Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

SQL Lenguaje Estructurado de Consulta

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 60

SQL

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.

 Está estandarizado por

 ANSI (Instituto nacional americano de normalización, American National Standards Institute) y


 ISO (Organización internacional para la normalización, International Standards Organization)

 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.

 El resultado de las consultas SQL es, por supuesto, una relación.


 SQL permite que una tabla tenga tuplas repetidas, por lo tanto, una relación SQL (tabla) es un
multiconjunto de tuplas (no un conjunto de tuplas que no admite repetidos).
La cláusula SELECT
 Permite proyectar el resultado de una consulta en los atributos especificados en la cláusula
SELECT.
 Las tuplas duplicadas no se eliminan.
 Ejemplo: Obtener el DNI, nombre y apellido1 de todos los empleados.

  Dni, Nombre, Apellido1 (EMPLEADO )

SELECT Dni, Nombre, Apellido1


FROM EMPLEADO

Selección incondicional de tuplas: todas las tuplas de la tabla especificada


en el FROM son seleccionadas para el resultado de la consulta.
La cláusula SELECT
 Es posible forzar la eliminación de tuplas duplicadas insertando la palabra DISTINCT después
de la palabra SELECT.
 Ejemplo: De la tabla Empleado, listar los diferentes números de departamento de los
empleados.

SELECT Dno SELECT DISTINCT Dno


FROM EMPLEADO FROM EMPLEADO

Consultas equivalentes Sin duplicados


Se obtienen valores duplicados

Tambien es posible pedir


explícitamente repetidos con ALL

SELECT ALL Dno


FROM EMPLEADO
La cláusula SELECT
 Para recuperar los valores de todos los atributos de las tuplas seleccionadas se usa “*”
después de la palabra SELECT.
 Ejemplo: Listar los datos completos de los empleados de la empresa.

SELECT * Representa todos los atributos.


FROM EMPLEADO
Es equivalente a escribir:

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 Dni, Sexo, Sueldo * 1.05


FROM EMPLEADO
La cláusula WHERE
 Permite seleccionar las tuplas de la relación que satisfacen una condición.
 Ejemplo: Obtener los datos completo del empleado “José Pérez”

 Nombre,Apellido1,Apellido2,Dni,FechaNac,Direccion,Sexo,Sueldo,SuperDni,Dno ( Nombre=‘José’ AND Apellido1=‘Pérez’ (EMPLEADO ))


3) Proyecta el resultado en todos y cada uno de los atributos de la
relación.
SELECT *
1) Involucra la relación EMPLEADO FROM EMPLEADO
WHERE Nombre=‘José’ AND Apellido1=‘Pérez’
Condición de Selección
2) Selecciona las tuplas de EMPLEADO que satisfacen la
condición de la cláusula WHERE
La cláusula WHERE
 Ejemplo: Seleccionar las tuplas de EMPLEADO cuyo sueldo es mayor o igual a 20000 y menor
o igual a 40000:

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.

Es equivalente a escribir: SELECT *


FROM EMPLEADO
WHERE Sueldo BETWEEN 20000 AND 40000

De forma análoga, se puede usar el operador de comparación NOT BETWEEN.


La cláusula WHERE
 SQL permite consultas que comprueban si el valor de un atributo es NULL, ya sea que falte, no
esté definido o no sea aplicable.
 IS NULL / IS NOT NULL comprueba la presencia o ausencia de valores nulos.

 Ejemplo: Mostrar nombre y apellidos de los empleados que no tienen jefe

SELECT Nombre, Apellido1, Apellido2


FROM EMPLEADO
WHERE SuperDni IS NULL
La cláusula FROM
 Permite especificar los nombres de las relaciones (tablas) requeridas para procesar la consulta.
 La omisión de la cláusula WHERE indica una selección incondicional de tuplas.
1) Recuperar nombre y apellido1 de las empleadas mujeres.

SELECT Nombre, Apellido1, Dni


FROM EMPS_MUJERES

 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

SELECT Nombre, Apellido1, NombSubordin


FROM EMPS_MUJERES, SUBORDINADO
WHERE Dni = DniEmpleado

Condición de
JOIN

Tabla resultante del producto cartesiano


Operación: REUNIÓN (JOIN)
2) Obtener el nombre y apellido de cada empleado junto con el nombre y apellido de su jefe.

SELECT E.Nombre, E.Apellido1, J.Nombre, J.Apellido1


FROM EMPLEADO AS E, EMPLEADO AS J
WHERE E.SuperDni = J.Dni
ALIAS de tablas

SELECT E.Nombre, E.Apellido1, J.Nombre, J.Apellido1


De manera equivalente, podemos escribir: FROM EMPLEADO E, EMPLEADO J
WHERE E.SuperDni = J.Dni
Operación: REUNIÓN (JOIN)
SELECT E.Nombre, E.Apellido1, J.Nombre, J.Apellido1
FROM EMPLEADO AS E, EMPLEADO AS J
WHERE E.SuperDni = J.Dni

¿Y si quisiéramos renombrar las columnas?

SELECT E.Nombre, E.Apellido1, J.Nombre AS NomJefe, J.Apellido1 AS ApeJefe


FROM EMPLEADO AS E, EMPLEADO AS J
WHERE E.SuperDni = J.Dni
ALIAS de columnas

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 Nombre, Apellido1, S.*


FROM EMPLEADO E, SUBORDINADO S
WHERE E.Dni = S.Dni AND E.Sexo = 'M'

Condición de JOIN Condición de SELECCIÓN


Ordenación de tuplas
 ORDER BY: permite ordenar las tuplas del resultado de una consulta SELECT <lista-de-atributos>
por los valores de uno o más atributos. FROM <lista-de-tablas>
[ WHERE <condición> ]
 El orden predeterminado es el ascendente (ASC).
[ ORDER BY <lista-de-atributos> ]
 DESC permite ver el resultado ordenado descendentemente.
1) Obtener las tuplas de empleados ordenados por sueldo ascendentemente.

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

Una variante para ordenar: se


especifica el número de la
columna por la cual se ordena.

Es posible ordenar por un campo


no proyectado.
Trabajo con cadenas de caracteres
 LIKE / NOT LIKE: permite realizar comparaciones de patrones sobre cadenas de caracteres
 Para la descripción de los patrones se utilizan dos caracteres especiales:
 % : sustituye una cantidad arbitraria de caracteres (de cero o más caracteres)
 _ : reemplaza un solo carácter.
1) Obtener las tuplas de empleados cuyos nombres comiencen con A
SELECT *
FROM EMPLEADO
WHERE Nombre LIKE 'A%'
Trabajo con cadenas de caracteres
 LIKE / NOT LIKE: permite realizar comparaciones de patrones sobre cadenas de caracteres
 Para la descripción de los patrones se utilizan dos caracteres especiales:
 % : sustituye una cantidad arbitraria de caracteres (de cero o más caracteres)
 _ : reemplaza un solo carácter.
2) Obtener los empleados que hayan nacido en la década del 60.
SELECT *
FROM EMPLEADO
WHERE TO_CHAR(FechaNac, 'yyyy/mm/dd') LIKE '196_\/%'
Operaciones de Conjuntos
 SQL incorpora las tres operaciones de conjunto:
 UNION (unión),
 INTERSECT (intersección),
 EXCEPT (diferencia)

 Las operaciones establecidas se aplican sólo a las relaciones compatibles


 Las 2 relaciones deben ser del mismo grado
 Los atributos deben aparecer en el mismo orden en ambas relaciones y ser del mismo
dominio.

 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

UNION ALL: conserva


Sin duplicados los duplicados
Operación: INTERSECCIÓN (Intersect)
 Ejemplo: Listar los estudiantes que son profesores

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 Nombre, Apellido1, Apellido2


FROM EMPLEADO, TRABAJA_EN, PROYECTO
WHERE Dni = DniEmpleado
AND NumProy = NumProyecto AND NumDptoProyecto = 5
EXCEPT
SELECT Nombre, Apellido1, Apellido2
FROM EMPLEADO, TRABAJA_EN, PROYECTO
WHERE Dni = DniEmpleado
AND NumProy = NumProyecto AND NumDptoProyecto = 4
Ejemplos
2) Obtener los directores que participan de al menos 1 proyecto de Sevilla y al menos 1 proyecto de Madrid.

SELECT Nombre, Apellido1, Apellido2


FROM EMPLEADO, PROYECTO, DEPARTAMENTO, TRABAJA_EN
WHERE Dni = DniDirector AND NumeroDpto = NumDptoProyecto
AND DniDirector = DniEmpleado AND NumProy = NumProyecto
AND UbicacionProyecto = 'Sevilla'
INTERSECT
SELECT Nombre, Apellido1, Apellido2
FROM EMPLEADO, PROYECTO, DEPARTAMENTO, TRABAJA_EN
WHERE Dni = DniDirector AND NumeroDpto = NumDptoProyecto
AND DniDirector = DniEmpleado AND NumProy = NumProyecto
AND UbicacionProyecto = Madrid'
Consultas Anidadas y Comparación de conjuntos
Algunas consultas requieren obtener valores existentes en la BD para usarlos después en
una condición de comparación.
Bloques select-from-where
Dichas consultas se pueden formular mediante consultas anidadas. completos dentro de la
cláusula WHERE de otra
consulta (externa).

OPERADORES de comparación contra un conjunto (colección de valores):


 IN / NOT IN: permite comprobar si se es miembro de un conjunto/no pertenencia al conjunto,
donde el conjunto es una colección de valores producidos por una cláusula SELECT (consulta
anidada).
 ANY, SOME, ALL  se pueden combinar con >, >=, <, <= y <>.
 v = ANY V / v = SOME V: devuelven TRUE si el valor v es igual a algún valor del conjunto V.
 v > ALL V: devuelve TRUE si el valor v es mayor que todos los valores del conjunto V.
 EXISTS / NOT EXISTS : se utiliza para comprobar si el resultado de una consulta anidada
correlacionada contiene tuplas o no.
Operador: IN / NOT IN
1) Obtener los empleados cuyos sueldos estén entre 30000 y 40000

Esta subconsulta da como resultado más de


SELECT * 1 tupla  no se puede comparar usando =. IN compara el valor individual
FROM EMPLEADO de cada tupla externa, con el
WHERE Sueldo IN ( SELECT Sueldo conjunto de valores que se
FROM EMPLEADO obtienen en la subconsulta
Consulta externa
WHERE Sueldo BETWEEN 30000 AND 40000 ) anidada.

Consulta interna / Subconsulta / Consulta anidada


Otra forma sería:
SELECT * Una consulta que contiene otra, anidada, y que utiliza los
FROM EMPLEADO operadores = o IN, siempre puede escribirse como una
WHERE Sueldo BETWEEN 30000 AND 40000 consulta de 1 solo bloque.
Operador: IN / NOT IN
2) Obtener nombre, apellidos, dni y numero de proyecto de los empleados que no trabajan en los
proyectos en los que trabaja “Alberto Campos”.

SELECT Nombre, Apellido1, Apellido2, Dni, NumProy


FROM EMPLEADO, TRABAJA_EN
WHERE Dni = DniEmpleado
AND NumProy NOT IN ( SELECT NumProy
FROM EMPLEADO, TRABAJA_EN
WHERE Dni = DniEmpleado
AND Nombre = 'Alberto'
AND Apellido1 = 'Campos' )
Operadores: SOME, ANY, ALL
1) Obtener los empleados que no trabajan en el depto. 5 y cuyo sueldo sea mayor que el de alguno
de los que trabajan en el depto 5.

SELECT Nombre, Apellido1, Apellido2, Dni, Sueldo


FROM EMPLEADO
WHERE Dno <> 5
AND Sueldo > SOME ( SELECT Sueldo
FROM EMPLEADO
Tener en cuenta que:
WHERE Dno = 5 )
 SOME y ANY se utilizan indistintamente
 = SOME es lo mismo que IN
 <> SOME no es lo mismo que NOT IN
 <> ALL es lo mismo que NOT IN
Operadores: SOME, ANY, ALL
2) Obtener los empleados que no trabajan en el depto. 5 y cuyo sueldo es mayor que el de todos
los empleados del depto 4

SELECT Nombre, Apellido1, Apellido2, Dni, Sueldo


FROM EMPLEADO
WHERE Dno <> 5
AND Sueldo > ALL ( SELECT Sueldo
FROM EMPLEADO
WHERE Dno = 4 )
Operador: EXISTS / NOT EXISTS
 EXISTS se utiliza para comprobar si el resultado de una consulta anidada correlacionada está vacío (no contiene
tuplas) o no.
 EXISTS devuelve el valor true si la subconsulta devuelve tuplas (no resulta vacía). De lo contrario, devuelve false.
 NOT EXISTS devuelve el valor true si la subconsulta no devuelve tuplas (está vacía). Sino, devuelve false.
 EXISTS / NOT EXISTS normalmente se utilizan en combinación con una consulta anidada correlacionada.

1) Obtener los empleados que tengan subordinados

SELECT Nombre, Apellido1, Dni Nombre Apellido1 Dni


La consulta anidada FROM EMPLEADO E José Pérez 123456789
se evalúa por cada WHERE EXISTS ( SELECT * Alberto Campos 333445555
tupla de la consulta FROM SUBORDINADO
externa. Juana Sainz 987654321
WHERE DniEmpleado = E.Dni )

Condición que correlaciona la consulta anidada


Operador: EXISTS / NOT EXISTS
2) Mostrar los empleados que no tienen subordinados.

SELECT Nombre, Apellido1, Dni


FROM EMPLEADO E
WHERE NOT EXISTS ( SELECT *
FROM SUBORDINADO
WHERE DniEmpleado = E.Dni )

Consulta anidada correlacionada


Operador: EXISTS / NOT EXISTS
3) Mostrar los empleados que son directores y tienen subordinados.

SELECT Nombre, Apellido1, Apellido2


FROM EMPLEADO E
WHERE EXISTS ( SELECT *
FROM DEPARTAMENTO
WHERE DniDirector = E.Dni )
AND EXISTS ( SELECT *
FROM SUBORDINADO
WHERE DniEmpleado = E.Dni )
Operador: EXISTS / NOT EXISTS
4) Mostrar los empleados que participan en proyectos de Madrid.

SELECT DISTINCT Nombre, Apellido1, Apellido2


FROM EMPLEADO E, TRABAJA_EN T
WHERE E.Dni = T.DniEmpleado
AND EXISTS ( SELECT *
FROM PROYECTO P
WHERE P.UbicacionProyecto = 'Madrid'
AND P.NumProyecto = T.NumProy )
EXISTS / NOT EXISTS: Muy útil para dar respuesta a
consultas del tipo “para todos”
“Encontrar el NyAP de los estudiantes que se registraron en todos los cursos”

Estudiante (NroLib, NyAP, Direccion)


Curso (Id-curso, Profesor, Area, Horas)
Registrado_en (NroLib, Id-curso)

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.

SELECT Nombre, Apellido1


FROM EMPLEADO E
WHERE NOT EXISTS ( SELECT *
FROM DEPARTAMENTO D
1 WHERE NOT EXISTS ( SELECT *
FROM PROYECTO P, TRABAJA_EN T
WHERE T.NumProy = P.NumProyecto
AND P.NumDptoProyecto = D.NumeroDpto
AND T.DniEmpleado = E.Dni ) )
Otras maneras de resolver consultas “para todos”
 Obtener Nombre y Apellido1 de los empleados que trabajaron en proyectos de todos los deptos.

SELECT Nombre, Apellido1


FROM EMPLEADO E
WHERE NOT EXISTS ( SELECT D.NumeroDpto
2 FROM DEPARTAMENTO D
EXCEPT
SELECT NumDptoProyecto
FROM PROYECTO P, TRABAJA_EN T
WHERE T.NumProy = P.NumProyecto
AND T.DniEmpleado = E.Dni )

SELECT Nombre, Apellido1


FROM EMPLEADO E, PROYECTO P, TRABAJA_EN T
WHERE E.Dni = T.DniEmpleado
3
AND T.NumProy = P.NumProyecto
GROUP BY E.Dni, E.Nombre, E.Apellido1
HAVING COUNT(Distinct P.NumDptoProyecto) = ( SELECT COUNT(*)
FROM DEPARTAMENTO )
Grupos y Funciones de grupos
 SQL proporciona 5 funciones para trabajar con agrupamiento:
 mínimo: MIN
 máximo: MAX
 promedio: AVG
 total: SUM
 cuenta: COUNT
 Las funciones de agregación operan sobre grupos de tuplas
 Toman una colección (un conjunto o multiconjunto) de valores como entrada y devuelven
un solo valor.
 El resultado de una función de agregación es una relación con un único atributo.
 Las funciones de agregación pueden ser empleadas:
 en la cláusula SELECT, donde se considera la tabla completa como un grupo
 con cláusulas de agrupamiento (GROUP BY)
 con cláusulas HAVING
Funciones de grupos - ejemplos

1) Obtener la suma de los sueldos de todos los empleados SELECT SUM(Sueldo)


FROM EMPLEADO

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.

SELECT COUNT(Sueldo) Obtener la cantidad de sueldos diferentes de la empresa.


FROM EMPLEADO Para eliminar
duplicados SELECT COUNT(DISTINCT Sueldo)
FROM EMPLEADO

 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.

WHERE permite filtrar HAVING permite filtrar


tuplas grupos enteros
Las cláusulas GROUP BY y HAVING
1) Listar el número de departamento y la cantidad de empleados que hay en cada uno.

SELECT Dno, COUNT(*)


FROM EMPLEADO
GROUP BY Dno

Los valores NULL de un atributo por el que SELECT COUNT(*)


se agrupe generarán 1 grupo. FROM EMPLEADO
GROUP BY SuperDni

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.

1 WHERE selecciona tuplas SELECT P.NumProyecto, P.NombreProyecto, COUNT(*)


individuales
FROM PROYECTO P, TRABAJA_EN T
GROUP BY divide en grupos
WHERE P.NumProyecto = T.NumProy
2 GROUP BY P.NumProyecto, P.NombreProyecto
las tuplas seleccionadas por
el where HAVING COUNT(*) > 2
3 HAVING selecciona grupos
Funciones de grupos - ejemplos
4) Recuperar el nombre completo de los empleados que tienen dos o más dependientes.

SELECT Nombre, Apellido1, Apellido2


FROM EMPLEADO E, SUBORDINADO S
WHERE E.Dni = S.DniEmpleado
GROUP BY E.Dni, Nombre, Apellido1, Apellido2
HAVING COUNT(*) >= 2
Las cláusulas GROUP BY y HAVING
5) Obtener el nombre del departamento con mayor monto en sueldo.

SELECT D.NombreDpto, SUM(E.Sueldo)


FROM EMPLEADO E, DEPARTAMENTO D
WHERE E.Dno = D.NumeroDpto
GROUP BY D.NumeroDpto, D.NombreDpto
HAVING SUM(E.Sueldo) >=ALL ( SELECT SUM(Sueldo)
FROM EMPLEADO
GROUP BY Dno )
Las cláusulas GROUP BY y HAVING
6) Contar el número total de empleados de cada departamento cuyo sueldo es superior a 35.000,
pero sólo en aquellos departamentos en los que trabajan más de dos empleados.

SELECT Dno, COUNT(*) Primero se filtran los


FROM EMPLEADO departamentos con más de
WHERE Sueldo > 35000 2 empleados
AND Dno IN ( SELECT Dno
FROM EMPLEADO
GROUP BY Dno
Luego, se seleccionan HAVING COUNT(*) > 2 )
los empleados con GROUP BY Dno
sueldos > 35000
Resumen de sintaxis de una consulta SQL
Una consulta en SQL puede constar de hasta seis cláusulas, pero solo las dos primeras, SELECT y FROM,
son obligatorias.

Las cláusulas se especifican en el siguiente orden:

SELECT < lista de atributos y funciones >


FROM < lista de tablas >
[ WHERE < condición selección de tuplas > ]
[ GROUP BY < atributo(s) de agrupación > ]
[ HAVING < condición selección de grupos > ]
[ ORDER BY < lista de atributos > ]
SQL – EQUIJOIN y NONEQUIJOIN
 Un equijoin es una operación binaria que combina filas de dos o más tablas pero que
selecciona las filas que tienen valores iguales para ciertas columnas (columnas que toman
valores del mismo dominio en ambas tablas, por lo general sus claves primarias/foráneas)
SELECT Nombre, Apellido1, NombSubordin
FROM EMPLEADO E, SUBORDINADO S
WHERE E.Dni = S.DniEmpleado

 Un non-equijoin es una operación binaria donde la condición de join contiene cualquier


operador que no sea el igual (=).
 Se pueden utilizar cualquiera de los operadores de comparación: <>, <, , >, , incluso
BETWEEN.
SELECT *
FROM EMPLEADO
WHERE Sueldo BETWEEN 20000 AND 40000

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

 Un outer join extiende el resultado de un join común (inner join).


 Se usa cuando se quiere mantener en el resultado todas las tuplas de R, o de S, o de ambas,
independientemente de si tienen correspondencias o no en la otra relación.
 Es posible ver, también, las filas que no cumplen las condiciones de join

 Un OUTER JOIN devuelve:


o todas las filas de la tabla que satisfacen la condición de join
o junto con todas las filas de la tabla que no satisfacen la condición de join.

 LEFT [OUTER] JOIN - Reunión externa IZQUIERDA

 RIGHT [OUTER] JOIN - Reunión externa DERECHA

 FULL [OUTER] JOIN - Reunión externa COMPLETA


Reunión Externa Izquierda: LEFT JOIN
SELECT <lista de atributos>
FROM <Tabla1> LEFT [ OUTER ] JOIN <Tabla2> ON <condición de 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

Nombre Apellido1 Apellido2 Dni DniEmpleado NombSubordin Relacion

José Pérez Pérez 123456789 123456789 Miguel Hijo

José Pérez Pérez 123456789 123456789 Alicia Hija


José Pérez Pérez 123456789 123456789 Elisa Esposa
Alberto Campos Sastre 333445555 333445555 Alicia Hija

Alberto Campos Sastre 333445555 333445555 Teodoro Hijo


Alberto Campos Sastre 333445555 333445555 Luisa Esposa
Alicia Jiménez Celaya 999887777 [null] [null] [null]
No satisfacen
Juana Sainz Oreja 987654321 987654321 Alfonso Esposo
la condición [null] [null] [null]
Fernando Ojeda Ordóñez 666884444
de join [null] [null] [null]
Aurora Oliva Avezuela 453453453
Luis Pajares Morela 987987987 [null] [null] [null]
Eduardo Ochoa Paredes 888665555 [null] [null] [null]
Reunión Externa Derecha: RIGHT JOIN
SELECT <lista de atributos>
FROM <Tabla1> RIGHT [ OUTER ] JOIN <Tabla2> ON <condición de join>

 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

Codigo Nombre Cliente_dni Dni Nombre

[null] [null] [null] 10 Juan

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.

 Listar todos los productos y todos los clientes.

SELECT *
FROM PRODUCTO P FULL JOIN CLIENTE C ON P.Cliente_dni = C.Dni

Codigo Nombre Cliente_dni Dni Nombre

[null] [null] [null] 10 Juan

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.

Ventajas de las Vistas


 Restringen el acceso a la base de datos
 Permiten a los usuarios realizar consultas simples (en la vista) sobre los resultados de
consultas complejas (la generación de la vista)
Vistas en SQL: Definición
CREATE [ OR REPLACE ] VIEW <nombre-vista> [ (<lista de atributos>) ]
AS <consulta-SQL>
 Lista de atributos: No se deben especificar nombres de atributos para la vista puesto que serán
idénticos a los de las tablas base, salvo que alguno de ellos resulte de aplicar funciones.
 OR REPLACE: se emplea para cambiar la definición de la vista sin eliminarla y recrearla.
 Consulta SQL: sentencia SQL que especifica el contenido de la vista.

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

SELECT * FROM TRABAJA_EN_PROYS


La vista se puede
consultar: WHERE NombreProyecto = 'Comunicaciones'
OR NombreProyecto = 'ProductoX'
ORDER BY 3,2
Vistas en SQL
2) Crear una vista INFO_DPTO que contenga el nombre de cada departamento, la cantidad de empleados y el
total de sueldos.

CREATE OR REPLACE VIEW INFO_DPTO (Nombre_Depto, Cant_Empleados, Total_Sueldos)


AS SELECT NombreDpto, COUNT (∗), SUM (Sueldo)
FROM DEPARTAMENTO, EMPLEADO
WHERE NumeroDpto=Dno
GROUP BY NombreDpto

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).

CREATE OR REPLACE VIEW PROYS_MAS_HORAS (Nombre_Proy, Hs_asignadas)


AS SELECT NombreProyecto, SUM(Horas)
FROM TRABAJA_EN_PROYS
GROUP BY NombreProyecto
HAVING SUM(Horas) >= ALL ( SELECT SUM(Horas)
FROM TRABAJA_EN_PROYS
GROUP BY NombreProyecto )
Modificación de Vistas
 La cláusula OR REPLACE en la sentencia CREATE VIEW permite agregar columnas adicionales al final
de la lista de atributos de la vista
 NO SE PUEDEN ELIMINAR columnas de una vista, sólo agregar.

Ejemplo: Modificar la vista TRABAJA_EN_PROYS para agregar el Dni de los empleados


CREATE OR REPLACE VIEW TRABAJA_EN_PROYS
AS SELECT Nombre, Apellido1, NombreProyecto, Horas, Dni
FROM EMPLEADO, PROYECTO, TRABAJA_EN
WHERE Dni = DniEmpleado
AND NumProy = NumProyecto

 Se puede cambiar el nombre de la vista con ALTER VIEW…RENAME TO


ALTER VIEW TRABAJA_EN_PROYS RENAME TO VISTA_TRABAJA_EN_PROYS
Vistas en SQL: Eliminación
DROP VIEW <nombre-vista> [CASCADE]

 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

Ejemplo: Eliminar la definición de la vista TRABAJA_EN_PROYS

DROP VIEW TRABAJA_EN_PROYS

DROP VIEW TRABAJA_EN_PROYS


CASCADE
Borra TRABAJA_EN_PROYS y la vista PROYS_MAS_HORAS dependiente de ella
Vistas Simples y Complejas
 La consulta que define a una vista puede contener una sintaxis SELECT compleja, incluyendo
uniones, grupos y subconsultas

Vistas Simples y Complejas

Características Vistas Simples Vistas Complejas


Cantidad de tablas 1 1 o más
Contiene cláusula DISTINCT No Si
Contiene funciones de grupos No Si
Contiene grupos de datos No Si
Operaciones de conjuntos No Si
Operaciones DML por medio de la vista Si No

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)

• Libro de Navathe y Elmasri:

- CAPÍTULO 8: SQL-99: definición del


esquema, restricciones, consultas y vistas

También podría gustarte