Consultas SQL Consultas SQL Anidadas INNER JOIN Inner join Sólo produce los registros que coinciden en las dos tablas A y B. Código (sql) 1. SELECT * FROM TablaA 2. INNER JOIN TablaB 3. ON TablaA.nombre = TablaB.nombre Full outer join Produce el conjunto de todos los registros en las tablas A y B, con registros coincidentes en ambos lados cuando sea posible. Si no hay coincidencia, el lado que falta contendrá null. Código (sql) 1. SELECT * FROM TablaA 2. FULL OUTER JOIN TablaB 3. ON TablaA.nombre = TablaB.nombre Left outer join produce el conjunto completo de registros de la tabla A, con los registros coincidentes (si están disponibles) en la tabla B. Si no hay coincidencia, el lado derecho contendrá null. Código (sql) 1. SELECT * FROM TablaA 2. LEFT OUTER JOIN TablaB 3. ON TablaA.nombre = TablaB.nombre Para producir el conjunto de registros en la tabla A, pero no en la tabla B, usamos el mismo Left Outer Join, y luego excluimos los registros que no queremos del lado derecho mediante una cláusula Where. Código (sql) 1. 2. 3. 4. SELECT * FROM TablaA LEFT OUTER JOIN TablaB ON TablaA.nombre = TablaB.nombre WHERE TablaB.id IS NULL DOCENTE: LIC. DAVID LOPEZ 1 Consultas SQL Full Outer Join Para producir el conjunto de registros únicos de la tabla A y la tabla B, usamos el mismo Full Outer Join, y luego excluimos los registros que no queremos de los dos lados mediante una cláusula Where. Código (sql) 1. 2. 3. 4. 5. SELECT * FROM TablaA FULL OUTER JOIN TablaB ON TablaA.nombre = TablaB.nombre WHERE TablaA.id IS NULL OR TablaB.id IS NULL Cross Join También hay un cross join, el cual no puede ser expresado con un diagrama de Venn: Código (sql) 1. SELECT * FROM TablaA 2. CROSS JOIN TablaB Esto une “todo con todo”, dando como resultado 4 x 4 = 16 filas, muchas más de las que teníamos en los conjuntos originales. Si haces unos simples cálculos, puedes ver por qué es un Join muy peligroso de ejecutar en tablas grandes. UNION El comando unión trabaja sobre los resultados de las consultas, nos sirve para unir las columnas resultantes. Código (SQL) 1. 2. 3. 4. 5. SELECT * FROM tablaA WHERE tablaA.nombre = “Juan” UNION SELECT * FROM tablaB WHERE tablaB.nombre = “Juan” DOCENTE: LIC. DAVID LOPEZ 2 Consultas SQL GROUP BY La cláusula GROUP BY en SQL permite realizar agrupaciones de registros de una tabla. Examinemos la siguiente tabla que contiene datos de los empleados de una empresa. Si en esta tabla deseáramos calcular el salario medio de los empleados agrupados por oficio, deberíamos escribir una sentencia SQL que agrupara las filas con un mismo nombre de oficio. De cada uno de los grupos que se formen se aplicaría la función AVG sobre el campo salario. De la misma forma, si quisiéramos contar el número de empleados de cada departamento deberíamos realizar un agrupamiento de los empleados por el campo departamento. De cada uno de los grupos formados se aplicaría la función COUNT. La sintaxis básica de la cláusula GROUP BY en una sentencia SELECT es la siguiente: 1. 2. 3. 4. 5. SELECT campos FROM tablas WHERE condiciones GROUP BY campo1, campo2, campo3... ORDER BY campo1, campo2, campo3... DOCENTE: LIC. DAVID LOPEZ 3 Consultas SQL La cláusula GROUP BY siempre va detrás de la cláusula WHERE (si es que la hay), y delante siempre de ORDER BY (si es que realizamos la ordenación de acuerdo un campo determinado). 1. SELECT oficio, AVG(salario) AVG_SALARIO 2. FROM empleado 3. GROUP BY oficio Se quiere calcular a continuación el número de empleados de cada departamento. En esta ocasión debemos realizar un agrupamiento de registros por el campo dept_no. De cada grupo que se forme debemos contar el número de registros que forman cada grupo. La sentencia SQL quedaría: 1. 2. 3. 4. SELECT dep_no, COUNT(*) TOTAL FROM empleados GROUP BY dep_no ORDER BY dep_no Hemos empleado la cláusula ORDER BY para mostrar el resultado ordenado por número de departamento. La cláusula GROUP BY DEPT_NO obliga a COUNT a contar las filas que se han agrupado por cada departamento. Veamos otro ejemplo más. Queremos obtener por cada agrupamiento de departamento y oficio el salario medio. Es decir, por cada departamento queremos calcular el salario medio agrupado por oficio. En este caso debemos agrupar los registros por número de departamento, y dentro de cada departamento por oficio. 1. 2. SELECT dep_no, oficio, AVG(salario) FROM empleados GROUP BY dep_no,oficio DOCENTE: LIC. DAVID LOPEZ 4 Consultas SQL En una sentencia SELECT pueden aparecer juntos tanto la cláusula WHERE como la cláusula GROUP BY. Si quisiéramos calcular, por ejemplo, el salario medio de cada departamento sin tener en cuenta aquellos empleados que cobren menos de 10000, la sentencia correcta en SQL sería: 1. 2. 3. 4. SELECT dep_no, AVG(salario) FROM empleados WHERE salario>=10000 GROUP BY dep_no; HAVING La cláusula HAVING permite especificar condiciones a los agrupamientos realizados con GROUP BY. Del mismo modo que existe la cláusula WHERE para filas individuales en la sentencia SELECT, también se puede especificar una condición para grupos de registros. Al utilizar la cláusula HAVING no se incluyen aquellos grupos que no cumplan una determinada condición. La cláusula HAVING siempre va detrás de la cláusula GROUP BY y no puede existir sin ésta. Si queremos visualizar, por ejemplo, el salario medio de cada departamento, pero sólo de aquellos cuyo salario medio sea mayor de 1200, la sentencia en SQL sería: 1. SELECT dep_no, AVG(salario) 2. FROM empleados DOCENTE: LIC. DAVID LOPEZ 5 Consultas SQL 3. GROUP BY dep_no 4. HAVING AVG(salario)>1200 Si, por ejemplo, queremos obtener el número de empleados de cada departamento pero sólo de aquellos que tengan más de 2 empleados, la manera correcta sería: 1. 2. 3. 4. SELECT dep_no,COUNT(*) FROM empleados GROUP BY dep_no HAVING COUNT(*)>2 Si queremos ordenar la salida descendentemente por número de empleados emplearíamos la cláusula ORDER BY. 1. 2. 3. 4. 5. SELECT dep_no,COUNT(*) FROM empleados GROUP BY dep_no HAVING COUNT(*)>2 ORDER BY COUNT(*) DESC La cláusula WHERE y la cláusula HAVING pueden aparecer juntas en la misma sentencia SQL. La cláusula HAVING es similar a la cláusula WHERE, pero trabaja con grupos de filas en vez que con filas individuales de una tabla. Si quisiéramos calcular, por ejemplo, el salario medio de cada departamento sin tener en cuenta aquellos empleados que cobren menos de 10000, y además no queremos que en resultado se visualicen aquellos departamentos cuyo salario sea menor que 12,000 la sentencia correcta en SQL sería: 1. SELECT dep_no, AVG(salario) 2. FROM empleados 3. WHERE salario>10000 DOCENTE: LIC. DAVID LOPEZ 6 Consultas SQL 4. GROUP BY dep_no 5. HAVING AVG(salario)>12000 DOCENTE: LIC. DAVID LOPEZ 7