Consultas Avanzadas SQLServer_01

[Consultas Avanzadas Sql Server] Administración de Base de Datos EMPLEO DE ALIAS EN LOS NOMBRES DE LAS TABLAS El uso

Views 76 Downloads 0 File size 2MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

[Consultas Avanzadas Sql Server]

Administración de Base de Datos

EMPLEO DE ALIAS EN LOS NOMBRES DE LAS TABLAS

El uso de alias en los nombres de tablas mejora la legibilidad de las secuencias de comandos, facilita la escritura de combinaciones complejas y simplifica el mantenimiento de Transact-SQL. Al escribir secuencias de comandos, puede sustituir un nombre de tabla descriptivo largo y complejo por un alias sencillo y abreviado. El alias se utiliza en lugar del nombre completo de la tabla. Sintaxis parcial SELECT * FROM servidor.baseDeDatos.esquema.tabla AS aliasTabla Ejemplo: En este ejemplo se muestra el código del cliente, el nombre de la compañía, la dirección y el país de procedencia de los clientes. Este ejemplo utiliza alias en los campos seleccionados. Transact-SQL:

use nwind go select c.IdCliente, dbo.Clientes as c

c.NombreCompañía,c.Dirección,c.País

from

Resultado:

COMBINACIÓN DE DATOS DE VARIAS TABLAS

Una combinación es una operación que permite consultar dos o más tablas para producir un conjunto de resultados que incorpore filas y columnas de cada una de las tablas. Las tablas se combinan en función de las columnas que son comunes a ambas tablas. Cuando se combinan tablas, Microsoft® SQL Server™ 2008 compara los valores de las columnas especificadas fila por fila y, después, utiliza los resultados de la comparación para combinar los valores que cumplan los criterios especificados en nuevas filas. Las tablas se combinan para producir un único conjunto de resultados que incorpore filas y columnas de dos o más tablas. Sintaxis parcial SELECT columna [, columna …] FROM {} [, ...n] ::= [ INNER | { { LEFT | RIGHT | FULL } [OUTER] } ] [ ]

Página 1

[Consultas Avanzadas Sql Server]

Administración de Base de Datos

JOIN ::= ON

| CROSS JOIN | Hay tres tipos de combinaciones: combinaciones internas, combinaciones externas y combinaciones cruzadas. Adicionalmente, en una instrucción SELECT se pueden combinar más de dos tablas mediante un conjunto de combinaciones o se puede combinar una tabla consigo misma mediante una autocombinación.

Una combinación permite seleccionar columnas de varias tablas al expandir la cláusula FROM de la instrucción SELECT. En la cláusula FROM se incluyen dos palabras clave adicionales: JOIN y ON.  La palabra clave JOIN especifica qué tablas se van a combinar y cómo.  La palabra clave ON especifica las columnas que las tablas tienen en común. Consultas de dos o más tablas para producir un conjunto de resultados Una combinación permite consultar dos o más tablas para producir un único conjunto de resultados. Al implementar combinaciones, tenga en cuenta los siguientes hechos e instrucciones:  Especifique la condición de combinación en función de claves principales y externas.  Si una tabla tiene una clave principal compuesta, cuando combine tablas debe hacer referencia a toda la clave en la cláusula ON.  Para combinar tablas, utilice columnas comunes a las tablas especificadas. Dichas columnas deben tener tipos de datos iguales o similares.  Haga referencia al nombre de la tabla si las columnas de las tablas que va a combinar tienen el mismo nombre. Califique los nombres de las columnas con el formato tabla.columna.  Limite el número de tablas de las combinaciones porque cuantas más tablas combine, mayor será la duración del proceso de la consulta.  Puede incluir varias combinaciones en una instrucción SELECT. Uso de combinaciones internas INNER JOIN Las combinaciones internas combinan tablas mediante la comparación de los valores de las columnas que son comunes a ambas tablas. SQL Server sólo devuelve las filas que cumplen las condiciones de la combinación. Por qué se utilizan combinaciones internas INNER JOIN Utilice combinaciones internas para obtener información de dos tablas independientes y combinar dicha información en un conjunto de resultados. Al utilizar combinaciones internas, tenga en cuenta los siguientes hechos e instrucciones:  Las combinaciones internas son el tipo predeterminado de SQL Server. Puede abreviar la cláusula INNER JOIN como JOIN. Página 2

[Consultas Avanzadas Sql Server]

  

Administración de Base de Datos

Para especificar las columnas que desea presentar en el conjunto de resultados, incluya los nombres calificados de las columnas en la lista de selección. Incluya una cláusula WHERE para restringir las filas que se devuelven en el conjunto de resultados. No utilice valores NULL como condición de combinación, ya que no se evalúan como iguales entre sí.

Ejemplos: Obtener el nombre de los proveedores y los productos que estos suministran ordenados por el nombre del proveedor: Transact-SQL:

USE Nwind GO SELECT PV.NombreCompañía , P.NombreProducto FROM Proveedores AS PV INNER JOIN Productos AS P ON PV.IdProveedor = P.IdProveedor ORDER BY 1

Análisis: Tabla Productos

Tabla Proveedores

Consulta Resultante:

Ejemplo 02: Obtener el código del producto, el nombre del producto y el nombre de la categoría. Utilice la combinación de tablas Productos y categorías.

Página 3

[Consultas Avanzadas Sql Server]

Administración de Base de Datos

Transact-SQL:

USE Nwind GO SELECT P.IdProducto,P. NombreProducto, C.NombreCategoría FROM Resultado:

Ejemplo 03: En este ejemplo se devuelven los nombres de los clientes que han hecho pedidos después del 1/1/12. Observe que se utiliza una cláusula WHERE para restringir las filas devueltas en el conjunto de resultados. Transact-SQL:

USE nwind SELECT DISTINCT NombreCompañía, FechaPedido FROM dbo.Pedidos INNER JOIN dbo.Clientes ON dbo.Pedidos.IdCliente = dbo.Clientes.IdCliente WHERE FechaPedido > '1/1/12' GO Resultado:

Página 4

[Consultas Avanzadas Sql Server]

Administración de Base de Datos

Combinación de más de dos tablas Se puede combinar cualquier número de tablas. Cualquier tabla a la que se haga referencia en una operación de combinación se puede combinar con otra tabla mediante una columna común. Por qué se combinan más de dos tablas Puede utilizar combinaciones múltiples para obtener información relacionada de varias tablas. Al combinar más de dos tablas, tenga en cuenta los siguientes hechos e instrucciones:  

Debe tener una o varias tablas con claves externas relacionadas con las tablas que vaya a combinar. Debe definir una cláusula JOIN por cada columna que forme parte de una clave compuesta.



Incluya una cláusula WHERE para limitar el número de filas que se devolverá

Ejemplo 04: Obtener el código del producto, el nombre del producto, el nombre de la categoría y el nombre de la compañía del proveedor, donde el código del proveedor es igual a 1. Utilice la combinación de tablas Productos, categorías y proveedor. Transact-SQL:

USE Nwind GO SELECT P.IdProducto,P. NombreProducto, C.NombreCategoría, PV.NombreCompañía FROM Productos AS P INNER JOIN Categorías AS C ON P.IdCategoría=C.IdCategoría INNER JOIN Proveedores AS PV ON P.IdProveedor= PV.IdProveedor WHERE P.IdProveedor= 1 Resultado:

Uso de las combinaciones externas OUTER JOIN Las combinaciones externas izquierda y derecha combinan filas de dos tablas que cumplen una condición de combinación, más las filas de la tabla izquierda o derecha que no la cumplen, tal como se especifique en la cláusula JOIN. Las filas que no cumplen la condición de combinación presentan NULL en el conjunto de resultados. También se pueden utilizar combinaciones

Página 5

[Consultas Avanzadas Sql Server]

Administración de Base de Datos

externas completas para presentar todas las filas de las independientemente de si hay valores que coincidan en las tablas.

tablas

combinadas,

Por qué se utilizan las combinaciones externas izquierda o derecha LEFT JOIN, RIGHT JOIN Utilice las combinaciones externas izquierda o derecha cuando necesite una lista completa de los datos de una de las tablas combinadas más la información que cumpla la condición de combinación. Al utilizar las combinaciones externas izquierda o derecha, tenga en cuenta los siguientes hechos e instrucciones:  



 

SQL Server sólo devuelve filas únicas cuando se utilizan las combinaciones externas izquierda o derecha. Utilice una combinación externa izquierda para presentar todas las filas de la primera tabla especificada (la tabla de la parte izquierda de la expresión). Si invierte el orden en el que aparecen las tablas en la cláusula FROM, la instrucción devuelve el mismo resultado que una combinación externa derecha. Utilice una combinación externa derecha para presentar todas las filas de la segunda tabla especificada (la tabla de la parte derecha de la expresión). Si invierte el orden en el que aparecen las tablas en la cláusula FROM, la instrucción devuelve el mismo resultado que una combinación externa izquierda. Puede abreviar las cláusulas LEFT OUTER JOIN o RIGHT OUTER JOIN Como LEFT JOIN o RIGHT JOIN. Las combinaciones externas sólo se pueden utilizar entre dos tablas.

Ejemplo 05: En este ejemplo se presentan todos los clientes y las fechas de sus pedidos. Con una combinación externa izquierda se obtiene una fila por cada cliente y filas adicionales si el cliente ha efectuado varios pedidos. Se devuelve NULL en la columna Fecha Pedido del conjunto de resultados para los clientes que no han hecho ningún pedido. Observe las entradas NULL para los clientes FISSA y Paris Spécialités. Transact-SQL:

USE Nwind GO SELECT C.IdCliente, C.NombreCompañía, P.IdPedido, P.FechaPedido FROM Clientes AS C LEFT OUTER JOIN Pedidos AS P ON P.IdCliente = C.IdCliente ORDER BY P.IdCliente Resultado:

Página 6

[Consultas Avanzadas Sql Server]

Administración de Base de Datos

Ejemplo 06: En este ejemplo se muestra a todos los clientes que no realizaron pedidos. utiliza una combinación externa IZQUIERDA (LEFT OUTER JOIN) . Transact-SQL:

USE Nwind GO SELECT C.IdCliente, C.NombreCompañía, P.IdPedido, P.FechaPedido FROM Clientes AS C LEFT OUTER JOIN Pedidos AS P ON P.IdCliente = C.IdCliente WHERE P.Idpedido IS NULL Resultado:

Ejemplo 07: El ejemplo siguiente inserta 3 registros a la tabla Compañía de envíos de la base de datos Nwind. Estos datos son necesarios para crear los ejercicios siguientes. Transact-SQL:

USE Nwind GO INSERT [Compañías de Envíos]VALUES (4, 'Aero Condor', '(503) 555-8831') INSERT [Compañías de Envíos] VALUES (5, 'American Express', '(503) 555-9761') INSERT [Compañías de Envíos] VALUES (6, 'Amazonas S.A.', '(503) 555-2231')

Ejemplo 08: El ejemplo siguiente retorna las columnas código de pedido de la tabla pedidos y nombre de Compañía de la tabla compañía de envíos utilizando una combinación externa derecha (RIGHT OUTER JOIN). Transact-SQL:

USE Nwind GO SELECT P.IdPedido, CE.NombreCompañía FROM Pedidos AS P RIGHT OUTER JOIN [Compañías de Envíos] AS CE ON P.FormaEnvío = CE.IdcompañíaEnvíos ORDER BY 2

Página 7

[Consultas Avanzadas Sql Server]

Administración de Base de Datos

GO Resultado:

La consulta retorna (833 filas afectadas), como es una combinación externa derecha, retorna todas las filas de la tabla Compañía de Envíos. Los tres registros ingresados en el ejercicio anterior no tienen pedidos asignados. Ejemplo 09: El siguiente ejemplo retorna el código del cliente de la tabla pedidos y el nombre de la compañía de envíos utilizando una combinación externa completa (FULL OUTER JOIN). Transact-SQL:

USE Nwind GO SELECT C.IdCliente, C.NombreCompañía ,P.IdPedido FROM Clientes AS C FULL OUTER JOIN Pedidos AS P ON C.IdCliente = P.IdCliente ORDER BY 3 Resultado:

Página 8

[Consultas Avanzadas Sql Server]

Administración de Base de Datos

Paso 1: Ejecutar el siguiente script para ejecutar los ejercicios que se presentan a continuación. El script crea dos tablas clientes B y Facturas y se ingresan algunos registros. Clientes B tiene 5 registros (algunos clientes no tienen facturas) Facturas tiene 7 registros (algunas facturas no tienen clientes). Transact-SQL:

USE Nwind GO --Si existe la tabla ClienteB la eliminamos IF OBJECT_ID('ClientesB') IS NOT NULL DROP TABLE ClientesB GO CREATE TABLE ClientesB ( IdCliente char(5), Nombre char(20), Telefono char(7) ) GO ---Si existe la tabla Facturas la eliminamos IF OBJECT_ID('Facturas') IS NOT NULL DROP TABLE Facturas GO CREATE TABLE Facturas ( IdFactura char(5), IdCliente char(5), Fecha DateTime, Total Money ) GO -- ingreso de datos a la tabla ClientesB INSERT ClientesB VALUES ('C0001', 'Luis Perez', '4532222') INSERT ClientesB VALUES ('C0002', 'Ana Rosales', '5532522') INSERT ClientesB VALUES ('C0003', 'Jose Martinez', '8539229') INSERT ClientesB VALUES ('C0004', 'Raul Gomez', '4532227') INSERT ClientesB VALUES ('C0005', 'Gloria Morales', '9532789') GO --- ingreso de datos a la tabla Facturas INSERT Facturas VALUES ('F0001','C0001', '01-08-2001', INSERT Facturas VALUES ('F0002', 'C0002','02-08-2001', INSERT Facturas VALUES ('F0003','C0003', '02-08-2001', INSERT Facturas VALUES ('F0004', 'C0001','03-08-2001', --registros sin clientes-INSERT Facturas VALUES ('F0005', 'C0009','03-08-2001', INSERT Facturas VALUES ('F0006', 'C0008','03-08-2001', INSERT Facturas VALUES ('F0007', 'C0007','05-08-2001', GO

600) 50) 100) 300) 1600) 1000) 800)

Página 9

[Consultas Avanzadas Sql Server]

Administración de Base de Datos

Ejercicio 01: Elaborar una consulta que retorne el código y el nombre de la tabla clientes B y además el número de la factura utilizando una combinación interna. Resultado:

Ejercicio 02: Elaborar una consulta que retorne el código y el nombre de la tabla clientes B y además el número de la factura utilizando una combinación externa izquierda. Resultado

Ejercicio 03: Elaborar una consulta que retorne el código y el nombre de la tabla clientes B y además el número de la factura utilizando una combinación externa derecha. Resultado

Página 10

[Consultas Avanzadas Sql Server]

Administración de Base de Datos

Ejercicio 04: Elaborar una consulta que retorne el código y el nombre de la tabla clientes B y además el número de la factura utilizando una combinación externa completa. Resultado

Uso de las combinaciones cruzadas Las combinaciones cruzadas presentan todas las combinaciones de todas las filas de las tablas combinadas. En este tipo de combinaciones no se requiere una columna común. Por qué se utilizan las combinaciones cruzadas Aunque las combinaciones cruzadas no se suelen utilizar en una base de datos normalizada, se pueden utilizar para generar datos de prueba para una base de datos o listas de todas las combinaciones posibles para elaborar listas de comprobación o patrones comerciales. Cuando se utilizan combinaciones cruzadas, SQL Server genera un producto cartesiano en el que el número de filas del conjunto de resultados es igual al número de filas de la primera tabla multiplicado por el número de filas de la segunda tabla. Por ejemplo, si hay 8 filas en una tabla y 9 filas en la otra, SQL Server devuelve un total de 72 filas. Ejemplo 10: En este ejemplo se presenta una combinación cruzada entre las tablas compañía de envíos y proveedores que puede ser útil para enumerar todas las formas de envío de los proveedores. Al utilizar una combinación cruzada se presentan todas las combinaciones posibles de las filas de las dos tablas. La tabla compañía de envíos tiene 3 filas y la tabla proveedores tiene 29 filas. El conjunto de resultados contiene 87 filas. Transact-SQL:

USE nwind SELECT Proveedores.NombreCompañía, [Compañías de envíos].IdCompañíaEnvíos FROM dbo.Proveedores CROSS JOIN [Compañías de envíos] GO

Página 11

[Consultas Avanzadas Sql Server]

Administración de Base de Datos

Resultado:

Ejemplo 11: El siguiente ejemplo retorna el código y nombre de la compañía de la tabla Cliente B y además el código de la factura empleando una combinación cruzada. Transact-SQL:

USE Nwind GO SELECT C.Idcliente, C.Nombre,F.IdFactura FROM ClientesB AS C CROSS JOIN Facturas AS F ORDER BY 1 Resultado:

Página 12

[Consultas Avanzadas Sql Server]

Administración de Base de Datos

Combinación de varios conjuntos de resultados El operador UNION combina el resultado de dos o más instrucciones SELECT en un único conjunto de resultados. Utilice el operador UNION cuando los datos que desee obtener residan en ubicaciones diferentes y no se pueda tener acceso a ellas con una única consulta. Al utilizar el operador UNION, tenga en cuenta los siguientes hechos e instrucciones: 

SQL Server requiere que las tablas a las que se hace referencia tengan tipos de datos similares, el mismo número de columnas y el mismo orden de columnas en la lista de selección de cada consulta.



SQL Server quita las filas duplicadas del conjunto de resultados. Sin embargo, si utiliza la opción ALL, se incluyen todas las filas en el conjunto de resultados, incluso las duplicadas. Debe especificar los nombres de las columnas en la primera instrucción SELECT. Por lo tanto, si desea definir nuevos encabezados de columnas en el conjunto de resultados, deberá crear los alias de columnas en la primera instrucción SELECT. Si desea que todo el conjunto de resultados aparezca con un orden específico, debe especificar la ordenación con una cláusula ORDER BY en la instrucción UNION. De lo contrario, puede que el conjunto de resultados no se devuelva en el orden que desea.

 



Puede lograr un mayor rendimiento si divide una consulta compleja en varias instrucciones SELECT y, después, utiliza el operador UNION para combinarlas.

Sintaxis instrucciónSelect UNION [ALL] instrucciónSelect

Página 13

[Consultas Avanzadas Sql Server]

Administración de Base de Datos

Una subconsulta es una sentencia SELECT que aparece dentro de otra sentencia. SELECT, que llamaremos consulta principal. Una subconsulta tiene la misma sintaxis que una sentencia SELECT normal exceptuando que aparece encerrada entre paréntesis, no puede contener la cláusula ORDER BY, ni puede ser la UNION de varias sentencias SELECT, además tiene algunas restricciones en cuando a número de columnas según lugar donde aparece en la consulta principal. Se aconseja no utilizar campos calculados en las subconsultas. Ejemplo 12: El ejemplo siguiente muestra las columnas código de pedido, fecha de pedido y máximo precio unitario en el pedido. Transact-SQL:

USE Nwind GO SELECT P.IdPedido , P.FechaPedido, -- se calcula el maximo precio unitario en el pedido -- cada pedido tiene diferentes articulos (SELECT MAX(DP.PrecioUnidad) FROM [Detalles de pedidos] AS DP WHERE P.IdPedido= DP.IdPedido) AS [Maximo precio unitario en el pedido] FROM Pedidos AS P GO Resultado:

Ejemplo 13: El ejemplo siguiente retorna todos los productos con precio unitario igual al mayor precio de los artículos que son abastecidos por el proveedor con código igual a 1. Transact-SQL:

USE Nwind GO SELECT * FROM Productos AS P1 WHERE PrecioUnidad= (SELECT MAX(PrecioUnidad) FROM Productos as P2 WHERE IdProveedor=1) GO Resultado:

Página 14

[Consultas Avanzadas Sql Server]

Administración de Base de Datos

Ejemplo 14: El ejemplo siguiente retorna las columnas Nombre de compañía, ciudad y país de los clientes que residen en el mismo país de la empresa Antonio Moreno Taquería Transact-SQL:

USE Nwind GO SELECT NombreCompañía,Ciudad,País FROM Clientes WHERE País IN (SELECT País FROM Clientes WHERE NombreCompañía='Antonio Moreno Taquería') Resultado:

Página 15

[Consultas Avanzadas Sql Server]

Administración de Base de Datos

1. Elaborar una consulta que me permita visualizar el nombre del producto, con su precio respectivo agregando el nombre de la categoría a la que pertenece. Transact-SQL:

select p.IdProducto, p.NombreProducto,p.PrecioUnidad,c.IdCategoría,c.NombreCategoría from Productos as P , Categorías as c where P.IdCategoría = c.IdCategoría

Utilizando inner join: select p.IdProducto, p.NombreProducto,p.PrecioUnidad,c.IdCategoría,c.NombreCategoría from Productos as P inner join Categorías as c on P.IdCategoría = c.IdCategoría Resultado:

2. Obtener el nombre de los proveedores y los productos que estos suministran ordenados por el nombre del proveedor Transact-SQL:

USE Nwind GO SELECT PV.NombreCompañía , P.NombreProducto FROM Proveedores AS PV INNER JOIN Productos AS P ON PV.IdProveedor = P.IdProveedor ORDER BY 1 Resultado:

3. El ejemplo siguiente retorna el IdPedido, FechaPedido y todas las columnas de la tabla cliente. Esta consulta nos responde a la pregunta “Muéstrame todos los números de pedidos, fecha y todos los datos del cliente que hizo el pedido”. Transact-SQL:

USE Nwind GO SELECT P.IdPedido, P.FechaPedido, C.* FROM Pedidos AS P INNER JOIN Clientes AS C ON P.IdCliente = C.IdCliente ORDER BY P.IdCliente

Página 16

[Consultas Avanzadas Sql Server]

Administración de Base de Datos

Resultado:

4. Obtener el idproducto, NombreProducto, el NombreCategoria y el nombre compañía donde IdProveedor es igual a 1. Utilice una combinación de las tablas Productos, Categorías y Proveedores. (Combinación de tres tablas) Transact-SQL:

USE Nwind GO SELECT P.IdProducto,P. NombreProducto, C.NombreCategoría, PV.NombreCompañía FROM Productos AS P INNER JOIN Categorías AS C ON P.IdCategoría=C.IdCategoría INNER JOIN Proveedores AS PV ON P.IdProveedor= PV.IdProveedor WHERE P.IdProveedor= 1 Resultado:

5. El siguiente ejemplo es similar al anterior retorna los clientes que residen en un paios diferente al de Antonio Moreno Taquería. Se utiliza la palabra clave Not IN Transact-SQL:

USE Nwind GO SELECT NombreCompañía,Ciudad,País FROM Clientes WHERE País NOT IN (SELECT País FROM Clientes WHERE NombreCompañía='Antonio Moreno Taquería') Resultado:

Página 17

[Consultas Avanzadas Sql Server]

Administración de Base de Datos

Ejercicios Propuestos

1. Elaborar una consulta que muestre el número total de artículos pedidos y además el monto total 2. Elaborar una consulta que muestre el promedio de los precios de los artículos que abastece el proveedor Tokyo Traders 3. Elaborar una consulta que me muestre el valor máximo y el valor mínimo de los productos abastecidos por el proveedor Pavlova, Ltd. 4. Utilizando count ,Elaborar una consulta que muestre cuantos pedidos realizó HILARIÓNAbastos 5. Utilizando count , Elaborar una consulta que muestre cuantos clientes residen en Alemania 6. Utilizando group by, elaborar una consulta que muestre cuantos productos existen por categoría. 7. Obtener todos los pedidos atendidos por las compañías de envíos. 8. Obtener el nombre de los productos, de aquellos cuyo precio unitario sea igual al del producto con el nombre “Licor Cloudberry”. 9. Obtener el nombre completo de los empleados que hayan efectuado pedidos entre las fechas 12/06/2011 al 12/12/2011 10. Obtener el nombre de los productos adquiridos por el cliente con el código de Wolza. 11. Obtener el nombre de los productos y las unidades vendidas de los productos que pertenecen al código de categoría 4 12. Elaborar una consulta que permita mostrar los pedidos con el nombre del cliente y el nombre del empleado que participaron en dicha transacción. 13. Elaborar una consulta que muestre el número de pedido y el nombre del producto, está información se obtiene de las tablas pedidos y productos mediante el uso de la tabla detalles de pedidos como vínculo. Por ejemplo, si desea obtener la lista de los productos que se piden cada día, necesitaría información de las tablas pedidos y productos. Un pedido puede contener muchos productos y un producto puede aparecer en muchos pedidos.

Página 18