Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tema 3
Lenguaje SQL
Lenguaje SQL 1
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
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
Lenguaje SQL 3
Lenguaje SQL 4
Estructura básica de la sentencia SELECT
Lenguaje SQL 5
Lenguaje SQL 6
Proyección de algunas columnas
Lenguaje SQL 7
WORKDEPT JOB
A00 CLERK
A00 PRES
A00 SALESREP
B01 MANAGER
C01 ANALYST
C01 MANAGER
D11 DESIGNER
D11 MANAGER
D21 CLERK
D21 MANAGER
E01 MANAGER
E11 MANAGER
E11 OPERATOR
E21 FIELDREP
E21 MANAGER
Lenguaje SQL 9
Lenguaje SQL 10
Salida ordenada
Lenguaje SQL 11
Lenguaje SQL 12
Salida ordenada (cont.)
Lenguaje SQL 13
Lenguaje SQL 14
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)
Lenguaje SQL 15
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
Selección de filas (cont.)
Lenguaje SQL 17
DEPTNO ADMRDEPT
A00 A00
B01 A00
C01 A00
D01 A00
E01 A00
Lenguaje SQL 18
Ejemplo de selección de filas
Lenguaje SQL 19
Lenguaje SQL 20
Múltiples condiciones - AND
Lenguaje SQL 21
EMPNO EDLEVEL
000310 12
000290 12
000300 14
000330 14
000100 14
000230 14
000120 14
000270 15
000250 15
Lenguaje SQL 23
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 14
LEE 14
O'CONNELL 14
SMITH 14
SPENSER 14
LUCCHESI 19
KWAN 20
Lenguaje SQL 24
Selección de valores NULL
Lenguaje SQL 25
SELECT LASTNAME
FROM EMPLOYEE
WHERE LASTNAME LIKE 'G%';
Lenguaje SQL 26
Búsqueda parcial – LIKE
Ejemplos con %
THOMPSON
SELECT LASTNAME HENDERSON
FROM EMPLOYEE ADAMSON
WHERE LASTNAME LIKE '%SON'; JEFFERSON
JOHNSON
Lenguaje SQL 27
Lenguaje SQL 28
Búsqueda parcial – NOT LIKE
DEPTNO DEPTNAME
A00 SPIFFY COMPUTER SERVICE DIV.
B01 PLANNING
C01 INFORMATION CENTER
E01 SUPPORT SERVICES
E11 OPERATIONS
E21 SOFTWARE SUPPORT
Lenguaje SQL 29
Renombramiento de columnas
Lenguaje SQL 30
Renombramiento de tablas
Lenguaje SQL 31
Lenguaje SQL 32
Tipos SQL y valores literales
Lenguaje SQL 33
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
Expresiones
Lenguaje SQL 35
SQL
Descripción IBM DB2 Oracle MySQL
Server
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
ROUND ROUND ROUND ROUND
de cifras decimales
Módulo MOD. % MOD. %
Lenguaje SQL 36
Funciones de cadena
Lenguaje SQL 37
Operaciones aritméticas
EMPNO SALARY
Lenguaje SQL 39
Expresiones en predicados
Lenguaje SQL 40
Uso de funciones
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
Lenguaje SQL 41
NAME
HAAS, CHRISTA
LUCCHESI, VINCENZO
O'CONNELL, SEAN
Lenguaje SQL 42
Operadores de conjunto
Lenguaje SQL 43
UNION - Concepto
Se
R ele lecci
me ona
RE nto r
Y D s
Y ON
DO
S R
R
R
Y Y UNION Y
r Y
i ona
c
R elec ntos Y
S me OS
ele ILL
Y AR
Y AM
R
Lenguaje SQL 44
UNION
Lenguaje SQL 45
UNION
Lenguaje SQL 46
UNION
MGRNO DEPTNAME
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
Lenguaje SQLSERVICES 47
UNION
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
UNION ALL. Concepto
Se
R ele lecci
me ona
RE
nto r
Y D s
Y ON
DO
S R
R
R
Y UNION ALL Y Y
Y
r Y
i ona
c
elec ntos Y
R S me S
ele IL LO
Y MAR
Y A
R
Lenguaje SQL 49
Lenguaje SQL 50
Consultar más de una tabla
EMPLOYEE
EMPNO LASTNAME WORKDEPT. . .
000010 HAAS A00
000020 THOMPSON C01
000030 KWAN C01
000040 PULASKI D21
DEPARTMENT
DEPTNO DEPTNAME ...
Lenguaje SQL 51
Lenguaje SQL 52
JOIN de tres tablas
PROJECT
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
DEPARTMENT
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
EMPLOYEE
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
Lenguaje SQL 53
Lenguaje SQL 54
Nombre de correlación (P, D, E)
Lenguaje SQL 55
Lenguaje SQL 56
JOIN de una tabla consigo misma
¿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
Lenguaje SQL 57
Lenguaje SQL 58
Otros JOIN: RIGHT [OUTER] JOIN
Lenguaje SQL 60
Otros JOIN: FULL [OUTER] JOIN
Lenguaje SQL 62
JOINs y predicados locales
Lenguaje SQL 63
JOINs
Resumen
Existen 4 tipos de reunión y 3 condiciones de reunión que se pueden
combinar
Tipos de reunión
z INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL
OUTER JOIN
Condiciones de reunión
z ON <predicado>
Respecto al predicado
No elimina duplicados de atributos comunes
z NATURAL
Respecto a todos los atributos comunes
Elimina duplicados de atributos comunes
z USING (A1, …, An)
Respecto a los atributos comunes indicados entre paréntesis
Elimina duplicados de atributos comunes indicados
Lenguaje SQL 64
Funciones de columna
Lenguaje SQL 65
Funciones de columna
Lenguaje SQL 66
Funciones de columna
Contar
el número de filas que satisfacen la condición de
búsqueda Æ COUNT(*)
Los valores NULL SI se cuentan.
el número de valores distintos en una columna Æ
Contar
COUNT (DISTINCT nombre-columna)
Los valores NULL NO se cuenta.
Lenguaje SQL 67
Funciones de columna
Lenguaje SQL 68
Funciones de columna en subconjuntos
Necesito el total de
salarios del área D
SUM
373020.00
Lenguaje SQL 69
GROUP BY
WORKDEPT SALARY
A00 52750.00
A00 46500.00 WORKDEPT SUM
A00 29250.00 A00 128500.00
B01 41250.00 B01 41250.00
C01 38250.00 C01 90470.00
C01 23800.00
C01 28420.00 Lenguaje SQL 70
GROUP BY-HAVING
W ORKDEPT SUM
W ORKDEPT SUM
A00 128500.00
B01 41250.00 A00 128500.00
C01 90470.00 C01 90470.00
Lenguaje SQL 71
GROUP BY-HAVING
Lenguaje SQL 72
GROUP BY-HAVING
SELECT 1 SELECT 2
WORKDEPT NUMB
B01 1 WORKDEPT NUMB
E01 1
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
GROUP BY-HAVING
Lenguaje SQL 74
GROUP BY-HAVING
SELECT 2
SELECT WORKDEPT, AVG(EDLEVEL) AS ED,
MIN(BONUS) AS MIN WORKDEPT ED MIN
FROM EMPLOYEE E11 14 300.00
GROUP BY WORKDEPT D21 15 300.00
HAVING MIN(BONUS) = 300
ORDER BY 2
Lenguaje SQL 75
Lenguaje SQL 76
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:
CASE CASE A
WHEN C1 THEN result1 WHEN V1 THEN result1
WHEN C2 THEN result2 WHEN V2 THEN result2
... ...
WHEN Cn THEN resultn WHEN Vn THEN resultn
ELSE resultx ELSE resultx
END END
Ci Æ Condiciones
A Æ Columna
Vi Æ Literal
Laexpresión CASE puede aparecer tanto en la cláusula
SELECT como en la cláusula WHERE.
Lenguaje SQL 77
Lenguaje SQL 78
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
Lenguaje SQL 79
Lenguaje SQL 80
Ejemplo de subconsulta
Lenguaje SQL 81
Subconsultas
Lenguaje SQL 82
Subconsultas
SELECT lista_seleccion
FROM tabla
WHERE expr operador
(SELECT lista_seleccion
FROM tabla);
Lenguaje SQL 83
Subconsultas (cont.)
Lenguaje SQL 84
Subconsulta con IN
Tabla DEPARTMENT
¿Qué departamentos no DEPTNO DEPTNAME
tienen proyectos
asignados? A00 SPIFFY COMPUTER SERVICE
B01 PLANNING
C01 INFORMATION CENTER
... ...
Resultado subconsulta
Resultado final
B01
DEPTNO DEPTNAME C01
A00 SPIFFY COMPUTER SERVICE D01
D11
D21
E01
E11
Lenguaje SQL E21 85
Resultado subconsulta
42833.33333333
41250.00000000
30156.66666666
Resultado final 24677.77777777
LASTNAME SALARY 25153.33333333
40175.00000000
HAAS 52750.00 20998.00000000
LUCCHESI 46500.00 Lenguaje SQL 23827.50000000 86
Subconsulta utilizando ANY o SOME
Resultado final
WORKDEPT AVG_WORKDEPT Resultado subconsulta
A00 42833.33333333 25188.80000000
C01 26110.00000000
Lenguaje SQL 88
Subconsultas correlacionadas
Lenguaje SQL 89
Subconsultas correlacionadas
AVG(SALARY) AVG(SALARY)
A00 41000.00000000 C01 30156.66666666
Lenguaje SQL 90
Subconsultas correlacionadas
Lenguaje SQL 91
Lenguaje SQL 92
Modificación de la BBDD
Lenguaje SQL 93
La instrucción INSERT
Lenguaje SQL 94
Añadir una fila
INSERT INTO TESTEMP
VALUES ('000111', 'SMITH', 'C01', '1998-06-25', 25000, NULL)
Lenguaje SQL 95
Lenguaje SQL 96
Añadir varias filas (cont.)
TESTEMP
EMPNO LASTNAME WORKDEPT HIREDATE SALARY BONUS
Lenguaje SQL 97
La instrucción UPDATE
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:
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 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:
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 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
La instrucción DELETE
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 - - - - -
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
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]
Vistas
PROJNO PROJNAME DEPTNO RESPEMP DEPTNO DEPTNAME MGRNO
AD3100 ADMIN SERVICES D01 000010 A00 SPIFFY COMPUTER SERVICE DIV. 000010
IF1000 QUERY SERVICES C01 000030 C01 INFORMATION CENTER 000030
IF2000 USER EDUCATION C01 000030 D01 DEVELOPMENT CENTER
Tabla PROJECT Tabla DEPARTMENT
ES COMO SI ...
Vistas
EMPNO LASTNAME WORKDEPT SALARY
000010 HAAS A00 52750.00
000030 KWAN C01 38250.00
Tabla EMPLOYEE 000120 O'CONNELL A00 29250.00
000130 QUINTANA C01 23800.00
000140 NICHOLLS C01 28420.00
DEPARTMENT TOTAL_SALARY
A00 82000.00
Vista DEPT_SALARIES
C01 90470.00
PASO 1
MAXIMUM_SALARY
90470.00 PASO 2
Vistas de lectura
Tabla EMPLOYEE
EMPNO LASTNAME WORKDEPT SALARY
000010 HAAS A00 52750.00 Tabla DEPARTMENT
000030 KWAN C01 38250.00 DEPTNO DEPTNAME MGRNO
000120 O'CONNELL A00 29250.00 A00 SPIFFY COMPUTER SERVICE DIV. 000010
000130 QUINTANA C01 23800.00 C01 INFORMATION CENTER 000030
000140 NICHOLLS C01 28420.00 D01 DEVELOPMENT CENTER
NAME DEPARTMENT
HAAS SPIFFY COMPUTER SERVICE DIV.
O'CONNELL SPIFFY COMPUTER SERVICE DIV.
Vista EMP_DEPT KWAN INFORMATION CENTER
NICHOLLS INFORMATION CENTER
QUINTANA INFORMATION CENTER
UPDATE EMP_DEPT
SET DEPARTMENT = 'DEVELOPMENT CENTER'
WHERE NAME = 'KWAN'
Opción check
FUNCIONA! NO SE PUEDE!
Lenguaje SQL 114
Cláusula WITH
Factorización de subconsultas
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 EMPLOYEE
000130 QUINTANA C01 23800.00 1971-07-28
000140 NICHOLLS C01 28420.00 1976-12-15
HIREDECADE MINIMUM_SALARY
1960 - 9 29250.00
1970 - 9 23800.00
) 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
UNION ALL
SELECT iterativa
SELECT CHILD.PART, CHILD.SUBPART, CHILD.QUANTITY
FROM RPL PARENT, PARTLIST CHILD
WHERE PARENT.SUBPART = CHILD.PART
)
SELECT principal
SELECT PART, SUBPART, SUM(QUANTITY) AS QUANTITY
FROM RPL
GROUP BY PART, SUBPART
WITH
RPL (LEVEL, PART, SUBPART, QUANTITY) AS
(
SELECT de iniciación
SELECT 0, ROOT.PART, ROOT.SUBPART, ROOT.QUANTITY
FROM PARTLIST ROOT
WHERE ROOT.PART = '01'
UNION ALL
SELECT iterativa
SELECT PARENT.LEVEL + 1, CHILD.PART,
CHILD.SUBPART,
CHILD.QUANTITY
FROM RPL PARENT, PARTLIST CHILD
WHERE PARENT.SUBPART = CHILD.PART AND
PARENT.LEVEL < 2
)