Anda di halaman 1dari 17

Structured Query

Language (SQL)
Dr. José Luis Zechinelli Martini
joseluis.zechinelli@udlap.mx
IS – 341

Structured Query Language

Basado sobre el álgebra y el calculo relacional.

1970’s IBM: SEQUEL

1986 ANSI: Standard SQL

IBM SAA-SQL (System Application


Architecture DB Interface)

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.

 Lenguaje de Manipulación de Datos (LMD):


 Inserción, eliminación, modificación y consulta de las tuplas.

 Incrustación en lenguajes de programación anfitriones.


 Integridad y control de transacciones.

Estructura básica
select A1, A2, ..., A n Proyección
from R1, R2, ..., Rm Producto cartesiano
where P Selección

donde cada A i es un atributo de rj y P es un predicado con


1 ≤ i ≤ n, 1 ≤ j ≤ m.

π A1, A2, ... , An (σ P (R1 × R2 × ... × Rm))

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

Álgebra relacional vs. SQL (2)


Operación Notación Resultado
θ-Producto R( Xi θ Yj ) × S select * from R, S where Xi θ Yj ;
(Join) select * from R, S where R.Xi θ S.Yj
Producto R( Xi = Yj ) × S select X U Y from R, S where Xi = Yj ;
natural R*S select * from R, S where R.Xi = S.Yj
R l×l S
Intersección R ∩ S select * from R intersect
select * from S
División R÷S select * from R div
select * from S

3
Intersección y división
 Intersección:

HOTEL intersect APARTAMENTOS;

 División:

(select Nombre, Destinación from RESERVACION)


div
(select Destinación from VIAJE);

Expresiones equivalentes
 R( Xi θ Yj ) × S = σ R.A1 θ S.A1 Λ … Λ R.Aq θ S.Aq (R × S)
donde X ∩ Y ⊆ {A1, ..., Aq}

 R l×l S = π X ∪ Y (σ R.A1 = S.A1 Λ … Λ R.Aq = S.Aq (R × S))


donde X ∩ Y ⊆ {A1, ..., Aq}

 R ∩ S = R – (R – S)

 R÷S = π X – Y (R) – π X – Y ((π X – Y (R) × S) – R)

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;

 (A1, A2, … An) not in R  boolean:


select
from HOTEL
where (Nombre, Tipo) not 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%’;

where Nombre like ‘___%’


where Descripción like ‘%\%%’ \\ \_

7
Operadores aritméticos

select Destinación, Precio * 1.15


from VIAJE
where Precio + Precio * 0.15 <= 2000;

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:

select distinct Nombre


from RESERVACION c
Where (select Destinación
from RESERVACION r
where c.Nombre = r.Nombre)
contains
(select Destinación from VIAJE)

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:

select distinct Nombre


from RESERVACION
where Destinación = ‘Acapulco’
order by Nombre

Clausula ORDER BY (2)


 Nombres y precios de los viajes ordenados
alfabéticamente por Nombre en orden
ascendente y por Precio en orden
descendente:

select Destinación, Precio


from VIAJE
order by Destinación asc, Precio desc

10
Funciones de agregación (1)
 Precio del viaje más barato:

(select distinct Precio


from VIAJE)
minus
(select v1.Precio
from VIAJE v1, VIAJE v2
where v1.Precio > v2.Precio)

Funciones de agregación (2)


 Precio del viaje alto/bajo:

select min(Precio) select max(Precio)


from VIAJE from VIAJE

select count(distinct Precio)


from VIAJE

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

Funciones de agregación (2)


 Destinación del viaje más barato:

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:

select max(Precio) from VIAJE


where Destinación = ‘Veracruz’

 Precio máximo para cada destinación:


(select-from-where-group by)

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.

 La cláusula having define una condición que deberá ser


verificada por todas las tuplas del grupo.

 Expresa un filtro sobre las particiones obtenidas por el


group by.

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

Group by: Consultas (1)


 Precio máximo para cada destinación:
select max(Precio)
from VIAJE
group by Destinación

 Destinaciones con su precio más alto:


select Destinación, max(Precio)
from VIAJE
group by Destinación

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;

Definición de esquemas (LDD)


create table <NOMBRE> ( A1 D1 [ NOT NULL ] [ DEFAULT V1 ], ... ,
An Dn [ NOT NULL ] [ DEFAULT Vn ],

R1, ... , Rm );

donde Ai es el nombres de un constituyente, Di su dominio, Vi ∈ Di y


Rj una restricción de integridad.

Di : CHAR, CHAR(N), CHARACTER(N), Rj : PRIMARY KEY (X),


VARCHAR(N), CHAR VARYING(N), UNIQUE (Y),
INTEGER, INT, SMALLINT, FOREIGN KEY (Z) REFERENCES <RELACION>,
FOREIGN KEY (Z) REFERENCES <RELACION> (W),
FLOAT, REAL, DOUBLE PRECISION,
CONSTRAINT <NOMBRE-RESTRICCION>
NUMBER(N), NUMBER(N,D),
CHECK (Ak BETWEEN V1 AND V2)
BIT(N), BIT VARYING(N),
DATE (HH:MM:SS DD-MMM-YY) donde X ⊆ { A1, ... , An }, Y ⊆ { A1, ... , An }, Z ⊆ { A1, ... , An },
V1 ∈ dom(Ak), V2 ∈ dom(Ak),
Z y W son atributos llave de la tabla <RELACION>.

15
Cambios de esquema (LDD)
 Eliminar relaciones:

drop table <NOMBRE>;

 Agregar constituyentes a una relación:

alter table <NOMBRE> add <ATRIBUTO> <DOMINIO>;

 Eliminar constituyentes de una relación:

alter table <NOMBRE> drop <ATRIBUTO> restrict;


alter table <NOMBRE> drop <ATRIBUTO> cascade;

Vistas en SQL (LDD)


 Relaciones virtuales, i.e., relaciones no materializadas

 Especificación de vistas en SQL:

create view <NOMBRE-VISTA>


as <EXPRESION-CONSULTA>;

create view <NOMBRE-VISTA>( A1, … , An )


as <EXPRESION-CONSULTA>;

16
Inserción de tuplas (LMD)
 insert into <NOMBRE> values ( V1, V2, ... , Vn );

donde Vi ∈ Di dominio de la relación <NOMBRE>, 1 ≤ i ≤ n.

 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.

Eliminación, actualización (LMD)


 Eliminación de tuplas:

delete [from] <NOMBRE>


where P;

 Actualización de tuplas:

update <NOMBRE>
set <ATRIBUTO> = <EXPRESION-VALOR>
where P;

17

Anda mungkin juga menyukai