Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Lenguaje SQL
Profesor: Gilberto Gutiérrez R.
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
Definición de datos
Eliminación de tablas
DROP TABLE EMPLEADO;
Modificación del esquema de la tabla
ALTER TABLE EMPLEADO ADD PUESTO VARCHAR(10);
Consultas básicas en SQL
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)
Listar los nombres y salario de los empleados cuyo sueldo supera los
30.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)
Consultas básicas en SQL (cont.)
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)
Consultas simples
De cada proyecto ubicado en ’Stafford’, obtener una lista con el número de proyecto, el
nú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’;
De cada empleado recuperar su nombre de pila y apellido y los de sus supervisor inmediato
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)
Cláusula WHERE no especificadas y uso de *
SELECT NSS
FROM EMPLEADO;
nss
-----------
123456789
333445555
999887777
987654321
666884444
453453453
987987987
888665555
(8 rows)
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;
Tablas como conjuntos
Ejemplos:
SALARIO
SELECT DISTINCT
FROM EMPLEADO
salario
----------
25000.00
30000.00
38000.00
40000.00
43000.00
55000.00
(6 rows)
Tablas como conjuntos (continuación)
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)
Los salarios resultantes de los empleados si estos se aumentan en un
10%
Ejemplo:
nombre | salario
----------+----------
John | 30000.00
Franklin | 40000.00
Ramesh | 38000.00
(3 rows)
Ordenación
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, EMPLEADO
WHERE 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)
Consultas anidadas / subconsultas
nsse
-----------
123456789
(1 row)
Consultas anidadas / subconsultas
Operadores:
Ejemplo: Los nombres de los empleados que cuyo salario es mayor que el de todos los
empleados del departamento 5
SELECT APELLIDO, NOMBRE
FROM EMPLEADO
WHERE SALARIO > ALL (SELECT SALARIO FROM EMPLEADO WHERE ND =5);
apellido | nombre
----------+----------
Wallace | Jennifer
Borg | James
(2 rows)
Consultas anidadas / subconsultas
--------+----------
(0 rows)
--------+----------
(0 rows)
Función EXISTS (NOT EXISTS)
nombre | apellido
--------+----------
Alicia | Zelaya
Ramesh | Narayan
Joyce | English
Ahmad | Jabbar
James | Borg
(5 rows)
Función EXISTS (NOT EXISTS)
Recupere los nombres y apellidos de los jefes de departamento y que tienen por lo menos
un familiar dependiente
SELECT NOMBRE, APELLIDO
FROM EMPLEADO AS E
WHERE EXISTS (SELECT *
FROM DEPENDIENTE
WHERE E.NSS = NSSE)
AND
EXISTS (SELECT *
FROM DEPARTAMENTO
WHERE NSS= NSS_JEFE);
nombre | apellido
----------+----------
Franklin | Worg
Jennifer | Wallace
(2 rows)
Función EXISTS (NOT EXISTS)
Recupere los nombres y apellidos de todos los empleados que trabajan en todos los
proyectos controlados por el departamento número 5
SELECT NOMBRE, APELLIDO
FROM EMPLEADO
WHERE NOT EXISTS
( ( SELECT NUMEROP
FROM PROYECTO
WHERE NUMD = 5)
EXCEPT
( SELECT NP
FROM TRABAJA_EN
WHERE NSS= NSSE));
nombre | apellido
--------+----------
(0 rows)
Conjuntos explícitos
nombre | apellido
--------+----------
James | Borg
(1 row)
Renombrar atributos y relaciones
nombre_empleado | nombre_supervisor
-----------------+-------------------
Smith | Worg
Worg | Borg
Zelaya | Wallace
Wallace | Borg
Narayan | Worg
English | Worg
Jabbar | Wallace
Tablas combinadas (Join)
nombre_empleado | nombre_supervisor
-----------------+-------------------
Smith | Worg
Worg | Borg
Zelaya | Wallace
Wallace | Borg
Narayan | Worg
English | Worg
Jabbar | Wallace
Borg |
(8 rows)
De cada proyecto ubicado en ’Stafford’, obtener una lista con el número de proyecto, el
nú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’;
1. Funciones de agregación
COUNT – Número de tuplas
SUM
MAX (MIN) – Se pueden usar en dominios no numéricos, si
existe un orden total entre los elementos
AVG
2. Funciones de agrupación
GROUP BY
Funciones de agregación
Encontrar la suma de todos los salarios de los empleados, el salario máximo, el salario
mínimo y el salario promedio
SELECT SUM(SALARIO),
MAX(SALARIO),
MIN(SALARIO),
AVG(SALARIO)
FROM EMPLEADO;
total_empleado
----------------
8
(1 row)
count
-------
4
(1 row)
Funciones de agregación
count
-------
6
(1 row)
Funciones de agregación
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)
Funciones de agregación – GROUP BY
nd | count | avg
----+-------+--------------------
5 | 4 | 33250.000000000000
4 | 3 | 31000.000000000000
1 | 1 | 55000.000000000000
(3 rows)
Funciones de agregación – GROUP BY
Por cada departamento con más de 5 empleados, obtener el total de empleados que ganen
más de 40.000 dólares
SELECT NOMBRED,
COUNT(*)
FROM (DEPARTAMENTO JOIN EMPLEADO ON ND = NUMEROD)
WHERE SALARIO > 40000 AND
ND IN (SELECT ND
FROM EMPLEADO
GROUP BY ND
HAVING COUNT(*) > 5)
GROUP BY NOMBRED;
nombred | count
---------+-------
(0 rows)
Resumen de las consultas en SQL
Forma simple
Otra forma
se debe tener en cuenta la forma en que se creó la tabla (NOT NULL, Integridad referencial,
de entidad)
INSERT (cont.)
UPDATE PROYECTO
SET SALARIO= SALARIO * 1.1
WHERE ND IN (SELECT NUMEROD
FROM DEPARTAMENTO
WHERE NOMBRED=’Investigacion’);
También se puede especificar NULL o DEFAULT como nuevo valor del atributo
Vistas (tablas virtuales) en SQL
Vistas
Vistas
CREATE VIEW
Ahora podemos consultar directamente la vista INVESTIGACION
SELECT * FROM INVESTIGACION;
CREATE VIEW
CREATE VIEW
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.
Especificación de índices en SQL
Indices
Oracle:
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
R1:
CREATE TRIGGER SueldoTotal1
AFTER INSERT ON EMPLEADO
FOR EACH ROW
WHEN (NEW.Dno IS NOT NULL)
UPDATE DEPARTAMENTO
SET SueldoTotal = SueldoTotal + NEW.Sueldo
WHERE Dno = NEW.Dno;
R2:
CREATE TRIGGER SueldoTotal2
AFTER UPDATE OF Sueldo ON EMPLEADO
FOR EACH ROW
WHEN (NEW.Dno IS NOT NULL)
UPDATE DEPARTAMENTO
SET SueldoTotal = SueldoTotal + NEW.Sueldo - OLD.Sueldo
WHERE Dno = NEW.Dno;
Triggers/ejemplos
R3:
CREATE TRIGGER SueldoTotal3
AFTER UPDATE OF Dno ON EMPLEADO
FOR EACH ROW
BEGIN
UPDATE DEPARTAMENTO
SET SueldoTotal = SueldoTotal + NEW.Sueldo
WHERE Dno = NEW.Dno;
UPDATE DEPARTAMENTO
SET SueldoTotal = SueldoTotal - OLD.Sueldo
WHERE Dno = Old.Dno;
END;
R4:
CREATE TRIGGER SueldoTotal4
AFTER DELETE ON EMPLEADO
FOR EACH ROW
WHEN (OLD.Dno IS NOT NULL)
UPDATE DEPARTAMENTO
SET SueldoTotal = SueldoTotal - OLD.Sueldo
WHERE Dno = Old.Dno;
Triggers/ejemplos
Ejemplo en postgres