Introducción
a SQL
◆
Structured
Query Language (
◆
Lenguaje
declarativo de acceso a bases de datos que combina
construcciones del álgebra relacional y el cálculo relacional.
◆
Originalmente desarrollado
en los '70 por IBM en su Research
Laboratory de San José a partir del cálculo de predicados creado por
Codd.
◆
Lenguaje
estándar de facto en los SGBD comerciales
◆
Estándares:
◼
SEQUEL(Structured
English QUEry Language), IBM 1976
◼
SQL
86 (ANSI SQL)
◼
SQL
89 (
◼
SQL
92 ( gran revisión del estándar
◼
SQL:1999
( Añade disparadores, algo de OO,
◼
SQL:2003. Añade XML,
secuencias y columnas autonuméricas.
Parámetros de Perforación y Voladura. para Plataformas
P1_SQL_Repaso.pdf
1. Lenguaje SQL 1
Bases de Datos
SQL
Introducción a SQL
◆ Structured Query Language (SQL)
◆ Lenguaje declarativo de acceso a bases de datos que combina
construcciones del álgebra relacional y el cálculo relacional.
◆ Originalmente desarrollado en los '70 por IBM en su Research
Laboratory de San José a partir del cálculo de predicados creado por
Codd.
◆ Lenguaje estándar de facto en los SGBD comerciales
◆ Estándares:
◼ SEQUEL(Structured English QUEry Language), IBM 1976
◼ SQL-86 (ANSI SQL)
◼ SQL-89 (SQL1)
◼ SQL-92 (SQL2), gran revisión del estándar
◼ SQL:1999 (SQL3), Añade disparadores, algo de OO, ...
◼ SQL:2003. Añade XML, secuencias y columnas autonuméricas.
Lenguaje SQL 2
2. Lenguaje SQL 3
Características de SQL
◆ El Lenguage de Definición de Datos (LDD)
◼ Proporciona comandos para la creación, borrado y modificación de
esquemas relacionales
◆ El Lenguaje de Manipulación de Datos (LMD)
◼ Basado en el álgebra relacional y el cálculo relacional permite realizar
consultas y adicionalmente insertar, borrar y actualizar de tuplas
◼ Ejecutado en una consola interactiva
◼ Embebido dentro de un lenguaje de programación de propósito general
◆ Definición de vistas
◆ Autorización
◼ Definición de usuarios y privilegios
◆ Integridad de datos
◆ Control de Transacciones
Estructura de la sentencia SELECT
- Nombre de las columnas
- Condiciones de selección de grupo
- Nombres de columnas
SELECT A1, …, An
FROM T1, …, Tn
WHERE P
GROUP BY Ai1, …, Ain
HAVING Q
ORDER BY Aj1, …, Ajn
-Describe la salida deseada con:
•Nombres de columnas
•Expresiones aritméticas
•Literales
•Funciones escalares
•Funciones de columna
- Nombres de las tablas / vistas
- Condiciones de selección de filas
Lenguaje SQL 4
3. Lenguaje SQL 5
Estructura básica de la sentencia SELECT
◆ Consta de tres cláusulas: SELECT, FROM y WHERE.
◼ SELECT corresponde a la operación de proyección del álgebra
relacional.
⚫ La lista de los atributos que se incluirán en el resultado de una consulta.
◼ FROM corresponde al producto cartesiano del álgebra relacional.
⚫ Especifica las relaciones que se van a usar como origen en el proceso de
la consulta.
◼ WHERE corresponde al predicado de selección del álgebra relacional.
⚫ Consta de un predicado que implica atributos de las relaciones de la
cláusula FROM.
Estructura básica de la sentencia SELECT
◆ Una consulta SQL tiene la forma:
SELECT A1, ..., An
FROM R1, ..., Rm
WHERE P;
/* Lista de atributos */
/* Lista de relaciones */
/* Condición. Cláusula OPCIONAL */
◼ Es posible que existan el mismo nombre de atributo en dos relaciones
distintas.
◼ Se añade "NOMBRE_RELACION." antes del nombre para desambiguar.
◆ Es equivalente a la siguiente expresión del álgebra relacional:
A1,A2,...,An ( P ( R1 R2 … Rm ) )
◆ El orden de ejecución de la expresión anterior es el mismo que el de la
consulta SQL.
◆ ADVERTENCIA: la selección del AR y el SELECT de SQL no
funcionan igual.
◼ El resultado de una consulta SELECT puede tener tuplas repetidas.
Lenguaje SQL 6
4. Lenguaje SQL 7
Proyección de algunas columnas
DEPTNO DEPTNAME ADMRDEPT
A00 SPIFFY COMPUTER SERVICE DIV. A00
B01 PLANNING A00
C01 INFORMATION CENTER A00
D01 DEVELOPMENTCENTER A00
D11 MANUFACTURING SYSTEMS D01
D21 ADMINISTRATION SYSTEMS D01
E01 SUPPORT SERVICES A00
E11 OPERATIONS E01
E21 SOFTWARE SUPPORT E01
SELECT DEPTNO, DEPTNAME, ADMRDEPT
FROM DEPARTMENT
Lenguaje SQL 8
Eliminación de filas duplicadas
◆ SQL permite duplicados debido a la gran cantidad de tiempo
que puede llevar eliminarlos
◆ Para eliminar las tuplas repetidas se utiliza la cláusula
DISTINCT.
◆ También es posible pedir explícitamente la inclusión de
tuplas repetidas mediante el uso de la cláusula ALL.
ADMRDEPT
A00
A00
A00
A00
D01
D01
A00
E01
E01
SELECT ADMRDEPT
FROM DEPARTMENT
A00
D01
E01
SELECT DISTINCT ADMRDEPT
FROM DEPARTMENT
ADMRDEPT
SELECT ALL ADMRDEPT
FROM DEPARTMENT
5. Lenguaje SQL 9
Eliminación de filas duplicadas
A00
A00
A00
B01
C01
C01
D11
D11
D21
D21
E01
E11
E11
E21
E21
CLERK
PRES
SALESREP
MANAGER
ANALYST
MANAGER
DESIGNER
MANAGER
CLERK
MANAGER
MANAGER
MANAGER
OPERATOR
FIELDREP
MANAGER
WORKDEPT, JOB
◆ ¿Qué trabajos realiza cada departamento?
SELECT DISTINCT
FROM EMPLOYEE
WORKDEPT JOB
Proyección de todos los atributos
◆ Se puede pedir la proyección de todos los atributos de la
consulta mediante utilizando el símbolo '*'
◼ La tabla resultante contendrá todos los atributos de las tablas que
aparecen en la cláusula FROM.
SELECT * FROM DEPARTMENT
MGRNO ADMRDEPT LOCATION
DEPTNO DEPTNAME
A00 SPIFFY COMPUTER SERVICE DIV. 000010 A00
B01 PLANNING 000020 A00
C01 INFORMATION CENTER 000030 A00
D01 DEVELOPMENTCENTER - - - - - - A00
D11 MANUFACTURING SYSTEMS 000060 D01
D21 ADMINISTRATION SYSTEMS 000070 D01
E01 SUPPORT SERVICES 000050 A00
E11 OPERATIONS 000090 E01
E21 SOFTWARE SUPPORT 000100 E01
Lenguaje SQL 10
6. Lenguaje SQL 11
Salida ordenada
◆ SQL permite controlar el orden en el que se presentan las
tuplas de una relación mediante la cláusula ORDER BY.
◆ La cláusula ORDER BY tiene la forma
ORDER BY A1 <DIRECCION>, ..., An <DIRECCION>
◼ A1, ..., An son atributos de la relación resultante de la consulta
◼ Ai <DIRECCION> controla si la ordenación es Ascendente 'ASC' o
descendente 'DESC' por el campo Ai. Por defecto la ordenación se
realiza de manera ascendente.
◆ La ordenación se realiza tras haber ejecutado la consulta
sobre las tuplas resultantes.
◆ La ordenación puede convertirse en una operación costosa
dependiendo del tamaño de la relación resultante.
Salida ordenada (cont.)
SELECT DEPTNO, DEPTNAME, ADMRDEPT
FROM DEPARTMENT
ORDER BY ADMRDEPT ASC
DEPTNO DEPTNAME ADMRDEPT
A00 SPIFFY COMPUTER SERVICE DIV. A00
C01 INFORMATION CENTER A00
B01 PLANNING A00
E01 SUPPORTSERVICES A00
D01 DEVELOPMENTCENTER A00
D11 MANUFACTURING SYSTEMS D01
D21 ADMINISTRATION SYSTEMS D01
E21 SOFTWARE SUPPORT E01
E11 OPERATIONS E01
Lenguaje SQL 12
7. Lenguaje SQL 13
Salida ordenada (cont.)
SELECT DEPTNO, DEPTNAME, ADMRDEPT
FROM DEPARTMENT
ORDER BY ADMRDEPT ASC, DEPTNO DESC
SUPPORT SERVICES
DEVELOPMENT CENTER
INFORMATION CENTER
ADMINISTRATION SYSTEMS
MANUFACTURING SYSTEMS
SOFTWARE SUPPORT
OPERATIONS
DEPTNO
ADMRDEPT DEPTNAME
A00
A00
A00
A00
A00
D01
D01
E01
E01
E01
D01
C01
PLANNING B01
SPIFFY COMPUTER SERVICE DIV. A00
D21
D11
E21
E11
Salida ordenada (cont.)
◆ En Oracle, IBM DB2 y MS-SQL Server entre otros es
posible indicar la columna de ordenación mediante un entero
◼ El entero hace referencia a la posición de la columna en la relación
resultante de la consulta
SELECT LASTNAME, FIRSTNME, WORKDEPT, JOB, SEX
FROM EMPLOYEE
ORDER BY WORKDEPT DESC, JOB, LASTNAME, SEX DESC
ORDER BY WORKDEPT DESC, JOB ASC, LASTNAME ASC, SEX DESC
ORDER BY 3 DESC, 4, 1, 5 DESC
ORDER BY 3 DESC, 4 ASC, 1 ASC, 5 DESC
ORDER BY 3 DESC, JOB, LASTNAME, 5 DESC
ORDER BY WORKDEPT DESC, 4 ASC, 1 ASC, SEX DESC
Lenguaje SQL 14
8. Lenguaje SQL 15
Selección de filas
◆ La cláusula WHERE permite filtrar las filas de la relación resultante.
◼ La condición de filtrado se especifica como un predicado.
◆ El predicado de la cláusula WHERE puede ser simple o complejo
◼ Se utilizan los conectores lógicos AND, OR y NOT en lugar de los símbolos
matemáticos .
◆ Las expresiones pueden contener
◼ Predicados de comparación
◼ BETWEEN / NOT BETWEEN
◼ IN / NOT IN (con y sin subconsultas)
◼ LIKE / NOT LIKE
◼ IS NULL / IS NOT NULL
◼ ALL, SOME/ANY (subconsultas)
◼ EXISTS (subconsultas)
Selección de filas (cont.)
◆ Predicados de comparación
◼ Operadores: =, <> (es el ≠), <, <=, >=. >
◆ BETWEEN es el operador de comparación para intervalos de
valores o fechas.
◆ IN es el operador que permite comprobar si un valor se
encuentra en un conjunto.
◼ Puede especificarse un conjunto de valores.
◼ Puede utilizarse el resultado de otra consulta.
Lenguaje SQL 16
9. Lenguaje SQL 17
Selección de filas (cont.)
◆ LIKE es el operador de comparación de cadenas de
caracteres.
◼ SQL distingue entre mayúsculas y minúsculas
◼ Las cadenas de caracteres se incluyen entre comillas simples
◼ SQL permite definir patrones a través de los siguientes caracteres:
⚫ '%', que es equivalente a "cualquier subcadena de caracteres"
⚫ '_', que es equivalente a "cualquier carácter"
◆ IS NULL es el operador de comparación de valores nulos.
Ejemplo de selección de filas
◆ ¿Qué departamentos reportan al A00?
SELECT DEPTNO, ADMRDEPT
FROM DEPARTMENT
WHERE ADMRDEPT='A00'
DEPTNO ADMRDEPT
A00
B01
C01
D01
E01
A00
A00
A00
A00
A00
Lenguaje SQL 18
10. Lenguaje SQL 19
Ejemplo de selección de filas
◆ Necesito el apellido y el nivel de formación de los empleados
cuyo nivel de formación es mayor o igual a 19
SELECT LASTNAME, EDLEVEL
FROM EMPLOYEE
WHERE EDLEVEL >= 19
Ejemplo de selección de filas
◆ Necesito el número de empleado, apellido y fecha de
nacimiento de aquellos que hayan nacido después del 1 de
enero de 1955 (inclusive).
SELECT EMPNO, LASTNAME, BIRTHDATE
FROM EMPLOYEE
WHERE BIRTHDATE >='1955-01-01'
ORDER BY BIRTHDATE
BIRTHDATE
EMPNO LASTNAME
000160 PIANKA
000100 SPENCER
1955-04-12
1956-12-18
Lenguaje SQL 20
11. Lenguaje SQL 21
Múltiples condiciones - AND
◆ Necesito el número de empleado, el trabajo y el nivel de
formación de los analistas con un nivel de educación 16
SELECT EMPNO, JOB, EDLEVEL
FROM EMPLOYEE
WHERE JOB='ANALYST' AND EDLEVEL=16
EMPNO JOB EDLEVEL
000130 ANALYST 16
Múltiples condiciones – AND/OR
◆ Obtener el número de empleado, el trabajo y el nivel de
formación de todos los analistas con un nivel 16 y de todos
los empleados de nivel 18. La salida se clasifica por trabajo y
nivel SELECT EMPNO, JOB, EDLEVEL
FROM EMPLOYEE
WHERE (JOB='ANALYST' AND EDLEVEL=16)
OR EDLEVEL=18
ORDER BY JOB, EDLEVEL
EMPNO JOB EDLEVEL
000130 ANALYST 16
000140 ANALYST 18
000220 DESIGNER 18
000020 MANAGER 18
000010 PRES 18
Lenguaje SQL 22
12. Lenguaje SQL 23
SELECT con BETWEEN
◆ Obtener el número de empleado y el nivel de todos los
empleados con un nivel entre 12 y 15
SELECT EMPNO, EDLEVEL
FROM EMPLOYEE
WHERE EDLEVEL BETWEEN 12 AND 15
ORDER BY EDLEVEL
EMPNO EDLEVEL
000310 12
000290 12
000300 14
000330 14
000100 14
000230 14
000120 14
000270 15
000250 15
SELECT con IN
◆ Listar los apellidos y nivel de formación de todos los
empleados de nivel 14, 19 o 20.
◼ El resultado clasificado por nivel y apellido
SELECT LASTNAME, EDLEVEL
FROM EMPLOYEE
WHERE EDLEVEL IN (14, 19, 20)
ORDER BY EDLEVEL, LASTNAME
LASTNAME EDLEVEL
JEFFERSON
LEE
O'CONNELL
SMITH
SPENSER
LUCCHESI
KWAN
14
14
14
14
14
19
20
Lenguaje SQL 24
13. Lenguaje SQL 25
Selección de valores NULL
◆ Listar el número y el nombre de los departamentos sin
director asignado
SELECT DEPTNO, DEPTNAME, MGRNO
FROM DEPARTMENT
WHERE MGRNO IS NULL;
DEPTNO DEPTNAME MGRNO
- - - - - -
D01 DEVELOPMENTCENTER
Búsqueda parcial - LIKE
◆ Obtener el apellido de todos los empleados cuyo apellido
empiece por G
SELECT LASTNAME
FROM EMPLOYEE
WHERE LASTNAME LIKE 'G%';
Lenguaje SQL 26
14. Lenguaje SQL 27
SELECT LASTNAME
FROM EMPLOYEE
WHERE LASTNAME LIKE '%SON';
Búsqueda parcial – LIKE
Ejemplos con %
THOMPSON
HENDERSON
ADAMSON
JEFFERSON
JOHNSON
THOMPSON
ADAMSON
MARINO
SELECT LASTNAME
FROM EMPLOYEE
WHERE LASTNAME LIKE '%M%N%';
Búsqueda parcial – LIKE
Ejemplos con _
◆ ¿Qué empleados tienen una C como segunda letra de su
apellido?
SELECT LASTNAME
FROM EMPLOYEE
WHERE LASTNAME LIKE '_C%';
Lenguaje SQL 28
15. Lenguaje SQL 29
Búsqueda parcial – NOT LIKE
◆ Necesito todos los departamentos excepto aquellos cuyo
número empiece por 'D'
SELECT DEPTNO, DEPTNAME
FROM DEPARTMENT
WHERE DEPTNO NOT LIKE 'D%';
DEPTNO DEPTNAME
SPIFFY COMPUTER SERVICE DIV.
PLANNING
INFORMATION CENTER
SUPPORT SERVICES
OPERATIONS
SOFTWARE SUPPORT
A0
B0
C0
E0
E1
E2
0
1
1
1
1
1
Renombramiento de columnas
SELECT EMPNO, SALARY, COMM,
SALARY+COMM AS INCOME
FROM EMPLOYEE
WHERE SALARY < 20000
ORDER BY EMPNO
EMPNO SALARY COMM INCOM
E
000210 18270.00 1462.00 19732.0
0
000250 19180.00 1534.00 20714.0
0
000260 17250.00 1380.00 18630.0
0
000290 15340.00 1227.00 16567.0
0
000300 17750.00 1420.00 19170.0
0
000310 15900.00 1272.00 17172.0
0
000320 19950.00 1596.00 21546.0
Lenguaje SQL 30
16. Lenguaje SQL 31
Renombramiento de tablas
◆ Es posible obtener “copias” de una tabla situando etiquetas
junto al nombre de las tablas.
◆ Ejemplo: en el siguiente esquema de base de datos,
queremos obtener el nombre de los empleados con al menos
dos hijos.
EMP (DNI, NOM) HIJOS (DNI, NOMH)
SELECT NOM
FROM EMP, HIJOS H1, HIJOS H2
WHERE EMP.DNI = H1.DNI AND EMP.DNI = H2.DNI AND
H1.NOMH <> H2.NOMH;
◆ Realiza el producto cartesiano de las tres tablas y da como
resultado aquellas tuplas con igual DNI en las tres y con
distinto nombre en los hijos. ¿Solución a la repetición de
nombres de distintos empleados?
Renombramiento de tablas (cont.)
◆ Utilizar clausula DISTINCT (elimina filas repetidas) e
incluir la clave de la tabla:
SELECT DISTINCT EMP.NOM, EMP.DNI
FROM EMP, HIJOS H1, HIJOS H2
WHERE EMP.DNI = H1.DNI AND EMP.DNI = H2.DNI AND
H1.NOMH <> H2.NOMH;
◆ Ejemplo: en el siguiente esquema de base de datos, se piden
los apellidos de cada empleado y de su supervisor.
◆ EMP (DNI, NOM, AP, SUELDO, ND, DNISUPERV)
SELECT E.AP, S.AP
FROM EMP E, EMP S
WHERE E.DNISUPERV = S.DNI;
◆ Las etiquetas también sirven para desambiguar.
Lenguaje SQL 32
17. Lenguaje SQL 33
Tipos SQL y valores literales
◆ La norma SQL define un conjunto de tipos para las columnas
de las tablas.
◼ Habitualmente cada SGBD tiene tipos propios o particularidades
para los tipos de la norma SQL.
◆ Es necesario consultar el manual del SGBD para obtener
información acerca de los tamaños máximos de
almacenamiento.
◼ En el caso de cadenas, cual es la longitud máxima de
almacenamiento.
◼ En el caso de tipos numéricos, cual es el rango de valores posibles.
Tipos SQL y valores literales
Tipo Ejemplo
BIGINT 8589934592
INTEGER 186282
SMALLINT 186
NUMERIC(8,2) 999999.99 (precisión, escala)
DECIMAL(8,2) 999999.99 (precisión, escala)
REAL 6.02257E23
DOUBLE PRECISION 3.141592653589
FLOAT 6.02257E23
CHARACTER(max) 'GREECE ' (15 caracteres)
VARCHAR(n) 'hola'
DATE date 'YYYY-MM-DD'
TIME time 'hh:mm:ss.ccc'
TIMESTAMP timestamp 'YYYY-MM-DD hh:mm:ss.ccc'
Lenguaje SQL 34
18. Lenguaje SQL 35
Expresiones
◆ Aunque SQL no es un lenguaje de programación de
propósito general, permite definir expresiones calculadas.
◆ Estas expresiones pueden contener
◼ Referencias a columnas
◼ Valores literales
◼ Operadores aritméticos
◼ Llamadas a funciones
◆ Los operadores aritméticos son los habituales: +, -, * y /
◼ Estos operadores sólo funcionan con valores numéricos.
◼ Los operadores '+' y '–' habitualmente funcionan para fechas.
◆ Aunque las normas SQL definen un conjunto mínimo de
funciones, los SGBD proporcionan una gran variedad.
◼ Es necesario consultar el manual del SGBD particular.
Funciones matemáticas comunes
Descripción IBM DB2
SQL
Server
Oracle MySQL
Valor absoluto ABSs ABS ABS ABS
Menor entero >= valor CEIL CEILING CEIL CEILING
Menor entero <= valor FLOOR FLOOR FLOOR FLOOR
Potencia POWER POWER POWER POWER
Redondeo a un número
de cifras decimales
ROUND ROUND ROUND ROUND
Devuelve el resto % MOD. % MOD. %
Lenguaje SQL 36
19. Lenguaje SQL 37
Descripción IBM DB2 SQL Server Oracle MySQL
Convierte todos los caracteres a
minúsculas
LOWER LOWER LOWER LOWER
Convierte todos los caracteres a
mayúsculas
UPPER UPPER UPPER UPPER
Elimina los blancos del final de la
cadena
RTRIM RTRIM RTRIM RTRIM
Elimina los blancos del comienzo
de la cadena
LTRIM LTRIM LTRIM LTRIM
Devuelve una subcadena SUBSTR SUBSTRING SUBSTR SUBSTRING
Concatena dos cadenas CONCAT + CONCAT CONCAT
Funciones de cadena
Operaciones aritméticas
◆ Necesito obtener el salario, la comisión y los ingresos totales
de todos los empleados que tengan un salario menor de
20000€ , clasificado por número de empleado
SELECT EMPNO, SALARY, COMM,
SALARY + COMM
FROM EMPLOYEE
WHERE SALARY < 20000
ORDER BY EMPNO
EMPNO SALARY COMM
000210 18270.00 1462.00 19732.00
000250 19180.00 1534.00 20714.00
000260 17250.00 1380.00 18630.00
000290 15340.00 1227.00 16567.00
000300 17750.00 1420.00 19170.00
000310 15900.00 1272.00 17172.00
000320 19950.00 1596.00 21546.00
Lenguaje SQL 38
20. Lenguaje SQL 39
Operaciones aritméticas (cont.)
SELECT EMPNO, SALARY,
SALARY*1.0375
FROM EMPLOYEE
WHERE SALARY < 20000
ORDER BY EMPNO
SALARY
EMPNO
18270.00
19180.00
17250.00
15340.00
17750.00
15900.00
19950.00
18955.125000
19899.250000
17896.875000
15915.250000
18415.625000
16496.250000
20698.125000
000210
000250
000260
000290
000300
000310
000320
Expresiones en predicados
SELECT EMPNO, SALARY,
(COMM/SALARY)*100
FROM EMPLOYEE
WHERE (COMM/SALARY) * 100 > 8
ORDER BY EMPNO
EMPNO COMM SALARY
000140 2274.00 28420.00 8.001400
000210 1462.00 18270.00 8.002100
000240 2301.00 28760.00 8.000600
000330 2030.00 25370.00 8.001500
Lenguaje SQL 40
21. Lenguaje SQL 41
Uso de funciones
SELECT EMPNO, SALARY,
TRUNC(SALARY*1.0375, 2)
FROM EMPLOYEE
WHERE SALARY < 20000
ORDER BY EMPNO
EMPNO SALARY
000210 18270.00 18955.12
000250 19180.00 19899.25
000260 17250.00 17896.87
000290 15340.00 15915.25
000300 17750.00 18415.62
000310 15900.00 16496.25
000320 19950.00 20698.12
Uso de funciones (cont.)
SELECT CONCAT(LASTNAME || ',', FIRSTNAME ) AS NAME
FROM EMPLOYEE
WHERE WORKDEPT = 'A00'
ORDER BY NAME
NAME
HAAS, CHRISTA
LUCCHESI, VINCENZO
O'CONNELL, SEAN
Lenguaje SQL 42
22. Lenguaje SQL 43
Operadores de conjunto
◆ SQL incluye las operaciones:
◼ UNION
◼ INTERSECT
◼ EXCEPT (MINUS en Oracle)
◆ Por definición los operadores de conjunto eliminan las tuplas
duplicadas.
◼ Para retener duplicados se debe utilizar <Operador> ALL
UNION - Concepto
UNION
R
R
Y
Y
Y
Y
Y
R
R
Y
Y
R
R
Y
Y
Lenguaje SQL 44
23. Lenguaje SQL 45
UNION
LASTNAME EDLEVEL
LASTNAME
HAAS
LUTZ
LASTNAME
HAAS
LUTZ
QUINTANA
THOMPSON
NICHOLLS 18
QUINTANA 16
EDLEVEL
18
18
NICHOLLS 18
THOMPSON 18
EDLEVEL
18
18
NICHOLLS 18
16
18
SELECT
FROM
WHERE
UNION
SELECT
FROM
WHERE
LASTNAME, EDLEVEL
EMPLOYEE
JOB = 'ANALYST'
LASTNAME, EDLEVEL
EMPLOYEE
EDLEVEL = 18
SELECT
FROM
WHERE
LASTNAME, EDLEVEL
EMPLOYEE
EDLEVEL = 18
SELECT
FROM
WHERE
LASTNAME, EDLEVEL
EMPLOYEE
JOB = 'ANALYST'
UNION
◆ Cada SELECT debe tener el mismo número de columnas
◆ Las columnas correspondientes deben tener tipos de datos
compatibles
◆ UNION elimina duplicados
◆ Si se indica, el ORDER BY debe ser la última cláusula de la
sentencia
Lenguaje SQL 46
24. Lenguaje SQL 47
UNION
DEPTNAME
MGRNO
000010 Mgr.: HAAS
000010 Dept.: SPIFFY COMPUTER SERVICE DIV.
000020 Mgr.: THOMPSON
000020 Dept.: PLANNING
000030 Mgr.: KWAN
000030 Dept.: INFORMATION CENTER
000050 Mgr.: GEYER
000050 Dept.: SUPPORT SERVICES
Cada entrada debe tener 2 lineas: la
primera debe incluir el número y
nombre del director y la seguna el
número y el nombre del
departamento. MGRNO , 'Dept.:', DEPTNAME
DEPARTMENT
MGRNO, 'Mgr.:', LASTNAME
SELECT
FROM
UNION
SELECT
FROM
WHERE
DEPARTMENT D, EMPLOYEE E
D.MGRNO = E.EMPNO
ORDER BY 1,2 DESC
UNION
EMPNO LASTNAME INCOME SORT
SUM:
M.L THOMPSON
000010 C.I HAAS
000010
000010
000010
000020
000020
000020
000.020 SUM:.
.
52750.00
1000.00
4220.00
57970.00
41250.00
800.00
3300.00
4535.0.00
1
2
3
4
1
2
3
4.
SELECT EMPNO, SUBSTR(FIRSTNME, 1, 1) || '.' || MIDINT,
LASTNAME, SALARY AS INCOME, 1 AS SORT FROM EMPLOYEE
UNION
SELECT EMPNO, '', '', BONUS, 2 AS SORT FROM EMPLOYEE
UNION
SELECT EMPNO, '', '', COMM, 3 AS SORT FROM EMPYOYEE
UNION
SELECT EMPNO, '', 'SUM:', SALARY+BONUS+COMM, 4 AS SORT FROM EMPLOYEE
ORDER BY EMPNO, SORT
Lenguaje SQL 48
25. Lenguaje SQL 49
UNION ALL. Concepto
UNIONALL
R
R
Y
Y
Y
Y
Y
R
R
Y
Y
R
R
Y
Y
Y
UNION ALL. Concepto
LASTNAME
HAAS
THOMPSON
LASTNAME
QUINTANA
HAAS
THOMPSON
LASTNAME
QUINTANA
NICHOLLS
EDLEVEL
16
18
EDLEVEL
18
18
NICHOLLS 18
LUTZ 18
EDLEVEL
16
NICHOLLS 18
18
18
NICHOLLS 18
LUTZ 18
SELECT
FROM
WHERE
UNION ALL
SELECT
FROM
WHERE
LASTNAME, EDLEVEL
EMPLOYEE
JOB = 'ANALYST'
LASTNAME, EDLEVEL
EMPLOYEE
EDLEVEL = 18
SELECT
FROM
WHERE
LASTNAME, EDLEVEL
EMPLOYEE
EDLEVEL = 18
SELECT
FROM
WHERE
LASTNAME, EDLEVEL
EMPLOYEE
JOB = 'ANALYST'
Lenguaje SQL 50
26. Lenguaje SQL 51
Consultar más de una tabla
WORKDEPT. . .
DEPARTMENT
EMPLOYEE
EMPNO LASTNAME
DEPTNO DEPTNAME . . .
A00 SP IFFY COMPUTER SERVICE DIV.
C01 INFORMATION CENTER
D01 DEVELOPMENT CENTER
D21 ADMINISTRATION SYSTEMS
A00
C01
C01
D21
000010 HAAS
000020 THOMPSON
000030 KWAN
000040 PULASKI
Sintaxis del JOIN: formato 1
000010 HAAS A00 SPIFFY COMPUTER SERVICE DIV.
SELECT
FROM
WHERE
AND
EMPNO, LASTNAME, WORKDEPT, DEPTNAME
EMPLOYEE,
DEPARTMENT
WORKDEPT = DEPTNO
LASTNAME = 'HAAS'
EMPNO LASTNAME WORKDEPT DEPTNAME
Lenguaje SQL 52
27. Diferentes tipos de SQL JOIN
Estos son los diferentes tipos de JOIN en SQL:
• (INNER) JOIN: Devuelve registros que tienen valores
coincidentes en ambas tablas
• LEFT (OUTER) JOIN: Devuelve todos los registros de la
tabla de la izquierda y los registros coincidentes de la tabla de la
derecha.
• RIGHT (OUTER) JOIN: Devuelve todos los registros de la
tabla de la derecha y los registros coincidentes de la tabla de la
izquierda.
• FULL (OUTER) JOIN: Devuelve todos los registros cuando
hay una coincidencia en la tabla izquierda o derecha
Lenguaje SQL 52
28. Lenguaje SQL 53
JOIN de tres tablas
DEPARTMENT
EMPLOYEE
DEPTNO DEPTNAME MGRNO . . .
A00 SPIFFY COMPUTER SERVICE DIV. 000010
B01 PLANNING 000020
C01 INFORMATION CENTER 000030
D01 DEVELOPMENT CENTER - - - - - -
D11 MANUFACTURING SYSTEMS 000060
D21 ADMINISTRATION SYSTEMS 000070
E01 SUPPORT SERVICES 000050
PROJECT
EMPNO FIRSTNME MIDINIT LASTNAME . . .
000010 CHRISTA I HAAS
000020 MICHAEL L THOMPSON
000030 SALLY A KWAN
000050 JOHN B GEYER
000060 IRVING F STERN
000070 EVA D PULASKI
000090 EILEEN W HENDERSON
000100 THEODORE Q SPENSER
PROJNO PROJNAME DEPTNO . . .
AD3100 ADMIN SERVICES D01
AD3110 GENERAL AD SYSTEMS D21
AD3111 PAYROLL PROGRAMMING D21
AD3112 PERSONELL PROGRAMMING D21
AD3113 ACCOUNT. PROGRAMMING D21
IF1000 QUERY SERVICES C01
JOIN de tres tablas
DEPTNO DEPTNAME MGRNO LASTNAME
PROJNO
AD3110 D21 ADMINISTRATION SYSTEMS 000070 PULASKI
AD3111 D21 ADMINISTRATION SYSTEMS 000070 PULASKI
AD3112 D21 ADMINISTRATION SYSTEMS 000070 PULASKI
AD3113 D21 ADMINISTRATION SYSTEMS 000070 PULASKI
SELECT PROJNO, PROJECT.DEPTNO, DEPTNAME, MGRNO, LASTNAME
FROM PROJECT,
DEPARTMENT,
EMPLOYEE
WHERE
AND
AND
ORDER BY
PROJECT.DEPTNO = DEPARTMENT.DEPTNO
DEPARTMENT.MGRNO = EMPLOYEE.EMPNO
DEPARTMENT.DEPTNO = 'D21'
PROJNO
Lenguaje SQL 54
29. Lenguaje SQL 55
Nombre de correlación (P, D, E)
PROJNO DEPTNO DEPTNAME MGRNO LASTNAME
AD3110 D21 ADMINISTRATION SYSTEMS 000070 PULASKI
AD3111 D21 ADMINISTRATION SYSTEMS 000070 PULASKI
AD3112 D21 ADMINISTRATION SYSTEMS 000070 PULASKI
AD3113 D21 ADMINISTRATION SYSTEMS 000070 PULASKI
SELECT PROJNO, P.DEPTNO, DEPTNAME, MGRNO, LASTNAME
FROM PROJECT P,
DEPARTMENT D,
EMPLOYEE E
WHERE P.DEPTNO = D.DEPTNO
AND D.MGRNO = E.EMPNO
AND D.DEPTNO = 'D21'
ORDER BY PROJNO
JOIN de una tabla consigo misma
2. Recuperar el nº deparatamento de DEPARTMENT (D)
3. Recuperar el director en EMPLOYEE (M)
DEPTNO DEPTNAME MGRNO ADMRDEPT
. . . .
. . . .
E21 SOFTWARE SUPPORT 000100 E21
EMPNO . . . LASTNAME WORKDEPT . . . BIRTHDATE . . .
000100 SPENSER E21 1956-12-18
000330 LEE E21 1941-07-18
EMPNO . . . LASTNAME WORKDEPT . . . BIRTHDATE . . .
000100 SPENSER E21 1956-12-18
000330 LEE E21 1941-07-18
1. Recuperar la fila de un empleado de la tabla EMPLOYEE (E)
Lenguaje SQL 56
30. Lenguaje SQL 57
JOIN de una tabla consigo misma
¿Qué empleados
son mayores que
su director? SELECT
FROM
WHERE
E.EMPNO, E.LASTNAME,
E.BIRTHDATE, M.BIRTHDATE, M.EMPNO
EMPLOYEE E, EMPLOYEE M,
DEPARTMENT D
E.WORKDEPT = D.DEPTNO
AND D.MGRNO = M.EMPNO
AND E.BIRTHDATE < M.BIRTHDATE
EMPNO LASTNAME BIRTHDATE BIRTHDATE EMPNO
000110 LUCCHESI 1929-11-05 1933-08-14 000010
000130 QUINTANA 1925-09-15 1941-05-11 000030
000200 BROWN 1941-05-29 1945-07-07 000060
000230 JEFFERSON 1935-05-30 1953-05-26 000070
000250 SMITH 1939-11-12 1953-05-26 000070
000260 JOHNSON 1936-10-05 1953-05-26 000070
000280 SCHNEIDER 1936-03-28 1941-05-15 000090
000300 SMITH 1936-10-27 1941-05-15 000090
000310 SETRIGHT 1931-04-21 1941-05-15 000090
000320 MEHTA 1932-08-11 1956-12-18 000100
000330 LEE 1941-07-18 1956-12-18 000100
000340 GOUNOT 1926-05-17 1956-12-18 000100
RESULTA
DO
EMPNO LA
STNA
ME DEPTNO DEPTNAME
000010 HAAS A00 SPIFFY COMPUTER SERVICE DIV.
000120 O'CONNELL A00 SPIFFY COMPUTER SERVICE DIV.
000030 KWAN C01 INFORMATION CENTER
000140 NICHOLLS C01 INFORMATION CENTER
000130 QUINTANA C01 INFORMATION CENTER
Sintaxis del JOIN: formato 2
SELECT EMPNO, LASTNAME, DEPTNO, DEPTNAME
FROM EMPLOYEE
[INNER] JOIN DEPARTMENT
ON WORKDEPT = DEPTNO
Lenguaje SQL 58
31. Lenguaje SQL 59
Otros JOIN: RIGHT [OUTER] JOIN
SELECT EMPNO, LASTNAME, DEPTNO, DEPTNAME
FROM EMPLOYEE
RIGHT OUTER JOIN DEPARTMENT
ON WORKDEPT = DEPTNO
RESULTADO
EMPNO LASTNAME DEPTNO DEPTNA
ME
000010 HAAS A00 SPIFFY COMPUTER SERVICE DIV.
000120 O'CONNELL A00 SPIFFY COMPUTER SERVICE DIV.
000030 KWAN C01 INFORMATION CENTER
000130 QUINTANA C01 INFORMATION CENTER
000140 NICHOLLS C01 INFORMATION CENTER
- - D01 DEVELOPMENT CENTER
Otros JOIN: LEFT [OUTER] JOIN
SELECT EMPNO, LASTNAME, DEPTNO, DEPTNAME
FROM EMPLOYEE
LEFT OUTER JOIN DEPARTMENT
ON WORKDEPT = DEPTNO
RESULTADO
EMPNO LASTNAME DEPTNO DEPTNAME
000010 HAAS A00 SPIFFY COMPUTER SERVICE DIV.
000030 KWAN C01 INFORMATION CENTER
000120 O'CONNELL A00 SPIFFY COMPUTER SERVICE DIV.
000130 QUINTANA C01 INFORMATION CENTER
000140 NICHOLLS C01 INFORMATION CENTER
000400 WILSON - -
Lenguaje SQL 60
32. Lenguaje SQL 61
Otros JOIN: FULL [OUTER] JOIN
SELECT EMPNO, LASTNAME, DEPTNO, DEPTNAME
FROM EMPLOYEE
FULL OUTER JOIN DEPARTMENT
ON WORKDEPT = DEPTNO
RESULTADO
EMPNO LA
STNAME DEPTNO DEPTNAME
000120 O'CONNELL A00 SPIFFY COMPUTER SERVICE DIV.
000010 HAAS A00 SPIFFY COMPUTER SERVICE DIV.
000030 KWAN C01 INFORMATION CENTER
000130 QUINTANA C01 INFORMATION CENTER
000140 NICHOLLS C01 INFORMATION CENTER
- - D01 DEVELOPMENT CENTER
000400 WILSON - -
JOINs y predicados locales
EMPNO LASTNAME W
ORKDEPT SALA
RY DEPTNO DEPTNAME MGRNO
000120 O'CONNELL A00 29250.00 A00 SPIFFY COMPUTER SERVICE DIV. 000010
000010 HAAS A00 52750.00 A00 SPIFFY COMPUTER SERVICE DIV. 000010
000030 KWAN C01 38250.00 C01 INFORMATION CENTER 000030
000130 QUINTANA C01 23800.00 C01 INFORMATION CENTER 000030
000140 NICHOLLS C01 28420.00 C01 INFORMATION CENTER 000030
- - - - D01 DEVELOPMENT CENTER -
000400 WILSON - 25400.00 - - -
SELECT EMPNO, LASTNAME, SALARY,
DEPTNO, DEPTNAME
FROM EMPLOYEE
FULL OUTER JOIN DEPARTMENT
ON WORKDEPT = DEPTNO
WHERE SALARY > 30000 AND
DEPTNAME LIKE '%CENTER%'
Lenguaje SQL 62
33. Lenguaje SQL 63
JOINs y predicados locales
EMPNO LASTNAME WORKDEPT SALARY DEPTNO DEPTNAME MGRNO
000120 O'CONNELL A00 29250.00 A00 SPIFFY COMPUTER SERVICE DIV. 000010
000010 HAAS A00 52750.00 A00 SPIFFY COMPUTER SERVICE DIV. 000010
000030 KWAN C01 38250.00 C01 INFORMATION CENTER 000030
000130 QUINTANA C01 23800.00 C01 INFORMATION CENTER 000030
000140 NICHOLLS C01 28420.00 C01 INFORMATION CENTER 000030
- - - - D01 DEVELOPMENT CENTER -
000400 WILSON - 25400.00 - - -
SELECT EMPNO, LASTNAME, SALARY,
DEPTNO, DEPTNAME
FROM EMPLOYEE
FULL OUTER JOIN DEPARTMENT
ON WORKDEPT = DEPTNO
WHERE SALARY > 30000 AND
DEPTNAME LIKE '%CENTER%'
DEPTNO DEPTNAME
EMPNO LASTNAME SALARY
000030 KWAN 38250.00 C01 INFORMATION CENTER
JOINs
◆ Resumen
◼ Existen 4 tipos de reunión y 3 condiciones de reunión que se pueden
combinar
◼ Tipos de reunión
⚫ INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL
OUTER JOIN
◼ Condiciones de reunión
⚫ ON <predicado>
Respecto al predicado
No elimina duplicados de atributos comunes
⚫ NATURAL
Respecto a todos los atributos comunes
Elimina duplicados de atributos comunes
⚫ USING (A1, …, An)
Respecto a los atributos comunes indicados entre paréntesis
Elimina duplicados de atributos comunes indicados
Lenguaje SQL 64
34. Lenguaje SQL 65
Funciones de columna
◆ Las funciones de columna o funciones de agregación son
funciones que toman una colección (conjunto o
multiconjunto) de valores de entrada y devuelve un solo
valor.
◆ Las funciones de columna disponibles son: AVG, MIN, MAX,
SUM, COUNT.
◆ Los datos de entrada para SUM y AVG deben ser una
colección de números, pero el resto de operadores pueden
operar sobre colecciones de datos de tipo no numérico.
Funciones de columna
◆ Por defecto las funciones se aplican a todas las tuplas
resultantes de la consulta.
◆ Podemos agrupar las tuplas resultantes para poder aplicar las
funciones de columna a grupos específicos utilizando la
cláusula GROUP BY.
◆ En la cláusula SELECT de consultas que utilizan funciones
de columna solamente pueden aparecer funciones de
columna.
◼ En caso de utilizar GROUP BY, también pueden aparecer columnas
utilizadas en la agrupación.
◆ Adicionalmente se pueden aplicar condiciones sobre los
grupos utilizando la cláusula HAVING.
Lenguaje SQL 66
35. Lenguaje SQL 67
Funciones de columna
◆ Cálculo del total → SUM (expresión)
◆ Cálculo de la media → AVG (expresión)
◆ Obtener el valor mínimo → MIN (expresión)
◆ Obtener el valor máximo → MAX (expresión)
◆ Contar el número de filas que satisfacen la condición de
búsqueda → COUNT(*)
◼ Los valores NULL SI se cuentan.
◆ Contar el número de valores distintos en una columna →
COUNT (DISTINCT nombre-columna)
◼ Los valores NULL NO se cuenta.
Funciones de columna
SUM AVG MIN MAX COUNT DEPT
873715.00 27303.59375000 15340.00 52750.00 32 8
SELECT SUM(SALARY) AS SUM,
AVG(SALARY) AS AVG,
MIN(SALARY ) AS MIN,
MAX(SALARY) AS MAX,
COUNT(*) AS COUNT,
COUNT(DISTINCT WORKDEPT) AS DEPT
FROM EMPLOYEE
Lenguaje SQL 68
36. Lenguaje SQL 69
Funciones de columna en subconjuntos
SUM
373020.0
0
373020.00
SELECT
FROM
WHERE
SUM(SALARY) AS SUM
EMPLOYEE
WORKDEPT LIKE 'D%'
Necesito el total de
salarios del área D
Lenguaje SQL 70
GROUP BY
SUM
WORKDEPT
Necesito conocer los salarios de todos los
empleados de los departamentos A00, B01,
y C01. Además, para estos departamentos
quiero conocer su masa salarial.
SELECT
FROM
WHERE
ORDER BY
WORKDEPT, SALARY
EMPLOYEE
WORKDEPT IN ('A00', 'B01', 'C01')
WORKDEPT
SELECT
FROM
WHERE
GROUP BY
ORDER BY
WORKDEPT
, SUM(SALARY) AS SUM
EMPLOYEE
WORKDEPT IN ('A00', 'B01', 'C01')
WORKDEPT
WORKDEPT
A00 128500.00
B01 41250.00
C01 90470.00
WORKDEPT
SALARY
A00 52750.00
A00 46500.00
A00 29250.00
B01 41250.00
C01 38250.00
C01 23800.00
C01 28420.00
37. Lenguaje SQL 71
GROUP BY-HAVING
SUM
A00
C01
Ahora sólo quiero ver los departamentos
cuya masa salarial sea superior a 50000
SELECT WORKDEPT, SUM(SALARY) AS SUM
FROM EMPLOYEE
WHERE WORKDEPT IN ('A00', 'B01', 'C01')
GROUP BY WORKDEPT
HAVING SUM(SALARY) > 50000
ORDER BY WORKDEPT
128500.00
90470.00
WORKDEPT
SELECT WORKDEPT, SUM(SALARY) AS SUM
FROM EMPLOYEE
WHERE WORKDEPT IN ('A00', 'B01', 'C01')
GROUP BY WORKDEPT
ORDER BY WORKDEPT
SUM
A00 128500.00
B01 41250.00
C01 90470.00
WORKDEPT
GROUP BY-HAVING
WORKDEPT JOB AVG
A00 CLERK 29250.00000000
A00 PRES 52750.00000000
A00 SALESREP 46500.00000000
C01 ANALYST 26110.00000000
Necesito, agrupado por departmento, los
trabajadores que no sean managers,
designer, y fieldrep, con una media de
salario mayor que 25000€.
SELECT WORKDEPT, JOBA
, VG(SALARY) AS AVG
FROM EMPLOYEE
WHERE JOB NOT IN ('MANAGER', 'DESIGNER', 'FIELDREP')
GROUP BY WORKDEPT, JOB
HAVING AVG(SALARY) > 25000
ORDER BY WORKDEPT, JOB
Lenguaje SQL 72
38. NUMB
WORKDEPT
SELECT 1 SELECT 2
B01
E01
1
1
WORKDEPT NUMB
A00 3 A00 3
C01 3 C01 3
E21 4 E21 4
E11 5 E11 5
D21 6 D21 6
D11 9 D11 9
Lenguaje SQL 73
SELECT WORKDEPT, COUNT(* ) AS NUMB
FROM EMPLOYEE
GROUP BY WORKDEPT
ORDER BY NUMB, WORKDEPT
SELECT WORKDEPT, COUNT(* ) AS NUMB
FROM EMPLOYEE
GROUP BY WORKDEPT
HAVING COUNT(*) > 1
ORDER BY NUMB, WORKDEPT
GROUP BY-HAVING
• Mostrar los departamentos con más de un empleado
GROUP BY-HAVING
ED YEARS
WORKDEPT
AVG(YEAR(CURRENT_DATE-HIREDATE))
AS YEARS E21 15 31
FROM EMPLOYEE E01 16 49
GROUP BY WORKDEPT A00 17 35
HAVING
ORDER BY
AVG(YEAR(CURRENT_DATE-HIREDATE)) > = 30
2
SELECT 1 WORKDEPT ED YEARS
SELECT WORKDEPT, AVG(EDLEVEL) AS ED, E11 14 27
AVG(YEAR(CURRENT_DATE-HIREDATE)) E21 15 31
AS YEARS D21 15 22
FROM EMPLOYEE E01 16 49
GROUP BY WORKDEPT D11 16 24
ORDER BY 2 A00 17 35
B01 18 24
C01 18 23
SELECT 2
SELECT WORKDEPT, AVG(EDLEVEL) AS ED,
Lenguaje SQL 74
39. Lenguaje SQL 75
GROUP BY-HAVING
SELECT 2
E01 16 800.00
E11 14 300.00
SELECT WORKDEPT, AVG(EDLEVEL) AS ED,
MIN(BONUS) AS MIN WORKDEPT ED MIN
FROM
GROUP BY
HAVING
ORDER BY
EMPLOYEE
WORKDEPT
MIN(BONUS) = 300
2
E11 14 300.00
D21 15 300.00
SELECT 1 WORKDEPT ED MIN
SELECT WORKDEPT, AVG(EDLEVEL) AS ED, A00 17 600.00
MIN(BONUS) AS MIN
FROM EMPLOYEE
B01
C01
18
18
800.00
500.00
GROUP BY WORKDEPT D11 16 400.00
D21 15 300.00
Ejecución de consultas SELECT
◆ El orden de ejecución de una consulta es el siguiente:
1. Se aplica el predicado WHERE a las tuplas del producto
cartesiano/join/vista que hay en el FROM.
2. Las tuplas que satisfacen el predicado de WHERE son
colocadas en grupos siguiendo el patrón GROUP BY.
3. Se ejecutan la cláusula HAVING para cada grupo de tuplas
anterior.
4. Los grupos obtenidos tras aplicar HAVING son los que
serán procesados por SELECT, que calculará, en los casos
que se incluyan, las funciones de agregación que le
acompañan.
5. A las tuplas resultantes de los pasos anteriores se le aplica
la ordenación descrita en la cláusula ORDER BY.
Lenguaje SQL 76
40. Lenguaje SQL 77
Expresión condicional CASE
◆ SQL tiene una sentencia CASE similar a la instrucción CASE
de los lenguajes de programación.
◆ La sintaxis general de esta expresión es:
◆ La expresión CASE puede aparecer tanto en la cláusula
SELECT como en la cláusula WHERE.
CASE
WHEN C1 THEN result1
WHEN C2 THEN result2
...
WHEN Cn THEN resultn
ELSE resultx
END
◼ Ci → Condiciones
◼ A → Columna
◼ Vi → Literal
CASE A
WHEN V1 THEN result1
WHEN V2 THEN result2
...
WHEN Vn THEN resultn
ELSE resultx
END
Ejemplo de expresión condicional CASE
SELECT EMPNO, FIRSTNME, MIDINIT, LASTNAME,
CASE
WHEN EDLEVEL < 15 THEN 'SECONDARY'
WHEN EDLEVEL < 19 THEN 'COLLEGE'
ELSE 'POST GRADUATE'
END AS EDUCATION
FROM EMPLOYEE
SELECT EMPNO, FIRSTNME,
LASTNAME,
CASE SEX
WHEN 'F' THEN 'FEMALE'
WHEN 'M' THEN 'MALE'
ELSE 'INVALID VALUE'
END AS SEX
FROM EMPLOYEE
WHERE SALARY < 18000
FIRSTNME LASTNAME SEX
EMPNO
000260
000290
000300
000310
SYBIL
JOHN
PHILIP
MAUDE
JOHNSON
PARKER
SMITH
SETRIGHT
FEMALE
MALE
MALE
FEMALE
Lenguaje SQL 78
41. Lenguaje SQL 79
Casos especiales de CASE
◆ Existen dos casos especiales de uso de la expresión CASE para los que
existe una expresión propia.
◼ NULLIF( exp, valor) → Devuelve NULL si al evaluar exp es igual a
valor.
CASE
WHEN exp = valor THEN NULL
ELSE exp
END
◼ COALESCE(valor1, …, valorn ) → Devuelve el primer valori que
no sea NULL. Si no existe se devuelve NULL.
CASE
WHEN valor1 IS NOT NULL THEN valor1
WHEN valor2 IS NOT NULL THEN valor2
WHEN valorn IS NOT NULL THEN valorn
ELSE NULL
END
Obtener resultados con varias consultas
◆ ¿Qué salarios son mayores que el salario medio?
1ra CONSULTA → SELECT AVG(SALARY)
FROM EMPLOYEE
2a CONSULTA → SELECT EMPNO, LASTNAME
FROM EMPLOYEE
WHERE SALARY > 27303
27303
SELECT EMPNO, LASTNAME
FROM EMPLOYEE
WHERE SALARY > (SELECT AVG(SALARY) FROM EMPLOYEE)
Lenguaje SQL 80
42. Lenguaje SQL 81
Ejemplo de subconsulta
◆ ¿Quién tiene el menor BONUS?
SELECT EMPNO, LASTNAME, BONUS
FROM EMPLOYEE
WHERE BONUS = (SELECT MIN(BONUS) FROM EMPLOYEE)
PARKER 300
LASTNAME BONUS
EMPNO
000290
Subconsultas
◆ Una subconsulta es una instrucción SELECT-FROM-WHERE
que está anidada dentro de otra consulta.
◆ Una subconsulta puede aparecer en
◼ SELECT → La subconsulta se utilizará como valor de la columna de
la tabla resultante. La subconsulta debe devolver un único valor.
◼ FROM → La subconsulta se utilizará como una tabla. Es necesario
que le demos nombre a esta tabla utilizando la clásula AS.
◼ WHERE → La subconsulta es utilizada dentro de los predicados para
realizar comparaciones.
⚫ Las subconsultas pueden devolver uno o varios valores.
⚫ Dependiendo del número de valores se utilizarán unos operadores u
otros.
Lenguaje SQL 82
43. Lenguaje SQL 83
Subconsultas
SELECT lista_seleccion
FROM tabla
WHERE expr operador
(SELECT lista_seleccion
FROM tabla);
◆ La subconsulta se ejecuta una vez antes de ejecutarse la
consulta principal.
◆ Los resultados de la subconsulta son utilizados en la consulta
principal.
Subconsultas (cont.)
◆ Si estamos seguros de que la subconsulta devuelve un único
valor, es posible utilizar los operadores de comparación
habituales =, <>, <=, <, >=, >.
◆ Para subconsultas que devuelven múltiples valores se pueden
utilizar los operadores
◼ IN / NOT IN
◼ Los operadores de comparación habituales junto a los
cuantificadores ANY/SOME y ALL.
Lenguaje SQL 84
44. Lenguaje SQL 85
Subconsulta con IN
Tabla DEPARTMENT
Resultado final
DEPTNO DEPTNAME
A00 SPIFFYCOMPUTER SERVICE
B01
C01
D01
D11
D21
E01
E11
E21
DEPTNO DEPTNAME
A00 SPIFFYCOMPUTER SERVICE
B01 PLANNING
C01 INFORMATIONCENTER
DEPTNO, DEPTNAME
DEPARTMENT
SELECT
FROM
WHERE DEPTNO NOT IN (SELECT DEPTNO
FROM PROJECT)
. . . . . .
Resultado subconsulta
¿Qué departamentos no
tienen proyectos
asignados?
Lenguaje SQL 86
Subconsulta con ALL
52750.00
46500.00
SALARY
HAAS
LUCCHESI
LASTNAME, SALARY
EMPLOYEE
SELECT
FROM
WHERE SALARY > ALL (SELECT AVG(SALARY)
FROM EMPLOYEE
GROUP BY WORKDEPT)
¿Qué empleados tienen
un salario mayor que la
media de salarios de
todos los
departamentos?
Resultado final
LASTNAME
42833.33333333
41250.00000000
30156.66666666
24677.77777777
25153.33333333
40175.00000000
20998.00000000
23827.50000000
Resultado subconsulta
45. Lenguaje SQL 87
Subconsulta utilizando ANY o SOME
¿Qué empleados del
departamento E11
tienen el salario mayor que la
media de salarios de al menos un
departamento?
SALARY
HENDERSON
SCHNEIDER
LASTNAME, SALARY, WORKDEPT
EMPLOYEE
WORKDEPT = 'E11'
SELECT
FROM
WHERE
AND SALARY > ANY (SELECT AVG(SALARY)
FROM EMPLOYEE
GROUP BY WORKDEPT)
Resultado Final
LASTNAME
29750.00 E11
26250.00 E11
WORKDEPT
42833.33333333
41250.00000000
30156.66666666
24677.77777777
25153.33333333
40175.00000000
20998.00000000
23827.50000000
ORDER BY LASTNAME
Resultado subconsulta
Subconsulta en la cláusula HAVING
WORKDEPT, AVG(SALARY) AS AVG_WORKDEPT
EMPLOYEE
JOB <> 'MANAGER'
WORKDEPT
SELECT
FROM
WHERE
GROUP BY
HAVING AVG(SALARY) >
ORDER BY AVG_WORKDEPT DESC
42833.33333333
26110.00000000
AVG_WORKDEPT
A00
C01
(SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE JOB <> 'MANAGER')
Necesito un listado de los departamentos con un
salario medio por empleado (sin director) mayor
que el salario medio por empleado de la compañia
(también sin directores). El resultado lo quiero de
forma que el departamento que tenga mayor
media sea el primero.
25188.80000000
Resultado subconsulta
Resultado final
WORKDEPT
Lenguaje SQL 88
46. Lenguaje SQL 89
Subconsultas correlacionadas
◆ En una subconsulta correlacionada se utilizan las tablas de la
consulta principal.
◆ El orden de ejecución de la consulta cambia.
◼ Primero se busca la tabla y filas especificadas por la consulta
principal.
◼ Posteriormente se ejecuta la subconsulta en la fila de la subconsulta
que está correlacionada con la consulta principal.
◆ Podemos asemejarlo al anidamiento de bucles donde el
índice del bucle externo es utilizado en el bucle interno.
Subconsultas correlacionadas
EMPLOYEE
¿Qué empleado tiene el
salario mayor que la media de
salarios de su departamento?
EMPNO LASTNAME WORKDEPT SALARY
000010 HAAS A00 52750.00
000030 KWAN C01 38250.00
000120 O'CONNELL A00 29250.00
000130 QUINTANA C01 23800.00
000140 NICHOLLS C01 28420.00
SELECT EMPNO, LASTNAME, SALARY
FROM EMPLOYEE
WHERE SALARY >
Media de salarios del dept.
correspondiente
AVG(SALARY)
41000.00000000
A00
AVG(SALARY)
30156.66666666
C01
Lenguaje SQL 90
47. Lenguaje SQL 91
Subconsultas correlacionadas
EMPNO LASTNAME SALARY
000010 HAAS 52750.00
000030 KWAN 38250.00
EMPNO LASTNAME WORKDEPT SALARY
000010 HAAS A00 52750.00
000030 KWAN C01 38250.00
000120 O'CONNELL A00 29250.00
000130 QUINTANA C01 23800.00
000140 NICHOLLS C01 28420.00
EMPLOYEE
SELECT EMPNO, LASTNAME, SALARY
FROM EMPLOYEE E
WHERE SALARY >
(SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE WORKDEPT =
WORKDEPT)
E.
AVG(SALARY)
30156.66666666
C01
AVG(SALARY)
41000.00000000
A00
¿Qué empleado tiene el
salario mayor que la media de
salarios de su departamento?
Subconsultas correlacionadas con EXISTS
DEPARTMENT
DEPTNO DEPTNAME MGRNO
¿Qué departamentos no
tienen empleados?
EMPLOYEE
EMPNO LASTNAME W
ORKDEPT SALARY
000010 HAAS A00 52750.00
000030 KWAN C01 38250.00
000120 O'CONNELL A00 29250.00
000130 QUINTANA C01 23800.00
000140 NICHOLLS C01 28420.00
000400 WILSON null 25400.00
SELECT DEPTNO, DEPTNAME
FROM DEPARTMENT D
WHERE NOT EXISTS
(SELECT *
FROM EMPLOYEE
WHERE
WORKDEPT = D.DEPTNO)
D01 DEVELOPMENT CENTER
DEPTNO DEPTNAME
RESULTA
DO
A00 SPIFFY COMPUTER SERVICE DIV. 000010
C01 INFORMATION CENTER 000030
D01 DEVELOPMENT CENTER -
Lenguaje SQL 92
48. Lenguaje SQL 93
Modificación de la BBDD
◆ Las instrucciones SQL que permiten modificar el estado de
la BBDD son:
◼ INSERT → Añade filas a una tabla/vista de la BBDD
◼ UPDATE → Actualiza filas de una tabla/vista de la BBDD
◼ DELETE → Elimina filas de una tabla/vista de la BBDD
La instrucción INSERT
◆ La inserción de tuplas se realiza con la sentencia INSERT,
◼ Es posible insertar directamente valores.
◼ O bien insertar el conjunto de resultados de una consulta.
◼ En cualquier caso, los valores que se insertan deben pertenecer al
dominio de cada uno de los atributos de la relación.
◆ Ejemplos: CLIENTES (DNI, NOMBRE, DIR)
◆ La inserción
◼ INSERT INTO CLIENTES VALUES (1111,'Mario',
'C/. Mayor, 3');
◆ Es equivalente a las siguientes sentencias
◼ INSERT INTO CLIENTES (NOMBRE,DIR,DNI)
VALUES ('Mario','C/. Mayor, 3',1111);
◼ INSERT INTO CLIENTES (DNI,DIR,NOMBRE)
VALUES (1111,'C/. Mayor, 3’,'Mario');
Lenguaje SQL 94
49. Lenguaje SQL 95
Añadir una fila
INSERT INTO TESTEMP
VALUES ('000111', 'SMITH', 'C01', '1998-06-25', 25000, NULL)
EMPNO LASTNAME WORKDEPT HIREDATE SALARY BONUS
000111 SMITH C01 1998-06-25 25000.00 -
INSERT INTO TESTEMP(EMPNO, LASTNAME, WORKDEPT, HIREDATE, SALARY)
VALUES ('000111', 'SMITH', 'C01', '1998-06-25', 25000)
Añadir varias filas
◆ Ejemplo:
◆ Para la siguiente base de datos, queremos incluir en la relación GRUPOS
a todos los grupos, junto con su número de álbumes publicados:
LP (TIT, GRUPO, ANIO, NUM_CANC)
◼ GRUPOS (NOMBRE, ALBUMES)
◆ Solución:
INSERT INTO GRUPOS
SELECT GRUPO, COUNT (DISTINCT TIT) FROM LP
GROUP BY GRUPO;
◆ En SQL se prohíbe que la consulta que se incluye en una cláusula
INSERT haga referencia a la misma tabla en la que se quieren
insertar las tuplas.
◼ En ORACLE sí está permitido
Lenguaje SQL 96
50. Lenguaje SQL 97
Añadir varias filas (cont.)
TESTEMP
INSERT INTO TESTEMP
SELECT EMPNO,LASTNAME,WORKDEPT,HIREDATE,SALARY,BONUS
FROM EMPLOYEE
WHERE EMPNO < = '000050'
EMPNO LASTNAME WORKDEPT HIREDATE SALARY BONUS
EMPNO LASTNAME WORKDEPT HIREDATE SALARY BONUS
000010 HAAS A00 1965-01-01 52750.00 1000.00
000020 THOMPSON B01 1973-10-10 41250.00 800.00
000030 KWAN C01 1975-04-05 38250.00 800.00
000050 GEYER E01 1949-08-17 40175.00 800.00
000111 SMITH C01 1998-06-25 25000.00 - - - - -
La instrucción UPDATE
◆ La modificación de tuplas se realiza con la sentencia UPDATE,
◼ Es posible elegir el conjunto de tuplas que se van a actualizar usando la
clausula WHERE.
◆ Ejemplos: CUENTAS (COD, DNI, NSUCURS, SALDO)
◆ Suma del 5% de interés a los saldos de todas las cuentas.
◼ UPDATE CUENTAS SET SALDO = SALDO * 1.05;
◆ Suma del 1% de bonificación a aquellas cuentas cuyo saldo sea superior a
100.000 €.
◼ UPDATE CUENTAS SET SALDO = SALDO * 1.01
WHERE SALDO > 100000;
◆ Modificación de DNI y saldo simultáneamente para el código 898.
◼ UPDATE CUENTAS SET DNI='555', SALDO=10000
WHERE COD LIKE '898';
Lenguaje SQL 98
52. Lenguaje SQL 101
La instrucción DELETE
◆ La eliminación de tuplas se realiza con la sentencia DELETE:
◼ DELETE FROM R WHERE P; -- WHERE es opcional
◼ Elimina tuplas completas, no columnas. Puede incluir subconsultas.
◆ Ejemplos: para la BD de CLIENTES, CUENTAS, SUCURSALES.
◆ Eliminar todas cuentas con código entre 1000 y 1100.
◼ DELETE FROM CUENTAS WHERE COD BETWEEN 1000 AND
1100;
◆ Eliminar todas las cuentas del cliente “Jose María García”.
◼ DELETE FROM CUENTAS WHERE DNI IN
(SELECT DNI FROM CLIENTES
WHERE NOMBRE LIKE 'Jose María García');
◆ Eliminar todas las cuentas de sucursales situadas en "Chinchón".
◼ DELETE FROM CUENTAS WHERE NSUCURS IN
(SELECT NSUC FROM SUCURSALES
WHERE CIUDAD LIKE 'Chinchón');
Borrar filas
Antes:
EMPNO LASTNAME WORKDEPT HIREDATE SALARY BONUS
000010 HAAS A00 1965-01-01 52750.00 1000.00
000020 THOMPSON B01 1973-10-10 41250.00 800.00
000030 KWAN C01 1975-04-05 38250.00 800.00
000050 GEYER E01 1949-08-17 40175.00 800.00
000111 SMITH C01 1998-06-25 25000.00 - - - - -
DELETE FROM TESTEMP
WHERE EMPNO = '000111'
Después:
EMPNO LASTNAME WORKDEPT HIREDATE SALARY BONUS
000010 HAAS A00 1965-01-01 52750.00 1000.00
000020 THOMPSON B01 1973-10-10 41250.00 800.00
000030 KWAN C01 1975-04-05 38250.00 800.00
000050 GEYER E01 1949-08-17 40175.00 800.00
Lenguaje SQL 102
53. Lenguaje SQL 103
Creación de Tablas
◆ La creación de tablas se lleva a cabo con la sentencia
CREATE TABLE.
◆ Ejemplo: creación del siguiente esquema de BD.
CLIENTES (DNI, NOMBRE, DIR) SUCURSALES (NSUC, CIUDAD)
CUENTAS (COD, DNI, NSUCURS, SALDO)
◆ Se empieza por las tablas más independientes:
CREATE TABLE CLIENTES (
DNI VARCHAR(9) NOT NULL,
NOMBRE VARCHAR(20),
DIR VARCHAR(30),
PRIMARY KEY (DNI)
);
CREATE TABLE SUCURSALES (
NSUC VARCHAR(4) NOT NULL,
CIUDAD VARCHAR(30),
PRIMARY KEY (NSUC)
);
Creación de Tablas (cont.)
◆ El siguiente paso es crear la tabla CUENTAS, con las claves externas:
CREATE TABLE CUENTAS (
COD VARCHAR(4) NOT NULL,
DNI VARCHAR(9) NOT NULL,
NSUCURS VARCHAR(4) NOT NULL,
SALDO INT DEFAULT 0,
PRIMARY KEY (COD, DNI, NSUCURS),
FOREIGN KEY (DNI) REFERENCES CLIENTES (DNI),
FOREIGN KEY (NSUCURS) REFERENCES SUCURSALES (NSUC) );
◆ Las claves candidatas, es decir, aquellos atributos no pertenecientes a la
clave que no deben alojar valores repetidos, se pueden indicar con la
clausula UNIQUE.
◆ Es posible crear una tabla como resultado de una consulta:
◼ CREATE TABLE NUEVA_TABLA AS SELECT ...
Lenguaje SQL 104
54. Lenguaje SQL 105
Modificación y eliminación de tablas
◆ Modificación de tablas: sentencia ALTER TABLE.
◼ Es posible añadir, modificar y eliminar campos. Ejemplos:
⚫ Adición del campo PAIS a la tabla CLIENTES
◼ ALTER TABLE CLIENTES ADD PAIS VARCHAR(10);
⚫ Modificación del tipo del campo PAIS
◼ ALTER TABLE CLIENTES MODIFY PAIS VARCHAR(20);
⚫ Eliminación del campo PAIS de la tabla CLIENTES
◼ ALTER TABLE CLIENTES DROP PAIS;
◼ También es posible añadir nuevas restricciones a la tabla (claves
externas, restricciones check).
◆ Eliminación de tablas: sentencia DROP TABLE.
◼ DROP TABLE CUENTAS;
-- Las tablas a las que referencia deben haber sido
eliminadas antes.
Vistas
◆ Una vista es una "tabla virtual".
◼ La diferencia principal con respecto a las tablas normales es que
habitualmente no ocupan espacio en disco.
◆ Las vistas pueden ser utilizadas en las consultas como otra tabla más.
◆ Habitualmente las vistas son creadas para combinar información de
múltiples tablas.
◼ Integración de diferentes BBDD.
◆ También es habitual su uso por razones de seguridad.
◼ Podemos filtrar las columnas y/o filas a las que un usuario tiene acceso.
◆ Su sintaxis es:
◆ CREATE VIEW nombre [(col1,...)]
AS instruccion_select
[WITH CHECK OPTION]
Lenguaje SQL 106
55. Lenguaje SQL 107
Vistas
EMPNO
TablaEMPLOYEE
LASTNAME WORKDEPT SALARY
000010 HAAS A00 52750.00
000030 KWAN C01 38250.00
000120 O'CONNELL A00 29250.00
000130 QUINTANA C01 23800.00
000140 NICHOLLS C01 28420.00
TablaDEPARTMENT
DEPTNO DEPTNAME MGRNO
A00 SPIFFY COMPUTER SERVICE DIV. 000010
C01 INFORMATION CENTER 000030
D01 DEVELOPMENT CENTER
CREATE VIEW EMP_DEPT (NAME, DEPARTMENT)
AS SELECT LASTNAME, DEPTNAME
FROM EMPLOYEE, DEPARTMENT
WHERE WORKDEPT = DEPTNO
SELECT * FROM EMP_DEPT;
NA
ME DEPA
RTMENT
HAAS SPIFFY COMPUTER SERVICE DIV.
O'CONNELL SPIFFY COMPUTER SERVICE DIV.
KWAN INFORMATION CENTER
NICHOLLS INFORMATION CENTER
QUINTANA INFORMATION CENTER
VistaEMP_DEPT
Vistas
TablaDEPARTMENT
DEPTNO DEPTNAME MG
RNO
A00 SPIFFY COMPUTER SERVICE DIV. 000010
C01 INFORMATION CENTER 000030
D01 DEVELOPMENT CENTER
TablaPROJECT
PROJNO PROJNAME RESPEMP
DEPTNO
AD3100 ADMIN SERVICES D01 000010
IF1000 QUERY SERVICES C01 000030
IF2000 USER EDUCATION C01 000030
DEPARTMENT
PRO
JECT MA
NA
G
ER
USER EDUCATION INFORMATION CENTER KWAN
QUERY SERVICES INFORMATION CENTER KWAN
ADMIN SERVICES SPIFFY COMPUTER SERVICE DIV.
VistaPROJ_DEPT_MGR
TablaEMPLOYEE
EMPNO LASTNAME W
O
RKDEPT SALARY
000010 HAAS A00 52750.00
000030 KWAN C01 38250.00
000120 O'CONNELL A00 29250.00
000130 QUINTANA C01 23800.00
000140 NICHOLLS C01 28420.00
DEPTNAME
PRO
JNAME MG
RNO
USER EDUCATION INFORMATION CENTER 000030
QUERY SERVICES INFORMATION CENTER 000030
ADMIN SERVICES SPIFFY COMPUTER SERVICE DIV.
VistaPROJ_DEPT
Lenguaje SQL 108
56. Lenguaje SQL 109
Vistas
ES COMO SI ...
CREATE VIEW EMP_SALARY_DEPT (NAME, SALARY, DEPARTMENT)
AS SELECT LASTNAME, SALARY, DEPTNAME
FROM EMPLOYEE INNER JOIN
DEPARTMENT ON WORKDEPT =
DEPTNO
WHERE DEPTNO = 'C01'
SELECT NAME, SALARY
FROM EMP_SALARY_DEPT
WHERE SALARY > 25000
SELECT LASTNAME AS NAME, SALARY
FROM EMPLOYEE INNER JOIN
DEPARTMENT ON WORKDEPT =
DEPTNO
WHERE DEPTNO = 'C01' AND
SALARY > 25000
Vistas
TablaEMPLOYEE
EMPNO LASTNAME WORKDEPT SALARY
000010 HAAS A00 52750.00
000030 KWAN C01 38250.00
000120 O'CONNELL A00 29250.00
000130 QUINTANA C01 23800.00
000140 NICHOLLS C01 28420.00
SELECT MAX(TOTAL_SALARY) AS MAXIMUM_SALARY
FROM DEPT_SALARIES
CREATE VIEW DEPT_SALARIES (DEPARTMENT, TOTAL_SALARY)
AS SELECT WORKDEPT, SUM(SALARY)
FROM EMPLOYEE
GROUP BY WORKDEPT
VistaDEPT_SALARIES
DEPARTMENT TOTAL_SALARY
A00 82000.00
C01 90470.00
PASO 1
MAXIMUM_SALARY
90470.00 PASO 2
Lenguaje SQL 110
57. Lenguaje SQL 111
Actualización de vistas
◆ Las vistas pueden ser utilizadas en consultas.
◆ Sin embargo, también se pueden definir vistas actualizables.
◼ Estas vistas tienen que cumplir ciertas restricciones en la instrucción de
selección que la define.
◆ Restricciones de la instrucción SELECT que define la vista
◼ No puede contener ningún join, es decir, la vista debe estar definida sobre
una única tabla o vista (en este caso, la vista debe ser actualizable).
◼ Todas las columnas obligatorias (NOT NULL) deben aparecer en la
definición de la vista.
◼ La consulta no contiene operadores de conjunto como UNION, EXCEPT o
INTERSECT. La cláusula DISTINCT tampoco está permitida.
◼ Ninguna expresión de agregación puede estar incluida en la cláusula
SELECT.
◼ No se puede utilizar la cláusula GROUP BY.
Vistas de lectura
TablaEMPLOYEE
EMPNO LA
STNA
ME WORKDEPT SA
LA
RY
000010 HAAS A00 52750.00
000030 KWAN C01 38250.00
000120 O'CONNELL A00 29250.00
000130 QUINTANA C01 23800.00
000140 NICHOLLS C01 28420.00
TablaDEPARTMENT
DEPTNO DEPTNAME MGRNO
A00 SPIFFY COMPUTER SERVICE DIV. 000010
C01 INFORMATION CENTER 000030
D01 DEVELOPMENT CENTER
NAME DEPARTMENT
HAAS SPIFFY COMPUTER SERVICE DIV.
O'CONNELL SPIFFY COMPUTER SERVICE DIV.
KWAN INFORMATION CENTER
NICHOLLS INFORMATION CENTER
QUINTANA INFORMATION CENTER
VistaEMP_DEPT
UPDATE EMP_DEPT
SET DEPARTMENT = 'DEVELOPMENT CENTER'
WHERE NAME = 'KWAN'
Lenguaje SQL 112
58. Lenguaje SQL 113
Restricciones en las vistas
◆ SQL3 no permite definir restricciones explícitas sobre vistas.
◆ Sin embargo, la cláusula CHECK OPTION puede
considerarse como un tipo de restricción.
◆ Si se utiliza CHECK OPTION en la creación de una vista el
SGBD no permite que una instrucción de manipulación de la
BBDD genere o actualice filas que no estén incluidas en la
consulta que ha generado la tabla.
Opción check
NO SE PUEDE!
FUNCIONA!
UPDATE SALARIES_1
SET SALARY = 42000
WHERE EMPNO = '000030'
CREATE VIEW SALARIES_1
AS
SELECT EMPNO, LASTNAME, SALARY
FROM EMPLOYEE
WHERE SALARY < 40000
TablaEMPLOYEE
EMPNO LASTNAME WORKDEPT SALARY
000010 HAAS A00 52750.00
000030 KWAN C01 38250.00
000120 O'CONNELL A00 29250.00
000130 QUINTANA C01 23800.00
000140 NICHOLLS C01 28420.00
UPDATE SALARIES_2
SET SALARY = 42000
WHERE EMPNO = '000030'
CREATE VIEW SALARIES_2
AS
SELECT EMPNO, LASTNAME, SALARY
FROM EMPLOYEE
WHERE SALARY < 40000
WITH CHECK OPTION
Lenguaje SQL 114
59. Lenguaje SQL 115
Cláusula WITH
◆ La norma SQL 1999 introduce la cláusula WITH con dos
propósitos:
◼ Factorización de subconsultas
◼ Definición de consultas recursivas.
◆ Aunque WITH forma parte de la norma, el IBM DB2 es uno
de los pocos SGBD que implementa el comportamiento
recursivo de esta cláusula.
◆ ORACLE por su parte ofrece una sintaxis y comportamiento
alternativos para la recursión.
◼ Cláusula CONNECT BY PRIOR.
Factorización de subconsultas
HIREDECADE MINIMUM_SALARY
1960 - 9 29250.00
1970 - 9 23800.00
EMPLOYEE
EMPNO LASTNAME WORKDEPT SALARY HIREDATE
000010 HAAS A00 52750.00 1965-01-01
000030 KWAN C01 38250.00 1975-04-05
000120 O'CONNELL A00 29250.00 1963-12-05
000130 QUINTANA C01 23800.00 1971-07-28
000140 NICHOLLS C01 28420.00 1976-12-15
SELECT S.HIREDECADE, MIN(S.SALARY) AS MINIMUM_SALARY
FROM
(
) AS S
GROUP BY S.HIREDECADE
SELECT SUBSTR(CHAR(HIREDATE,ISO),1,3)
CONCAT '0 - 9' AS HIREDECADE,
SALARY
FROM EMPLOYEE
Lenguaje SQL 116
60. Lenguaje SQL 117
Factorización de subconsultas (cont.)
SELECT E.EMPNO, E.LASTNAME, E.HIREDECADE, E.SALARY, M.MINIMUM_SALARY
FROM
(
SELECT EMPNO, LASTNAME,SALARY,
SUBSTR(CHAR(HIREDATE,ISO),1,3) CONCAT '0 - 9'
AS HIREDECADE
FROM EMPLOYEE
) AS E
INNER JOIN
(
SELECT S.HIREDECADE, MIN(S.SALARY) AS MINIMUM_SALARY
FROM
(
SELECT SUBSTR(CHAR(HIREDATE,ISO),1,3)
CONCAT '0 - 9' AS HIREDECADE,
SALARY
FROM EMPLOYEE
) AS S
GROUP BY S.HIREDECADE
) AS M
ON E.HIREDECADE = M.HIREDECADE
Factorización de subconsultas (cont.)
FROM EMPLOYEE
FROM E
WITH
E AS
(
SELECT EMPNO, LASTNAME, SALARY,
SUBSTR(CHAR(HIREDATE,ISO),1,3) CONCAT '0 - 9'
AS HIREDECADE
),
M (HIREDECATE, MINIMUM_SALARY) AS
(
SELECT HIREDECADE, MIN(SALARY)
GROUP BY HIREDECADE
)
SELECT E.EMPNO, E.LASTNAME, E.HIREDECADE,
E.SALARY, M.MINIMUM_SALARY
FROM E INNER JOIN M
ON E.HIREDECADE = M.HIREDECADE
Lenguaje SQL 118
61. Lenguaje SQL 119
Consultas recursivas
◆ Una consulta recursiva es una consulta que depende sobre
si misma.
◆ Ejemplo:
◼ JEFE(NOMBRE_EMPLEADO, NOMBRE_JEFE)
◼ Determinar los empleados que supervisa directa o indirectamente
Lopez.
◆ La ejecución de esta consulta se llevaría a cabo de esta
manera:
1. Obtención de los empleados supervisados por Lopez
2. Obtención de los empleados supervisados por los supervisados por
Lopez.
3. Repetir el paso 2 hasta que un empleado no supervise a nadie.
Consultas recursivas (cont.)
◆ A este tipo de consultas se le denomina cierre transitivo.
◆ Existen numerosas aplicaciones en las que es necesario
calcular el cierre transitivo sobre una jerarquía.
◼ Destino de vuelos
◼ Partes de un coche
◼ Departamentos en una empresa
Lenguaje SQL 120
62. Lenguaje SQL 121
SQL Recursivo
WITH
RPL (PART, SUBPART, QUANTITY) AS
(
SELECT CHILD.PART, CHILD.SUBPART,
CHILD.QUANTITY FROM RPL PARENT, PARTLIST
CHILD
WHERE PARENT.SUBPART = CHILD.PART
)
SELECT PART, SUBPART, SUM(QUANTITY) AS
QUANTITY FROM RPL
GROUP BY PART, SUBPART
SELECT ROOT.PART, ROOT.SUBPART, ROOT.QUANTITY
FROM PARTLIST ROOT
WHERE ROOT.PART = '01'
UNION ALL
SELECT de iniciación
SELECT iterativa
SELECT principal
SQL Recursivo. Iniciación
SELECT ROOT.PART, ROOT.SUBPART, ROOT.QUANTITY
FROM PARTLIST ROOT
WHERE ROOT.PART = '01'
PART SUBPART QUANTITY
00 01 5
00 05 3
01 02 2
01 03 3
01 04 4
01 06 3
02 05 7
02 06 6
03 07 6
04 08 10
04 09 11
05 10 10
05 11 10
06 12 10
06 13 10
07 12 8
07 14 8
PART SUBPART QUANTITY
01 02 2
01 03 3
01 04 4
01 06 3
RPL
Lenguaje SQL 122