Está en la página 1de 64

Lenguaje SQL 1

Ficheros y Bases de Datos


Tema 3
Lenguaje SQL
Lenguaje SQL 2
Introduccin a SQL
Structured Query Language (SQL)
Lenguaje declarativo de acceso a bases de datos que combina
construcciones del lgebra relacional y el clculo relacional.
Originalmente desarrollado en los '70 por IBM en su Research
Laboratory de San Jos a partir del clculo de predicados creado por
Codd.
Lenguaje estndar de facto en los SGBD comerciales
Estndares:
SEQUEL(Structured English QUEry Language), IBM 1976
SQL-86 (ANSI SQL)
SQL-89 (SQL1)
SQL-92 (SQL2), gran revisin del estndar
SQL:1999 (SQL3), Aade disparadores, algo de OO, ...
SQL:2003. Aade XML, secuencias y columnas autonumricas.
Lenguaje SQL 3
Caractersticas de SQL
El Lenguage de Definicin de Datos (LDD)
Proporciona comandos para la creacin, borrado y modificacin de
esquemas relacionales
El Lenguaje de Manipulacin de Datos (LMD)
Basado en el lgebra relacional y el clculo relacional permite realizar
consultas y adicionalmente insertar, borrar y actualizar de tuplas
Ejecutado en una consola interactiva
Embebido dentro de un lenguaje de programacin de propsito general
Definicin de vistas
Autorizacin
Definicin de usuarios y privilegios
Integridad de datos
Control de Transacciones
Lenguaje SQL 4
Estructura de la sentencia SELECT
- Nombres de las tablas / vistas
- Condiciones de seleccin de filas
- Nombre de las columnas
- Condiciones de seleccin de grupo
- Nombres de columnas
SELECT A1, , An
FROM T1, , Tn
WHERE P
GROUP BY Ai 1, , Ai n
HAVING Q
ORDER BY Aj 1, , Aj n
-Describe la salida deseada con:
Nombres de columnas
Expresiones aritmticas
Literales
Funciones escalares
Funciones de columna
Lenguaje SQL 5
Estructura bsica de la sentencia SELECT
Consta de tres clusulas: SELECT, FROMy WHERE.
SELECT corresponde a la operacin de proyeccin del lgebra
relacional.
La lista de los atributos que se incluirn 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 seleccin del lgebra relacional.
Consta de un predicado que implica atributos de las relaciones de la
clusula FROM.
Lenguaje SQL 6
Estructura bsica de la sentencia SELECT
Una consulta SQL tiene la forma:
SELECT A1, ..., An /* Lista de atributos */
FROM R1, ..., Rm /* Lista de relaciones */
WHERE P; /* Condicin. Clusula OPCIONAL */
Es posible que existan el mismo nombre de atributo en dos relaciones
distintas.
Se aade "NOMBRE_RELACION." antes del nombre para desambiguar.
Es equivalente a la siguiente expresin del lgebra relacional:

A1,A2,...,An
(
P
( R1 R2 Rm ) )
El orden de ejecucin de la expresin anterior es el mismo que el de la
consulta SQL.
ADVERTENCIA: la seleccin del AR y el SELECT de SQL no
funcionan igual.
El resultado de una consulta SELECT puede tener tuplas repetidas.
Lenguaje SQL 7
Proyeccin de algunas columnas
DEPTNAME
ADMRDEPT
DEPTNO
SPIFFY COMPUTER SERVICE DIV.
PLANNING
INFORMATION CENTER
DEVELOPMENTCENTER
MANUFACTURING SYSTEMS
ADMINISTRATION SYSTEMS
SUPPORT SERVICES
OPERATIONS
SOFTWARE SUPPORT
A00
A00
A00
A00
D01
D01
A00
E01
E01
A00
B01
C01
D01
D11
D21
E01
E11
E21
SELECT DEPTNO, DEPTNAME, ADMRDEPT
FROM DEPARTMENT
Lenguaje SQL 8
Eliminacin 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 clusula
DISTINCT.
Tambin es posible pedir explcitamente la inclusin de
tuplas repetidas mediante el uso de la clusula ALL.
ADMRDEPT
A00
A00
A00
A00
D01
D01
A00
E01
E01
SELECT ADMRDEPT
FROM DEPARTMENT
ADMRDEPT
A00
D01
E01
SELECT DISTINCT ADMRDEPT
FROM DEPARTMENT
SELECT ALL ADMRDEPT
FROM DEPARTMENT
Lenguaje SQL 9
Eliminacin de filas duplicadas
Qu trabajos realiza cada departamento?
WORKDEPT
A00
A00
A00
B01
C01
C01
D11
D11
D21
D21
E01
E11
E11
E21
E21
J OB
CLERK
PRES
SALESREP
MANAGER
ANALYST
MANAGER
DESIGNER
MANAGER
CLERK
MANAGER
MANAGER
MANAGER
OPERATOR
FIELDREP
MANAGER
SELECT DISTINCT WORKDEPT, JOB
FROM EMPLOYEE
Lenguaje SQL 10
Proyeccin de todos los atributos
Se puede pedir la proyeccin de todos los atributos de la
consulta mediante utilizando el smbolo '*'
La tabla resultante contendr todos los atributos de las tablas que
aparecen en la clusula FROM.
SELECT * FROM DEPARTMENT
SPIFFY COMPUTER SERVICE DIV.
PLANNING
INFORMATION CENTER
DEVELOPMENTCENTER
MANUFACTURING SYSTEMS
ADMINISTRATION SYSTEMS
SUPPORT SERVICES
OPERATIONS
SOFTWARE SUPPORT
DEPTNAME ADMRDEPT LOCATION MGRNO DEPTNO
A00
A00
A00
A00
D01
D01
A00
E01
E01
000010
000020
000030
- - - - - -
000060
000070
000050
000090
000100
A00
B01
C01
D01
D11
D21
E01
E11
E21
Lenguaje SQL 11
Salida ordenada
SQL permite controlar el orden en el que se presentan las
tuplas de una relacin mediante la clusula ORDER BY.
La clusula ORDER BY tiene la forma
ORDER BY A1 <DIRECCION>, ..., An <DIRECCION>
A1, ..., An son atributos de la relacin resultante de la consulta
Ai <DIRECCION> controla si la ordenacin es Ascendente 'ASC' o
descendente 'DESC' por el campo Ai. Por defecto la ordenacin se
realiza de manera ascendente.
La ordenacin se realiza tras haber ejecutado la consulta
sobre las tuplas resultantes.
La ordenacin puede convertirse en una operacin costosa
dependiendo del tamao de la relacin resultante.
Lenguaje SQL 12
Salida ordenada (cont.)
SELECT DEPTNO, DEPTNAME, ADMRDEPT
FROM DEPARTMENT
ORDER BY ADMRDEPT ASC
SPIFFY COMPUTER SERVICE DIV.
INFORMATION CENTER
PLANNING
SUPPORTSERVICES
DEVELOPMENTCENTER
MANUFACTURING SYSTEMS
ADMINISTRATION SYSTEMS
SOFTWARE SUPPORT
OPERATIONS
DEPTNAME ADMRDEPT DEPTNO
A00
A00
A00
A00
A00
D01
D01
E01
E01
A00
C01
B01
E01
D01
D11
D21
E21
E11
Lenguaje SQL 13
Salida ordenada (cont.)
SELECT DEPTNO, DEPTNAME, ADMRDEPT
FROM DEPARTMENT
ORDER BY ADMRDEPT ASC, DEPTNO DESC
SUPPORT SERVICES
DEVELOPMENT CENTER
INFORMATION CENTER
PLANNING
SPIFFY COMPUTER SERVICE DIV.
ADMINISTRATION SYSTEMS
MANUFACTURING SYSTEMS
SOFTWARE SUPPORT
OPERATIONS
DEPTNAME DEPTNO ADMRDEPT
A00
A00
A00
A00
A00
D01
D01
E01
E01
E01
D01
C01
B01
A00
D21
D11
E21
E11
Lenguaje SQL 14
Salida ordenada (cont.)
En Oracle, IBM DB2 y MS-SQL Server entre otros es
posible indicar la columna de ordenacin mediante un entero
El entero hace referencia a la posicin de la columna en la relacin
resultante de la consulta
SELECT LASTNAME, FI RSTNME, WORKDEPT, J OB, 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 15
Seleccin de filas
La clusula WHERE permite filtrar las filas de la relacin resultante.
La condicin de filtrado se especifica como un predicado.
El predicado de la clusula WHERE puede ser simple o complejo
Se utilizan los conectores lgicos AND, OR y NOT en lugar de los smbolos
matemticos , , .
Las expresiones pueden contener
Predicados de comparacin
BETWEEN / NOT BETWEEN
IN / NOT IN (con y sin subconsultas)
LIKE / NOT LIKE
IS NULL / IS NOT NULL
ALL, SOME/ANY (subconsultas)
EXISTS (subconsultas)
Lenguaje SQL 16
Seleccin de filas (cont.)
Predicados de comparacin
Operadores: =, <> (es el ), <, <=, >=. >
BETWEEN es el operador de comparacin 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 17
Seleccin de filas (cont.)
LIKE es el operador de comparacin de cadenas de
caracteres.
SQL distingue entre maysculas y minsculas
Las cadenas de caracteres se incluyen entre comillas simples
SQL permite definir patrones a travs de los siguientes caracteres:
'%', que es equivalente a "cualquier subcadena de caracteres"
'_', que es equivalente a "cualquier carcter"
IS NULL es el operador de comparacin de valores nulos.
Lenguaje SQL 18
Ejemplo de seleccin 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 19
Ejemplo de seleccin de filas
Necesito el apellido y el nivel de formacin de los empleados
cuyo nivel de formacin es mayor o igual a 19
SELECT LASTNAME, EDLEVEL
FROM EMPLOYEE
WHERE EDLEVEL >= 19
Lenguaje SQL 20
Ejemplo de seleccin de filas
Necesito el nmero de empleado, apellido y fecha de
nacimiento de aquellos que hayan nacido despus del 1 de
enero de 1955 (inclusive).
SELECT EMPNO, LASTNAME, BI RTHDATE
FROM EMPLOYEE
WHERE BIRTHDATE >='1955-01-01'
ORDER BY BIRTHDATE
BIRTHDATE
EMPNO
000160
000100
LASTNAME
PIANKA
SPENCER
1955-04-12
1956-12-18
Lenguaje SQL 21
Mltiples condiciones - AND
Necesito el nmero de empleado, el trabajo y el nivel de
formacin de los analistas con un nivel de educacin 16
SELECT EMPNO, J OB, EDLEVEL
FROM EMPLOYEE
WHERE JOB='ANALYST' AND EDLEVEL=16
EMPNO J OB EDLEVEL
000130 ANALYST 16
Lenguaje SQL 22
Mltiples condiciones AND/OR
Obtener el nmero de empleado, el trabajo y el nivel de
formacin 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, J OB, EDLEVEL
FROM EMPLOYEE
WHERE (JOB='ANALYST' AND EDLEVEL=16)
OR EDLEVEL=18
ORDER BY JOB, EDLEVEL
EMPNO J OB EDLEVEL
000130
000140
000220
000020
000010
ANALYST
ANALYST
DESIGNER
MANAGER
PRES
16
18
18
18
18
Lenguaje SQL 23
SELECT con BETWEEN
Obtener el nmero 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
000250
EMPNO EDLEVEL
000310
000290
000300
000330
000100
000230
000120
000270
12
12
14
14
14
14
14
15
15
Lenguaje SQL 24
SELECT con IN
Listar los apellidos y nivel de formacin 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
J EFFERSON
LEE
O'CONNELL
SMITH
SPENSER
LUCCHESI
KWAN
14
14
14
14
14
19
20
Lenguaje SQL 25
Seleccin de valores NULL
Listar el nmero y el nombre de los departamentos sin
director asignado
SELECT DEPTNO, DEPTNAME, MGRNO
FROM DEPARTMENT
WHERE MGRNO IS NULL;
DEPTNO DEPTNAME MGRNO
D01 - - - - - - DEVELOPMENTCENTER
Lenguaje SQL 26
Bsqueda parcial - LIKE
Obtener el apellido de todos los empleados cuyo apellido
empiece por G
SELECT LASTNAME
FROM EMPLOYEE
WHERE LASTNAME LIKE 'G%';
Lenguaje SQL 27
Bsqueda parcial LIKE
Ejemplos con %
SELECT LASTNAME
FROM EMPLOYEE
WHERE LASTNAME LIKE '%SON';
THOMPSON
HENDERSON
ADAMSON
J EFFERSON
J OHNSON
THOMPSON
ADAMSON
MARINO
SELECT LASTNAME
FROM EMPLOYEE
WHERE LASTNAME LIKE '%M%N%';
Lenguaje SQL 28
Bsqueda 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 29
Bsqueda parcial NOT LIKE
Necesito todos los departamentos excepto aquellos cuyo
nmero empiece por 'D'
SELECT DEPTNO, DEPTNAME
FROM DEPARTMENT
WHERE DEPTNO NOT LIKE 'D%';
DEPTNAME DEPTNO
SPIFFY COMPUTER SERVICE DIV.
PLANNING
INFORMATION CENTER
SUPPORT SERVICES
OPERATIONS
SOFTWARE SUPPORT
A00
B01
C01
E01
E11
E21
Lenguaje SQL 30
Renombramiento de columnas
SELECT EMPNO, SALARY, COMM,
SALARY+COMM AS INCOME
FROM EMPLOYEE
WHERE SALARY < 20000
ORDER BY EMPNO
SALARY COMM INCOME EMPNO
18270.00
19180.00
17250.00
15340.00
17750.00
15900.00
19950.00
1462.00
1534.00
1380.00
1227.00
1420.00
1272.00
1596.00
19732.00
20714.00
18630.00
16567.00
19170.00
17172.00
21546.00
000210
000250
000260
000290
000300
000310
000320
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)
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. Solucin a la repeticin de
nombres de distintos empleados?
SELECT NOM
FROM EMP, HI J OS H1, HI J OS H2
WHERE EMP. DNI = H1. DNI AND EMP. DNI = H2. DNI AND
H1. NOMH <> H2. NOMH;
Lenguaje SQL 32
Renombramiento de tablas (cont.)
Utilizar clausula DISTINCT (elimina filas repetidas) e
incluir la clave de la tabla:
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)
Las etiquetas tambin sirven para desambiguar.
SELECT DI STI NCT EMP. NOM, EMP. DNI
FROM EMP, HI J OS H1, HI J OS H2
WHERE EMP. DNI = H1. DNI AND EMP. DNI = H2. DNI AND
H1. NOMH <> H2. NOMH;
SELECT E. AP, S. AP
FROM EMP E, EMP S
WHERE E. DNI SUPERV = S. DNI ;
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
informacin acerca de los tamaos mximos de
almacenamiento.
En el caso de cadenas, cual es la longitud mxima de
almacenamiento.
En el caso de tipos numricos, cual es el rango de valores posibles.
Lenguaje SQL 34
Tipos SQL y valores literales
timestamp 'YYYY-MM-DD hh:mm:ss.ccc' TIMESTAMP
time 'hh:mm:ss.ccc' TIME
date 'YYYY-MM-DD' DATE
'hola' VARCHAR(n)
'GREECE ' (15 caracteres) CHARACTER(max)
6.02257E23 FLOAT
3.141592653589 DOUBLE PRECISION
6.02257E23 REAL
999999.99 (precisin, escala) DECIMAL(8,2)
999999.99 (precisin, escala) NUMERIC(8,2)
186 SMALLINT
186282 INTEGER
8589934592 BIGINT
Ejemplo Tipo
Lenguaje SQL 35
Expresiones
Aunque SQL no es un lenguaje de programacin de
propsito general, permite definir expresiones calculadas.
Estas expresiones pueden contener
Referencias a columnas
Valores literales
Operadores aritmticos
Llamadas a funciones
Los operadores aritmticos son los habituales: +, -, * y /
Estos operadores slo funcionan con valores numricos.
Los operadores '+' y '' habitualmente funcionan para fechas.
Aunque las normas SQL definen un conjunto mnimo de
funciones, los SGBD proporcionan una gran variedad.
Es necesario consultar el manual del SGBD particular.
Lenguaje SQL 36
Funciones matemticas comunes
Mdulo
Redondeo a un nmero
de cifras decimales
Potencia
Menor entero <= valor
Menor entero >= valor
Valor absoluto
Descripcin
MOD.
ROUND
POWER
FLOOR
CEIL
ABSs
IBM DB2 MySQL Oracle
SQL
Server
CEILING CEIL CEILING
FLOOR FLOOR FLOOR
POWER POWER POWER
ROUND ROUND ROUND
% MOD. %
ABS ABS ABS
Lenguaje SQL 37
CONCAT CONCAT + CONCAT Concatena dos cadenas
LOWER LOWER LOWER LOWER
Convierte todos los caracteres a
minsculas
UPPER UPPER UPPER UPPER
Convierte todos los caracteres a
maysculas
RTRIM RTRIM RTRIM RTRIM
Elimina los blancos del final de la
cadena
LTRIM LTRIM LTRIM LTRIM
Elimina los blancos del comienzo
de la cadena
SUBSTRING SUBSTR SUBSTRING SUBSTR Devuelve una subcadena
Descripcin IBM DB2 MySQL Oracle SQL Server
Funciones de cadena
Lenguaje SQL 38
Operaciones aritmticas
Necesito obtener el salario, la comisin y los ingresos totales
de todos los empleados que tengan un salario menor de
20000 , clasificado por nmero de empleado
SELECT EMPNO, SALARY, COMM,
SALARY + COMM
FROM EMPLOYEE
WHERE SALARY < 20000
ORDER BY EMPNO
18270.00
19180.00
17250.00
15340.00
17750.00
15900.00
19950.00
1462.00
1534.00
1380.00
1227.00
1420.00
1272.00
1596.00
19732.00
20714.00
18630.00
16567.00
19170.00
17172.00
21546.00
SALARY COMM EMPNO
000210
000250
000260
000290
000300
000310
000320
Lenguaje SQL 39
Operaciones aritmticas (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
Lenguaje SQL 40
Expresiones en predicados
SELECT EMPNO, SALARY,
(COMM/SALARY)*100
FROM EMPLOYEE
WHERE (COMM/SALARY) * 100 > 8
ORDER BY EMPNO
SALARY EMPNO
2274.00
1462.00
2301.00
2030.00
28420.00
18270.00
28760.00
25370.00
000140
000210
000240
000330
COMM
8.001400
8.002100
8.000600
8.001500
Lenguaje SQL 41
Uso de funciones
SELECT EMPNO, SALARY,
TRUNC(SALARY*1.0375, 2)
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.12
19899.25
17896.87
15915.25
18415.62
16496.25
20698.12
000210
000250
000260
000290
000300
000310
000320
Lenguaje SQL 42
Uso de funciones (cont.)
SELECT CONCAT(LASTNAME || ' , ' , FI RSTNAME ) AS NAME
FROM EMPLOYEE
WHERE WORKDEPT = ' A00'
ORDER BY NAME
NAME
HAAS, CHRISTA
LUCCHESI, VINCENZO
O'CONNELL, SEAN
Lenguaje SQL 43
Operadores de conjunto
SQL incluye las operaciones:
UNION
INTERSECT
EXCEPT (MINUS en Oracle)
Por definicin los operadores de conjunto eliminan las tuplas
duplicadas.
Para retener duplicados se debe utilizar <Operador> ALL
Lenguaje SQL 44
UNION - Concepto
A
M
A
R
I
L
L
O
S
R
E
D
O
N
D
O
S
S
e
l
e
c
c
i
o
n
a
r
e
l
e
m
e
n
t
o
s
S
e
l
e
c
c
i
o
n
a
r
e
l
e
m
e
n
t
o
s
UNION
R
R
Y
Y
Y
Y
Y
Y
R
R
Y
Y
R
R
Y
Y
Lenguaje SQL 45
UNION
EDLEVEL
EDLEVEL
EDLEVEL
LASTNAME
LASTNAME
LASTNAME
LASTNAME
HAAS
LUTZ
NICHOLLS
THOMPSON
HAAS
LUTZ
NICHOLLS
QUINTANA
THOMPSON
NICHOLLS
QUINTANA
18
16
18
18
18
18
18
18
18
16
18
SELECT
FROM
WHERE
UNION
SELECT
FROM
WHERE
LASTNAME, EDLEVEL
EMPLOYEE
J OB ='ANALYST'
LASTNAME, EDLEVEL
EMPLOYEE
EDLEVEL =18
SELECT
FROM
WHERE
LASTNAME, EDLEVEL
EMPLOYEE
EDLEVEL =18
SELECT
FROM
WHERE
LASTNAME, EDLEVEL
EMPLOYEE
J OB ='ANALYST'
Lenguaje SQL 46
UNION
Cada SELECT debe tener el mismo nmero de columnas
Las columnas correspondientes deben tener tipos de datos
compatibles
UNION elimina duplicados
Si se indica, el ORDER BY debe ser la ltima clusula de la
sentencia
Lenguaje SQL 47
UNION
Mgr.:
Dept.:
Mgr.:
Dept.:
Mgr.:
Dept.:
Mgr.:
Dept.:
HAAS
SPIFFY COMPUTER SERVICE DIV.
THOMPSON
PLANNING
KWAN
INFORMATION CENTER
GEYER
SUPPORT SERVICES
DEPTNAME MGRNO
000010
000010
000020
000020
000030
000030
000050
000050
Cada entrada debe tener 2 lineas: la
primera debe incluir el nmero y
nombre del director y la seguna el
nmero y el nombre del
departamento.
SELECT MGRNO , 'Dept.:', DEPTNAME
FROM DEPARTMENT
UNION
SELECT MGRNO, 'Mgr.:', LASTNAME
FROM DEPARTMENT D, EMPLOYEE E
WHERE D.MGRNO =E.EMPNO
ORDER BY 1,2 DESC
Lenguaje SQL 48
UNION
EMPNO LASTNAME INCOME SORT
HAAS
SUM:
THOMPSON
SUM:
C.I
M.L
1
2
3
4
1
2
3
4
000010
000010
000010
000010
000020
000020
000020
000020
52750.00
1000.00
4220.00
57970.00
41250.00
800.00
3300.00
45350.00
. . . . .
SELECT EMPNO, SUBSTR( FI RSTNME, 1, 1) | | ' . ' | | MI DI NT,
LASTNAME, SALARY AS I NCOME, 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 49
UNION ALL. Concepto
A
M
A
R
I
L
L
O
S
R
E
D
O
N
D
O
S
S
e
l
e
c
c
i
o
n
a
r
e
l
e
m
e
n
t
o
s
S
e
l
e
c
c
i
o
n
a
r
e
l
e
m
e
n
t
o
s
UNION ALL
R
R
Y
Y
Y
Y
Y
Y
R
R
Y
Y
R
R
Y
Y
Y
Lenguaje SQL 50
UNION ALL. Concepto
EDLEVEL
EDLEVEL
EDLEVEL
LASTNAME
LASTNAME
LASTNAME
LASTNAME
HAAS
THOMPSON
NICHOLLS
LUTZ
QUINTANA
NICHOLLS
HAAS
THOMPSON
NICHOLLS
LUTZ
QUINTANA
NICHOLLS
16
18
18
18
18
18
16
18
18
18
18
18
SELECT
FROM
WHERE
UNION ALL
SELECT
FROM
WHERE
LASTNAME, EDLEVEL
EMPLOYEE
J OB ='ANALYST'
LASTNAME, EDLEVEL
EMPLOYEE
EDLEVEL =18
SELECT
FROM
WHERE
LASTNAME, EDLEVEL
EMPLOYEE
EDLEVEL =18
SELECT
FROM
WHERE
LASTNAME, EDLEVEL
EMPLOYEE
J OB ='ANALYST'
Lenguaje SQL 51
Consultar ms de una tabla
EMPLOYEE
DEPTNAME
LASTNAME WORKDEPT
. . .
. . .
DEPARTMENT
EMPNO
DEPTNO
A00
C01
D01
D21
SPIFFY COMPUTER SERVICE DIV.
INFORMATION CENTER
DEVELOPMENT CENTER
ADMINISTRATION SYSTEMS
000010
000020
000030
000040
A00
C01
C01
D21
HAAS
THOMPSON
KWAN
PULASKI
Lenguaje SQL 52
Sintaxis del JOIN: formato 1
HAAS
WORKDEPT DEPTNAME LASTNAME
A00 SPIFFY COMPUTER SERVICE DIV. 000010
SELECT EMPNO, LASTNAME, WORKDEPT, DEPTNAME
FROM EMPLOYEE,
DEPARTMENT
WHERE WORKDEPT = DEPTNO
AND LASTNAME = 'HAAS'
EMPNO
Lenguaje SQL 53
JOIN de tres tablas
FIRSTNME LASTNAME MIDINIT
DEPTNAME MGRNO
PROJ NAME DEPTNO
. . .
DEPARTMENT
EMPLOYEE
EMPNO
DEPTNO
PROJ NO
AD3100
AD3110
AD3111
AD3112
AD3113
IF1000
ADMIN SERVICES
GENERAL AD SYSTEMS
PAYROLL PROGRAMMING
PERSONELL PROGRAMMING
ACCOUNT. PROGRAMMING
QUERY SERVICES
D01
D21
D21
D21
D21
C01
A00
B01
C01
D01
D11
D21
E01
000010
000020
000030
- - - - - -
000060
000070
000050
SPIFFY COMPUTER SERVICE DIV.
PLANNING
INFORMATION CENTER
DEVELOPMENT CENTER
MANUFACTURING SYSTEMS
ADMINISTRATION SYSTEMS
SUPPORT SERVICES
HAAS
THOMPSON
KWAN
GEYER
STERN
PULASKI
HENDERSON
SPENSER
I
L
A
B
F
D
W
Q
CHRISTA
MICHAEL
SALLY
J OHN
IRVING
EVA
EILEEN
THEODORE
000010
000020
000030
000050
000060
000070
000090
000100
PROJ ECT
. . .
. . .
Lenguaje SQL 54
JOIN de tres tablas
DEPTNO DEPTNAME MGRNO LASTNAME PROJ NO
D21
D21
D21
D21
ADMINISTRATION SYSTEMS
ADMINISTRATION SYSTEMS
ADMINISTRATION SYSTEMS
ADMINISTRATION SYSTEMS
000070
000070
000070
000070
PULASKI
PULASKI
PULASKI
PULASKI
AD3110
AD3111
AD3112
AD3113
SELECT PROJ NO, PROJ ECT.DEPTNO, DEPTNAME, MGRNO, LASTNAME
FROM PROJ ECT,
DEPARTMENT,
EMPLOYEE
WHERE PROJ ECT.DEPTNO =DEPARTMENT.DEPTNO
AND DEPARTMENT.MGRNO =EMPLOYEE.EMPNO
AND DEPARTMENT.DEPTNO ='D21'
ORDER BY PROJ NO
Lenguaje SQL 55
Nombre de correlacin (P, D, E)
DEPTNO DEPTNAME MGRNO LASTNAME
PROJ NO
D21
D21
D21
D21
ADMINISTRATION SYSTEMS
ADMINISTRATION SYSTEMS
ADMINISTRATION SYSTEMS
ADMINISTRATION SYSTEMS
000070
000070
000070
000070
PULASKI
PULASKI
PULASKI
PULASKI
AD3110
AD3111
AD3112
AD3113
SELECT PROJ NO, P.DEPTNO, DEPTNAME, MGRNO, LASTNAME
FROM PROJ ECT P,
DEPARTMENT D,
EMPLOYEE E
WHERE P.DEPTNO =D.DEPTNO
AND D.MGRNO =E.EMPNO
AND D.DEPTNO ='D21'
ORDER BY PROJ NO
Lenguaje SQL 56
JOIN de una tabla consigo misma
DEPTNAME ADMRDEPT
LASTNAME
LASTNAME
WORKDEPT
WORKDEPT
BIRTHDATE
BIRTHDATE
.
.
. . .
2. Recuperar el n deparatamento de DEPARTMENT (D)
3. Recuperar el director en EMPLOYEE (M)
DEPTNO
EMPNO
EMPNO
000100
000330
SPENSER
LEE
E21
E21
1956-12-18
1941-07-18
E21 E21
.
.
000100
.
.
SOFTWARE SUPPORT
.
.
000100
000330
SPENSER
LEE
E21
E21
1956-12-18
1941-07-18
MGRNO
. . . . . .
. . . . . . . . .
1. Recuperar la fila de un empleado de la tabla EMPLOYEE (E)
Lenguaje SQL 57
JOIN de una tabla consigo misma
EMPNO LASTNAME BIRTHDATE EMPNO
LUCCHESI
QUINTANA
BROWN
J EFFERSON
SMITH
J OHNSON
SCHNEIDER
SMITH
SETRIGHT
MEHTA
LEE
GOUNOT
Qu empleados
son mayores que
su director? SELECT E.EMPNO, E.LASTNAME,
E.BIRTHDATE, M.BIRTHDATE, M.EMPNO
FROM EMPLOYEE E, EMPLOYEE M,
DEPARTMENT D
WHERE E.WORKDEPT =D.DEPTNO
AND D.MGRNO =M.EMPNO
AND E.BIRTHDATE <M.BIRTHDATE
000110
000130
000200
000230
000250
000260
000280
000300
000310
000320
000330
000340
1929-11-05
1925-09-15
1941-05-29
1935-05-30
1939-11-12
1936-10-05
1936-03-28
1936-10-27
1931-04-21
1932-08-11
1941-07-18
1926-05-17
000010
000030
000060
000070
000070
000070
000090
000090
000090
000100
000100
000100
1933-08-14
1941-05-11
1945-07-07
1953-05-26
1953-05-26
1953-05-26
1941-05-15
1941-05-15
1941-05-15
1956-12-18
1956-12-18
1956-12-18
BIRTHDATE
Lenguaje SQL 58
Sintaxis del JOIN: formato 2
RESULTADO
EMPNO LASTNAME DEPTNO DEPTNAME
000010
000120
000030
000140
000130
HAAS
O'CONNELL
KWAN
NICHOLLS
QUINTANA
A00
C01
C01
C01
SPIFFY COMPUTER SERVICE DIV.
A00
SPIFFY COMPUTER SERVICE DIV.
INFORMATION CENTER
INFORMATION CENTER
INFORMATION CENTER
SELECT EMPNO, LASTNAME, DEPTNO, DEPTNAME
FROM EMPLOYEE
[INNER] JOIN DEPARTMENT
ON WORKDEPT = DEPTNO
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 DEPTNAME
000010
000120
000030
000130
000140
HAAS
O'CONNELL
KWAN
QUINTANA
NICHOLLS
A00
SPIFFY COMPUTER SERVICE DIV.
A00
SPIFFY COMPUTER SERVICE DIV.
C01 INFORMATION CENTER
C01
C01
INFORMATION CENTER
INFORMATION CENTER
D01 DEVELOPMENT CENTER
- -
Lenguaje SQL 60
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
000130
HAAS
QUINTANA
000140 NICHOLLS
SPIFFY COMPUTER SERVICE DIV. A00
C01
C01
INFORMATION CENTER
INFORMATION CENTER
000030 KWAN C01 INFORMATION CENTER
000120 O'CONNELL A00 SPIFFY COMPUTER SERVICE DIV.
000400 WILSON - -
Lenguaje SQL 61
Otros JOIN: FULL [OUTER] JOIN
SELECT EMPNO, LASTNAME, DEPTNO, DEPTNAME
FROM EMPLOYEE
FULL OUTER JOIN DEPARTMENT
ON WORKDEPT = DEPTNO
RESULTADO
EMPNO LASTNAME DEPTNO DEPTNAME
000030 KWAN C01 INFORMATION CENTER
000130
000140
QUINTANA
NICHOLLS
C01
C01
INFORMATION CENTER
INFORMATION CENTER
D01 DEVELOPMENT CENTER -
000400
-
WILSON - -
000010 HAAS SPIFFY COMPUTER SERVICE DIV. A00
000120 O'CONNELL A00 SPIFFY COMPUTER SERVICE DIV.
Lenguaje SQL 62
JOINs y predicados locales
EMPNO LASTNAME WORKDEPT SALARY DEPTNAME DEPTNO MGRNO
000130 QUINTANA C01 23800.00
000140 NICHOLLS C01 28420.00
SPIFFY COMPUTER SERVICE DIV. A00 000010
C01 INFORMATION CENTER 000030
- - - -
000010 HAAS A00 52750.00
000030 KWAN C01 38250.00
000120 O'CONNELL A00 29250.00
000400 WILSON 25400.00 - - - -
DEVELOPMENT CENTER D01 -
C01 INFORMATION CENTER 000030
C01 INFORMATION CENTER 000030
SPIFFY COMPUTER SERVICE DIV. A00 000010
SELECT EMPNO, LASTNAME, SALARY,
DEPTNO, DEPTNAME
FROM EMPLOYEE
FULL OUTER JOIN DEPARTMENT
ON WORKDEPT = DEPTNO
WHERE SALARY > 30000 AND
DEPTNAME LIKE '%CENTER%'
Lenguaje SQL 63
JOINs y predicados locales
EMPNO LASTNAME WORKDEPT SALARY DEPTNAME DEPTNO MGRNO
000130 QUINTANA C01 23800.00
000140 NICHOLLS C01 28420.00
SPIFFY COMPUTER SERVICE DIV. A00 000010
C01 INFORMATION CENTER 000030
- - - -
000010 HAAS A00 52750.00
000030 KWAN C01 38250.00
000120 O'CONNELL A00 29250.00
000400 WILSON 25400.00 - - - -
DEVELOPMENT CENTER D01 -
C01 INFORMATION CENTER 000030
C01 INFORMATION CENTER 000030
SPIFFY COMPUTER SERVICE DIV. A00 000010
SELECT EMPNO, LASTNAME, SALARY,
DEPTNO, DEPTNAME
FROM EMPLOYEE
FULL OUTER JOIN DEPARTMENT
ON WORKDEPT = DEPTNO
WHERE SALARY > 30000 AND
DEPTNAME LIKE '%CENTER%'
LASTNAME DEPTNO DEPTNAME EMPNO SALARY
000030 KWAN INFORMATION CENTER C01 38250.00
Lenguaje SQL 64
JOINs
Resumen
Existen 4 tipos de reunin y 3 condiciones de reunin que se pueden
combinar
Tipos de reunin
INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL
OUTER JOIN
Condiciones de reunin
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 parntesis
Elimina duplicados de atributos comunes indicados
Lenguaje SQL 65
Funciones de columna
Las funciones de columna o funciones de agregacin son
funciones que toman una coleccin (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
coleccin de nmeros, pero el resto de operadores pueden
operar sobre colecciones de datos de tipo no numrico.
Lenguaje SQL 66
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 especficos utilizando la
clusula GROUP BY.
En la clusula SELECT de consultas que utilizan funciones
de columna solamente pueden aparecer funciones de
columna.
En caso de utilizar GROUP BY, tambin pueden aparecer columnas
utilizadas en la agrupacin.
Adicionalmente se pueden aplicar condiciones sobre los
grupos utilizando la clusula HAVING.
Lenguaje SQL 67
Funciones de columna
Clculo del total SUM (expresin)
Clculo de la media AVG (expresin)
Obtener el valor mnimo MIN (expresin)
Obtener el valor mximo MAX (expresin)
Contar el nmero de filas que satisfacen la condicin de
bsqueda COUNT(*)
Los valores NULL SI se cuentan.
Contar el nmero de valores distintos en una columna
COUNT (DISTINCT nombre-columna)
Los valores NULL NO se cuenta.
Lenguaje SQL 68
Funciones de columna
AVG MIN MAX COUNT DEPT SUM
27303.59375000 15340.00 52750.00 32 8 873715.00
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 69
Funciones de columna en subconjuntos
SUM
373020.00 373020.00
SELECT SUM(SALARY) AS SUM
FROM EMPLOYEE
WHERE WORKDEPT LIKE 'D%'
Necesito el total de
salarios del rea D
Lenguaje SQL 70
GROUP BY
SUM
WORKDEPT
A00
B01
C01
Necesito conocer los salarios de todos los
empleados de los departamentos A00, B01,
y C01. Adems, para estos departamentos
quiero conocer su masa salarial.
SELECT WORKDEPT, SALARY
FROM EMPLOYEE
WHERE WORKDEPT IN ('A00', 'B01', 'C01')
ORDER BY WORKDEPT
SELECT WORKDEPT, SUM(SALARY) AS SUM
FROM EMPLOYEE
WHERE WORKDEPT IN ('A00', 'B01', 'C01')
GROUP BY WORKDEPT
ORDER BY WORKDEPT
128500.00
41250.00
90470.00
WORKDEPT
SALARY
A00
A00
A00
B01
C01
C01
C01
52750.00
46500.00
29250.00
41250.00
38250.00
23800.00
28420.00
Lenguaje SQL 71
GROUP BY-HAVING
SUM
A00
C01
Ahora slo 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
B01
C01
128500.00
41250.00
90470.00
WORKDEPT
Lenguaje SQL 72
GROUP BY-HAVING
CLERK
PRES
SALESREP
ANALYST
29250.00000000
52750.00000000
46500.00000000
26110.00000000
J OB AVG WORKDEPT
A00
A00
A00
C01
Necesito, agrupado por departmento, los
trabajadores que no sean managers,
designer, y fieldrep, con una media de
salario mayor que 25000.
SELECT WORKDEPT, J OB, AVG(SALARY) AS AVG
FROM EMPLOYEE
WHERE J OB NOT IN ('MANAGER', 'DESIGNER', 'FIELDREP')
GROUP BY WORKDEPT, JOB
HAVING AVG(SALARY) > 25000
ORDER BY WORKDEPT, J OB
Lenguaje SQL 73
GROUP BY-HAVING
1
1
3
3
4
5
6
9
3
3
4
5
6
9
NUMB
NUMB
WORKDEPT
WORKDEPT
SELECT 1
SELECT 2
B01
E01
A00
C01
E21
E11
D21
D11
A00
C01
E21
E11
D21
D11
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
Mostrar los departamentos con ms de un empleado
Lenguaje SQL 74
GROUP BY-HAVING
14
15
15
16
16
17
18
18
15
16
17
27
31
22
49
24
35
24
23
31
49
35
ED
ED
YEARS
YEARS
WORKDEPT
WORKDEPT
SELECT 1
SELECT 2
E11
E21
D21
E01
D11
A00
B01
C01
E21
E01
A00
SELECT WORKDEPT, AVG(EDLEVEL) AS ED,
AVG(YEAR(CURRENT_DATE-HIREDATE))
AS YEARS
FROM EMPLOYEE
GROUP BY WORKDEPT
HAVING AVG(YEAR(CURRENT_DATE-HIREDATE)) > = 30
ORDER BY 2
SELECT WORKDEPT, AVG(EDLEVEL) AS ED,
AVG(YEAR(CURRENT_DATE-HIREDATE))
AS YEARS
FROM EMPLOYEE
GROUP BY WORKDEPT
ORDER BY 2
Lenguaje SQL 75
GROUP BY-HAVING
17
18
18
16
15
16
14
14
15
600.00
800.00
500.00
400.00
300.00
800.00
300.00
300.00
300.00
ED
ED
MIN
MIN
WORKDEPT
WORKDEPT
SELECT 1
SELECT 2
A00
B01
C01
D11
D21
E01
E11
E11
D21
SELECT WORKDEPT, AVG(EDLEVEL) AS ED,
MIN(BONUS) AS MIN
FROM EMPLOYEE
GROUP BY WORKDEPT
HAVING MIN(BONUS) = 300
ORDER BY 2
SELECT WORKDEPT, AVG(EDLEVEL) AS ED,
MIN(BONUS) AS MIN
FROM EMPLOYEE
GROUP BY WORKDEPT
Lenguaje SQL 76
Ejecucin de consultas SELECT
El orden de ejecucin 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 patrn GROUP BY.
3. Se ejecutan la clusula HAVING para cada grupo de tuplas
anterior.
4. Los grupos obtenidos tras aplicar HAVING son los que
sern procesados por SELECT, que calcular, en los casos
que se incluyan, las funciones de agregacin que le
acompaan.
5. A las tuplas resultantes de los pasos anteriores se le aplica
la ordenacin descrita en la clusula ORDER BY.
Lenguaje SQL 77
Expresin condicional CASE
SQL tiene una sentencia CASE similar a la instruccin CASE
de los lenguajes de programacin.
La sintaxis general de esta expresin es:
Ci Condiciones
A Columna
Vi Literal
La expresin CASE puede aparecer tanto en la clusula
SELECT como en la clusula WHERE.
CASE
WHEN C1 THEN r esul t 1
WHEN C2 THEN r esul t 2
. . .
WHEN Cn THEN r esul t n
ELSE r esul t x
END
CASE A
WHEN V1 THEN r esul t 1
WHEN V2 THEN r esul t 2
. . .
WHEN Vn THEN r esul t n
ELSE r esul t x
END
Lenguaje SQL 78
Ejemplo de expresin condicional CASE
SELECT EMPNO, FI RSTNME, MI DI NI T, LASTNAME,
CASE
WHEN EDLEVEL < 15 THEN ' SECONDARY'
WHEN EDLEVEL < 19 THEN ' COLLEGE'
ELSE ' POST GRADUATE'
END AS EDUCATION
FROM EMPLOYEE
SELECT EMPNO, FI RSTNME,
LASTNAME,
CASE SEX
WHEN ' F' THEN ' FEMALE'
WHEN ' M' THEN ' MALE'
ELSE ' I NVALI D VALUE'
END AS SEX
FROM EMPLOYEE
WHERE SALARY < 18000
FIRSTNME LASTNAME SEX EMPNO
000260
000290
000300
000310
SYBIL
J OHN
PHILIP
MAUDE
J OHNSON
PARKER
SMITH
SETRIGHT
FEMALE
MALE
MALE
FEMALE
Lenguaje SQL 79
Casos especiales de CASE
Existen dos casos especiales de uso de la expresin CASE para los que
existe una expresin propia.
NULLIF( exp, valor) Devuelve NULL si al evaluar exp es igual a
valor.
CASE
WHEN exp = val or THEN NULL
ELSE exp
END
COALESCE(valor
1
, , valor
n
) Devuelve el primer valor
i
que
no sea NULL. Si no existe se devuelve NULL.
CASE
WHEN val or
1
I S NOT NULL THEN val or
1
WHEN val or
2
I S NOT NULL THEN val or
2
WHEN val or
n
I S NOT NULL THEN val or
n
ELSE NULL
END
Lenguaje SQL 80
Obtener resultados con varias consultas
Qu salarios son mayores que el salario medio?
1r a 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 81
Ejemplo de subconsulta
Quin tiene el menor BONUS?
SELECT EMPNO, LASTNAME, BONUS
FROM EMPLOYEE
WHERE BONUS = (SELECT MIN(BONUS) FROM EMPLOYEE)
PARKER 300
LASTNAME
BONUS
EMPNO
000290
Lenguaje SQL 82
Subconsultas
Una subconsulta es una instruccin 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 clsula AS.
WHERE La subconsulta es utilizada dentro de los predicados para
realizar comparaciones.
Las subconsultas pueden devolver uno o varios valores.
Dependiendo del nmero de valores se utilizarn unos operadores u
otros.
Lenguaje SQL 83
Subconsultas
La subconsulta se ejecuta una vez antes de ejecutarse la
consulta principal.
Los resultados de la subconsulta son utilizados en la consulta
principal.
SELECT l i st a_sel ecci on
FROM t abl a
WHERE expr oper ador
(SELECT lista_seleccion
FROM tabla);
Lenguaje SQL 84
Subconsultas (cont.)
Si estamos seguros de que la subconsulta devuelve un nico
valor, es posible utilizar los operadores de comparacin
habituales =, <>, <=, <, >=, >.
Para subconsultas que devuelven mltiples valores se pueden
utilizar los operadores
IN / NOT IN
Los operadores de comparacin habituales junto a los
cuantificadores ANY/SOME y ALL.
Lenguaje SQL 85
Subconsulta con IN
SPIFFY COMPUTER SERVICE
SPIFFY COMPUTER SERVICE
PLANNING
INFORMATION CENTER
DEPTNAME
DEPTNAME
DEPTNO
DEPTNO
Tabla DEPARTMENT
Resultado final
A00
B01
C01
D01
D11
D21
E01
E11
E21
A00
B01
C01
SELECT DEPTNO, DEPTNAME
FROM DEPARTMENT
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 LASTNAME
HAAS
LUCCHESI
SELECT LASTNAME, SALARY
FROM EMPLOYEE
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
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?
29750.00
26250.00
SALARY LASTNAME
HENDERSON
SCHNEIDER
SELECT LASTNAME, SALARY, WORKDEPT
FROM EMPLOYEE
WHERE WORKDEPT = 'E11'
AND SALARY >ANY
ORDER BY LASTNAME
(SELECT AVG(SALARY)
FROM EMPLOYEE
GROUP BY WORKDEPT)
Resultado Final
E11
E11
WORKDEPT
42833.33333333
41250.00000000
30156.66666666
24677.77777777
25153.33333333
40175.00000000
20998.00000000
23827.50000000
Resultado subconsulta
Lenguaje SQL 88
Subconsulta en la clusula HAVING
SELECT WORKDEPT, AVG(SALARY) AS AVG_WORKDEPT
FROM EMPLOYEE
WHERE J OB <>'MANAGER'
GROUP BY WORKDEPT
HAVING AVG(SALARY) >
ORDER BY AVG_WORKDEPT DESC
42833.33333333
26110.00000000
AVG_WORKDEPT 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 compaia
(tambin sin directores). El resultado lo quiero de
forma que el departamento que tenga mayor
media sea el primero.
25188.80000000
Resultado subconsulta
Resultado final
Lenguaje SQL 89
Subconsultas correlacionadas
En una subconsulta correlacionada se utilizan las tablas de la
consulta principal.
El orden de ejecucin 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.
Lenguaje SQL 90
Subconsultas correlacionadas
EMPLOYEE
Qu empleado tiene el
salario mayor que la media de
salarios de su departamento?
EMPNO LASTNAME WORKDEPT SALARY
000010
000030
000120
000130
000140
HAAS
KWAN
O'CONNELL
QUINTANA
NICHOLLS
A00
C01
A00
C01
C01
52750.00
38250.00
29250.00
23800.00
28420.00
SELECT EMPNO, LASTNAME, SALARY
FROM EMPLOYEE
WHERE SALARY >
Media de salarios del dept.
c or r espondi ent e
AVG(SALARY)
41000.00000000 A00
AVG(SALARY)
30156.66666666 C01
Lenguaje SQL 91
Subconsultas correlacionadas
EMPNO LASTNAME SALARY
000030 KWAN
000010 HAAS 52750.00
38250.00
EMPLOYEE
EMPNO LASTNAME WORKDEPT SALARY
000010
000030
000120
000130
000140
HAAS
KWAN
O'CONNELL
QUINTANA
NICHOLLS
A00
C01
A00
C01
C01
52750.00
38250.00
29250.00
23800.00
28420.00
SELECT EMPNO, LASTNAME, SALARY
FROM EMPLOYEE
WHERE SALARY >
E
(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?
Lenguaje SQL 92
Subconsultas correlacionadas con EXISTS
Qu departamentos no
tienen empleados?
DEPARTMENT
DEPTNAME DEPTNO MGRNO
DEVELOPMENT CENTER
SPIFFY COMPUTER SERVICE DIV.
D01
A00
C01 INFORMATION CENTER
000010
000030
SELECT DEPTNO, DEPTNAME
FROM DEPARTMENT D
WHERE NOT EXISTS
EMPLOYEE
EMPNO LASTNAME WORKDEPT SALARY
000010
000030
000120
000130
000140
000400
HAAS
KWAN
O'CONNELL
QUINTANA
NICHOLLS
WILSON
A00
C01
A00
C01
C01
52750.00
38250.00
29250.00
23800.00
28420.00
25400.00 null
(SELECT *
FROM EMPLOYEE
WHERE
WORKDEPT = D.DEPTNO)
D01 DEVELOPMENT CENTER
DEPTNO DEPTNAME
RESULTADO
-
Lenguaje SQL 93
Modificacin de la BBDD
Las instrucciones SQL que permiten modificar el estado de
la BBDD son:
INSERT Aade 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
Lenguaje SQL 94
La instruccin INSERT
La insercin 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 relacin.
Ejemplos: CLIENTES (DNI, NOMBRE, DIR)
La insercin
INSERT INTO CLI ENTES VALUES ( 1111, ' Mar i o' ,
' C/ . Mayor , 3' ) ;
Es equivalente a las siguientes sentencias
INSERT INTO CLI ENTES ( NOMBRE, DI R, DNI )
VALUES ( ' Mar i o' , ' C/ . Mayor , 3' , 1111) ;
INSERT INTO CLI ENTES ( DNI , DI R, NOMBRE)
VALUES ( 1111, ' C/ . Mayor , 3 , ' Mar i o' ) ;
Lenguaje SQL 95
Aadir una fila
INSERT INTO TESTEMP
VALUES ( ' 000111' , ' SMI TH' , ' C01' , ' 1998- 06- 25' , 25000, NULL)
EMPNO LASTNAME WORKDEPT HIREDATE SALARY BONUS
25000.00 1998-06-25 - C01 SMITH 000111
INSERT INTO TESTEMP( EMPNO, LASTNAME, WORKDEPT, HI REDATE, SALARY)
VALUES ( ' 000111' , ' SMI TH' , ' C01' , ' 1998- 06- 25' , 25000)
Lenguaje SQL 96
Aadir varias filas
Ejemplo:
Para la siguiente base de datos, queremos incluir en la relacin GRUPOS
a todos los grupos, junto con su nmero de lbumes publicados:
GRUPOS (NOMBRE, ALBUMES) LP (TIT, GRUPO, ANIO, NUM_CANC)
Solucin:
En SQL se prohbe que la consulta que se incluye en una clusula
INSERT haga referencia a la misma tabla en la que se quieren
insertar las tuplas.
En ORACLE s est permitido
INSERT INTO GRUPOS
SELECT GRUPO, COUNT (DISTINCT TIT) FROM LP
GROUP BY GRUPO;
Lenguaje SQL 97
Aadir varias filas (cont.)
TESTEMP
INSERT INTO TESTEMP
SELECT
FROM EMPLOYEE
WHERE EMPNO <='000050'
EMPNO,LASTNAME,WORKDEPT,HIREDATE,SALARY,BONUS
EMPNO LASTNAME WORKDEPT HIREDATE SALARY BONUS
EMPNO LASTNAME WORKDEPT HIREDATE SALARY BONUS
1000.00
800.00
800.00
800.00
- - - - -
52750.00
41250.00
38250.00
40175.00
25000.00
1965-01-01
1973-10-10
1975-04-05
1949-08-17
1998-06-25
A00
B01
C01
E01
C01
HAAS
THOMPSON
KWAN
GEYER
SMITH
000010
000020
000030
000050
000111
Lenguaje SQL 98
La instruccin UPDATE
La modificacin 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 inters a los saldos de todas las cuentas.
UPDATE CUENTAS SET SALDO = SALDO * 1. 05;
Suma del 1% de bonificacin a aquellas cuentas cuyo saldo sea superior a
100.000 .
UPDATE CUENTAS SET SALDO = SALDO * 1. 01
WHERE SALDO > 100000;
Modificacin de DNI y saldo simultneamente para el cdigo 898.
UPDATE CUENTAS SET DNI =' 555' , SALDO=10000
WHERE COD LIKE ' 898' ;
Lenguaje SQL 99
Modificar datos
UPDATE TESTEMP
SET BONUS =500,
SALARY =26000
WHERE EMPNO ='000111'
Antes:
Despus:
EMPNO LASTNAME WORKDEPT HIREDATE SALARY BONUS
1000.00
800.00
800.00
800.00
- - - - -
52750.00
41250.00
38250.00
40175.00
25000.00
1965-01-01
1973-10-10
1975-04-05
1949-08-17
1998-06-25
A00
B01
C01
E01
C01
HAAS
THOMPSON
KWAN
GEYER
SMITH
000010
000020
000030
000050
000111
EMPNO LASTNAME WORKDEPT HIREDATE SALARY BONUS
1000.00
800.00
800.00
800.00
500.00
52750.00
41250.00
38250.00
40175.00
26000.00
1965-01-01
1973-10-10
1975-04-05
1949-08-17
1998-06-25
A00
B01
C01
E01
C01
HAAS
THOMPSON
KWAN
GEYER
SMITH
000010
000020
000030
000050
000111
Lenguaje SQL 100
Modificar datos
UPDATE TESTEMP
SET SALARY =SALARY +1000
WHERE WORKDEPT ='C01'
Antes:
Despus:
EMPNO LASTNAME WORKDEPT HIREDATE SALARY BONUS
1000.00
800.00
800.00
800.00
- - - - -
52750.00
41250.00
38250.00
40175.00
25000.00
1965-01-01
1973-10-10
1975-04-05
1949-08-17
1998-06-25
A00
B01
C01
E01
C01
HAAS
THOMPSON
KWAN
GEYER
SMITH
000010
000020
000030
000050
000111
EMPNO LASTNAME WORKDEPT HIREDATE SALARY BONUS
1000.00
800.00
800.00
800.00
- - - - -
52750.00
41250.00
39250.00
40175.00
26000.00
1965-01-01
1973-10-10
1975-04-05
1949-08-17
1998-06-25
A00
B01
C01
E01
C01
HAAS
THOMPSON
KWAN
GEYER
SMITH
000010
000020
000030
000050
000111
Lenguaje SQL 101
La instruccin DELETE
La eliminacin de tuplas se realiza con la sentencia DELETE:
DELETE FROM R WHERE P; - - WHERE es opci onal
Elimina tuplas completas, no columnas. Puede incluir subconsultas.
Ejemplos: para la BD de CLIENTES, CUENTAS, SUCURSALES.
Eliminar todas cuentas con cdigo entre 1000 y 1100.
DELETE FROM CUENTAS WHERE COD BETWEEN 1000 AND
1100;
Eliminar todas las cuentas del cliente Jose Mara Garca.
DELETE FROM CUENTAS WHERE DNI IN
( SELECT DNI FROM CLI ENTES
WHERE NOMBRE LIKE ' J ose Mar a Gar c a' ) ;
Eliminar todas las cuentas de sucursales situadas en "Chinchn".
DELETE FROM CUENTAS WHERE NSUCURS IN
( SELECT NSUC FROM SUCURSALES
WHERE CI UDAD LIKE ' Chi nchn' ) ;
Lenguaje SQL 102
Borrar filas
DELETE FROM TESTEMP
WHERE EMPNO ='000111'
Antes:
Despus:
EMPNO LASTNAME WORKDEPT HIREDATE SALARY BONUS
1000.00
800.00
800.00
800.00
- - - - -
52750.00
41250.00
38250.00
40175.00
25000.00
1965-01-01
1973-10-10
1975-04-05
1949-08-17
1998-06-25
A00
B01
C01
E01
C01
HAAS
THOMPSON
KWAN
GEYER
SMITH
000010
000020
000030
000050
000111
EMPNO LASTNAME WORKDEPT HIREDATE SALARY BONUS
1000.00
800.00
800.00
800.00
52750.00
41250.00
38250.00
40175.00
1965-01-01
1973-10-10
1975-04-05
1949-08-17
A00
B01
C01
E01
HAAS
THOMPSON
KWAN
GEYER
000010
000020
000030
000050
Lenguaje SQL 103
Creacin de Tablas
La creacin de tablas se lleva a cabo con la sentencia
CREATE TABLE.
Ejemplo: creacin del siguiente esquema de BD.
CLIENTES (DNI, NOMBRE, DIR) SUCURSALES (NSUC, CIUDAD)
CUENTAS (COD, DNI, NSUCURS, SALDO)
Se empieza por las tablas ms independientes:
CREATE TABLE CLI ENTES (
DNI VARCHAR( 9) NOT NULL,
NOMBRE VARCHAR( 20) ,
DI R VARCHAR( 30) ,
PRIMARY KEY ( DNI )
) ;
CREATE TABLE SUCURSALES (
NSUC VARCHAR( 4) NOT NULL,
CI UDAD VARCHAR( 30) ,
PRIMARY KEY ( NSUC)
) ;
Lenguaje SQL 104
Creacin de Tablas (cont.)
El siguiente paso es crear la tabla CUENTAS, con las claves externas:
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 ...
CREATE TABLE CUENTAS (
COD VARCHAR( 4) NOT NULL,
DNI VARCHAR( 9) NOT NULL,
NSUCURS VARCHAR( 4) NOT NULL,
SALDO I NT DEFAULT 0,
PRIMARY KEY ( COD, DNI , NSUCURS) ,
FOREIGN KEY ( DNI ) REFERENCES CLI ENTES ( DNI ) ,
FOREIGN KEY ( NSUCURS) REFERENCES SUCURSALES ( NSUC) ) ;
Lenguaje SQL 105
Modificacin y eliminacin de tablas
Modificacin de tablas: sentencia ALTER TABLE.
Es posible aadir, modificar y eliminar campos. Ejemplos:
Adicin del campo PAIS a la tabla CLIENTES
ALTER TABLE CLI ENTES ADD PAI S VARCHAR( 10) ;
Modificacin del tipo del campo PAIS
ALTER TABLE CLI ENTES MODIFY PAI S VARCHAR( 20) ;
Eliminacin del campo PAIS de la tabla CLIENTES
ALTER TABLE CLI ENTES DROP PAI S;
Tambin es posible aadir nuevas restricciones a la tabla (claves
externas, restricciones check).
Eliminacin de tablas: sentencia DROP TABLE.
DROP TABLE CUENTAS;
- - Las t abl as a l as que r ef er enci a deben haber si do
el i mi nadas ant es.
Lenguaje SQL 106
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 ms.
Habitualmente las vistas son creadas para combinar informacin de
mltiples tablas.
Integracin de diferentes BBDD.
Tambin 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 [ ( col 1, . . . ) ]
AS instruccion_select
[ WITH CHECK OPTION]
Lenguaje SQL 107
Vistas
Tabla EMPLOYEE
EMPNO LASTNAME WORKDEPT SALARY
000010
000030
000120
000130
000140
HAAS
KWAN
O'CONNELL
QUINTANA
NICHOLLS
A00
C01
A00
C01
C01
52750.00
38250.00
29250.00
23800.00
28420.00
Tabla DEPARTMENT
DEPTNAME DEPTNO MGRNO
DEVELOPMENT CENTER
SPIFFY COMPUTER SERVICE DIV.
D01
A00
C01 INFORMATION CENTER
000010
000030
CREATE VIEW EMP_DEPT (NAME, DEPARTMENT)
AS SELECT LASTNAME, DEPTNAME
FROM EMPLOYEE, DEPARTMENT
WHERE WORKDEPT = DEPTNO
SELECT * FROM EMP_DEPT;
NAME
DEPARTMENT
HAAS
O'CONNELL
KWAN
NICHOLLS
QUINTANA
SPIFFY COMPUTER SERVICE DIV.
SPIFFY COMPUTER SERVICE DIV.
INFORMATION CENTER
INFORMATION CENTER
INFORMATION CENTER
Vista EMP_DEPT
Lenguaje SQL 108
Vistas
Tabla DEPARTMENT
DEPTNAME DEPTNO MGRNO
DEVELOPMENT CENTER
SPIFFY COMPUTER SERVICE DIV.
D01
A00
C01 INFORMATION CENTER
000010
000030
Tabla PROJECT
PROJNAME PROJNO RESPEMP DEPTNO
USER EDUCATION
ADMIN SERVICES
IF2000
AD3100
IF1000 QUERY SERVICES
000010
000030
000030
D01
C01
C01
DEPARTMENT PROJECT MANAGER
ADMIN SERVICES
USER EDUCATION
QUERY SERVICES
SPIFFY COMPUTER SERVICE DIV.
INFORMATION CENTER
INFORMATION CENTER
KWAN
KWAN

Vista PROJ_DEPT_MGR
Tabla EMPLOYEE
EMPNO LASTNAME WORKDEPT SALARY
000010
000030
000120
000130
000140
HAAS
KWAN
O' CONNELL
QUINTANA
NICHOLLS
A00
C01
A00
C01
C01
52750.00
38250.00
29250.00
23800.00
28420.00
DEPTNAME PROJNAME
MGRNO
ADMIN SERVICES
USER EDUCATION
QUERY SERVICES
SPIFFY COMPUTER SERVICE DIV.
INFORMATION CENTER
INFORMATION CENTER
000030
000030

Vista PROJ_DEPT
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
Lenguaje SQL 110
Vistas
Tabla EMPLOYEE
EMPNO LASTNAME WORKDEPT SALARY
000010
000030
000120
000130
000140
HAAS
KWAN
O'CONNELL
QUINTANA
NICHOLLS
A00
C01
A00
C01
C01
52750.00
38250.00
29250.00
23800.00
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
Vista DEPT_SALARIES
DEPARTMENT TOTAL_SALARY
A00
C01
82000.00
90470.00
PASO 1
MAXIMUM_SALARY
90470.00
PASO 2
Lenguaje SQL 111
Actualizacin de vistas
Las vistas pueden ser utilizadas en consultas.
Sin embargo, tambin se pueden definir vistas actualizables.
Estas vistas tienen que cumplir ciertas restricciones en la instruccin de
seleccin que la define.
Restricciones de la instruccin SELECT que define la vista
No puede contener ningn 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
definicin de la vista.
La consulta no contiene operadores de conjunto como UNI ON, EXCEPT o
INTERSECT. La clusula DISTINCT tampoco est permitida.
Ninguna expresin de agregacin puede estar incluida en la clusula
SELECT.
No se puede utilizar la clusula GROUP BY.
Lenguaje SQL 112
Vistas de lectura
Tabla EMPLOYEE
EMPNO LASTNAME WORKDEPT SALARY
000010
000030
000120
000130
000140
HAAS
KWAN
O'CONNELL
QUINTANA
NICHOLLS
A00
C01
A00
C01
C01
52750.00
38250.00
29250.00
23800.00
28420.00
Tabla DEPARTMENT
DEPTNAME DEPTNO MGRNO
DEVELOPMENT CENTER
SPIFFY COMPUTER SERVICE DIV.
D01
A00
C01 INFORMATION CENTER
000010
000030
NAME DEPARTMENT
HAAS
O'CONNELL
KWAN
NICHOLLS
QUINTANA
SPIFFY COMPUTER SERVICE DIV.
SPIFFY COMPUTER SERVICE DIV.
INFORMATION CENTER
INFORMATION CENTER
INFORMATION CENTER
Vista EMP_DEPT
UPDATE EMP_DEPT
SET DEPARTMENT = 'DEVELOPMENT CENTER'
WHERE NAME = 'KWAN'
Lenguaje SQL 113
Restricciones en las vistas
SQL3 no permite definir restricciones explcitas sobre vistas.
Sin embargo, la clusula CHECK OPTION puede
considerarse como un tipo de restriccin.
Si se utiliza CHECK OPTION en la creacin de una vista el
SGBD no permite que una instruccin de manipulacin de la
BBDD genere o actualice filas que no estn incluidas en la
consulta que ha generado la tabla.
Lenguaje SQL 114
Opcin 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
Tabla EMPLOYEE
EMPNO LASTNAME WORKDEPT SALARY
000010
000030
000120
000130
000140
HAAS
KWAN
O'CONNELL
QUINTANA
NICHOLLS
A00
C01
A00
C01
C01
52750.00
38250.00
29250.00
23800.00
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
WI TH CHECK OPTI ON
Lenguaje SQL 115
Clusula WITH
La norma SQL 1999 introduce la clusula WITH con dos
propsitos:
Factorizacin de subconsultas
Definicin 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 clusula.
ORACLE por su parte ofrece una sintaxis y comportamiento
alternativos para la recursin.
Clusula CONNECT BY PRIOR.
Lenguaje SQL 116
Factorizacin de subconsultas
HIREDECADE MINIMUM_SALARY
1960 - 9 29250.00
23800.00 1970 - 9
EMPLOYEE
EMPNO LASTNAME WORKDEPT SALARY HIREDATE
000010
000030
000120
000130
000140
HAAS
KWAN
O' CONNELL
QUINTANA
NICHOLLS
A00
C01
A00
C01
C01
52750.00
38250.00
29250.00
23800.00
28420.00
1965-01-01
1975-04-05
1963-12-05
1971-07-28
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 117
Factorizacin de subconsultas (cont.)
SELECT E.EMPNO, E.LASTNAME, E.HIREDECADE, E.SALARY, M.MINIMUM_SALARY
FROM
(
) AS E
INNER JOIN
(


) AS M
ON E.HIREDECADE = M.HIREDECADE
SELECT EMPNO, LASTNAME,SALARY,
SUBSTR(CHAR(HIREDATE,ISO),1,3) CONCAT '0 - 9'
AS HIREDECADE
FROM EMPLOYEE
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
Lenguaje SQL 118
Factorizacin de subconsultas (cont.)
SELECT EMPNO, LASTNAME, SALARY,
SUBSTR(CHAR(HIREDATE,ISO),1,3) CONCAT '0 - 9'
AS HIREDECADE
FROM EMPLOYEE
SELECT HIREDECADE, MIN(SALARY)
FROM
GROUP BY HIREDECADE
E
WITH
E AS
(




),
M (HIREDECATE, MINIMUM_SALARY) AS
(

)
SELECT E.EMPNO, E.LASTNAME, E.HIREDECADE,
E.SALARY, M.MINIMUM_SALARY
FROM E INNER JOIN M
ON E.HIREDECADE = M.HIREDECADE
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 ejecucin de esta consulta se llevara a cabo de esta
manera:
1. Obtencin de los empleados supervisados por Lopez
2. Obtencin de los empleados supervisados por los supervisados por
Lopez.
3. Repetir el paso 2 hasta que un empleado no supervise a nadie.
Lenguaje SQL 120
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 jerarqua.
Destino de vuelos
Partes de un coche
Departamentos en una empresa
Lenguaje SQL 121
SQL Recursivo
WITH
RPL (PART, SUBPART, QUANTITY) AS
(
SELECT ROOT.PART, ROOT.SUBPART, ROOT.QUANTITY
FROM PARTLIST ROOT
WHERE ROOT.PART = '01'

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
UNI ON ALL
SELECT de i ni ci aci n
SELECT i t erat i va
SELECT pri nci pal
Lenguaje SQL 122
SQL Recursivo. Iniciacin
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 123
SQL Recursivo. Iteracin 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
Lenguaje SQL 124
SQL Recursivo. Iteracin 2
10
10
10
10
8
8
RPL
SELECT CHILD.PART, CHILD.SUBPART, CHILD.QUANTITY
FROM RPL PARENT, PARTLIST CHILD
WHERE PARENT.SUBPART = CHILD.PART
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
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
05
05
06
06
07
07
10
11
12
13
12
14
No hay
correspondencia
en tabla PARTLIST
Lenguaje SQL 125
SQL Recursivo. Resultado
SELECT PART, SUBPART, SUM(QUANTITY) AS QUANTITY
FROM RPL
GROUP BY PART, SUBPART
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
05 10 10
05 11 10
06 12 10
06 13 10
07 12 8
07 14 8
Resultado final
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
05 10 10
05 11 10
06 12 20
06 13 20
07 12 8
07 14 8
Lenguaje SQL 126
SQL Recursivo. Control de recursin
WITH
RPL (LEVEL, PART, SUBPART, QUANTITY) AS
(
SELECT 0, ROOT.PART, ROOT.SUBPART, ROOT.QUANTITY
FROM PARTLIST ROOT
WHERE ROOT.PART = '01'

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
UNI ON ALL
SELECT i t erat i va
SELECT de i ni c i ac i n
Lenguaje SQL 127
SQL Recursivo. Control de recursin
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

También podría gustarte