Instructivo de consultas multitabla SQL 2020

Anuncio
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
Descargar