consultas avanzadas SQLServer

Descripción completa

Views 250 Downloads 59 File size 387KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Consultas avanzadas (multitabla) Consultas de Combinación entre tablas. Las vinculaciones entre tablas se realizan mediante la cláusula INNER que combina registros de dos tablas siempre que haya concordancia de valores en un campo común. Su sintaxis es: SELECT campos FROM tb1 INNER JOIN tb2 ON tb1.campo1 comp tb2.campo2 En donde: tb1, tb2

Son los nombres de las tablas desde las que se combinan los registros.

campo1, campo2

Son los nombres de los campos que se combinan. Si no son numéricos, los campos deben ser del mismo tipo de datos y contener el mismo tipo de datos, pero no tienen que tener el mismo nombre.

comp

Es cualquier operador de comparación relacional: =, .

Se puede utilizar una operación INNER JOIN en cualquier cláusula FROM. Esto crea una combinación por equivalencia, conocida también como unión interna. Las combinaciones equivalentes son las más comunes; éstas combinan los registros de dos tablas siempre que haya concordancia de valores en un campo común a ambas tablas. Se puede utilizar INNER JOIN con las tablas Departamentos y Empleados para seleccionar todos los empleados de cada departamento. Por el contrario, para seleccionar todos los departamentos (incluso si alguno de ellos no tiene ningún empleado asignado) se emplea LEFT JOIN o todos los empleados (incluso si alguno no está asignado a ningún departamento), en este caso RIGHT JOIN. El ejemplo siguiente muestra cómo podría combinar las tablas Categorías y Productos basándose en el campo IDCategoria: SELECT NombreCategoria, NombreProducto FROM Categorias INNER JOIN Productos ON Categorias.IDCategoria = Productos.IDCategoria En el ejemplo anterior, IDCategoria es el campo combinado, pero no está incluido en la salida de la consulta ya que no está incluido en la instrucción SELECT. Para incluir el campo combinado, incluir el nombre del campo en la instrucción SELECT, en este caso, Categorias.IDCategoria. También se pueden enlazar varias cláusulas ON en una instrucción JOIN, utilizando la sintaxis siguiente: SELECT campos FROM tabla1 INNER JOIN tabla2 ON (tb1.campo1 comp tb2.campo1 AND ON tb1.campo2 comp tb2.campo2) OR ON (tb1.campo3 comp tb2.campo3) También puede anidar instrucciones JOIN utilizando la siguiente sintaxis:

SELECT campos FROM tb1 INNER JOIN (tb2 INNER JOIN [( ]tb3 [INNER JOIN [( ]tablax [INNER JOIN ...)] ON tb3.campo3 comp tbx.campox)] ON tb2.campo2 comp tb3.campo3) ON tb1.campo1 comp tb2.campo2 Un LEFT JOIN o un RIGHT JOIN puede anidarse dentro de un INNER JOIN, pero un INNER JOIN no puede anidarse dentro de un LEFT JOIN o un RIGHT JOIN. Ejemplo: SELECT Sum(d.PrecioUnidad * d.Cantidad) AS Ventas, (e.Nombre + ' ' + e.Apellidos) AS Nombres FROM Empleados as E INNER JOIN( Pedidos as P INNER JOIN [Detalles de pedidos] as D ON P.IdPedido = d.IdPedido) ON E.IdEmpleado = P.IdEmpleado GROUP BY e.Nombre + ' ' + e.Apellidos

(Crea dos combinaciones equivalentes: una entre las tablas Detalles de pedidos y Pedidos, y la otra entre las tablas Pedidos y Empleados. Esto es necesario ya que la tabla Empleados no contiene datos de ventas y la tabla Detalles de pedidos no contiene datos de los empleados. La consulta produce una lista de empleados y sus ventas totales.) Si empleamos la cláusula INNER en la consulta se seleccionarán sólo aquellos registros de la tabla de la que hayamos escrito a la izquierda de INNER JOIN que contengan al menos un registro de la tabla que hayamos escrito a la derecha. Para solucionar esto tenemos dos cláusulas que sustituyen a la palabra clave INNER, estas cláusulas son LEFT y RIGHT. LEFT toma todos los registros de la tabla de la izquierda aunque no tengan ningún registro en la tabla de la izquierda. RIGHT realiza la misma operación pero al contrario, toma todos los registros de la tabla de la derecha aunque no tenga ningún registro en la tabla de la izquierda. La sintaxis expuesta anteriormente pertenece a ACCESS, en donde todas las sentencias con la sintaxis funcionan correctamente. Los manuales de SQL-SERVER dicen que esta sintaxis es incorrecta y que hay que añadir la palabra reservada OUTER: LEFT OUTER JOIN y RIGHT OUTER JOIN. En la práctica funciona correctamente de una u otra forma.

SELECT pedidos.*, [Detalles de pedidos].* FROM pedidos INNER JOIN [Detalles de pedidos] ON Pedidos.IdPedido = [Detalles de pedidos].Idpedido WHERE Pedidos.IdPedido = 10248

Consultas de Autocombinación La autocombinación se utiliza para unir una tabla consigo misma, comparando valores de dos columnas con el mismo tipo de datos. La sintaxis en la siguiente: SELECT alias1.columna, alias2.columna, ... FROM tabla1 as alias1, tabla2 as alias2 WHERE alias1.columna = alias2.columna AND otras condiciones

Otra forma de obtener los resultados anteriores es de la siguiente forma: SELECT pedidos.*, [Detalles de pedidos].* FROM pedidos,[Detalles de pedidos] WHERE Pedidos.IdPedido = [Detalles de pedidos].Idpedido and Pedidos.IdPedido = 10248

Como se puede observar los cambios realizados han sido los siguientes: 1. Todas las tablas que intervienen en la consulta se especifican en la cláusula FROM. 2. Las condiciones que vinculan a las tablas se especifican en la cláusula WHERE y se vinculan mediante el operador lógico AND.

En SQL-SERVER se puede utilizar una sintaxis parecida, sino los caracteres =* para el LEFT JOIN y *= para el RIGHT JOIN.

Por ejemplo, para visualizar el número, nombre y puesto de cada empleado, junto con el número, nombre y puesto del supervisor de cada uno de ellos se utilizaría la siguiente sentencia: SELECT t.IdEmpleado,t.Nombre,t.Apellidos,t.Cargo,t.Jefe,s.Nombre,s.Cargo FROM empleados AS t, empleados AS s WHERE t.jefe = s.IdEmpleado

Consultas de Combinaciones no Comunes La mayoría de las combinaciones están basadas en la igualdad de valores de las columnas que son el criterio de la combinación. Las no comunes se basan en otros operadores de combinación, tales como NOT, BETWEEN, , etc. Por ejemplo, para listar el grado salarial, nombre, salario y puesto de cada empleado ordenando el resultado por grado y salario habría que ejecutar la siguiente sentencia: SELECT grados.grado,empleados.nombre, empleados.salario, empleados.puesto FROM empleados, grados WHERE empleados.salario BETWEEN grados.salarioinferior And grados.salariosuperior ORDER BY grados.grado, empleados.salario Para listar el salario medio dentro de cada grado salarial habría que lanzar esta otra sentencia: SELECT grados.grado, AVG(empleados.salario) FROM empleados, grados WHERE empleados.salario BETWEEN grados.salarioinferior And grados.salariosuperior GROUP BY grados.grado

CROSS JOIN (SQL-SERVER) Se utiliza en SQL-SERVER para realizar consultas de unión. Supongamos que tenemos una tabla con todos los autores y otra con todos los libros. Si deseáramos obtener un listado combinar ambas tablas de tal forma que cada autor apareciera junto a cada título, utilizaríamos la siguiente sintaxis: SELECT Autores.Nombre, Libros.Titulo FROM Autores CROSS JOIN Libros

Ejemplos de consultas avanzadas 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. 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

2. Obtener el nombre de los proveedores y los productos que estos suministran ordenados por el nombre del proveedor 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

3. Obtener el idProducto, NombreProducto y el nombre categoría. Utilice una combinación de las tablas productos y categorías USE Nwind GO SELECT P.IdProducto,P. NombreProducto, C.NombreCategoría FROM Productos AS P INNER JOIN Categorías AS C ON P.IdCategoría=C.IdCategoría

4. 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”. 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

5. 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) 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

6. El siguiente ejemplo retorna las columnas IdCliente, NombreCompañía, de la tabla Clientes utilizando una combinación Externa izquierda (LEFT OUTER JOIN) con la tabla pedidos. De esta tabla obtiene las columnas IdPedido y FechaPedido. 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

Al efectuar la consulta se obtiene 832 filas observe en el grafico los valores null para las dos primeras filas, esto significa que nos retorna clientes que no tienen pedidos realizados. En lugar de LEFT OUTER JOIN utilice INNER JOIN esta consulta retorna 830 filas afectadas la diferencia es de 2 que es el número de clientes que no tienen pedidos. 7. El siguiente ejemplo retorna las columnas IdPedido de la tabla pedidos y nombre compañía de la tabla compañía de envíos utilizando una combinación externa derecha RIGHT OUTER JOIN 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') 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 GO

8. EL EJEMPLO siguiente retorna las columnas NombreCompañía , ciudad y País de los Clientes que residen en el mismo país de la empresa Antonio Moreno Taquería. 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")

9. 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 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")

Ejercicios Propuestos 1. Elaborar una consulta que me muestre el valor máximo y el valor mínimo de los productos abastecidos por el proveedor Pavlova, Ltd. 2. Utilizando count ,Elaborar una consulta que muestre cuantos pedidos realizó HILARIÓNAbastos 3. Utilizando count , Elaborar una consulta que muestre cuantos clientes residen en Alemania 4. Utilizando group by, elaborar una consulta que muestre cuantos productos existen por categoría. 5. Obtener todos los pedidos agrupados por el nombre de compañía. 6. Obtener el nombre de los productos, de aquellos cuyo precio unitario sea igual al del producto con el nombre “Licor Cloudberry”. 7. Obtener el nombre completo de los empleados que hayan efectuado pedidos entre las fechas 12/06/2010 al 12/12/2010 8. Obtener el nombre de los productos adquiridos por el cliente con el código de Wolza. 9. Obtener el nombre de los productos y las unidades vendidas de los productos que pertenecen al código de categoría 4 10. Elaborar una consulta que permita mostrar los pedidos con el nombre del cliente y el nombre del empleado que participaron en dicha transacción.

Resolución de ejercicios 1. Elaborar una consulta que me muestre el valor máximo y el valor mínimo de los productos abastecidos por el proveedor Pavlova, Ltd. USE Nwind GO SELECT MAX (PrecioUnidad) AS " Precio Maximo", MIN(PrecioUnidad) AS " Precio minimo" FROM Productos WHERE IdProveedor= (SELECT IdProveedor FROM Proveedores WHERE NombreCompañía="Pavlova, Ltd.")

2. Elaborar una consulta que muestre cuantos pedidos realizó HILARIÓN-Abastos USE Nwind GO SELECT COUNT(*) AS "Nro. Pedidos del cliente FROM Pedidos WHERE IdCliente= (SELECT IdCliente FROM CLientes WHERE NombreCompañía="HILARIÓN-Abastos ")

HILARIÓN-Abastos"

3. Elaborar una consulta que muestre cuantos clientes residen en Alemania USE Nwind GO SELECT COUNT(*) AS " Nro. Clientes de Alemania" FROM Clientes WHERE País ="Alemania"

4. Utilizando group by, elaborar una consulta que muestre cuantos productos existen por categoría. USE Nwind GO SELECT C.NombreCategoría, COUNT(P.IdProducto) AS 'Cantidad por categoría' FROM Categorías AS C INNER JOIN Productos AS P ON (C.IdCategoría = P.IdCategoría) GROUP BY P.IdCategoría, C.NombreCategoría

5. Obtener todos los pedidos agrupados por el nombre de compañía. USE Nwind GO SELECT C.NombreCompañía, P.IDPedido FROM [Compañías de envíos] AS C INNER JOIN Pedidos AS P ON C.IdCompañíaEnvíos = P.FormaEnvío GROUP BY C.NombreCompañía, P.IDPedido ORDER BY 1

6. Obtener el nombre de los productos, de aquellos cuyo precio unitario sea igual al del producto con el nombre “Licor Cloudberry”. USE Nwind GO SELECT NombreProducto FROM Productos WHERE PrecioUnidad = (SELECT PrecioUnidad FROM Productos WHERE NombreProducto = 'Licor cloudberry')

7. Obtener el nombre completo de los empleados que hayan efectuado pedidos entre las fechas 12/06/2010 al 12/12/2010 select E.Nombre,E.Apellidos,P.IdPedido,P.FechaPedido from Empleados as e inner join Pedidos as p on p.IdEmpleado = p.IdEmpleado where p.FechaPedido between '12-06-2010' and '12-12-2010'

8. Obtener el nombre de los productos adquiridos por el cliente con el código de Wolza. USE Nwind GO SELECT NombreProducto FROM Productos WHERE IdProducto IN (SELECT IdProducto FROM [Detalles de Pedidos] WHERE IDPedido IN (SELECT IdPedido FROM Pedidos WHERE IDCliente IN (SELECT IdCliente FROM ClienteS WHERE IDCliente = 'WOLZA')))

9. Obtener el nombre de los productos y las unidades vendidas de los productos que pertenecen al código de categoría 4 SELECT P.NombreProducto, SUM(DP.Cantidad) AS 'Cantidad Pedida' FROM [Detalles de pedidos] DP INNER JOIN Productos P ON DP.IdProducto = P.IdProducto AND P.IdCategoría = 4, Categorías GROUP BY P.NombreProducto

10. Elaborar una consulta que permita mostrar los pedidos con el nombre del cliente y el nombre del empleado que participaron en dicha transacción. select p.*,C.NombreCompañía, E.Nombre+ ' '+E.Apellidos from Clientes C inner join Pedidos P inner join Empleados E on P.IdEmpleado = E.IdEmpleado on C.IdCliente = P.IdCliente