SQL Lenguaje Estructurado de Consulta
SQL Lenguaje Estructurado de Consulta
SQL Lenguaje Estructurado de Consulta
Lenguaje Estructurado
de
Consulta
SQL - Lenguaje de Consulta Estructurado
Es el lenguaje estándar de las bases de datos relacionales.
Es un Lenguaje Declarativo: el usuario sólo especifica cuál debe ser el resultado, dejando
para el DBMS la optimización y las decisiones de cómo ejecutar la consulta.
SQL incluye algunas características del álgebra relacional, sin embargo su sintaxis es más
amigable.
Cuenta con revisiones: 1986 (inicial), 1989, 1992, 1999, 2003, 2005, 2008, 2011 y 2016.
Sentencia básica de SQL
SELECT <lista-de-atributos> Proyección
FROM <lista-de-tablas> R (relación)
[ WHERE <condición> ] Selección
Lista de atributos: es una lista de nombres de atributos cuyos valores debe recuperar la
consulta.
Lista de tablas: es una lista de los nombres de tablas requeridas para procesar la
consulta.
Condición: es una expresión condicional (booleana) que identifica las tuplas que la
consulta debe recuperar
Se pueden utilizar cualquiera de los operadores de comparación: , <>, <, , >,
Se pueden separar usando los operadores lógicos AND, OR y NOT.
SELECT Nombre, Apellido1, Apellido2, Dni, FechaNac, Direccion, Sexo, Sueldo, SuperDni, Dno
FROM EMPLEADO
La cláusula SELECT
Puede contener también expresiones aritméticas que operen sobre constantes y/o atributos
de la tuplas.
Los operadores pueden ser: +, -, *, /.
Ejemplo: Obtener el DNI y sexo de los empleados, junto con el sueldo de cada uno de ellos,
incrementado en un 5%.
SELECT *
FROM EMPLEADO Especifica que un valor sea menor o igual que
WHERE Sueldo >= 20000 AND Sueldo <= 40000 un valor y mayor o igual que otro valor.
Si se especifica más de una relación en la cláusula FROM, y no hay cláusula WHERE se obtiene como
resultado el PRODUCTO CARTESIANO de esas relaciones.
Nombre Apellido1 NombSubordin
2) Recuperar nombre y apellido1 de las empleadas mujeres, junto
Alicia Jiménez Alicia
con la lista de nombres de cada dependiente.
Alicia Jiménez Teodoro
SELECT Nombre, Apellido1, NombSubordin Absurdo Alicia Jiménez Luisa
FROM EMPS_MUJERES, SUBORDINADO Alicia Jiménez Alfonso
Alicia Jiménez Miguel
Alicia Jiménez Alicia
Alicia Jiménez Elisa
Juana Sainz Alicia
….. ….. …..
Aurora Oliva Elisa
Operación: REUNIÓN (JOIN)
1) Recuperar nombre y apellido de cada empleada mujer junto con el nombre de sus
subordinados correspondientes
Condición de
JOIN
El uso de AS es opcional en la
especificación de alias de columnas y/o
tablas
Operación: REUNIÓN (JOIN)
3) Recuperar nombre y apellido de cada empleada mujer junto los datos completos de sus
subordinados correspondientes
SELECT *
FROM EMPLEADO
ORDER BY Sueldo
Ordenación de tuplas
2) Obtener las tuplas de empleados ordenados por sueldo ascendentemente y por apellido1
descendentemente.
SELECT * SELECT *
FROM EMPLEADO Es equivalente a escribir: FROM EMPLEADO
ORDER BY Sueldo, Apellido1 DESC ORDER BY 8, 2 DESC
Las relaciones resultantes de estas operaciones son conjuntos de tuplas las tuplas
duplicadas son eliminadas del resultado.
Los nombres de los atributos en el resultado serán los mismos que los nombres de los
atributos de la primera tabla.
Operación: UNIÓN
Ejemplo: Recuperar los dni de todos los empleados que trabajan en el depto 5, o el dni de sus
supervisores.
SELECT Dni
FROM EMPLEADO
WHERE Dno = 5
UNION
SELECT SuperDni
FROM EMPLEADO
WHERE Dno = 5
UNION
SELECT *
FROM ESTUDIANTE
INTERSECT INTERSECT ALL permite obtener todas las
tuplas sin eliminar duplicados.
SELECT *
FROM PROFESOR
Operación: DIFERENCIA (Except)
Ejemplo: Listar los estudiantes que NO son profesores
SELECT *
FROM ESTUDIANTE
EXCEPT EXCEPT ALL permite obtener todas las
tuplas sin eliminar duplicados.
SELECT *
FROM PROFESOR
Ejemplos
1) Obtener los empleados que trabajan en proyectos del depto 5 pero no del depto. 4.
SELECT NyAP
FROM ESTUDIANTE E
WHERE NOT EXISTS (
SELECT *
FROM CURSO C
WHERE NOT EXISTS ( SELECT *
FROM REGISTRADO_EN R
WHERE E.NroLib = R.Nrolib
“No existe ningún estudiante que no haya tomado AND C.Id-curso = R.Id-curso ) )
todos los cursos”
EXISTS / NOT EXISTS: consultas “para todos”
Obtener Nombre y Apellido1 de los empleados que trabajaron en proyectos de todos los deptos.
2) Obtener el sueldo más alto, el más bajo y el promedio de sueldos de los empleados
SELECT MAX(Sueldo) , MIN(Sueldo) , AVG(Sueldo)
FROM EMPLEADO
3) Si se aplica MAX o MIN a una cadena de caracteres: SELECT MAX(Nombre) SELECT MIN(Nombre)
FROM EMPLEADO FROM EMPLEADO
La función COUNT
Dado que el asterisco (∗) se refiere a las filas (tuplas) COUNT (∗) devuelve el número de filas como
resultado de la consulta.
Obtener el total de empleados de la empresa.
SELECT COUNT(*)
FROM EMPLEADO
También se puede utilizar la función COUNT para contar los valores de una columna en lugar de las tuplas.
En ese caso, los valores duplicados no se eliminan.
Los valores NULL se descartan si se aplican las funciones de grupo a una columna (atributo) en particular.
Obtener la cantidad de empleados supervisores.
SELECT COUNT(SuperDni) AS "Supervisor"
FROM EMPLEADO
Las cláusulas GROUP BY y HAVING
GROUP BY permite aplicar las funciones de agregación a subgrupos de tuplas de una relación.
SELECT <lista-de-atributos>
FROM <lista-de-tablas>
[ WHERE <condición> ]
[ GROUP BY <lista-de-atributos-de-agrupación> ]
[ HAVING <condición-sobre-los-grupos> ]
Lista de atributos: pueden ser atributos o funciones de agregación
Lista de atributos de agrupación: indican los campos por los que se formarán los grupos
Condición sobre los grupos: restringe a que aparezcan en el resultado solamente los grupos que
satisfacen la condición
Las tuplas con el mismo valor en todos los atributos de la cláusula group by constituyen un
mismo grupo.
HAVING solamente puede aparecer en combinación con GROUP BY.
2) Listar el dni y nombre completo de los supervisores, junto con la cantidad de empleados que supervisan.
SELECT S.Dni, S.Nombre, S.Apellido1, S.Apellido2, COUNT(*)
FROM EMPLEADO E, EMPLEADO S
WHERE E.SuperDni = S.Dni
GROUP BY S.Dni, S.Nombre, S.Apellido1, S.Apellido2
La cláusula SELECT sólo puede incluir el/los atributo/s de agrupamiento y
las funciones que se aplican a cada grupo de tuplas.
Las cláusulas GROUP BY y HAVING
3) De cada proyecto en el que trabajan más de 2 empleados, listar su número, nombre y el número de
empleados que participan en él. Mostrar el resultado ordenado ascendentemente por número de
proyecto.
Estas operaciones de reunión se conocen también como concatenaciones internas (inner joins) para
distinguirlas de una variación llamada concatenaciones externas (outer joins).
Reuniones Externas - OUTER JOIN
Mantiene cada tupla de Tabla1 (relación izquierda). Rellena con NULL los atributos de las tuplas de
Tabla2 que no tienen una tupla coincidente con Tabla1.
Listar todos los empleados de la empresa y sus dependientes (los tengan o no).
SELECT *
FROM EMPLEADO E LEFT JOIN SUBORDINADO S ON E.Dni = S.DniEmpleado
Mantiene cada tupla de Tabla2 (relación derecha). Rellena con NULL los atributos de las tuplas de Tabla1
que no tienen una tupla coincidente con Tabla2.
Listar los productos (hayan sido comprados o no) junto con los clientes que los compraron.
SELECT *
FROM PRODUCTO P RIGHT JOIN CLIENTE C ON P.Cliente_dni = C.Dni
1 Pan 20 20 María
2 Alfajor 20 20 María
9 Medialunas 30 30 Osvaldo No satisface la
condición de join
Reunión Externa Completa: FULL JOIN
SELECT <lista de atributos>
FROM <Tabla1> FULL [ OUTER ] JOIN <Tabla2> ON <condición de join>
Mantiene cada tupla de ambas relaciones (Tabla1 y Tabla2). Rellena con NULL los atributos de las tuplas que
no tienen una tupla coincidente, ya sea en la relación izquierda o en la relación derecha.
SELECT *
FROM PRODUCTO P FULL JOIN CLIENTE C ON P.Cliente_dni = C.Dni
1 Pan 20 20 María
2 Alfajor 20 20 María
9 Medialunas 30 30 Osvaldo
6 Bizcochos 30 [null] [null]
No satisfacen la
condición de join
Vistas en SQL
Una vista es una tabla lógica basada (derivada) en una o varias tablas de base o incluso otras
vistas previamente definidas
Son tablas virtuales
No contienen datos propios
A través de ellas se pueden consultar los datos de las tablas
Las tablas sobre las que se basa la vista se denominan tablas base
La vista se almacena como una sentencia SELECT en el diccionario de datos
Cuando se la consulta se la sustituye por la expresión de consulta almacenada la vista
se vuelve a calcular siempre que se especifica una consulta sobre ella.
Una vista siempre está actualizada; si modificamos las tablas base (a las cuales referencia la
vista), la vista mostrará los cambios.
1) Crear una vista que contenga el nombre y apellido1 de los empleados, junto con los proyecto en los que
trabajan y la cantidad de horas asignadas al mismo.
CREATE OR REPLACE VIEW TRABAJA_EN_PROYS
AS SELECT Nombre, Apellido1, NombreProyecto, Horas
FROM EMPLEADO, PROYECTO, TRABAJA_EN
WHERE Dni = DniEmpleado
AND NumProy = NumProyecto
2) Crear una vista PROYS_MAS_HORAS que se base en la vista TRABAJA_EN_PROYS y contenga el nombre del
proyecto (Nombre_Proy) que tiene mayor cantidad de horas asignadas (Hs_asignadas).
La eliminación de una vista no afecta a las tablas base sobre las que se basa la vista
Las vistas o aplicaciones basadas en una vista eliminada se convierten en inválidas
Únicamente el creador o un usuario con el privilegio DROP ANY VIEW puede eliminar una vista
Vistas actualizables
Operaciones DML sobre Vistas
Es posible modificar los datos de una tabla base (inserciones, actualizaciones y eliminaciones) solamente
mediante una vista simple (vista con una única tabla base) Vista actualizable
Una vista es actualizable si:
No incluye:
La cláusula DISTINCT
Funciones de grupo
Operaciones de conjuntos
Una cláusula GROUP BY ni HAVING
Contiene:
La clave primaria de la tabla base como atributo de la vista
Todos los atributos con la restricción NOT NULL sin valores predeterminados especificados.
Para profundizar en el tema:
• Archivo de teoría (Campus)