bases de datos lenguaje sql
TRANSCRIPT
-
8/19/2019 Bases de Datos Lenguaje SQL
1/89
Bases de Datos
Lenguaje SQLProfesor: Gilberto Gutiérrez R.
Departamento de Ciencias de la Computación y Tecnologı́as de la Información
Facultad de Ciencias Empresariales
Universidad del Bı́o-Bı́o
-
8/19/2019 Bases de Datos Lenguaje SQL
2/89
Contenido
1. Introducción
2. Definición de datos
3. Consultas básicas en SQL
4. Consultas más complejas
5. Sentencias de inserción, eliminación y de actualización en SQL
6. Vistas (tablas virtuales) en SQL
7. Utilización de índices
8. Procedimientos almacenados
9. Triggers de Bases de datos
-
8/19/2019 Bases de Datos Lenguaje SQL
3/89
Definición de datos
Creando la tabla EMPLEADOSCREATE TABLE EMPLEADO (
NOMBRE VARCHAR(15) NOT NULL,
INIC CHAR,
APELLIDO VARCHAR(15) NOT NULL,NSS CHAR(9) NOT NULL,
FECHA_NCTO DATE,
DIRECCION VARCHAR(15),
SEXO CHAR,
SALARIO DECIMAL(10,2),
NSS_SUPERV CHAR(9),
ND INT NOT NULL,
PRIMARY KEY(NSS),
FOREIGN KEY(NSS-SUPERV) REFERENCES EMPLEADO (NSS),FOREIGN KEY(ND) REFERENCES DEPARTAMENTO (NUMEROD));
-
8/19/2019 Bases de Datos Lenguaje SQL
4/89
Definición de datos (cont.)
creando la tabla TRABAJA_ENCREATE TABLE TRABAJA_EN (
NSSE CHAR(9) NOT NULL,
NP INT NOT NULL,
HORAS DECIMAL(3,1) NOT NULL,PRIMARY KEY(NSSE, NP),
FOREIGN KEY (NSSE) REFERENCES EMPLEADO(NSS),
FOREIGN KEY (NP) REFERENCES PROYECTO(NUMEROP));
-
8/19/2019 Bases de Datos Lenguaje SQL
5/89
Definición de datos (cont.)
Eliminación de tablasDROP TABLE EMPLEADO;
Modificación del esquema de la tabla
ALTER TABLE EMPLEADO ADD PUESTO VARCHAR(10);
-
8/19/2019 Bases de Datos Lenguaje SQL
6/89
Consultas básicas en SQL
SELECT FROM
WHERE
donde:
es una lista de atributos cuyos valores van a
ser recuperados
es una lista de nombres de las relaciones
necesarias para procesar las consultas
es una expresión booleana que identifica las tuplas
que van a ser recuperadas por la consulta
-
8/19/2019 Bases de Datos Lenguaje SQL
7/89
Consultas básicas en SQL (cont.)
Ejemplos:Recuperar la fecha nacimiento y dirección del empleado cuyo nombre
es ’John B. Samith’.
SELECT FECHA_NCTO, DIRECCION
FROM EMPLEADO
WHERE NOMBRE=’John’ and INIC=’B’ and APELLIDO=’Smith’;
Resultado:fecha_ncto | direccion
------------+--------------------------
1965-01-09 | 731 Fondren, Houston, TX
(1 row)
En álgebra relacional sería:
πFECHA_NAC, DIRECCION
(σNOMBRE =′John′ and INIC =′B′ and AP ELLIDO=′Smith′(EMPLEADO))
-
8/19/2019 Bases de Datos Lenguaje SQL
8/89
Consultas básicas en SQL (cont.)
Listar los nombres y salario de los empleados cuyo sueldo supera los30.000 dólares
SELECT NOMBRE, SALARIO
FROM EMPLEADO
WHERE SALARIO > 30000;
Resultado:
nombre | salario
----------+----------
Franklin | 40000.00
Jennifer | 43000.00
Ramesh | 38000.00
James | 55000.00
(4 rows)
-
8/19/2019 Bases de Datos Lenguaje SQL
9/89
Consultas básicas en SQL (cont.)
Recuperar los nombres y dirección de los empleados que trabajan enel departamento de ’Investigación’
SELECT NOMBRE, DIRECCION
FROM EMPLEADO, DEPARTAMENTO
WHERE NOMBRED=’Investigacion’ AND NUMEROD=ND;
Resultado:
nombre | apellido | direccion----------+----------+--------------------------
John | Smith | 731 Fondren, Houston, TX
Franklin | Worg | 638 Voss, Houston, TX
Ramesh | Narayan | 975 Fire Oak, Humble, TX
Joyce | English | 5631 Rice, Houston, TX
(4 rows)
-
8/19/2019 Bases de Datos Lenguaje SQL
10/89
Consultas simples
De cada proyecto ubicado en ’Stafford’, obtener una lista con el número de proyecto, elnúmero del departamento controlador y el apellido, dirección y fecha de nacimiento del jefe
del departamento.
SELECT NUMEROP, NUMD, APELLIDO, DIRECCION, FECHA_NCTO
FROM PROYECTO, DEPARTAMENTO, EMPLEADO
WHERE NUMD = NUMEROD AND NSS_JEFE = NSS AND LOCALIZACIONP=’Stafford’;
numerop | numd | apellido | direccion | fecha_ncto
---------+------+----------+-------------------------+------------
30 | 4 | Wallace | 291 Berry, Bellaire, TX | 1941-06-20
10 | 4 | Wallace | 291 Berry, Bellaire, TX | 1941-06-20
(2 rows)
-
8/19/2019 Bases de Datos Lenguaje SQL
11/89
-
8/19/2019 Bases de Datos Lenguaje SQL
12/89
Atributos ambiguos y asignación de alias
De cada empleado recuperar su nombre de pila y apellido y los de sus supervisor inmediato
SELECT E.NOMBRE, E.APELLIDO, S.NOMBRE, S.APELLIDO
FROM EMPLEADO AS E, EMPLEADO AS S
WHERE E.NSS_SUPERV = S.NSS;
nombre | apellido | nombre | apellido
----------+----------+----------+----------
John | Smith | Franklin | Worg
Franklin | Worg | James | Borg
Alicia | Zelaya | Jennifer | Wallace
Jennifer | Wallace | James | Borg
Ramesh | Narayan | Franklin | Worg
Joyce | English | Franklin | Worg
Ahmad | Jabbar | Jennifer | Wallace
(7 rows)
También puede ser
FROM EMPLEADO E, EMPLEADO S
-
8/19/2019 Bases de Datos Lenguaje SQL
13/89
Renombrar los atributos de la relación
EMPLEADO AS E(NP, IN,AP, NSS, FN, DIR, SEX, SAL, NSSS, NF)También puede ser así
SELECT NOMBRE AS NOMBRE_PILA
FROM EMPLEADO;
nombre_pila
-------------
John
Franklin
Alicia
Jennifer
Ramesh
Joyce
Ahmad
James
(8 rows)
-
8/19/2019 Bases de Datos Lenguaje SQL
14/89
Cláusula WHERE no especificadas y uso de *
SELECT NSSFROM EMPLEADO;
nss
-----------
123456789
333445555
999887777
987654321
666884444
453453453
987987987
888665555
(8 rows)
-
8/19/2019 Bases de Datos Lenguaje SQL
15/89
Cláusula WHERE no especificadas y uso de *
SELECT NSS, NOMBREDFROM EMPLEADO, DEPARTAMENTO
nss | nombred
-----------+----------------
123456789 | Investigacion
333445555 | Investigacion
999887777 | Investigacion
987654321 | Investigacion
666884444 | Investigacion
453453453 | Investigacion
987987987 | Investigacion
888665555 | Investigacion
123456789 | Administracion
333445555 | Administracion
999887777 | Administracion
987654321 | Administracion
... ....
-
8/19/2019 Bases de Datos Lenguaje SQL
16/89
Cláusula WHERE no especificadas y uso de *
SELECT *FROM EMPLEADO
WHERE ND=5
SELECT *
FROM EMPLEADO, DEPARTAMENTO
WHERE NOMBRED=’Investigacion’ AND ND = NUMEROD;
SELECT *
FROM EMPLEADO, DEPARTAMENTO;
-
8/19/2019 Bases de Datos Lenguaje SQL
17/89
Tablas como conjuntos
SQL suele tratar una tabla no como un conjunto sino como unmulticonjunto
Pueden aparecer tuplas repetidas en una tabla y en el resultado de
una consulta
Algunas razones para mantener las tuplas repetidas:
La eliminación de tuplas es una operación muy costosa
El usuario quiere ver las tuplas rpetidasFunciones de agregación (veremos esto más adelante)
-
8/19/2019 Bases de Datos Lenguaje SQL
18/89
Tablas como conjuntos (continuación)
DISTINCT – Eliminación de tuplas repetidasALL – Se conservan las tuplas repetidas
Ejemplos:
SELECT ALL SALARIO
FROM EMPLEADO
salario
----------
30000.0040000.00
25000.00
43000.00
38000.00
25000.00
25000.00
55000.00(8 rows)
-
8/19/2019 Bases de Datos Lenguaje SQL
19/89
Tablas como conjuntos (continuación)
Ejemplos:SELECT DISTINCT SALARIO
FROM EMPLEADO
salario
----------
25000.00
30000.00
38000.0040000.00
43000.00
55000.00
(6 rows)
-
8/19/2019 Bases de Datos Lenguaje SQL
20/89
Tablas como conjuntos (continuación)
Union (UNION), Intersección (INTERSECT) y diferencia de conjuntos(EXCEPT)
Ejemplo:Prepare una lista con todos los números de proyectos en los que participa un empleado de
apellido ’Smith’, sea como trabajador o como jefe del departamento que controla el proyecto
(SELECT DISTINCT NUMEROP
FROM PROYECTO, DEPARTAMENTO, EMPLEADO
WHERE NUMD = NUMEROD AND NSS_JEFE = NSS AND
APELLIDO = ’Smith’ )UNION
(SELECT DISTINCT NP
FROM TRABAJA_EN, EMPLEADO
WHERE NSSE= NSS AND APELLIDO=’Smith’);
numerop
---------
1
2
(2 rows)
-
8/19/2019 Bases de Datos Lenguaje SQL
21/89
Subcadenas y operadores aritméticos
LIKE, % y -Recuperar todos los empleados cuya dirección es Houston, Texas
SELECT NOMBRE,APELLIDO
FROM EMPLEADO
WHERE DIRECCION LIKE ’%Houston, TX%’ ;
nombre | apellido
----------+----------
John | Smith
Franklin | Worg
Joyce | English
Ahmad | Jabbar
James | Borg
(5 rows)
-
8/19/2019 Bases de Datos Lenguaje SQL
22/89
-
8/19/2019 Bases de Datos Lenguaje SQL
23/89
Operador between
SELECT NOMBRE, SALARIOFROM EMPLEADO
WHERE (SALARIO BETWEEN 30000 AND 40000);
nombre | salario
----------+----------
John | 30000.00
Franklin | 40000.00
Ramesh | 38000.00
(3 rows)
-
8/19/2019 Bases de Datos Lenguaje SQL
24/89
Ordenación
Obtener una lista de los empleados y de los proyectos en los quetrabajan, ordenados por departamento, y, dentro de departamento,alfabéticamente por apellido y nombre
SELECT NOMBRED, APELLIDO, E.NOMBRE, PROYECTO.NOMBRE
FROM DEPARTAMENTO, EMPLEADO E, TRABAJA_EN, PROYECTOWHERE NUMEROD=ND AND NSS=NSSE AND NP= NUMEROP
ORDER BY NOMBRED, APELLIDO, E.NOMBRE;
nombred | apellido | nombre | nombre
----------------+----------+----------+----------------
Administracion | Jabbar | Ahmad | Automatizacion
Administracion | Jabbar | Ahmad | Nuevos Benefic
Administracion | Wallace | Jennifer | Reorganizacion
Administracion | Wallace | Jennifer | Nuevos Benefic
Administracion | Zelaya | Alicia | AutomatizacionAdministracion | Zelaya | Alicia | Nuevos Benefic
Direccion | Borg | James | Reorganizacion
Investigacion | English | Joyce | ProductoY
...
-
8/19/2019 Bases de Datos Lenguaje SQL
25/89
Consultas SQL más complejas
-
8/19/2019 Bases de Datos Lenguaje SQL
26/89
Consultas anidadas / subconsultas
Caso: obtener valores existentes en la base de datos para luego utilizarlos en una condición.Estos son bloques completos SELECT... FROM ... WHERE dentro de la claúsula WHERE
de otra consulta.
Ejemplo: Prepare una lista con todos los números de proyectos en los que participa un
empleado de apellido ’Smith’, sea como trabajador o como jefe del departamento que
controla el proyecto
SELECT DISTINCT NUMEROP
FROM PROYECTO
WHERE NUMEROP IN (SELECT NUMEROP
FROM PROYECTO, DEPARTAMENTO, EMPLEADOWHERE NUMD=NUMEROD AND NSS_JEFE=NSS AND APELLIDO =’Smith’)
OR
NUMEROP IN (SELECT NP
FROM TRABAJA_EN, EMPLEADO
WHERE NSSE=NSS AND APELLIDO=’Smith’);
numerop
---------
1
2(2 rows)
C l id d b l
-
8/19/2019 Bases de Datos Lenguaje SQL
27/89
Consultas anidadas / subconsultas
SELECT DISTINCT NSSEFROM TRABAJA_EN
WHERE (NP,HORAS) IN (SELECT NP, HORAS FROM TRABAJA_EN
WHERE NSSE= ’123456789’);
nsse
-----------
123456789
(1 row)
C lt id d / b lt
-
8/19/2019 Bases de Datos Lenguaje SQL
28/89
Consultas anidadas / subconsultas
Operadores:
IN Compara el valor v con un conjunto o multiconjunto de valores
V y evalúa a TRUE si v es uno de los elementos de V
ANY⇐⇒ SOME, ALL (>,>=,
-
8/19/2019 Bases de Datos Lenguaje SQL
29/89
Consultas anidadas / subconsultas
Ambiguedades de los nombres de los atributosEjemplo:El nombre y apellido de cada empleado que tenga un familiar con el mismo nombre de pila y
sexo que el e mpleado
SELECT E.NOMBRE, E.APELLIDOFROM EMPLEADO AS E
WHERE E.NSS IN (SELECT NSSE
FROM DEPENDIENTE
WHERE E.NOMBRE = NOMBRE_DEPENDIENTE
AND E.SEXO = SEXO);
--------+----------
(0 rows)
La regla es: la referencia a un atributo no calificado se refiere a larelación declarada en la consulta anidada más interior
C lt id d l i d
-
8/19/2019 Bases de Datos Lenguaje SQL
30/89
Consultas anidadas correlacionadas
Siempre que una claúsula WHERE de una consulta anidada hacereferencia a un atributo de una relación declarada en una consulta
externa.
La consulta anida se evalua una vez por cada tupla (o combinación de
tuplas) en la consulta externa.
En la consulta anterior: Por cada tupla empleado, se evalua la consulta
anidadaEn general una consulta anidada y que emplee los operadores = o IN siempre puede
expresarse como una consulta de un sólo bloque Ejemplo:
SELECT E.NOMBRE, E.APELLIDO
FROM EMPLEADO AS E, DEPENDIENTE AS D
WHERE E.NSS = D.NSSE AND E.SEXO = D.SEXO AND
E.NOMBRE = D.NOMBRE_DEPENDIENTE
Función EXISTS (NOT EXISTS)
-
8/19/2019 Bases de Datos Lenguaje SQL
31/89
Función EXISTS (NOT EXISTS)
Sirve para comprobar si el resultado de una consulta anidadacorrelacionada es o no vacío. Ejemplo:
El nombre y apellido de cada empleado que tenga un familiar con el mismo nombre de pila y
sexo que el e mpleado
SELECT E.NOMBRE, E.APELLIDO
FROM EMPLEADO AS E
WHERE EXISTS (SELECT *
FROM DEPENDIENTE
WHERE E.NSS = NSSE ANDE.NOMBRE = NOMBRE_DEPENDIENTE
AND E.SEXO = SEXO);
--------+----------
(0 rows)
-
8/19/2019 Bases de Datos Lenguaje SQL
32/89
Función EXISTS (NOT EXISTS)
-
8/19/2019 Bases de Datos Lenguaje SQL
33/89
Función EXISTS (NOT EXISTS)
Recupere los nombres y apellidos de los jefes de departamento y que tienen por lo menosun familiar dependiente
SELECT NOMBRE, APELLIDO
FROM EMPLEADO AS E
WHERE EXISTS (SELECT *
FROM DEPENDIENTE
WHERE E.NSS = NSSE)
AND
EXISTS (SELECT *
FROM DEPARTAMENTOWHERE NSS= NSS_JEFE);
nombre | apellido
----------+----------
Franklin | Worg
Jennifer | Wallace
(2 rows)
Función EXISTS (NOT EXISTS)
-
8/19/2019 Bases de Datos Lenguaje SQL
34/89
Función EXISTS (NOT EXISTS)
Recupere los nombres y apellidos de todos los empleados que trabajan en todos losproyectos controlados por el departamento número 5
SELECT NOMBRE, APELLIDO
FROM EMPLEADO
WHERE NOT EXISTS
( ( SELECT NUMEROP
FROM PROYECTO
WHERE NUMD = 5)
EXCEPT
( SELECT NPFROM TRABAJA_EN
WHERE NSS= NSSE));
nombre | apellido
--------+----------
(0 rows)
-
8/19/2019 Bases de Datos Lenguaje SQL
35/89
Valores null (IS NULL, IS NOT NULL)
-
8/19/2019 Bases de Datos Lenguaje SQL
36/89
Valores null (IS NULL, IS NOT NULL)
Recupere los nombres de los empleados que no tienen supervisoresSELECT NOMBRE, APELLIDO
FROM EMPLEADO
WHERE NSS_SUPERV IS NULL;
nombre | apellido
--------+----------
James | Borg
(1 row)
Renombrar atributos y relaciones
-
8/19/2019 Bases de Datos Lenguaje SQL
37/89
Renombrar atributos y relaciones
De cada empleado recuperar su apellido y el apellido de su supervisor inmediatoSELECT E.APELLIDO AS NOMBRE_EMPLEADO,
S.APELLIDO AS NOMBRE_SUPERVISOR
FROM EMPLEADO AS E, EMPLEADO AS S
WHERE E.NSS_SUPERV=S.NSS;
nombre_empleado | nombre_supervisor
-----------------+-------------------
Smith | Worg
Worg | BorgZelaya | Wallace
Wallace | Borg
Narayan | Worg
English | Worg
Jabbar | Wallace
Tablas combinadas (Join)
-
8/19/2019 Bases de Datos Lenguaje SQL
38/89
ab as co b adas (Jo )
Recuperar los nombres y dirección de los empleados que trabajan en el departamento deInvestigación
SELECT EMPLEADO.NOMBRE, APELLIDO, DIRECCION
FROM (EMPLEADO JOIN DEPARTAMENTO ON ND = NUMEROD)
WHERE DEPARTAMENTO.NOMBRED= ’Investigacion’;
nombre | apellido | direccion
----------+----------+--------------------------
John | Smith | 731 Fondren, Houston, TX
Franklin | Worg | 638 Voss, Houston, TXRamesh | Narayan | 975 Fire Oak, Humble, TX
Joyce | English | 5631 Rice, Houston, TX
(4 rows)
Tablas combinadas (Natural Join)
-
8/19/2019 Bases de Datos Lenguaje SQL
39/89
( )
Recuperar los nombres y dirección de los empleados que trabajan en el departamento deInvestigación
SELECT EMPLEADO.NOMBRE, APELLIDO, DIRECCION
FROM (EMPLEADO NATURAL JOIN
DEPARTAMENTO AS DEPTO(NOMBRED, ND, NSSG, FECHAIG))
WHERE NOMBRED= ’Investigacion’;
nombre | apellido | direccion
----------+----------+--------------------------
John | Smith | 731 Fondren, Houston, TXFranklin | Worg | 638 Voss, Houston, TX
Ramesh | Narayan | 975 Fire Oak, Humble, TX
Joyce | English | 5631 Rice, Houston, TX
(4 rows)
Tablas combinadas (OUTER JOIN)
-
8/19/2019 Bases de Datos Lenguaje SQL
40/89
( )
De cada empleado recuperar su apellido y el apellido de su supervisor inmediatoSELECT E.APELLIDO AS NOMBRE_EMPLEADO,
S.APELLIDO AS NOMBRE_SUPERVISOR
FROM (EMPLEADO AS E LEFT OUTER JOIN EMPLEADO AS S
ON E.NSS_SUPERV= S.NSS);
nombre_empleado | nombre_supervisor
-----------------+-------------------
Smith | Worg
Worg | BorgZelaya | Wallace
Wallace | Borg
Narayan | Worg
English | Worg
Jabbar | Wallace
Borg |
(8 rows)
LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN
Tablas combinadas (varias reuniones)
-
8/19/2019 Bases de Datos Lenguaje SQL
41/89
( )
De cada proyecto ubicado en ’Stafford’, obtener una lista con el número de proyecto, elnúmero del departamento controlador y el apellido, dirección y fecha de nacimiento del jefe
del departamento.
SELECT NUMEROP, NUMD, APELLIDO, DIRECCION, FECHA_NCTO
FROM ((PROYECTO JOIN DEPARTAMENTO ON NUMD = NUMEROD)JOIN EMPLEADO ON NSS_JEFE = NSS)
WHERE LOCALIZACIONP = ’Stafford’;
numerop | numd | apellido | direccion | fecha_ncto
---------+------+----------+-------------------------+------------
30 | 4 | Wallace | 291 Berry, Bellaire, TX | 1941-06-20
10 | 4 | Wallace | 291 Berry, Bellaire, TX | 1941-06-20
(2 rows)
Ejercicios
-
8/19/2019 Bases de Datos Lenguaje SQL
42/89
1. Obtenga un listado (nombre y apellido, ordenado alfabéticamente por apellido) de losempleados varones que ganan entre 30000 y 10000.
2. Obtenga un listado con los empleados (nombre, apellido) que tienen asignado más de
20 horas a un proyecto.
3. Obtenga los empleados que trabajan en un proyecto dirigido por un departamentocuyo jefe es el empleado "Smith".
4. Encuentre los empleados que no están asignado a ningún proyecto.
5. Los empledados que tienen en alguno de sus proyectos las misma cantidad de horas
que tiene asignado el empleado NSS=12345678 al proyecto 1020.6. Encuentre Los empleados que trabajan en los mismos proyectos que el empleado con
NSS=12345678
Funciones de agregación y de agrupación
-
8/19/2019 Bases de Datos Lenguaje SQL
43/89
1. Funciones de agregaciónCOUNT – Número de tuplas
SUM
MAX (MIN) – Se pueden usar en dominios no numéricos, siexiste un orden total entre los elementos
AVG
2. Funciones de agrupación
GROUP BY
Funciones de agregación
-
8/19/2019 Bases de Datos Lenguaje SQL
44/89
Encontrar la suma de todos los salarios de los empleados, el salario máximo, el salariomínimo y el salario promedio
SELECT SUM(SALARIO),
MAX(SALARIO),
MIN(SALARIO),
AVG(SALARIO)
FROM EMPLEADO;
sum | max | min | avg
-----------+----------+----------+--------------------281000.00 | 55000.00 | 25000.00 | 35125.000000000000
(1 row)
Funciones de agregación
-
8/19/2019 Bases de Datos Lenguaje SQL
45/89
Encontrar la suma de todos los salarios de los empleados del departamento de
investigación, así como el salario máximo, el salario mínimo y el salario promedio de dicho
departamento
SELECT SUM(SALARIO),
MAX(SALARIO),
MIN(SALARIO),
AVG(SALARIO)
FROM (EMPLEADO JOIN DEPARTAMENTO ON ND = NUMEROD)
WHERE NOMBRED= ’Investigacion’;
sum | max | min | avg
-----------+----------+----------+--------------------
133000.00 | 40000.00 | 25000.00 | 33250.000000000000
(1 row)
Funciones de agregación
-
8/19/2019 Bases de Datos Lenguaje SQL
46/89
Recupere el total de empleados de la empresa
SELECT COUNT(*) AS TOTAL_EMPLEADO
FROM EMPLEADO;
total_empleado
----------------
8
(1 row)
Recupere el total de empleados del departamento de investigaciónSELECT COUNT(*)
FROM (EMPLEADO JOIN DEPARTAMENTO ON ND = NUMEROD)
WHERE NOMBRED= ’Investigacion’;
count
-------
4
(1 row)
Funciones de agregación
-
8/19/2019 Bases de Datos Lenguaje SQL
47/89
COUNT(*) – Número de filasSELECT COUNT(DISTINCT SALARIO)
FROM EMPLEADO;
count
-------
6
(1 row)
Funciones de agregación
-
8/19/2019 Bases de Datos Lenguaje SQL
48/89
Recupere el nombre de los empleados que tienen más de dos cargas familiares
(dependientes)
SELECT APELLIDO, NOMBRE
FROM EMPLEADO
WHERE (SELECT COUNT(*)
FROM DEPENDIENTE
WHERE NSS=NSSE) >=2;
apellido | nombre
----------+----------Smith | John
Worg | Franklin
(2 rows)
-
8/19/2019 Bases de Datos Lenguaje SQL
49/89
Funciones de agregación – GROUP BY
-
8/19/2019 Bases de Datos Lenguaje SQL
50/89
De cada proyecto, recupere su número, nombre y el número de empleados que trabajan en
él
SELECT NUMEROP,
NOMBRE,
COUNT(*)
FROM (PROYECTO JOIN TRABAJA_EN ON NP = NUMEROP)
GROUP BY NUMEROP, NOMBRE;
numerop | nombre | count
---------+----------------+-------1 | ProductoX | 2
10 | Automatizacion | 3
3 | ProductoZ | 2
30 | Nuevos Benefic | 3
2 | ProductoY | 3
20 | Reorganizacion | 3
(6 rows)
Funciones de agregación – GROUP BY y HAVING
-
8/19/2019 Bases de Datos Lenguaje SQL
51/89
De cada proyecto, en el que trabajen más de dos empleados, recupere su número, su
nombre y el número de empleados que trabajan en él
SELECT NUMEROP,
NOMBRE,
COUNT(*)
FROM (PROYECTO JOIN TRABAJA_EN ON NP = NUMEROP)
GROUP BY NUMEROP, NOMBRE
HAVING COUNT(*) > 2 :
numerop | nombre | count---------+----------------+-------
10 | Automatizacion | 3
30 | Nuevos Benefic | 3
2 | ProductoY | 3
20 | Reorganizacion | 3
(4 rows)
Funciones de agregación – GROUP BY y HAVING
-
8/19/2019 Bases de Datos Lenguaje SQL
52/89
De cada proyecto, recupere su número, su nombre y el número de empleados del
departamento 5 que trabajan en él
SELECT P.NUMEROP,
P.NOMBRE,
COUNT(*)
FROM ((PROYECTO AS P JOIN TRABAJA_EN ON NP = NUMEROP) JOIN EMPLEADO ON NSS=NSS
WHERE ND = 5
GROUP BY P.NUMEROP, P.NOMBRE;
numerop | nombre | count---------+----------------+-------
3 | ProductoZ | 2
1 | ProductoX | 2
20 | Reorganizacion | 1
10 | Automatizacion | 1
2 | ProductoY | 3
(5 rows)
-
8/19/2019 Bases de Datos Lenguaje SQL
53/89
-
8/19/2019 Bases de Datos Lenguaje SQL
54/89
-
8/19/2019 Bases de Datos Lenguaje SQL
55/89
Sentencias INSERT, DELETE y UPDATE en SQL
-
8/19/2019 Bases de Datos Lenguaje SQL
56/89
INSERT
-
8/19/2019 Bases de Datos Lenguaje SQL
57/89
Forma simple
INSERT INTO EMPLEADO
VALUES (’John’, ’B’, ’Smith’, ’123456789’, ’01/09/1965’,
’731 Fondren, Houston, TX’, ’H’, 30000, ’333445555’,5);
Otra forma
INSERT INTO EMPLEADO(NOMBRE, APELLIDO, ND, NSS)
VALUES (’Gilberto’, ’G’, ’Gutierrez’, 4, ’8906080’),
(’Luis’,’L’, ’Salcedo’,5,’123456710’);
se debe tener en cuenta la forma en que se creó la tabla (NOT NULL, Integridad referencial,
de entidad)
INSERT (cont.)
-
8/19/2019 Bases de Datos Lenguaje SQL
58/89
Insertando tuplas a partir del resultado de una consultaCREATE TABLE INFO_DEPTOS
(NOMBRE_DEPTO VARCHAR(15),
NUM_DE_EMPS INTEGER,
SAL_TOTAL INTEGER);
INSERT INTO INFO_DEPTOS (NOMBRE_DEPTO, NUM_DE_EMPS, SAL_TOTAL)
SELECT NOMBRED, COUNT(*), SUM(SALARIO)
FROM (DEPARTAMENTO JOIN EMPLEADO ON NUMEROD=ND)
GROUP BY NOMBRED;
SELECT * FROM INFO_DEPTOS;
nombre_depto | num_de_emps | sal_total
----------------+-------------+-----------
Direccion | 1 | 55000
Administracion | 3 | 93000
Investigacion | 4 | 133000
(3 rows)
-
8/19/2019 Bases de Datos Lenguaje SQL
59/89
UPDATE
-
8/19/2019 Bases de Datos Lenguaje SQL
60/89
Modificar los valores de los atributos en una o más tuplasUPDATE PROYECTO
SET LOCALIZACIONP=’Bellaire’,
N D = 5
WHERE NUMEROP= 10;
UPDATE PROYECTO
SET SALARIO= SALARIO * 1.1
WHERE ND IN (SELECT NUMEROD
FROM DEPARTAMENTOWHERE NOMBRED=’Investigacion’);
También se puede especificar NULL o DEFAULT como nuevo valor del atributo
-
8/19/2019 Bases de Datos Lenguaje SQL
61/89
Vistas (tablas virtuales) en SQL
-
8/19/2019 Bases de Datos Lenguaje SQL
62/89
Vistas
-
8/19/2019 Bases de Datos Lenguaje SQL
63/89
Diferentes visiones de la Base de DatosConsultas complejas.
Ejemplo “Los empleados del departamento 10 que ganan más
que el promedio de la empresa y menos que el promedio del
departamento 30”
Definición: Una vista en SQL es una tabla derivada de otras tablas o
relaciones, las cuales pueden ser:
tablas o relaciones de base
Vistas previamente definidas
-
8/19/2019 Bases de Datos Lenguaje SQL
64/89
Vistas
-
8/19/2019 Bases de Datos Lenguaje SQL
65/89
Ejemplo: “Una lista de empleados y su jefe
CREATE VIEW EMPYJEFES AS
SELECT E1.NOMBRE AS NOMBRE, E1.APELLIDO AS APELLIDO,
E2.NOMBRE AS NOMBRE_J, E2.APELLIDO AS APELLIDO_J
FROM (EMPLEADO E1 LEFT OUTER JOIN EMPLEADO E2 ON E1.NSS_SUPERV = E2.NSS);
CREATE VIEW
select * from empyjefes;
nombre | apellido | nombre_j | apellido_j----------+----------+----------+------------
John | Smith | Franklin | Worg
Franklin | Worg | James | Borg
Alicia | Zelaya | Jennifer | Wallace
Jennifer | Wallace | James | Borg
Ramesh | Narayan | Franklin | Worg
Joyce | English | Franklin | Worg
Ahmad | Jabbar | Jennifer | Wallace
James | Borg | |(8 rows)
-
8/19/2019 Bases de Datos Lenguaje SQL
66/89
Vistas
-
8/19/2019 Bases de Datos Lenguaje SQL
67/89
Las modificaciones en las tablas bases se ven reflejadas en la vista.
Esto es responsabilidad del SABD
Eliminación de una vista
DROP VIEW
Implementación de vistas
-
8/19/2019 Bases de Datos Lenguaje SQL
68/89
1. Modificación de consulta. Convertir la consulta sobre las tablas
de base. Su principal desventaja es el tiempo de ejecución.
2. Materialización de vistas. Crear físicamente la tabla de vista
cuando se consulta la vista por primera vez y mantener la tabla
para aprovecharla en consultas posteriores. Esto implica contar
con estrategias para mantener actualizada la vista siendo una de
ella la actualización incremental.
Actualización de vistas
M li d bi
-
8/19/2019 Bases de Datos Lenguaje SQL
69/89
Muy complicada y ambigua.
insert into investigacion values(’1’, ’Juan’, ’JP’, ’Perez’, 5000);
Una vista con una sola tabla base es actualizable si los atributos
de la vista contienen la clave primaria o alguna otra clave
candidata de la relación base.
En general las vistas definidas sobre múltiples tablas por medio
de join no son actualizables.
Las vistas definidas mediante agrupación y funciones de
agregación no son actualizables.
-
8/19/2019 Bases de Datos Lenguaje SQL
70/89
Especificación de índices en SQL
Indices
CREATE TABLE EMPLEADO (
-
8/19/2019 Bases de Datos Lenguaje SQL
71/89
CREATE TABLE EMPLEADO (
NOMBRE VARCHAR(15) NOT NULL,
INIC CHAR,
APELLIDO VARCHAR(15) NOT NULL,
NSS CHAR(9) NOT NULL,
FECHA_NCTO DATE,DIRECCION VARCHAR(15),
SEXO CHAR,
SALARIO DECIMAL(10,2),
NSS_SUPERV CHAR(9),
ND INT NOT NULL,
PRIMARY KEY(NSS),
FOREIGN KEY(NSS-SUPERV) REFERENCES EMPLEADO (NSS),
FOREIGN KEY(ND) REFERENCES DEPARTAMENTO (NUMEROD));
SELECT * FROM EMPLEADO WHERE NSS=’123456789’; =⇒ todo bien, muy rápidoSELECT * FROM EMPLEADO WHERE salario=25000; =⇒ recorrer toda la tabla empleado,
tarda demasiado.
(salario es frecuentemente usado en la cláusula WHERE)
-
8/19/2019 Bases de Datos Lenguaje SQL
72/89
creación de un índice
CREATE INDEX INICIDX ON EMPLEADO USING HASH (INIC);
-
8/19/2019 Bases de Datos Lenguaje SQL
73/89
CREATE INDEX INICIDX ON EMPLEADO USING HASH (INIC);
ggutierr=> \d empleado
Table "public.empleado"
Column | Type | Modifiers
------------+-----------------------+-----------
nombre | character varying(15) | not null
inic | character(1) |
apellido | character varying(15) | not null
nss | character(9) | not null
fecha_ncto | date |
direccion | character varying(30) |
sexo | character(1) |
salario | numeric(10,2) |
nss_superv | character(9) |
nd | integer | not null
Indexes:
"empleado_pkey" PRIMARY KEY, btree (nss)
"inicidx" hash (inic)
"salarioidx" btree (salario)
Eliminación de un índice
DROP INDEX SALARIOIDX;
-
8/19/2019 Bases de Datos Lenguaje SQL
74/89
DROP INDEX SALARIOIDX;
-
8/19/2019 Bases de Datos Lenguaje SQL
75/89
Procedimientos Almacenados de Bases
de Datos
Procedimientos almacenados y funciones
1 Lo normal es que el programa de aplicación de Bases de Datos se
-
8/19/2019 Bases de Datos Lenguaje SQL
76/89
1. Lo normal es que el programa de aplicación de Bases de Datos se
ejecute en el cliente.
2. Sin embargo, a veces es conveniente crear módulos de programas
que se almacenen en lado del servidor (procedimientos
almacenados / módulos almacenados persistentes)
Los Procedimientos almacenados son útiles en los siguientes casos:
1. Varias aplicaciones accesan un mismo programa de bases dedatos. Se reduce la duplicidad de esfuerzo
2. Reducir el costo de derivado de la transferencia de datos
3. Potenciar las vistas (tipos de datos derivados más complejos)
Procedimientos almacenados y funciones
Declaración de un procedimiento almacenado
-
8/19/2019 Bases de Datos Lenguaje SQL
77/89
Declaración de un procedimiento almacenadoCREATE PROCEDURE nombre del procedimiento (parámetros)
declaraciones locales
cuerpo del procedimiento;
Declaración de una funciónCREATE FUNCTION nombre de la función (parámetros)
RETURNS tipo de devolución
declaraciones locales
cuerpo de la función;
Declaración usando un lenguaje de propósito generalCREATE PROCEDURE nombre del procedimiento (parámetros)
LANGUAGE nombre del lenguaje de programación
EXTERNAL NAME nombre de la ruta del archivo;
Procedimientos almacenados y funciones
LLamando a un procedimiento almacenado o una función
-
8/19/2019 Bases de Datos Lenguaje SQL
78/89
LLamando a un procedimiento almacenado o una función
1. CALL nombre del procedimiento o función(lista de argumentos))
2. SELECT nombre de la función(lista de argumentos)), . . .
Ejemplo:
Procedimientos almacenados y funciones
Ejemplos usando Postgres
-
8/19/2019 Bases de Datos Lenguaje SQL
79/89
Una función para obtener la edad de un empleado
CREATE FUNCTION Edad(date, character(9))
RETURNS integer
AS ’SELECT ($1-fecha_ncto)/365 FROM empleado WHERE $2 = NSS;’
LANGUAGE ’sql’;
SELECT nombre, Apellido, Edad(’10/03/2008’, NSS) FROM Empleado;
nombre | apellido | edad
----------+----------+------
John | Smith | 43
Franklin | Worg | 52
Alicia | Zelaya | 40
Jennifer | Wallace | 67
Ramesh | Narayan | 46
Joyce | English | 36
Ahmad | Jabbar | 39
James | Borg | 70
Juan | Perez | 43
(9 rows)
Procedimientos almacenados y funciones
Ejemplos usando Postgres
-
8/19/2019 Bases de Datos Lenguaje SQL
80/89
SELECT Nombre, Apellido, Edad(’11/02/2008’, NSS) AS EDAD
FROM EMPLEADO
ORDER BY EDAD;
SELECT Nombre, Apellido, Edad(’11/02/2008’, NSS) AS EDADFROM EMPLEADO where Edad(’11/02/2008’,NSS) < 50
ORDER BY EDAD;
nombre | apellido | edad
--------+----------+------
Joyce | English | 36
Ahmad | Jabbar | 39
Alicia | Zelaya | 40
John | Smith | 43Juan | Perez | 43
Ramesh | Narayan | 46
(6 rows)
Procedimientos almacenados y funciones
Ejemplos usando Postgres
-
8/19/2019 Bases de Datos Lenguaje SQL
81/89
Una función para obtener la cantidad de empleados de un departamento
CREATE FUNCTION TamDpto(integer)
RETURNS bigint
AS ’SELECT COUNT(*)
FROM EMPLEADO WHERE ND=$1;’LANGUAGE ’sql’;
SELECT Nombred, tamdpto(numerod) FROM Departamento;
nombred | tamdpto
----------------+---------
Investigacion | 4
Administracion | 3
Direccion | 1Nuevo Depto | 1
(4 rows)
-
8/19/2019 Bases de Datos Lenguaje SQL
82/89
Trigger
Trigger: Sentencia que el sistema ejecuta automáticamente como un
-
8/19/2019 Bases de Datos Lenguaje SQL
83/89
efecto secundario producto de una modificación en la base de datos
(INSERT, DELETE, UPDATE).
Modelo: ECA — (Evento, Condición, Acción)
1. Evento —Acción sobre la BD que provoca que trigger se dispare(UPDATE, INSERT, DELETE, o eventos temporales)
2. Condición —Condiciones bajo las cuales se ejecuta la acción (if
new.saldo
-
8/19/2019 Bases de Datos Lenguaje SQL
84/89
CREATE TRIGGER nombre_regla
{BEFORE | AFTER }
{INSERT | DELETE | UPDATE [OF lista_atributos]}
ON nombre_relaci’on
[ REFERENCING [NEW | OLD] AS nombre_par’ametro][FOR EACH {ROW | STATEMENT} ]
[WHEN ( condici’on ) ]
{sentencia_SQL | procedimiento_SQL}
Triggers/ejemplos
EMPLEADO(Nombre, Dni, Sueldo, Dno, SuperDni)
-
8/19/2019 Bases de Datos Lenguaje SQL
85/89
DEPARTAMENTO(NombreDepto, Dno, SueldoTotal, DniDirector)
Eventos que afectan SueldoTotal:
1. Inserción (uno o más) de nuevas tuplas de empleado
2. Modificación del sueldo de los empleados existentes (uno o más)
3. Modificación de la asignación de de los empleados existentes de
un departamento a otro
4. Eliminación de tuplas de empleado (una o más)
-
8/19/2019 Bases de Datos Lenguaje SQL
86/89
-
8/19/2019 Bases de Datos Lenguaje SQL
87/89
-
8/19/2019 Bases de Datos Lenguaje SQL
88/89
Triggers
Ejemplo en postgres
-
8/19/2019 Bases de Datos Lenguaje SQL
89/89