Está en la página 1de 99

SQL

Bases de Datos 2 - Tecnologo de Informatica

BD2 - SQL
Outline
1 Structured Query Language (SQL)
Introducción y características
2 SQL como Data Definition Language
Conceptos básicos, Tabla base
Tabla virtual, Vista Materializada
Tipos de datos
Restricciones, Acciones por violación, Valores por
defecto
3 SQL como Data Manipulation Language
Tablas concatenadas (INNER/OUTER JOIN)
Valores NULL
Consultas anidadas y comparación de
conjuntos/multiconjuntos
Funciones de agregación y agrupamiento de tuplas
Constructor CASE y consultas recursivas

BD2 - SQL
Outline
1 Structured Query Language (SQL)
Introducción y características
2 SQL como Data Definition Language
Conceptos básicos, Tabla base
Tabla virtual, Vista Materializada
Tipos de datos
Restricciones, Acciones por violación, Valores por
defecto
3 SQL como Data Manipulation Language
Tablas concatenadas (INNER/OUTER JOIN)
Valores NULL
Consultas anidadas y comparación de
conjuntos/multiconjuntos
Funciones de agregación y agrupamiento de tuplas
Constructor CASE y consultas recursivas

BD2 - SQL
Outline
1 Structured Query Language (SQL)
Introducción y características
2 SQL como Data Definition Language
Conceptos básicos, Tabla base
Tabla virtual, Vista Materializada
Tipos de datos
Restricciones, Acciones por violación, Valores por
defecto
3 SQL como Data Manipulation Language
Tablas concatenadas (INNER/OUTER JOIN)
Valores NULL
Consultas anidadas y comparación de
conjuntos/multiconjuntos
Funciones de agregación y agrupamiento de tuplas
Constructor CASE y consultas recursivas

BD2 - SQL
Structured Query Language (SQL)
Historia

SQL significa Lenguaje de consulta estructurado


(Sructured Query Language). Originalmente llamado
SEQUEL (Sructured English QUEry Language).
En 1986 el Instituto nacional americano de normalización
(ANSI, American National Standards Institute) y la
Organización internacional para la normalización (ISO,
International Standards Organization) estandarizaron una
primer versión denominada SQL-86 (o SQL1).
Luego le siguieron las versiones SQL-92 (o SQL2), el más
ampliamente conocido SQL-99 (o SQL3), las
actualizaciones SQL:2003 y SQL:2006 que incorporaron
funcionalidades de XML, SQL:2008 y la última estable
SQL:2011.
Comenzando con SQL-99, el standard se divide en la
especificación de un nucleo y extensiones.
BD2 - SQL
Structured Query Language (SQL)
Características de SQL Standard

Opera sobre multiconjuntos de tuplas:


No elimina automáticamente tuplas repetidas.
El mismo lenguaje puede ser usado:
En forma interactiva (Ej.: consola)
Embebido en un lenguaje de programación
ISO/IEC 9075-2:2011

BD2 - SQL
Structured Query Language (SQL)
Características de SQL Standard

Su poder de expresión incluye el álgebra relacional y la


extiende.
Se identifican dos sublenguajes:
DDL (Data Definition Language):
Permite crear, modificar y eliminar objetos de la base.
EJ.: CREATE, ALTER, DROP

DML (Data Manipulation Language):


Permite crear, modificar, eliminar y recuperar datos.
EJ.: INSERT, UPDATE, DELETE, SELECT

BD2 - SQL
Outline
1 Structured Query Language (SQL)
Introducción y características
2 SQL como Data Definition Language
Conceptos básicos, Tabla base
Tabla virtual, Vista Materializada
Tipos de datos
Restricciones, Acciones por violación, Valores por
defecto
3 SQL como Data Manipulation Language
Tablas concatenadas (INNER/OUTER JOIN)
Valores NULL
Consultas anidadas y comparación de
conjuntos/multiconjuntos
Funciones de agregación y agrupamiento de tuplas
Constructor CASE y consultas recursivas

BD2 - SQL
Outline
1 Structured Query Language (SQL)
Introducción y características
2 SQL como Data Definition Language
Conceptos básicos, Tabla base
Tabla virtual, Vista Materializada
Tipos de datos
Restricciones, Acciones por violación, Valores por
defecto
3 SQL como Data Manipulation Language
Tablas concatenadas (INNER/OUTER JOIN)
Valores NULL
Consultas anidadas y comparación de
conjuntos/multiconjuntos
Funciones de agregación y agrupamiento de tuplas
Constructor CASE y consultas recursivas

BD2 - SQL
DDL
Data Definition Language

DDL permite especificar información acerca de relaciones,


incluyendo:
El esquema de cada relación.
El dominio de valores asociado a cada atributo.
Restricciones de integridad.
Más adelante veremos que también otra información como
ser:
El conjunto de índices a mantener para cada relación.
Información sobre seguridad y autorización para cada
relación.
Estructura del almacenamiento físico en disco de cada
relación.

BD2 - SQL
DDL - Tabla
¿Qué es una tabla?

SQL utiliza los términos tabla (table), fila (row) y columna


(column) para los términos relación, tupla y atributo del
modelo relacional formal, respectivamente.
Una tabla es conjunto de valores organizados en
columnas y filas.
Es la representación de una relación pero no son
estrictamente equivalentes.

BD2 - SQL
DDL - Tabla
Operaciones sobre tablas

CREATE TABLE
Crea una nueva tabla de la base.
Parámetros:
Nombre de la tabla
Nombre de cada columna
Tipo de datos de cada columna
Restricciones de clave primaria y clave foránea sobre otras
tablas
Los atributos se considerarán ordenados en la secuencia
en que se especifiquen.
ALTER TABLE
Modifica una tabla existente
DROP TABLE
Elimina la definición de la tabla (y los datos almacenados
en ella si existen)

BD2 - SQL
DDL - Tabla
Ejemplo

Figura : Esq. base de datos relacional Empresa

BD2 - SQL
DDL - Tabla
Ejemplo

BD2 - SQL
DDL - Tabla
Ejemplo

PRODS(#p, Nombre, Peso, Desc)


Contiene todos los productos.

FABS(#f, Nombre, Departamento)


Contiene los fabricantes de productos.

VENTAS(#f, #p, Precio)


Indica qué fabricante vende qué producto y a que precio.

BD2 - SQL
DDL - Tabla
Ejemplo

Creo la tabla PRODS


CREATE TABLE PRODS(
#p integer NOT NULL,
Nombre character varying(50),
CONSTRAINT prods_pk PRIMARY KEY (#p)
);

Agrego la columna “Peso” a la tabla PRODS.


ALTER TABLE PRODS
ADD Peso double precision;

Modifico la especificación de la columna “Peso”.


ALTER TABLE PRODS ALTER COLUMN Peso
SET DEFAULT ’0’;

BD2 - SQL
Outline
1 Structured Query Language (SQL)
Introducción y características
2 SQL como Data Definition Language
Conceptos básicos, Tabla base
Tabla virtual, Vista Materializada
Tipos de datos
Restricciones, Acciones por violación, Valores por
defecto
3 SQL como Data Manipulation Language
Tablas concatenadas (INNER/OUTER JOIN)
Valores NULL
Consultas anidadas y comparación de
conjuntos/multiconjuntos
Funciones de agregación y agrupamiento de tuplas
Constructor CASE y consultas recursivas

BD2 - SQL
DDL - Vista
¿Qué es una vista?

Una vista es una tabla virtual que se basa en el resultado


de una consulta.
Sus atributos son atributos de tablas o de otras vistas.
Pueden usarse en consultas como si fueran tablas.
La vista se supone que está siempre actualizada.
Es responsabilidad del DBMS y no del usuario asegurarse
de mantener actualizada la vista.

BD2 - SQL
DDL - Vista
Operaciones sobre vistas

CREATE VIEW
Crea una vista.
ALTER VIEW
Modifica una vista.
DROP VIEW
Elimina la vista.

BD2 - SQL
DDL - Vista
Ejemplo

Quiero ofrecer una vista sobre la tabla PRODS en la que


no aparezca el peso.
CREATE VIEW PRODS2 AS (
SELECT #p, Nombre
FROM PRODS )
. . . devuelve sólo el código y nombre de cada producto.
Quiero una vista más amigable que la relación
TRABAJA_EN.
CREATE VIEW TRABAJA_EN1 AS (
SELECT Nombre, Apellido1, NombreProyecto, Horas
FROM EMPLEADO, PROYECTO, TRABAJA_EN
WHERE DniEmpleado = Dni AND NumProy =
NumProyecto)

BD2 - SQL
DDL - Vista Materializada
Implementación de vistas

Materializar una vista implica la creación física de una


tabla de vista temporal cuando la vista es consultada por
primera vez1 y se mantiene en la suposición de que se
harán otras consultas en la vista.
Para actualizar éstas vistas se aplican estrategias de
actualización incremental.
Immediate update. Actualiza la vista tan pronto las tablas
base cambian.
Lazy update. Actualiza la vista cuando la consulta de la
vista lo requiere.
Periodic update. Actualiza la vista periodicamente

1
El comportamiento por defecto para la materialización de vistas puede
variar según el DBMS
BD2 - SQL
DDL - Vista Materializada

CREATE MATERIALIZED VIEW nombre AS . . .

Si bien la sintaxis básica se respeta, puede variar la forma


de especificar opciones según el DBMS.
Distintos DBMS implementan y ofrecen distintas
estrategias de actualzación automáticas.
Generalmente, una actualización (mediante sentencia
UPDATE) de vista es factible cuando sólo una
actualización posible en las relaciones base puede lograr
el efecto de actualización deseado en la vista.

BD2 - SQL
Outline
1 Structured Query Language (SQL)
Introducción y características
2 SQL como Data Definition Language
Conceptos básicos, Tabla base
Tabla virtual, Vista Materializada
Tipos de datos
Restricciones, Acciones por violación, Valores por
defecto
3 SQL como Data Manipulation Language
Tablas concatenadas (INNER/OUTER JOIN)
Valores NULL
Consultas anidadas y comparación de
conjuntos/multiconjuntos
Funciones de agregación y agrupamiento de tuplas
Constructor CASE y consultas recursivas

BD2 - SQL
DDL - Tipos de datos

Los tipos de datos básicos disponibles para atributos son:


Numérico: INTEGER, SMALLINT2 , FLOAT(n), REAL1 ,
DOUBLE PRECISION1 , DECIMAL, NUMERIC(p,d).
Cadenas de caracteres (character-string): CHAR(n),
VARCHAR(n), CLOB.
Cadenas de bit (bit-string): BIT(n), BIT VARYING(n), BLOB
Boolean, puede tomar valores TRUE, FALSE, NULL
(UNKNOW)
Fecha y hora: TIME, DATE, TIMESTAMP.
Se pueden crear tipos y dominios: TYPE, DOMAIN.

2
la presicón dependende de la maquina
BD2 - SQL
DDL - Tipos de datos
User-defined TYPEs

CREATE TYPE se utiliza para crear tipos definidos por el


usuario.
CREATE TYPE TDni AS NUMERIC(7,0)

CREATE TABLE
EMPLEADO (
Dni TDni,
SuperDni TDni,
...)

BD2 - SQL
DDL - Tipos de datos
DOMAIN

CREATE DOMAIN, incluido en SQL-92, permite crear


dominios definidos por el usuario.
CREATE DOMAIN Nombre CHAR(20) NOT NULL

TYPEs y DOMAINs son similares. DOMAIN puede tener


especificadas restricciones.
CREATE DOMAIN color VARCHAR(8) CONSTRAINT
colores_permitidos CHECK (VALUE IN(’rojo’, ’verde’,
’azul’));

BD2 - SQL
DDL - Tipos de datos
Tipos Large-Object

Objetos grandes (fotos, videos, pdf, etc.) se almacenan


como Large OBject:
blob binary large object: El objeto es una colección de datos
binarios cuya interpretación la realiza una aplicación
externa al sistema de base de datos.
clob character large object: El objeto es una gran colección de
caracteres.
Cuando una el resultado de una consulta es un LOB, se
retorna un puntero en lugar del objeto en si.

BD2 - SQL
Outline
1 Structured Query Language (SQL)
Introducción y características
2 SQL como Data Definition Language
Conceptos básicos, Tabla base
Tabla virtual, Vista Materializada
Tipos de datos
Restricciones, Acciones por violación, Valores por
defecto
3 SQL como Data Manipulation Language
Tablas concatenadas (INNER/OUTER JOIN)
Valores NULL
Consultas anidadas y comparación de
conjuntos/multiconjuntos
Funciones de agregación y agrupamiento de tuplas
Constructor CASE y consultas recursivas

BD2 - SQL
DDL - Restricciones
Primary Key, Foreign Key, Check

PRIMARY KEY
Especifica uno o más atributos que constituyen la clave
principal de una relación.
FOREIGN KEY
Especifica una restricción de integridad referencial.
Acciones por violación: rechazo, SET NULL, CASCADE y
SET DEFAULT (deben aplicarse con ON DELETE u ON
UPDATE).
CONSTRAINT
Nombrar restricciones.
CHECK
Restricciones que se aplican individualmente a cada tupla.
UNIQUE
Especifica calves (secundarias) alternativas.

BD2 - SQL
DDL - Acciones por violación / Valor por defecto
Ejemplo Elmasri ed7 fig. 6.2

CREATE TABLE EMPLEADO


( ... ,
Dno INT NOT NULL DEFAULT 1,
CONSTRAINT EMPPK PRIMARY KEY (Dni),
CONSTRAINT EMPSUPERFK FOREIGN KEY (SuperDni)
REFERENCES EMPLEADO(Dni) ON DELETE SET NULL ON
UPDATE CASCADE,
CONSTRAINT EMPDEPTFK FOREIGN KEY(Dno) REFERENCES
DEPARTAMENTO(NumeroDpto) ON DELETE SET DEFAULT
ON UPDATE CASCADE)

La restricción EMPSUPERFK actualiza SuperDni con valor


NULL si se borra la túpla de su supervisor.
Si en una sentencia INSERT no se indica el atributo Dno,
se carga con valor 1.

BD2 - SQL
DDL - Acciones por violación / Valor por defecto
Ejemplo Elmasri ed7 fig. 6.2

CREATE TABLE LOCALIZACIONES_DPTO


( ... ,
PRIMARY KEY (NumeroDpto, UbicacionDpto),
FOREIGN KEY (NumeroDpto) REFERENCES
DEPARTAMENTO(NumeroDpto) ON DELETE CASCADE ON
UPDATE CASCADE)

Se borrará la túpla si en la tabla DEPARTAMENTO se


borra la túpla del departamento NumeroDpto.
Si en una túpla de la tabla DEPARTAMENTO se actualiza
el valor de NumeroDpto, también se actualizará en toda
túpla de LOCALIZACIONES_DPTO que haga referencia a
dicha túpla (mismo valor de NumeroDpto).

BD2 - SQL
Outline
1 Structured Query Language (SQL)
Introducción y características
2 SQL como Data Definition Language
Conceptos básicos, Tabla base
Tabla virtual, Vista Materializada
Tipos de datos
Restricciones, Acciones por violación, Valores por
defecto
3 SQL como Data Manipulation Language
Tablas concatenadas (INNER/OUTER JOIN)
Valores NULL
Consultas anidadas y comparación de
conjuntos/multiconjuntos
Funciones de agregación y agrupamiento de tuplas
Constructor CASE y consultas recursivas

BD2 - SQL
DML
Data Manipulation Language

Permite crear, modificar, eliminar y recuperar datos:


INSERT
Agrega tuplas a una tabla.
UPDATE
Cambia tuplas de una tabla.
DELETE
Borra tuplas de una tabla.
SELECT
Recupera datos.

BD2 - SQL
DML - INSERT
Ejemplo

Insertar una nueva venta del producto 530 a precio 15000,


para el fabricante 25.
INSERT INTO VENTAS
VALUES (25, 530, 15000);

¿Por qué funciona?


Otra forma es especificar explicitamente los nombres de
los atributos que corresponda con cada valor de la
sentencia.
INSERT INTO VENTAS(#p, #f, Precio)
VALUES (530, 25, 15000);

Atributos no especificados tomaran su valor por defecto


(DEFAULT) o NULL.

BD2 - SQL
DML - INSERT
Ejemplo

Insertar una nueva venta del producto 530 a precio 15000,


para el fabricante 25.
INSERT INTO VENTAS
VALUES (25, 530, 15000);

¿Por qué funciona?


Otra forma es especificar explicitamente los nombres de
los atributos que corresponda con cada valor de la
sentencia.
INSERT INTO VENTAS(#p, #f, Precio)
VALUES (530, 25, 15000);

Atributos no especificados tomaran su valor por defecto


(DEFAULT) o NULL.

BD2 - SQL
DML - INSERT
Ejemplo

Tabla que contiene nombre, apellido y salario de los


empleados que trabajan en el departamento nro 5.
CREATE DEP5_EMPS (
Nombre char(50),
Apellido char(50) ,
Salario float);

¿Cómo podría realizar la carga inicial de esta tabla?

INSERT INTO DEP5_EMPS( Nombre, Apellido, Salario )


SELECT Nombre, Apellido1, Sueldo
FROM EMPLEADO
WHERE Dno=5;

Asumo mismo tipo/dominio de atributos.

BD2 - SQL
DML - DELETE
Borrar tuplas

La sentencia DELETE remueve tuplas de una relación.


Puede incluir la cláusula WHERE que se utiliza para
seleccionar las tuplas a borrar.
Sólo permite borrar tuplas de una relacón a la vez.
Dependiendo de la cláusula WHERE, puede borrarse cero,
una o más túplas con una misma sentencia DELETE.
La ausencia de la cláusula WHERE indica que todas las
tuplas de la relación serán borradas.

BD2 - SQL
DML - DELETE
Ejemplo

Borrar los empleados con Dni 321 (Dni es clave, entonces


se borrará una tupla o ninguna).
DELETE FROM EMPLEADO WHERE Dni=321

Borrar los empleados con apellido Ochoa.


DELETE FROM EMPLEADO
WHERE Apellido1=’Ochoa’ OR Apellido2=’Ochoa’

Borrar los empleados del departamento 5.


DELETE FROM EMPLEADO WHERE Dno=5

Borrar todos los empleados (ausencia del WHERE).


DELETE FROM EMPLEADO

BD2 - SQL
DML - UPDATE
Actualizar tuplas

La sentencia UPDATE se utiliza para modificar valores de


atributos de una o más tuplas.
Puede incluir la cláusula WHERE para seleccionar las
tuplas a actualizar.
Sólo permite actualizar tuplas de una relacón pero. . .
Si se actualiza el valor de una clave primaria podría
propagarse a los valores foreign keys de tuplas en otras
relaciones (ver previo ejemplo con ON UPDATE
CASCADE).
Dependiendo de la cláusula WHERE, puede actualizarse
el/los atributo/os de cero, una o más túplas con una misma
sentencia UPDATE.
La ausencia de la cláusula WHERE indica que todas las
tuplas de la relación serán actualizadas.

BD2 - SQL
DML - UPDATE, DELETE
Ejemplo

Incrementar el precio del producto número 530 en un


10 %.
UPDATE VENTAS
SET Precio = Precio ∗ 1.1
WHERE #p = 530;

Incrementar el precio de todo producto en un 2 %.


UPDATE VENTAS
SET Precio = Precio ∗ 1.02;

Borrar toda la información de ventas con precio mayor a


$50000.
DELETE FROM VENTAS
WHERE Precio = 50000;

BD2 - SQL
DML - Recuperación de datos
Sentencia SQL que nos permite recuperar información de
la base de datos.

SELECT <lista de atributos>


FROM <lista de tablas>
WHERE <condicion>
GROUP BY <expresion>
HAVING <expresion>
ORDER BY <expresion>;

donde:
<lista de atributos> lista de los atributos cuyos valores serán
recuperados por la consulta.
<lista de tablas> es una lista de las relaciones necesarias
para procesar la consulta.
<condicion> es una expresión condicional (booleana) que
identifica las tuplas que la consulta recuperará (es un
perdicado).
<expresion> más adelante veremos la expresión de cada
cláusula.
BD2 - SQL
DML - Recuperación de datos
SELECT

La cláusula SELECT lista los atributos que queremos que


aparezcan en el resultado de la consulta.
¿Encuentra una equivalencia en Álgebra Relacional de la
cláusula SELECT?
Corresponde a la operación de proyección del álgebra
relacional.
Ejemplo:
SELECT Nombre, Apellido1, Apellido2 FROM EMPLEADO
Nota: nombres SQL son case insensitive, ej.:
Apellido1 ≡ APELLIDO1 ≡ apellido1.

BD2 - SQL
DML - Recuperación de datos
SELECT

La cláusula SELECT lista los atributos que queremos que


aparezcan en el resultado de la consulta.
¿Encuentra una equivalencia en Álgebra Relacional de la
cláusula SELECT?
Corresponde a la operación de proyección del álgebra
relacional.
Ejemplo:
SELECT Nombre, Apellido1, Apellido2 FROM EMPLEADO
Nota: nombres SQL son case insensitive, ej.:
Apellido1 ≡ APELLIDO1 ≡ apellido1.

BD2 - SQL
DML - Recuperación de datos
Filtrado de repetidos

SQL permíte que una tabla (relación) tenga dos o más


tuplas idénticas en todos sus valores de atributo.
Por tanto, en general, una tabla SQL no es un conjunto de
tuplas. Es un multiconjunto (o bolsa).
Algunas relaciones SQL están restringidas a ser conjuntos
porque se ha declarado una restricción de clave o porque
se ha utilizado la keyword DISTINCT en la cláusula
SELECT.

BD2 - SQL
DML - Filtrado de repetidos
Razones para no eliminar automáticamente tuplas repetidas

La eliminación de duplicados es una operación muy


costosa.
El usuario puede querer ver las tuplas duplicadas en el
resultado de una consulta.
Al aplicar una función de agregación a las tuplas, en la
mayoría de los casos no queremos eliminar los duplicados
(veremos más adelante).

BD2 - SQL
DML - Filtrado de repetidos
Ejemplo

Dar los #p de los productos vendidos, filtrando los


repetidos.
SELECT DISTINCT #p
FROM VENTAS

Dar los precios a los que se vende cada producto.


SELECT DISTINCT #p, Precio
FROM VENTAS

La cláusula DISTINCT filtra tuplas repetidas.

BD2 - SQL
DML - SELECT
* y expresiones aritméticas

Un asterisco en SELECT denota “todos los atributos” del


esquema resultado.
SELECT ∗ FROM VENTAS;
. . . es equivalente a:
SELECT #f, #p, Precio FROM VENTAS;

La cláusula también puede contener expresiones


aritméticas que involucren los operadores +, -, * y /, y
operen sobre constantes o atributos de túplas.
La siguiente consulta retorna el nombre del Empleado y el
total de salarios que percibe en el año.
SELECT Nombre, Salario ∗ 12 FROM EMPLEADO;

BD2 - SQL
DML - WHERE

La cláusula where especifica condiciones que el resultado


debe cumplir.
Corresponde al predicado de la operación de selección del
álgebra relacional.
Las comparaciones sobre el resultado pueden ser
combinadas utilizando conectores lógicos: AND, OR y
NOT.
Las comparaciones también pueden aplicarse sobre
resultados de expresiones aritméticas.

BD2 - SQL
DML - WHERE
Operadores de comparación

Operadores de comparación aplicables en las condiciones de


la cláusula WHERE:
=, >, >=, <, <=, <>
BETWEEN m AND n
Entre m y n (inclusive)
IN(lista)
Se encuentra en la lista
LIKE
Se ajusta a un patrón.
IS [NOT] NULL
Es/No es valor nulo (veremos ejemplos más adelante)

BD2 - SQL
DML - Recuperación de datos
Ejemplo

Dar el precio al que vende el producto 7 el fabricante 2.

SELECT Precio
FROM VENTAS
WHERE #f = 2 and #p = 7;

Dar el número de los fabricantes que vendieron el


producto 4 a menos de $100.

SELECT #f
FROM VENTAS
WHERE Precio < 100 and #p = 4;

¿Qué expresión utilizaría en álgebra relacional?

BD2 - SQL
DML - Recuperación de datos
FROM

La cláusula FROM lista las relaciones involucradas en la


consulta.
Corresponde con la operación producto cartesiano del
álgebra relacional.
Ejemplo: Obtener el producto cartesiano de las ventas, los
fabricantes y los productos.
SELECT ∗
FROM VENTAS, PRODS
genera todo posible par venta-producto, con todos los
atributos de ambas relaciones.

BD2 - SQL
DML - Tablas como conjuntos
UNION, EXCEPT, INTERSECT

SQL incorpora las operaciones del álgebra relacional.


Únion de conjuntos: UNION
Diferencia de conjuntos: EXCEPT (MINUS)
Intersección de conjuntos: INTERSECT
Las relaciones resultantes de estas operaciones son
conjuntos de tuplas.
Precondición: se aplican a las relaciones compatibles con
la unión.
Mismos atributos
y aparecen en el mismo orden en ambas relaciones.

BD2 - SQL
DML - UNION
Ejemplos

Dar los #f que son de Montevideo o que venden algún


producto a precio mayor que $500.
SELECT #f FROM FABS
WHERE departamento=’Montevideo’
UNION
SELECT #f FROM VENTAS
WHERE Precio > 500;

La UNION elimina tuplas repetidas.

BD2 - SQL
DML - Diferencia (EXCEPT, MINUS)
Ejemplos

Dar los #f que no venden ningún producto.


SELECT #f FROM FABS
EXCEPT
SELECT #f FROM VENTAS;

Hay otras alternativas.


SELECT #f FROM FABS
WHERE #f NOT IN ( SELECT #f FROM VENTAS );

BD2 - SQL
DML - Tablas como multiconjunto
UNION ALL, EXCEPT ALL, INTERSECT ALL

SQL también dispone de las operaciones multiconjunto


correspondientes, que van seguidas por la palabra clave
ALL
UNION ALL, EXCEPT ALL, INTERSECT ALL.
Sus resultados son multiconjuntos. Es decir, los
duplicados no se eliminan.

BD2 - SQL
DML - UNION ALL, EXCEPT ALL, INTERSECT ALL
Ejemplos

A R EXCEPT ALL S
R UNION ALL S
a1
a2 A A
a2 a1 a2
a3 a1 a3
a2
a2
S R INTERSECT ALL S
a2
A a3 A
a1 a4 a1
a2 a5 a2
a4
a5
BD2 - SQL
DML - Orden de tuplas
ORDER BY

Dar los #p de los productos fabricados, pero ordenados en


forma ascendente.
SELECT #p
FROM VENTAS
ORDER BY #p ASC;

La cláusula ORDER BY permite indicar el campo por el


cual se ordena el resultado.
Se indica el orden ascendente o descendente (ASC o
DESC)

BD2 - SQL
DML - Resolver ambiguedades de nombre
Renombre de atributos, Alias, Referencia explícita

Dar los nombres de fabricantes y los nombres de los


productos que venden.
SELECT Nombre, Nombre
FROM VENTAS, FABS, PRODS
WHERE VENTAS.#f=FABS.#f AND VENTAS.#p=PRODS.#p

Una forma de resolver la ambiguedad es indicar la tabla


explícitamente.
SELECT FABS.Nombre, PRODS.Nombre
FROM VENTAS, FABS, PRODS
WHERE VENTAS.#f=FABS.#f AND
VENTAS.#p=PRODS.#p

BD2 - SQL
DML - Resolver ambiguedades de nombre
Renombre de atributos, Alias, Referencia explícita

Dar los nombres de fabricantes y los nombres de los


productos que venden.
SELECT Nombre, Nombre
FROM VENTAS, FABS, PRODS
WHERE VENTAS.#f=FABS.#f AND VENTAS.#p=PRODS.#p

Una forma de resolver la ambiguedad es indicar la tabla


explícitamente.
SELECT FABS.Nombre, PRODS.Nombre
FROM VENTAS, FABS, PRODS
WHERE VENTAS.#f=FABS.#f AND
VENTAS.#p=PRODS.#p

BD2 - SQL
DML - Alias y Renombre de atributos
Ejemplo

También se puede asignar un alias a las tablas.


En este ejemplo se asignan diferentes alias a la “misma”
tabla.
SELECT E.Apellido1, S.Apellido1
FROM EMPLEADO AS E, EMPLEADO AS S
WHERE E.SuperDni=S.Dni;

La sentencias AS permite renombrar los atributos.


SELECT E.Ap1, S.Apellido1
FROM EMPLEADO AS E(Nombre, Ap1, Ap2, ..., SsDni,
Dno), EMPLEADO AS S
WHERE E.SsDni=S.Dni;

BD2 - SQL
Outline
1 Structured Query Language (SQL)
Introducción y características
2 SQL como Data Definition Language
Conceptos básicos, Tabla base
Tabla virtual, Vista Materializada
Tipos de datos
Restricciones, Acciones por violación, Valores por
defecto
3 SQL como Data Manipulation Language
Tablas concatenadas (INNER/OUTER JOIN)
Valores NULL
Consultas anidadas y comparación de
conjuntos/multiconjuntos
Funciones de agregación y agrupamiento de tuplas
Constructor CASE y consultas recursivas

BD2 - SQL
DML - INNER JOIN
Tablas concatenadas y concatenación interna

El concepto de tabla concatenada (o relación


concatenada) se incorporó a SQL para poder especificar
una tabla como resultado de una operación de
concatenación en la cláusula from de una consulta.
Esta estructura es más fácil que mezclar todas las
condiciones de selección y concatenación en la cláusula
WHERE.
El tipo predeterminado de concatenación en una tabla
concatenada es una concatenación interna
La tupla se incluye en el resultado si en la otra relación
existe una tupla coincidente.

BD2 - SQL
DML - INNER JOIN
Ejemplo - Imponiendo la igualdad

Dar los nombres de los fabricantes y los productos que


venden.
SELECT Nombre, #p
FROM VENTAS, FABS
WHERE VENTAS.#f = FABS.#f;

Dar los nombres de fabricantes y los productos que


venden, tales que el precio es $100.
SELECT Nombre, #p
FROM VENTAS, FABS
WHERE VENTAS.#f = FABS.#f AND Precio = 100;

BD2 - SQL
DML - INNER JOIN
Ejemplo - Utilizando operador JOIN

SELECT Nombre, #p
FROM (VENTAS JOIN FABS ON VENTAS.#f=FABS.#f)

SELECT Nombre, #p
FROM (VENTAS JOIN FABS ON VENTAS.#f=FABS.#f)
WHERE Precio = 100;

En lugar de imponer la igualdad utilizo el operador JOIN


para resolver las consultas previas.

BD2 - SQL
DML - INNER JOIN
Ejemplo - Utilizando operador JOIN

SELECT Nombre, #p
FROM (VENTAS JOIN FABS ON VENTAS.#f=FABS.#f)

SELECT Nombre, #p
FROM (VENTAS JOIN FABS ON VENTAS.#f=FABS.#f)
WHERE Precio = 100;

En lugar de imponer la igualdad utilizo el operador JOIN


para resolver las consultas previas.

BD2 - SQL
DML - NATURAL JOIN
Ejemplo

SELECT Nombre, #p
FROM (VENTAS NATURAL JOIN FABS)

SELECT Nombre, #p
FROM (VENTAS NATURAL JOIN FABS)
WHERE Precio = 100;

No se especifica condición de concatenación alguna.


Se crea una condición EQUIJOIN implícita para cada par
de atributos con el mismo nombre (ejemplo el atributo #f).

BD2 - SQL
DML - NATURAL JOIN
Ejemplo

SELECT Nombre, #p
FROM (VENTAS NATURAL JOIN FABS)

SELECT Nombre, #p
FROM (VENTAS NATURAL JOIN FABS)
WHERE Precio = 100;

No se especifica condición de concatenación alguna.


Se crea una condición EQUIJOIN implícita para cada par
de atributos con el mismo nombre (ejemplo el atributo #f).

BD2 - SQL
DML - NATURAL JOIN

Apareceran en el resultad las túplas con el mismo valor


para todos los atributos comunes, y se conservará solo
una copia para cada columna en común.
Hay que tener cuidado: atributos con el mismo nombre y
que no tienen relación pueden ser comparados
incorrectamente.
Ejemplo: ¿qué recupera esta consulta?
SELECT ∗
FROM FABS NATURAL JOIN PRODS

BD2 - SQL
DML - OUTER JOIN
Concatenación externa, LEFT, RIGHT y FULL

Es una extensión de la operación join que evita perdida de


información.
Agrega al resultado del join las túplas de una relación que
no coincide con la otra ralación.
Usa valores NULL para rellenar.

BD2 - SQL
DML - OUTER JOIN
Concatenación externa, LEFT, RIGHT y FULL

Obtener para cada empleado su apellido y el de su


supervisor.
SELECT E.Apellido1, S.Apellido1
FROM (EMPLEADO AS E JOIN EMPLEADO AS S ON
E.SuperDni=S.Dni);

Ahora quiero que se incluyan todos los empleados. Esto


es, tengan o no supervisor.

SELECT E.Apellido1, S.Apellido1


FROM (EMPLEADO AS E LEFT OUTER JOIN
EMPLEADO AS S ON E.SuperDni=S.Dni);

BD2 - SQL
DML - OUTER JOIN
Concatenación externa, LEFT, RIGHT y FULL

Obtener para cada empleado su apellido y el de su


supervisor.
SELECT E.Apellido1, S.Apellido1
FROM (EMPLEADO AS E JOIN EMPLEADO AS S ON
E.SuperDni=S.Dni);

Ahora quiero que se incluyan todos los empleados. Esto


es, tengan o no supervisor.

SELECT E.Apellido1, S.Apellido1


FROM (EMPLEADO AS E LEFT OUTER JOIN
EMPLEADO AS S ON E.SuperDni=S.Dni);

BD2 - SQL
DML - OUTER JOIN
Concatenación externa, LEFT, RIGHT y FULL

Obtener para cada empleado su apellido y el de su


supervisor.
SELECT E.Apellido1, S.Apellido1
FROM (EMPLEADO AS E JOIN EMPLEADO AS S ON
E.SuperDni=S.Dni);

Ahora quiero que se incluyan todos los empleados. Esto


es, tengan o no supervisor.

SELECT E.Apellido1, S.Apellido1


FROM (EMPLEADO AS E LEFT OUTER JOIN
EMPLEADO AS S ON E.SuperDni=S.Dni);

BD2 - SQL
DML - OUTER JOIN
Concatenación externa, LEFT, RIGHT y FULL

Sea la concatenación entre las tablas T1 y T2,


“...T1 <operador_concatenacion> T2...”

Si <operador_concatenacion>:
LEFT JOIN se agrega, para cada tupla de T1 que no
satisface la condición de JOIN con NINGUNA de T2, una
fila con NULOS (NULLs) en las columnas de T2.
RIGHT JOIN análogo al LEFT pero se incluyen todos los
de T2
FULL JOIN equivale a la unión del LEFT y RIGHT.

BD2 - SQL
DML - CROSS JOIN
Producto cartesiano

La keyword CROSS JOIN es utilizada para especificar la


operación Producto Cartesiano.
Como vimos en álgebra relacional, este genera todas las
posibles combinaciones de tuplas.
Se debe utilizar con cuidado.

BD2 - SQL
Outline
1 Structured Query Language (SQL)
Introducción y características
2 SQL como Data Definition Language
Conceptos básicos, Tabla base
Tabla virtual, Vista Materializada
Tipos de datos
Restricciones, Acciones por violación, Valores por
defecto
3 SQL como Data Manipulation Language
Tablas concatenadas (INNER/OUTER JOIN)
Valores NULL
Consultas anidadas y comparación de
conjuntos/multiconjuntos
Funciones de agregación y agrupamiento de tuplas
Constructor CASE y consultas recursivas

BD2 - SQL
DML - Valores NULL
Comparaciones con valores NULL y Lógica de tres valores

El valor NULL tiene una de tres interpretaciones:


Valor desconocido (Unknown). Existe, pero no se conoce.
Valor no disponible. Existe, pero no se especifíca a
propósito.
Atributo no aplicable. No definido para esta tupla.
El resultado de cualquier operación aritmética que
involucre un valor NULL es NULL.
Cuando se compara un atributo con valor NULL, el
resultado se considera desconocido (podría ser TRUE o
podría ser FALSE).
SQL usa una “Lógica de tres valores” cuyos valores son
TRUE, FALSE y UNKNOWN.

BD2 - SQL
DML - Valores NULL
Lógica de tres valores

Figura : Logica de tres valores

BD2 - SQL
DML - Valores NULL
Es o no es

SQL permite chequear en una consulta si un valor es nulo.


Predicados: IS NULL, IS NOT NULL
Ejemplo:
Devolver los nombres de los fabricantes de los que no se
conoce el departamento donde trabajan.
SELECT Nombre
FROM FABS
WHERE departamento IS NULL;
Nombre y apellidos de los empleados que no tienen un
supervisor.
SELECT Nombre, Apellido1, Apellido2
FROM EMPLEADO
WHERE SuperDni IS NULL;

BD2 - SQL
Outline
1 Structured Query Language (SQL)
Introducción y características
2 SQL como Data Definition Language
Conceptos básicos, Tabla base
Tabla virtual, Vista Materializada
Tipos de datos
Restricciones, Acciones por violación, Valores por
defecto
3 SQL como Data Manipulation Language
Tablas concatenadas (INNER/OUTER JOIN)
Valores NULL
Consultas anidadas y comparación de
conjuntos/multiconjuntos
Funciones de agregación y agrupamiento de tuplas
Constructor CASE y consultas recursivas

BD2 - SQL
DML - Consultas anidadas
Consulta anidada y consulta externa

Permiten obtener valores existentes en la base de datos


para usarlos después en una comparación.
Son bloques competos select-from-where que pueden
aparecer dentro de la cláusula WHERE o SELECT u otras.
Se le llama consulta externa (outer query) a la consulta
donde se anidan éstas consultas.

BD2 - SQL
DML - Consultas anidadas
Ejemplos

Dar los nombres de los fabricantes que venden productos


que también son vendidos por el fabricante número 1.
SELECT f.Nombre
FROM FABS f, VENTAS v
WHERE f.#f = v.#f AND f.#f <> 1 AND v.#p IN ( SELECT
#p FROM VENTAS WHERE VENTAS.#f=1 )

BD2 - SQL
DML - Comparación de conjuntos/multiconjuntos
IN, ANY, ALL

Los operadores/keywords IN, ANY, ALL permiten comprar


con conjuntos o multiconjuntos.
En el ejemplo anterior se introduce el operador de
comparación IN que compara un valor con un conjunto (o
multiconjunto) de valores V y se evalúa TRUE si v es uno
de los elementos de V.
El keyword ANY (o SOME) se puede combinar con
operadores: =, >, >=, <, <= y <>.
Ej. = ANY se comporta igual que el operador IN.
El keyword ALL también puede combinarse con dichos
operadores.
Ej. > ALL retornará TRUE si el valor v es mayor que todos
los valores del conjunto o multiconjunto.

BD2 - SQL
DML - EXISTS y UNIQUE

EXISTS y UNIQUE son funciones booleanas que retornan


TRUE o FALSE.
EXISTS
Se utiliza para chequear si el resultado de una consulta
anidada es vacio o no.
Retorna TRUE si dicho resultado contiene al menos una
tupla.
UNIQUE( Q )
Retorna TRUE si no hay tuplas duplicadas en el resultado
de la consulta Q.
Puede ser utilizada para probar si el resultado de una
consulta anidada es un conjunto (no contiene duplicados) o
es un multiconjunto (existen duplicados).

BD2 - SQL
Outline
1 Structured Query Language (SQL)
Introducción y características
2 SQL como Data Definition Language
Conceptos básicos, Tabla base
Tabla virtual, Vista Materializada
Tipos de datos
Restricciones, Acciones por violación, Valores por
defecto
3 SQL como Data Manipulation Language
Tablas concatenadas (INNER/OUTER JOIN)
Valores NULL
Consultas anidadas y comparación de
conjuntos/multiconjuntos
Funciones de agregación y agrupamiento de tuplas
Constructor CASE y consultas recursivas

BD2 - SQL
DML - Funciones de agregación
COUNT, SUM, MIN, MAX, AVG, RANK

Nos permiten resumir información de varias tuplas en un


simple tupla.
Por tanto, aplican sobre conjutos de tuplas, no sobre
tuplas individuales.
Ej.: Obtener la suma de sueldos de todos los empleados,
el sueldo más bajo, el más alto y calcular el sueldo
promedio.
SELECT SUM (Sueldo), MAX (Sueldo), MIN (Sueldo),
AVG (Sueldo)
FROM EMPLEADO;

Ej.: Total de fabricantes.


SELECT COUNT(∗) FROM FABS;

BD2 - SQL
DML - Funciones de agregación
COUNT

Número de empleados (cuenta el número de túplas).


SELECT COUNT(∗) FROM EMPLEADO;

Número de empleados que tienen un supervisor (ignora


NULLs).
SELECT COUNT(SuperDni) FROM EMPLEADO;

Número de empleados que son supervisores.


SELECT COUNT( DISTINCT SuperDni ) FROM
EMPLEADO;

BD2 - SQL
DML - Funciones de agregación
RANK

Ranking se realiza en combinación con un especificación


de orden.
SELECT Dni, RANK() OVER (ORDER BY horas desc)
AS dedicacion
FROM TRABAJA_EN;

Una cláusula ORDER BY extra se necesita para ordenar el


resultado en función del ranking.
SELECT Dni, NumProy, RANK() OVER (ORDER BY
horas desc) AS Dedicacion
FROM TRABAJA_EN
ORDER BY Dedicacion;

¿De qué otra forma se puede implementar?

BD2 - SQL
DML - Funciones de agregación
RANK

Se pueden especificar varias cláusulas rank en una misma


cláusula SELECT.
El ranking se realiza lueg de aplicar la cláusula GROUP
BY.
SQL:1999 permite que el usuario especifique si rankear
los NULLs al final (last) o primeros (first).
SELECT Dni, RANK() OVER (ORDER BY horas desc
NULLS LAST) AS dedicacion
FROM TRABAJA_EN;
Puede utilizarse para encontrar los top-n.
Es más general que la cláusula LIMIT que soporta muchas
bases de datos.

BD2 - SQL
DML - Agrupamiento de tuplas
GROUP BY

En ciertas situaciones se quiere aplicar funciones de


agregación a subgrupos de tuplas en una relación, donde
los subgrupos se confeccionan en base a algunos valores
de atributos.
Ejemplo:
Dar, para cada fabricante, la cantidad de productos que
vende.
Esto implica:
Tomar cada grupo de tuplas en VENTAS correspondiente a
un fabricante.
Contar la cantidad de tuplas en el grupo.
Para realizar esta operación es necesaria la cláusula
GROUP BY.

BD2 - SQL
DML - Agrupamiento de tuplas
GROUP BY

Es una cláusula más que se agrega al bloque


select-from-where.
SELECT #f, COUNT(∗)
FROM VENTAS
GROUP BY #f;

¿Cómo funciona?
Particiona las ventas en subconjuntos o grupos de tuplas
donde cada grupo corresponde a un fabricante distinto.
De cada grupo devuelve el #f del fabricante y la cantidad
de tuplas de dicho grupo.

BD2 - SQL
DML - Agrupamiento de tuplas
GROUP BY

En una sentencia SQL que tiene cláusula GROUP BY, las


expresiones en el SELECT pueden ser sólo:
Atributos presentes en la cláusula GROUP BY.
Funciones de agregación sobre atributos.
Expresiones aritméticas que utilicen los anteriores.
El agrupamiento se realiza después de aplicar el WHERE.
O sea, sobre las tuplas que cumplen la condición.
Si existen NULL en el atributo de agrupamiento, se crea un
grupo separado para todas las tuplas con valor NULL en
dicho atributo.
Otro ejemplo:
Empleados agrupados por su fecha de nacimiento.
SELECT FechaNac, COUNT(∗)
FROM EMPLEADO
GROUP BY FechaNac;

BD2 - SQL
DML - Agrupamiento de tuplas
HAVING

A veces interesa recuperar información de grupos que


cumplen cierta condición.
Con la cláusula HAVING se pueden especificar
condiciones sobre los grupos.
La condición trabaja sobre información resumida del
grupo.
Ejemplo:
Dar los nombres de fabricantes que hicieron más de 5
ventas sobre productos con #p mayor que 2, junto con el
total de precio vendido.
SELECT #f, Nombre, SUM(Precio)
FROM FABS, VENTAS
WHERE FABS.#f = VENTAS.#f AND #p > 2
GROUP BY #f, Nombre
HAVING count(∗) > 5;

BD2 - SQL
Outline
1 Structured Query Language (SQL)
Introducción y características
2 SQL como Data Definition Language
Conceptos básicos, Tabla base
Tabla virtual, Vista Materializada
Tipos de datos
Restricciones, Acciones por violación, Valores por
defecto
3 SQL como Data Manipulation Language
Tablas concatenadas (INNER/OUTER JOIN)
Valores NULL
Consultas anidadas y comparación de
conjuntos/multiconjuntos
Funciones de agregación y agrupamiento de tuplas
Constructor CASE y consultas recursivas

BD2 - SQL
DML - Constructor CASE

El constructor CASE suele utilizarse cuando un valor


puede ser diferente según ciertas condiciones.
Puede ser utilizado ya sea al recuperar, insertar o
actualizar tuplas.
Ejemplo:
Aumentamos el sueldo de los empleados según el
departamento donde trabajan.
UPDATE EMPLEADO
SET Sueldo =
CASE
WHEN Dno=5 THEN Sueldo+2000
WHEN Dno=4 THEN Sueldo+1500
WHEN Dno=1 THEN Sueldo+3000
ELSE Sueldo+500;

BD2 - SQL
DML - Consultas recursivas
WITH [RECURSIVE]

Las consultas WITH, también llamadas Common Table


Expressions (CTEs), a grandes rasgos permiten dividir
consultas complicadas en consultas más simples y fáciles
de interpretar.
Estructura:
WITH RECURSIVE <cte_nombre> (columna, ...) AS (
<termino_no_recursivo>
UNION ALL
<termino_recursivo>)
SELECT ... FROM <cte_nombre>;

BD2 - SQL
DML - Consultas recursivas
Ejemplo

Un ejemplo de relación recursiva entre tuplas del mismo


tipo es la relación entre un empleado y un supervisor.
En álgebra relacional vimos que no podiamos recuperar
todos los supervisados directa e indirectamente por
Ochoa.

BD2 - SQL
DML - Consultas recursivas
Ejemplo - cláusula WITH

WITH RECURSIVE EMP_SUP( EmpDni, SupDni ) AS (


SELECT Dni, SuperDni
FROM EMPLEADO
WHERE SuperDni IN ( SELECT Dni FROM EMPLEADO
WHERE Nombre=’Eduardo’ AND Apellido1=’Ochoa’ )
UNION
SELECT E.Dni, E.SuperDni
FROM EMPLEADO AS E, EMP_SUP AS S
WHERE S.EmpDni = E.SuperDni
)
SELECT ∗ FROM EMP_SUP;

BD2 - SQL
DML - Consultas recursivas
WITH [RECURSIVE]

Sin recursión, un programa no-recursivo y no-iterativo solo


puede realizar un número fijo de JOINs de la relación
EMPLEADO consigo misma.
Esto solo nos podría dar un número fijo de niveles de
supervisores.
Dada una consulta no-recursiva, podemos construir una
base de datos con más niveles de supervisión en los
cuales la consulta no va a funcionar.
Alternativamente: tendríamos que escribir un
procedimiento para iterar tantas veces como sea
necesario.

BD2 - SQL
DML - Consultas recursivas
Ejemplo - cláusula CONNECT BY de Oracle

SELECT Dni, SuperDni


FROM EMPLEADO
CONNECT BY PRIOR Dni = SuperDni
START WITH SuperDni IN ( SELECT Dni FROM
EMPLEADO WHERE Nombre=’Eduardo’ AND
Apellido1=’Ochoa’ )

BD2 - SQL

También podría gustarte