Tema SQL
Tema SQL
Tema SQL
Structured Query
Language
Bases de datos II
Ing. Yesmani Fernández
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.
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
3
SQL - LDD
CREATE
ALTER
DROP
4
Creación de tablas
Lenguaje SQL 5
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) );
6
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).
Lenguaje SQL
Ejemplo
9
Ejemplo
DEPARTMENT(DEPTNO, DEPTNAME, MGRNO, ADMRDEPT, LOCATION)
10
SQL - LMD
Selección:
SELECT
Modificación:
INSERT
UPDATE
DELETE
11
SQL - LMD
INSERT
SELECT
UPDATE
DELETE
12
SQL - LMD
Lenguaje SQL 15
Añadir una fila
Lenguaje SQL 16
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:
GRUPOS (NOMBRE, ALBUMES) LP (TIT, GRUPO, ANIO, NUM_CANC)
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 17
Añadir varias filas (cont.)
TESTEMP
EMPNO LASTNAME WORKDEPT HIREDATE SALARY BONUS
Lenguaje SQL 18
Estructura de la sentencia SELECT
19
Estructura básica de la sentencia SELECT
20
Estructura básica de la sentencia SELECT
21
Proyección de algunas columnas
22
Eliminación de filas duplicadas
25
Salida ordenada
26
Salida ordenada (cont.)
27
Salida ordenada (cont.)
28
Selección de filas
Laclá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 (conjunción), OR
(disyunción) y NOT (negación)
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)
29
Selección de filas (cont.)
Predicados de comparación
Operadores: =, <> (es el ≠), <, <=, >=. >
BETWEEN Op1 AND Op2
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 (Val1, Val2, …)
Puede utilizarse el resultado de otra consulta SELECT.
30
Selección de filas (cont.)
31
Ejemplo de selección de filas
DEPTNO ADMRDEPT
A00 A00
B01 A00
C01 A00
D01 A00
E01 A00
32
Ejemplo de selección de filas
33
Ejemplo de selección de filas
34
Múltiples condiciones - AND
35
Múltiples condiciones – AND/OR
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
37
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
38
Búsqueda parcial - LIKE
SELECT LASTNAME
FROM EMPLOYEE
WHERE LASTNAME LIKE 'G%';
39
Búsqueda parcial – LIKE
Ejemplos con %
THOMPSON
SELECT LASTNAME HENDERSON
FROM EMPLOYEE ADAMSON
WHERE LASTNAME LIKE '%SON'; JEFFERSON
JOHNSON
40
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%';
41
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
42
Expresiones y renombramiento de columnas
43
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?
Lenguaje SQL 44
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)
45
Tipos SQL y valores literales
46
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'
47
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.
48
Funciones matemáticas comunes
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. %
49
Funciones de cadena
50
Operaciones aritméticas
EMPNO SALARY
52
Expresiones en predicados
53
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
54
Uso de funciones (cont.)
NAME
HAAS, CHRISTA
LUCCHESI, VINCENZO
O'CONNELL, SEAN
55
Operadores de conjunto
56
UNION
Lenguaje SQL 57
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 58
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 59
Sintaxis del JOIN: formato 1
Lenguaje SQL 60
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 61
JOIN de tres tablas
Lenguaje SQL 62
Nombre de correlación (P, D, E)
Lenguaje SQL 63
JOIN de una tabla consigo misma
Lenguaje SQL 64
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 65
Funciones de columna
Lenguaje SQL 66
Funciones de columna
Lenguaje SQL 67
Funciones de columna
Lenguaje SQL 68
Funciones de columna
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
WORKDEPT SUM
WORKDEPT 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
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
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 77
Modificación de la BBDD
Lenguaje SQL 78
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 79
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 80
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');
Lenguaje SQL 81
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
Lenguaje SQL 82