Consultas SQL Avanzadas y Técnicas
Consultas SQL Avanzadas y Técnicas
SQL Avanzado
SQL avanzado
BASES DE DATOS
Contenido
SQL avanzado
• Preguntas anidadas
• Operadores: IN, ANY, ALL, EXISTS, UNIQUE
• Cláusula HAVING
• OUTER JOIN
SQL avanzado
BASES DE DATOS
COMPETENCIAS
SQL avanzado
BASES DE DATOS
SELECT ( <atributos> | * )
FROM <tablas>
[WHERE <condición>]
SQL avanzado
BASES DE DATOS
Concatenación de tablas
INNER JOIN
Hace una concatenación de las tablas basándose en la comparación de
los atributos de las dos tablas
NATURAL JOIN
El operador de comparación es = y se aplica a todos los atributos del
mismo nombre en las tablas. Elimina columnas repetidas en el
resultado
SQL avanzado
BASES DE DATOS
RENOMBRAR
Se evita la ambigüedad.
FROM <tabla> T
FROM <tabla> AS T
FROM <tabla> AS T(atrib1, ... , atribn)
SQL avanzado
BASES DE DATOS
<consulta1>
UNION / EXCEPT / INTERSECT
<consulta2>
SQL avanzado
BASES DE DATOS
Operador IN
Verdadero si el valor del atributo está incluido en la lista
Predicado IS NULL
Verdadero si el valor del atributo es null
Operador BETWEEN
Verdadero si el valor del atributo se encuentra entre los dos valores
(incluidos ambos)
WHERE <atributo> BETWEEN valor_1 AND valor_2
SQL avanzado
BASES DE DATOS
Clásula ORDER BY
ORDER BY 1 ASC
SQL avanzado
BASES DE DATOS
Funciones agregadas
COUNT
Para contar el número de tuplas
SQL avanzado
BASES DE DATOS
Cláusula GROUP BY
SQL avanzado
BASES DE DATOS
Valor NULL
SQL avanzado
BASES DE DATOS
A B and or
A not
True True True True True False
True False False True False True
False False False False Null Null
True Null Null True
False Null Null Null
Null Null Null Null
SQL avanzado
BASES DE DATOS
vendedor X
SELECT vendedor
Jon 1500 FROM ventas
WHERE venta<=cuota
Miren 1500
Josu null
Ane 1700 SELECT vendedor, cuota+500 as X
FROM ventas
Aitor 1500
Leire null
SQL avanzado
BASES DE DATOS
S1 S2 S3 S4
K1 K2 K3
7100 4200 2900 400
VENTAS null 0 2
cod vendedor venta cuota
1 Jon 1000 1000
SELECT SUM (cuota) AS K1,
2 Miren 1500 1000 count(cuota) AS K2,
3 Josu 500 null count(*) AS K3
FROM ventas
4 Ane 1000 1200 WHERE venta=500
5 Aitor 1100 1000 OR venta= 2000
6 Leire 2000 null
SQL avanzado
BASES DE DATOS
SQL avanzado
BASES DE DATOS
19
Consultas SQL
(BD Empresa)
Obtener el número de los proyectos en los que intervine Luis como
trabajador o como director del departamento que lo controla.
Consultas anidadas
SQL avanzado
BASES DE DATOS
Operador IN
•
WHERE (a, b)
Mismo dominio en ambos lados
IN (SELECT d FROM ...
•
Mismo orden
WHERE (a, b) IN (SELECT c, d FROM ...
int char char int
WHERE (a, b) IN (SELECT c, d FROM ...
SQL avanzado
BASES DE DATOS
Operador EXISTS
SELECT A, B, C SELECT A, B, C
FROM Tabla1 FROM Tabla1 AS Z
WHERE A in (SELECT A WHERE exists (SELECT *
FROM Tabla2) FROM Tabla2
Tabla1(A, B, C, D) WHERE A=Z.A)
Tabla2(E, F, A)
SQL avanzado
BASES DE DATOS
2 7984 6
(SELECT 1
FROM Calificaciones Ø
WHERE nota>=7 AND dni=[Link])
2 4544 3
3 7984 7.5 SELECT Nombre
FROM Alumno AS A Nombre
3 4544 9 WHERE EXISTS
3 7540 8 (SELECT 1
FROM Calificaciones
Dni Nombre WHERE nota>=7 AND dni=2)
1 Jon Estudiante
2 Ane
Expr EXISTS = FALSE
3 Leire
SQL avanzado
BASES DE DATOS
SQL avanzado
BASES DE DATOS
SQL avanzado
BASES DE DATOS
xxx:
< ALL
<= ALL 1
< ANY 1,2,3,5
<= ANY 1,2,3,4,5
SQL avanzado
BASES DE DATOS
SELECT Dni
FROM Personal
WHERE Salario <ALL (SELECT Salario
FROM Personal)
SQL avanzado
BASES DE DATOS
PERSONAL
Dni Nombre … Sueldo Dni
1 Jon … 100
2 Miren … 150 1
3 Josu … 175
4 Ane … 200
5 Aitor … 160
SELECT Dni
FROM Personal
WHERE Salario <=ALL(SELECT Salario
FROM Personal)
SQL avanzado
BASES DE DATOS
Empleado
Dni
Dni Nombre … Sueldo
1 Jon … 100
1
2 Miren … 150
3 Josu … 175 2
4 Ane … 200
5 Aitor … 160 3
SELECT Dni 5
FROM Personal
WHERE Salario <ANY
(SELECT Salario
FROM Personal)
SQL avanzado
BASES DE DATOS
Dni
PERSONAL
1
Dni Nombre … Sueldo
1 Jon … 100 2
2 Miren … 150
3 Josu … 175 3
4 Ane … 200
5 Aitor … 160
4
SELECT Dni 5
FROM Personal
WHERE Salario <=ANY (SELECT Salario
FROM Personal)
SQL avanzado
BASES DE DATOS
Operador UNIQUE
Tabla1 Tabla2
A B C D G E F A
1 Bb 5 Aba 1 Aaa 2 2
2 Ab 3 Aaa 2 Aeb 3 4
3 Cb 4 Aaa 3 Aeb 8 2
4 Ec 2 Aeb 4 Aeb 5 3
SELECT A,B,C 5 Aba 8 1
FROM Tabla1 AS Z
6 Aaa 2 5
WHERE UNIQUE ( SELECT A
FROM Tabla2
WHERE F=Z.C) UNIQUE = TRUE
SELECT A,B,C
FROM Tabla1 AS Z
A B C
WHERE UNIQUE ( SELECT A 1 Bb 5
FROM Tabla2
WHERE F=5)
SQL avanzado
BASES DE DATOS
Tabla2
Tabla1
G E F A
A B C D
1 Aaa 2 2
1 Bb 5 Aba
2 Aeb 3 4
2 Ab 3 Aaa
3 Aeb 8 2
3 Cb 4 Aaa
4 Aeb 5 3
4 Ec 2 Aeb
5 Aba 8 1
SELECT A,B,C
FROM Tabla1 AS Z
6 Aaa 2 5
WHERE UNIQUE ( SELECT A UNIQUE = TRUE
FROM Tabla2
WHERE F=Z.C) A B C
SELECT A,B,C
3 Ab 3
FROM Tabla1 AS Z A B C
WHERE UNIQUE ( SELECT A
FROM Tabla2
1
A Bb
B 5
C
WHERE F=3) 2
1 Ab
Bb 3
5
SQL avanzado
BASES DE DATOS
Tabla1
Tabla2 G E F A
A B C D
1 Aaa 2 2
1 Bb 5 Aba
2 Aeb 3 4
2 Ab 3 Aaa
3 Aeb 8 2
3 Cb 4 Aaa
4 Aeb 5 3
4 Ec 2 Aeb
5 Aba 8 1
SELECT A,B,C
6 Aaa 2 5
FROM Tabla1 AS Z
WHERE UNIQUE ( SELECT A Ø UNIQUE = TRUE
FROM Tabla2
A B C
WHERE F=Z.C)
3 Cb 4
SELECT A,B,C A B C
FROM Tabla1 AS Z 1
A Bb
B 5C
WHERE UNIQUE ( SELECT A
21 Ab
Bb 35
FROM Tabla2
WHERE F=4) 32 Cb
Ab 43
SQL avanzado
BASES DE DATOS
Tabla1 Tabla2
A B C D G E F A
1 Bb 5 Aba 1 Aaa 2 2
2 Ab 3 Aaa 2 Aeb 3 4
3 Cb 4 Aaa 3 Aeb 8 2
4 Ec 2 Aeb 4 Aeb 5 3
SELECT A,B,C
5 Aba 8 1
FROM Tabla1 AS Z 6 Aaa 2 5
WHERE UNIQUE ( SELECT A UNIQUE = TRUE
FROM Tabla2
WHERE F=Z.C)
A B C
SELECT A,B,C A B C
FROM Tabla1 AS Z 1 Bb 5
WHERE UNIQUE ( SELECT A
FROM Tabla2
2 Ab 3
WHERE F=2) 3 Cb 4
SQL avanzado
BASES DE DATOS
Cláusula HAVING
SQL avanzado
BASES DE DATOS
Tabla1
A B C D HAVING
3 8 4 Aba SELECT D, count(*) AS Cant
4 9 2 Aeb FROM Tabla1
5 9 1 Aba WHERE B > 6
GROUP BY D
7 8 3 Aaa
HAVING COUNT(*)>1
9 8 3 Aeb
10 7 1 Aba
Cláusula WHERE
Cláusula GROUP BY
A B C D
3 8 4 Aba
5 9 1 Aba G1
10 7 1 Aba
4 9 2 Aeb
G2
9 8 3 Aeb
7 8 3 Aaa G3
SQL avanzado
BASES DE DATOS
SQL avanzado
BASES DE DATOS
SQL avanzado
BASES DE DATOS
SQL avanzado
BASES DE DATOS
T1 T2 T3
A B C D A E F
1 Abc A Aa 2 1 Dj
2 Aab B Ab 3 3 Mn
3 Acb C Ba 3 5 Nd
4 Ccb D Bb Null 6 Dm
E cc 5 A B C
SELECT A, B, C 2 Aab A
FROM T1 INNER JOIN T2 ON T1.A=T2.A;
3 Acb B
3 Acb C
SQL avanzado
BASES DE DATOS
SQL avanzado
BASES DE DATOS
SQL avanzado
BASES DE DATOS
Compatibilidad de UNION
SQL avanzado
BASES DE DATOS
Compatibilidad de Unión
A C
Numero Nombre Numero Nombre
1 ‘Cooper Industries’ 4 ‘Flowtech Industries’
2 ‘Emblazon Corporation’ 8 ‘Zantech Inc.’
3 ‘Ditech Corporation’
4 ‘Flowtech Industries’ D
5 ‘Gentech Industries’ Numero Nombre
B
‘4' ‘Flowtech Industries’
Número Nombre Ciudad
‘8' ‘Zantech Inc.’
1 Cooper Industries LAX
2 Emblazon Corporation NYC E
3 Ditech Corporation BCN Edad Nombre
4 Flowtech Industries EAS 4 ‘Svendson, Tove’
5 Gentech Industries MAD 8 ‘Svendson, Stephen’
UNION
UNION DISTINCT
También UNION UNIQUE o sólo UNION
Unión de dos tablas [conjuntos]
• Las tablas deben ser compatibles para unión
Elimina tuplas repetidas
UNION ALL
No elimina tuplas repetidas
SQL avanzado
BASES DE DATOS
Personal_Noruega Personal_USA
P_ID P_Name P_ID P_Name
1 Hansen, Ola 1 Turner, Sally
2 Svendson, Tove 2 Kent, Clark
3 Svendson, Stephen 3 Svendson, Stephen
4 Pettersen, Kari 4 Scott, Stephen
P_Name
SELECT P_Name Hansen, Ola
FROM Personal_Noruega Svendson, Tove
UNION Svendson, Stephen
SELECT P_Name Pettersen, Kari
FROM Personal_USA Turner, Sally
Kent, Clark
Scott, Stephen
SQL avanzado
BASES DE DATOS
UNION ALL
Personal_Noruega Personal_USA
P_ID P_Name P_ID P_Name
1 Hansen, Ola 1 Turner, Sally
2 Svendson, Tove 2 Kent, Clark
3 Svendson, Stephen 3 Svendson, Stephen
4 Pettersen, Kari 4 Scott, Stephen
P_Name
Hansen, Ola
SELECT P_Name
Svendson, Tove
FROM Personal_Noruega Svendson, Stephen
UNION ALL Pettersen, Kari
SELECT P_Name Turner, Sally
FROM Personal_USA Kent, Clark
Svendson, Stephen
Scott, Stephen
SQL avanzado