SlideShare una empresa de Scribd logo
1 de 65
Descargar para leer sin conexión
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Modificar datos
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 - - - - -
UPDATE TESTEMP
SET BONUS = 500,
SALARY = 26000
WHERE EMPNO = '000111'
Después:
EMPN
O
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 26000.00 500.00
Lenguaje SQL 99
Modificar datos
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 - - - - -
UPDATE TESTEMP
SET SALARY = SALARY + 1000
WHERE WORKDEPT = 'C01'
Después:
EMPN
O
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 39250.00 800.00
000050 GEYER E01 1949-08-17 40175.00 800.00
000111 SMITH C01 1998-06-25 26000.00 - - - - -
Lenguaje SQL 100
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
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
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
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
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
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
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
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
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
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
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
Lenguaje SQL 123
SQL Recursivo. Iteración 1
SELECT CHILD.PART, CHILD.SUBPART, CHILD.QUANTITY
FROM RPL PARENT, PARTLIST CHILD
WHERE PARENT.SUBPART = CHILD.PART
Tabla
PARTLIST
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
PART SUBPART QUANTITY
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
06 12 10
06 13 10
RPL
SQL Recursivo. Iteración 2
RPL
SELECT CHILD.PART, CHILD.SUBPART, CHILD.QUANTITY
FROM RPL PARENT, PARTLIST CHILD
WHERE PARENT.SUBPART = CHILD.PART
Tabla PARTLIST
PART SUBPART QUANTITY PART SUBPART QUANTITY
00 01 5
No hay
correspondencia
en tabla PARTLIST
01 02 2
00 05 3 01 03 3
01 02 2 01 04 4
01 03 3 01 06 3
01 04 4 02 05 7
01 06 3 02 06 6
02 05 7 03 07 6
02 06 6 04 08 10
03 07 6 04 09 11
04 08 10 06 12 10
04 09 11 06 13 10
05 10 10 05 10 10
05 11 10 05 11 10
06 12 10 06 12 10
06 13 10 06 13 10
07 12 8 07 12 8
07 14 8 07 14 8
Lenguaje SQL 124
Lenguaje SQL 125
SQL Recursivo. Resultado
SELECT PART, SUBPART, SUM(QUANTITY) AS QUANTITY
FROM RPL
GROUP BY PART, SUBPART
PA
RT SUBPA
RT QUANTITY PA
RT SUBPA
RT QUANTITY
01 02 2 01 02 2
01 03 3 01 03 3
01 04 4 01 04 4
01 06 3 01 06 3
02 05 7 02 05 7
02 06 6 02 06 6
03 07 6 03 07 6
04 08 10 04 08 10
04 09 11 04 09 11
06 12 10 05 10 10
06 13 10 05 11 10
05 10 10 06 12 20
05 11 10 06 13 20
06 12 10 07 12 8
06 13 10 07 14 8
07 12 8
Resultado final
07 14 8
SQL Recursivo. Control de recursión
WITH
RPL (LEVEL, PART, SUBPART, QUANTITY) AS
(
SELECT PARENT.LEVEL + 1, CHILD.PART,
CHILD.SUBPART,
CHILD.QUANTITY
FROM RPL PARENT, PARTLIST CHILD
WHERE PARENT.SUBPART = CHILD.PART AND
PARENT.LEVEL < 2
)
SELECT LEVEL, PART, SUBPART, SUM(QUANTITY) AS QUANTITY
FROM RPL
GROUP BY PART, SUBPART
SELECT 0, ROOT.PART, ROOT.SUBPART, ROOT.QUANTITY
FROM PARTLIST ROOT
WHERE ROOT.PART = '01'
UNION ALL
SELECT iterativa
SELECT de iniciación
Lenguaje SQL 126
Lenguaje SQL 127
SQL Recursivo. Control de recursión
Tabla PARTLIST
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
Resultado final
0 00 01 5
0 00 05 3
1 01 02 2
1 01 03 3
1 01 04 4
1 01 06 3
1 05 10 10
1 05 11 10
2 02 05 7
2 02 06 6
2 03 07 6
2 04 08 10
2 04 09 11
2 06 12 10
2 06 13 10
PART SUBPART QUANTITY
LEVEL

Más contenido relacionado

Similar a P1_SQL_Repaso.pdf

Similar a P1_SQL_Repaso.pdf (20)

Base de datos - Clase 2
Base de datos - Clase 2Base de datos - Clase 2
Base de datos - Clase 2
 
Tsql
TsqlTsql
Tsql
 
Ti. Sql.Caso1al9.Consultas
Ti. Sql.Caso1al9.ConsultasTi. Sql.Caso1al9.Consultas
Ti. Sql.Caso1al9.Consultas
 
APLICACIONES EMPRESARIALES
APLICACIONES EMPRESARIALESAPLICACIONES EMPRESARIALES
APLICACIONES EMPRESARIALES
 
Sql server express edition 2012 libro
Sql server express edition 2012 libroSql server express edition 2012 libro
Sql server express edition 2012 libro
 
Investigacion Uno
Investigacion UnoInvestigacion Uno
Investigacion Uno
 
Sql
SqlSql
Sql
 
Exposición
ExposiciónExposición
Exposición
 
TRANSACT-SQL
TRANSACT-SQLTRANSACT-SQL
TRANSACT-SQL
 
Exposición
ExposiciónExposición
Exposición
 
Comandos SQL
Comandos SQLComandos SQL
Comandos SQL
 
PLSQL y paquetes
PLSQL y paquetesPLSQL y paquetes
PLSQL y paquetes
 
Lenguaje transact sql
Lenguaje transact sqlLenguaje transact sql
Lenguaje transact sql
 
Mejores prácticas desarrollo de base de datos
Mejores prácticas desarrollo de base de datos Mejores prácticas desarrollo de base de datos
Mejores prácticas desarrollo de base de datos
 
diapositiva-clase-unidad-4-sql.pptx
diapositiva-clase-unidad-4-sql.pptxdiapositiva-clase-unidad-4-sql.pptx
diapositiva-clase-unidad-4-sql.pptx
 
diapositiva-clase-unidad-4-sql.pptx
diapositiva-clase-unidad-4-sql.pptxdiapositiva-clase-unidad-4-sql.pptx
diapositiva-clase-unidad-4-sql.pptx
 
Tsql
TsqlTsql
Tsql
 
Lecc01
Lecc01Lecc01
Lecc01
 
TRANSACCIONES, TRIGGERS, PROCEDIMIENTOS ALMACENADOS: DB2/IBM
TRANSACCIONES, TRIGGERS, PROCEDIMIENTOS ALMACENADOS: DB2/IBM   TRANSACCIONES, TRIGGERS, PROCEDIMIENTOS ALMACENADOS: DB2/IBM
TRANSACCIONES, TRIGGERS, PROCEDIMIENTOS ALMACENADOS: DB2/IBM
 
Optimizacion De Consultas
Optimizacion De ConsultasOptimizacion De Consultas
Optimizacion De Consultas
 

Más de Pedro Narváez

Practica DE PL/SQL 1.pdf
Practica DE PL/SQL 1.pdfPractica DE PL/SQL 1.pdf
Practica DE PL/SQL 1.pdfPedro Narváez
 
Solucionario de Ejercicios de PL/SQL.pdf
Solucionario de Ejercicios de PL/SQL.pdfSolucionario de Ejercicios de PL/SQL.pdf
Solucionario de Ejercicios de PL/SQL.pdfPedro Narváez
 
David Noel Ramirez Padilla .pdf
David Noel Ramirez Padilla .pdfDavid Noel Ramirez Padilla .pdf
David Noel Ramirez Padilla .pdfPedro Narváez
 
UNIDAD 2 INTRODUCCIÓN A LA ADMINISTRACIÓN Y A LAS ORGANIZACIONES.ppsx
UNIDAD 2 INTRODUCCIÓN A LA ADMINISTRACIÓN Y A LAS ORGANIZACIONES.ppsxUNIDAD 2 INTRODUCCIÓN A LA ADMINISTRACIÓN Y A LAS ORGANIZACIONES.ppsx
UNIDAD 2 INTRODUCCIÓN A LA ADMINISTRACIÓN Y A LAS ORGANIZACIONES.ppsxPedro Narváez
 
Manual de-Bobinagem-weg
Manual de-Bobinagem-wegManual de-Bobinagem-weg
Manual de-Bobinagem-wegPedro Narváez
 
Ajedrez curso-completo-no-1-garry-kasparov
Ajedrez curso-completo-no-1-garry-kasparovAjedrez curso-completo-no-1-garry-kasparov
Ajedrez curso-completo-no-1-garry-kasparovPedro Narváez
 

Más de Pedro Narváez (8)

5_Armonicos.pdf
5_Armonicos.pdf5_Armonicos.pdf
5_Armonicos.pdf
 
Practica DE PL/SQL 1.pdf
Practica DE PL/SQL 1.pdfPractica DE PL/SQL 1.pdf
Practica DE PL/SQL 1.pdf
 
Solucionario de Ejercicios de PL/SQL.pdf
Solucionario de Ejercicios de PL/SQL.pdfSolucionario de Ejercicios de PL/SQL.pdf
Solucionario de Ejercicios de PL/SQL.pdf
 
David Noel Ramirez Padilla .pdf
David Noel Ramirez Padilla .pdfDavid Noel Ramirez Padilla .pdf
David Noel Ramirez Padilla .pdf
 
UNIDAD 2 INTRODUCCIÓN A LA ADMINISTRACIÓN Y A LAS ORGANIZACIONES.ppsx
UNIDAD 2 INTRODUCCIÓN A LA ADMINISTRACIÓN Y A LAS ORGANIZACIONES.ppsxUNIDAD 2 INTRODUCCIÓN A LA ADMINISTRACIÓN Y A LAS ORGANIZACIONES.ppsx
UNIDAD 2 INTRODUCCIÓN A LA ADMINISTRACIÓN Y A LAS ORGANIZACIONES.ppsx
 
Manual
ManualManual
Manual
 
Manual de-Bobinagem-weg
Manual de-Bobinagem-wegManual de-Bobinagem-weg
Manual de-Bobinagem-weg
 
Ajedrez curso-completo-no-1-garry-kasparov
Ajedrez curso-completo-no-1-garry-kasparovAjedrez curso-completo-no-1-garry-kasparov
Ajedrez curso-completo-no-1-garry-kasparov
 

Último

CENTROIDES Y MOMENTOS DE INERCIA DE AREAS PLANAS.pdf
CENTROIDES Y MOMENTOS DE INERCIA DE AREAS PLANAS.pdfCENTROIDES Y MOMENTOS DE INERCIA DE AREAS PLANAS.pdf
CENTROIDES Y MOMENTOS DE INERCIA DE AREAS PLANAS.pdfpaola110264
 
Hanns Recabarren Diaz (2024), Implementación de una herramienta de realidad v...
Hanns Recabarren Diaz (2024), Implementación de una herramienta de realidad v...Hanns Recabarren Diaz (2024), Implementación de una herramienta de realidad v...
Hanns Recabarren Diaz (2024), Implementación de una herramienta de realidad v...Francisco Javier Mora Serrano
 
Flujo multifásico en tuberias de ex.pptx
Flujo multifásico en tuberias de ex.pptxFlujo multifásico en tuberias de ex.pptx
Flujo multifásico en tuberias de ex.pptxEduardoSnchezHernnde5
 
CONSTRUCCIONES II - SEMANA 01 - REGLAMENTO NACIONAL DE EDIFICACIONES.pdf
CONSTRUCCIONES II - SEMANA 01 - REGLAMENTO NACIONAL DE EDIFICACIONES.pdfCONSTRUCCIONES II - SEMANA 01 - REGLAMENTO NACIONAL DE EDIFICACIONES.pdf
CONSTRUCCIONES II - SEMANA 01 - REGLAMENTO NACIONAL DE EDIFICACIONES.pdfErikNivor
 
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdfAnthonyTiclia
 
CE.040 DRENAJE PLUVIAL_RM 126-2021-VIVIENDA.pdf
CE.040 DRENAJE PLUVIAL_RM 126-2021-VIVIENDA.pdfCE.040 DRENAJE PLUVIAL_RM 126-2021-VIVIENDA.pdf
CE.040 DRENAJE PLUVIAL_RM 126-2021-VIVIENDA.pdfssuserc34f44
 
Uso y Manejo de Extintores Lucha contra incendios
Uso y Manejo de Extintores Lucha contra incendiosUso y Manejo de Extintores Lucha contra incendios
Uso y Manejo de Extintores Lucha contra incendioseduardochavezg1
 
CICLO DE DEMING que se encarga en como mejorar una empresa
CICLO DE DEMING que se encarga en como mejorar una empresaCICLO DE DEMING que se encarga en como mejorar una empresa
CICLO DE DEMING que se encarga en como mejorar una empresaSHERELYNSAMANTHAPALO1
 
produccion de cerdos. 2024 abril 20..pptx
produccion de cerdos. 2024 abril 20..pptxproduccion de cerdos. 2024 abril 20..pptx
produccion de cerdos. 2024 abril 20..pptxEtse9
 
Proyecto de iluminación "guia" para proyectos de ingeniería eléctrica
Proyecto de iluminación "guia" para proyectos de ingeniería eléctricaProyecto de iluminación "guia" para proyectos de ingeniería eléctrica
Proyecto de iluminación "guia" para proyectos de ingeniería eléctricaXjoseantonio01jossed
 
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023ANDECE
 
Tiempos Predeterminados MOST para Estudio del Trabajo II
Tiempos Predeterminados MOST para Estudio del Trabajo IITiempos Predeterminados MOST para Estudio del Trabajo II
Tiempos Predeterminados MOST para Estudio del Trabajo IILauraFernandaValdovi
 
Edificio residencial Becrux en Madrid. Fachada de GRC
Edificio residencial Becrux en Madrid. Fachada de GRCEdificio residencial Becrux en Madrid. Fachada de GRC
Edificio residencial Becrux en Madrid. Fachada de GRCANDECE
 
VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)
VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)
VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)ssuser6958b11
 
IPERC Y ATS - SEGURIDAD INDUSTRIAL PARA TODA EMPRESA
IPERC Y ATS - SEGURIDAD INDUSTRIAL PARA TODA EMPRESAIPERC Y ATS - SEGURIDAD INDUSTRIAL PARA TODA EMPRESA
IPERC Y ATS - SEGURIDAD INDUSTRIAL PARA TODA EMPRESAJAMESDIAZ55
 
Edificio residencial Tarsia de AEDAS Homes Granada
Edificio residencial Tarsia de AEDAS Homes GranadaEdificio residencial Tarsia de AEDAS Homes Granada
Edificio residencial Tarsia de AEDAS Homes GranadaANDECE
 
SOUDAL: Soluciones de sellado, pegado y hermeticidad
SOUDAL: Soluciones de sellado, pegado y hermeticidadSOUDAL: Soluciones de sellado, pegado y hermeticidad
SOUDAL: Soluciones de sellado, pegado y hermeticidadANDECE
 
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONALCHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONALKATHIAMILAGRITOSSANC
 
CLASE 2 MUROS CARAVISTA EN CONCRETO Y UNIDAD DE ALBAÑILERIA
CLASE 2 MUROS CARAVISTA EN CONCRETO  Y UNIDAD DE ALBAÑILERIACLASE 2 MUROS CARAVISTA EN CONCRETO  Y UNIDAD DE ALBAÑILERIA
CLASE 2 MUROS CARAVISTA EN CONCRETO Y UNIDAD DE ALBAÑILERIAMayraOchoa35
 
Parámetros de Perforación y Voladura. para Plataformas
Parámetros de  Perforación y Voladura. para PlataformasParámetros de  Perforación y Voladura. para Plataformas
Parámetros de Perforación y Voladura. para PlataformasSegundo Silva Maguiña
 

Último (20)

CENTROIDES Y MOMENTOS DE INERCIA DE AREAS PLANAS.pdf
CENTROIDES Y MOMENTOS DE INERCIA DE AREAS PLANAS.pdfCENTROIDES Y MOMENTOS DE INERCIA DE AREAS PLANAS.pdf
CENTROIDES Y MOMENTOS DE INERCIA DE AREAS PLANAS.pdf
 
Hanns Recabarren Diaz (2024), Implementación de una herramienta de realidad v...
Hanns Recabarren Diaz (2024), Implementación de una herramienta de realidad v...Hanns Recabarren Diaz (2024), Implementación de una herramienta de realidad v...
Hanns Recabarren Diaz (2024), Implementación de una herramienta de realidad v...
 
Flujo multifásico en tuberias de ex.pptx
Flujo multifásico en tuberias de ex.pptxFlujo multifásico en tuberias de ex.pptx
Flujo multifásico en tuberias de ex.pptx
 
CONSTRUCCIONES II - SEMANA 01 - REGLAMENTO NACIONAL DE EDIFICACIONES.pdf
CONSTRUCCIONES II - SEMANA 01 - REGLAMENTO NACIONAL DE EDIFICACIONES.pdfCONSTRUCCIONES II - SEMANA 01 - REGLAMENTO NACIONAL DE EDIFICACIONES.pdf
CONSTRUCCIONES II - SEMANA 01 - REGLAMENTO NACIONAL DE EDIFICACIONES.pdf
 
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf
 
CE.040 DRENAJE PLUVIAL_RM 126-2021-VIVIENDA.pdf
CE.040 DRENAJE PLUVIAL_RM 126-2021-VIVIENDA.pdfCE.040 DRENAJE PLUVIAL_RM 126-2021-VIVIENDA.pdf
CE.040 DRENAJE PLUVIAL_RM 126-2021-VIVIENDA.pdf
 
Uso y Manejo de Extintores Lucha contra incendios
Uso y Manejo de Extintores Lucha contra incendiosUso y Manejo de Extintores Lucha contra incendios
Uso y Manejo de Extintores Lucha contra incendios
 
CICLO DE DEMING que se encarga en como mejorar una empresa
CICLO DE DEMING que se encarga en como mejorar una empresaCICLO DE DEMING que se encarga en como mejorar una empresa
CICLO DE DEMING que se encarga en como mejorar una empresa
 
produccion de cerdos. 2024 abril 20..pptx
produccion de cerdos. 2024 abril 20..pptxproduccion de cerdos. 2024 abril 20..pptx
produccion de cerdos. 2024 abril 20..pptx
 
Proyecto de iluminación "guia" para proyectos de ingeniería eléctrica
Proyecto de iluminación "guia" para proyectos de ingeniería eléctricaProyecto de iluminación "guia" para proyectos de ingeniería eléctrica
Proyecto de iluminación "guia" para proyectos de ingeniería eléctrica
 
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
 
Tiempos Predeterminados MOST para Estudio del Trabajo II
Tiempos Predeterminados MOST para Estudio del Trabajo IITiempos Predeterminados MOST para Estudio del Trabajo II
Tiempos Predeterminados MOST para Estudio del Trabajo II
 
Edificio residencial Becrux en Madrid. Fachada de GRC
Edificio residencial Becrux en Madrid. Fachada de GRCEdificio residencial Becrux en Madrid. Fachada de GRC
Edificio residencial Becrux en Madrid. Fachada de GRC
 
VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)
VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)
VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)
 
IPERC Y ATS - SEGURIDAD INDUSTRIAL PARA TODA EMPRESA
IPERC Y ATS - SEGURIDAD INDUSTRIAL PARA TODA EMPRESAIPERC Y ATS - SEGURIDAD INDUSTRIAL PARA TODA EMPRESA
IPERC Y ATS - SEGURIDAD INDUSTRIAL PARA TODA EMPRESA
 
Edificio residencial Tarsia de AEDAS Homes Granada
Edificio residencial Tarsia de AEDAS Homes GranadaEdificio residencial Tarsia de AEDAS Homes Granada
Edificio residencial Tarsia de AEDAS Homes Granada
 
SOUDAL: Soluciones de sellado, pegado y hermeticidad
SOUDAL: Soluciones de sellado, pegado y hermeticidadSOUDAL: Soluciones de sellado, pegado y hermeticidad
SOUDAL: Soluciones de sellado, pegado y hermeticidad
 
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONALCHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
 
CLASE 2 MUROS CARAVISTA EN CONCRETO Y UNIDAD DE ALBAÑILERIA
CLASE 2 MUROS CARAVISTA EN CONCRETO  Y UNIDAD DE ALBAÑILERIACLASE 2 MUROS CARAVISTA EN CONCRETO  Y UNIDAD DE ALBAÑILERIA
CLASE 2 MUROS CARAVISTA EN CONCRETO Y UNIDAD DE ALBAÑILERIA
 
Parámetros de Perforación y Voladura. para Plataformas
Parámetros de  Perforación y Voladura. para PlataformasParámetros de  Perforación y Voladura. para Plataformas
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
  • 51. Modificar datos 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 - - - - - UPDATE TESTEMP SET BONUS = 500, SALARY = 26000 WHERE EMPNO = '000111' Después: EMPN O 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 26000.00 500.00 Lenguaje SQL 99 Modificar datos 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 - - - - - UPDATE TESTEMP SET SALARY = SALARY + 1000 WHERE WORKDEPT = 'C01' Después: EMPN O 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 39250.00 800.00 000050 GEYER E01 1949-08-17 40175.00 800.00 000111 SMITH C01 1998-06-25 26000.00 - - - - - Lenguaje SQL 100
  • 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
  • 63. Lenguaje SQL 123 SQL Recursivo. Iteración 1 SELECT CHILD.PART, CHILD.SUBPART, CHILD.QUANTITY FROM RPL PARENT, PARTLIST CHILD WHERE PARENT.SUBPART = CHILD.PART Tabla PARTLIST 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 PART SUBPART QUANTITY 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 06 12 10 06 13 10 RPL SQL Recursivo. Iteración 2 RPL SELECT CHILD.PART, CHILD.SUBPART, CHILD.QUANTITY FROM RPL PARENT, PARTLIST CHILD WHERE PARENT.SUBPART = CHILD.PART Tabla PARTLIST PART SUBPART QUANTITY PART SUBPART QUANTITY 00 01 5 No hay correspondencia en tabla PARTLIST 01 02 2 00 05 3 01 03 3 01 02 2 01 04 4 01 03 3 01 06 3 01 04 4 02 05 7 01 06 3 02 06 6 02 05 7 03 07 6 02 06 6 04 08 10 03 07 6 04 09 11 04 08 10 06 12 10 04 09 11 06 13 10 05 10 10 05 10 10 05 11 10 05 11 10 06 12 10 06 12 10 06 13 10 06 13 10 07 12 8 07 12 8 07 14 8 07 14 8 Lenguaje SQL 124
  • 64. Lenguaje SQL 125 SQL Recursivo. Resultado SELECT PART, SUBPART, SUM(QUANTITY) AS QUANTITY FROM RPL GROUP BY PART, SUBPART PA RT SUBPA RT QUANTITY PA RT SUBPA RT QUANTITY 01 02 2 01 02 2 01 03 3 01 03 3 01 04 4 01 04 4 01 06 3 01 06 3 02 05 7 02 05 7 02 06 6 02 06 6 03 07 6 03 07 6 04 08 10 04 08 10 04 09 11 04 09 11 06 12 10 05 10 10 06 13 10 05 11 10 05 10 10 06 12 20 05 11 10 06 13 20 06 12 10 07 12 8 06 13 10 07 14 8 07 12 8 Resultado final 07 14 8 SQL Recursivo. Control de recursión WITH RPL (LEVEL, PART, SUBPART, QUANTITY) AS ( SELECT PARENT.LEVEL + 1, CHILD.PART, CHILD.SUBPART, CHILD.QUANTITY FROM RPL PARENT, PARTLIST CHILD WHERE PARENT.SUBPART = CHILD.PART AND PARENT.LEVEL < 2 ) SELECT LEVEL, PART, SUBPART, SUM(QUANTITY) AS QUANTITY FROM RPL GROUP BY PART, SUBPART SELECT 0, ROOT.PART, ROOT.SUBPART, ROOT.QUANTITY FROM PARTLIST ROOT WHERE ROOT.PART = '01' UNION ALL SELECT iterativa SELECT de iniciación Lenguaje SQL 126
  • 65. Lenguaje SQL 127 SQL Recursivo. Control de recursión Tabla PARTLIST 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 Resultado final 0 00 01 5 0 00 05 3 1 01 02 2 1 01 03 3 1 01 04 4 1 01 06 3 1 05 10 10 1 05 11 10 2 02 05 7 2 02 06 6 2 03 07 6 2 04 08 10 2 04 09 11 2 06 12 10 2 06 13 10 PART SUBPART QUANTITY LEVEL