Language (SQL)
Dr. José Luis Zechinelli Martini
joseluis.zechinelli@udlap.mx
IS – 341
1
Structured Query Language
Lenguaje de Definición de Datos (LDD):
Definición, modificación y eliminación de esquemas de relación.
Definición de vistas.
Especificación de derechos de acceso.
Estructura básica
select A1, A2, ..., A n Proyección
from R1, R2, ..., Rm Producto cartesiano
where P Selección
2
Álgebra relacional vs. SQL (1)
Operación Notación SQL
Selección R:f select * from R where f
σ f (R)
Proyección R : (A) select A1, ... An from R ;
π A (R) select distinct A1, ... An from R
Producto R×S select * from R, S
cartesiano
Unión R∪S select * from R union
select * from S
Diferencia R–S select * from R minus
select * from S
3
Intersección y división
Intersección:
División:
Expresiones equivalentes
R( Xi θ Yj ) × S = σ R.A1 θ S.A1 Λ … Λ R.Aq θ S.Aq (R × S)
donde X ∩ Y ⊆ {A1, ..., Aq}
R ∩ S = R – (R – S)
4
División
(select Nombre from RESERVACION)
minus
(select Nombre
from ( (select Nombre, VIAJE.Destinación
from RESERVACION, VIAJE)
minus
(select Nombre, Destinación
from RESERVACION) )
)
Intersección y diferencia
(A1, A2, … An) in R boolean:
select *
from HOTEL
where (Nombre, Tipo) in APARTAMENTOS;
5
Otros operadores SQL
Pertenecía a los conjuntos in, not in
(intersect, minus o except, renombrado)
Predicados and, or, not
between, >, <, =, <>, like ( “%”, “_”, “\%” )
Operadores aritméticos +, -, *, /
Comparación de conjuntos some, all, contains
Existencia de tuplas exists, not exists
Ordenación de las tuplas order by
Agregación avg, min, max, sum, count,
group by, having
Renombrado
select c2.Nombre
from CLIENTE c1, CLIENTE c2
where c1.Dirección = c2.Dirección and
c1.Nombre = ‘juan’ and
c2.Nombre != ‘juan’;
6
Between
A between V1 and V2 boolean
select Destinación
from VIAJE
where Precio between 1000 and 1500;
Like
V like P boolean
select Dirección
from CLIENTE
where Nombre like ‘%juan%’;
7
Operadores aritméticos
ALL y SOME:
A θ all R boolean
Destinaciones de todos los viajes que
tienen un precio menor que todos los
precios de los viajes a Acapulco:
select Destinación
from VIAJE
where Precio <all (select Precio from VIAJE
where Destinación = ‘Acapulco’);
8
R contains S boolean
Clientes que van a todos lados:
exist ( R ) boolean
Direcciones de los clientes que tienen reservaciones para ir a
Veracruz:
select Dirección
from CLIENTE
where exist( select *
from RESERVACION
where Destinación = ‘Veracruz’ and
CLIENTE.Nombre =
RESERVACION.Nombre
)
9
Clausula ORDER BY (1)
Nombres de los clientes con
reservaciones a Acapulco ordenados
alfabéticamente:
10
Funciones de agregación (1)
Precio del viaje más barato:
11
Ejemplo
VIAJE
DESTINACION SALIDA PRECIO
Acapulco 01/06/03 2000.00
Veracruz 15/08/03 1000.00
Acapulco 20/03/03 1500.00
Veracruz 30/06/03 2200.00
Veracruz 23/02/03 800.00
CLIENTE
NOMBRE DIRECCION
Juan Cain Murray
Rosario Cain Murray
Pedro Ignacio Bernal
Amalia José Gaos
Celia Coley Taylor
Juan José Gaos
Pedro Coley Taylor
select Destinación
from VIAJE
where Precio in
(select min(Precio) from VIAJE)
12
Funciones de agregación (3)
Precio máximo de los viajes a Veracruz:
Group by
Crear particiones de una relación en grupos de tuplas
G1, G2, ..., Gn tal que todas las tuplas de un Gi posee la
misma proyección según una lista de atributos.
13
Group by: ejemplo
VIAJE
DESTINACION SALIDA PRECIO
Acapulco 01/06/03 2000.00
Veracruz 15/08/03 1000.00
Acapulco 20/03/03 1500.00
Veracruz 30/06/03 2200.00
Veracruz 23/02/03 800.00
CLIENTE
NOMBRE DIRECCION
Juan Cain Murray
Rosario Cain Murray
Pedro Ignacio Bernal
Amalia José Gaos
Celia Coley Taylor
Juan José Gaos
Pedro Coley Taylor
14
Group by: Consultas (2)
Destinaciones donde el promedio de
precios sea mayor a 1500:
select Destinación
from VIAJE
group by Destinación
having avg(Precio) > 1500;
R1, ... , Rm );
15
Cambios de esquema (LDD)
Eliminar relaciones:
16
Inserción de tuplas (LMD)
insert into <NOMBRE> values ( V1, V2, ... , Vn );
insert into <NOMBRE> ( A1, A2, ... , Am ) values ( V1, V2, ... , Vm );
donde Vj ∈ Dj dominio y
Aj atributo de la relación <NOMBRE>, 1 ≤ j ≤ m.
insert into <NOMBRE> [ ( B1, B2, ... , Bq ) ] select C1, C2, ... , Cq
from R1, ... , Rp
where P;
donde dom(Bk) = dom(Ck) y
Bk atributo de la relación <NOMBRE>, 1 ≤ k ≤ q.
Actualización de tuplas:
update <NOMBRE>
set <ATRIBUTO> = <EXPRESION-VALOR>
where P;
17