Está en la página 1de 6

Tarea 4

OPERACIONES RELACIONALES EN CRT, AR Y SQL

Dado el siguiente esquema de base de datos, resolver las operaciones que se indican posteriormente en CRT y AR, junto
con sus codificaciones en SQL. Tener en cuenta que la codificación de una operación a SQL debe corresponder a su
representación en CRT o AR, y que cada operación puede tener

Se provee un script para la creación y carga de una base de datos de prueba para verificar la corrección de las
operaciones.

Se sugiere trabajar con MySQL 8.0, y, para la interfaz para consultas, con Heidi o con el Workbench de MySQL.

Esquema de base de datos


agencia((razonSocial)pk, direccion, telefono, email)

ciudad((codigoPostal)pk, nombreCiudad, anioCreacion)

cliente((dni)pk, nombre, apellido, telefono, direccion)

viaje((fecha, hora, (dni)fk)pk, (cpOrigen)fk, (cpDestino)fk, (razonSocial)fk , (descripción)?)

Operaciones
1. Listar DNI, fecha, hora, nombre de ciudad origen, nombre de ciudad destino y razón social de agencia de los viajes
realizados por Cristian Olivera, ordenados por fecha y hora.

{(v.dni, v.fecha, v.hora, o.nombreCiudad, d.nombreCiudad, v.razonSocial) | vviaje  ociudad 


o.codigoPostal=v.cpOrigen  dciudad  d.codigoPostal=v.cpDestino  ( ccliente)(c.nombre='Cristian' 
c.apellido='Olivera')}

SELECT v.dni, v.fecha, v.hora, o.nombreCiudad, d.nombreCiudad, v.razonSocial


FROM (viaje v INNER JOIN ciudad o ON (v.cpOrigen=o.codigoPostal)) INNER JOIN ciudad d ON
(v.cpDestino=d.codigoPostal)
WHERE EXISTS (SELECT * FROM cliente c WHERE c.nombre = 'Cristian' AND c.apellido = 'Olivera' AND c.dni=v.dni);

dni, fecha, hora, origen.nombreCiudad, destino.nombreCiudad, razonSocial ((o(ciudad) ||cpOrigen = o.codigoPostal viaje ||cpDestino = d.codigoPostal
d(ciudad)) |dni nombre = “Cristian”  apellido = “Olivera” (cliente))

SELECT v.dni, v.fecha, v.hora, o.nombreCiudad, d.nombreCiudad, v.razonSocial


FROM (ciudad o INNER JOIN viaje v ON (v.cpOrigen=o.codigoPostal) INNER JOIN ciudad d ON
(v.cpDestino=d.codigoPostal)) INNER JOIN cliente c USING (dni)
WHERE c.nombre = 'Cristian' AND c.apellido = 'Olivera';

2. Listar ordenados por apellido, nombre y DNI a los clientes que tengan viajes con destino a “Bahia Blanca” y a “Carmen
de Patagones”.

{ (c.apellido, c.nombre, c.dni, c.telefono, c.direccion) | ccliente  ( v1viaje, d1ciudad)(v1.dni=c.dni 


v1.cpDestino=d1.codigoPostal  d1.nombreCiudad='Bahia Blanca')  ( v2viaje, d2ciudad)(v2.dni=c.dni 
v2.cpDestino=d2.codigoPostal  d2.nombreCiudad='Carmen de Patagones')}

Base de Datos Curso Servetto1 de 6


SELECT *
FROM cliente c
WHERE EXISTS
(SELECT *
FROM viaje v1 INNER JOIN ciudad d1 ON (v1.cpDestino=d1.codigoPostal)
WHERE v1.dni=c.dni AND d1.nombreCiudad='Bahia Blanca')
AND EXISTS
(SELECT *
FROM viaje v2 INNER JOIN ciudad d2 ON (v2.cpDestino=d2.codigoPostal)
WHERE v2.dni=c.dni AND d2.nombreCiudad='Carmen de Patagones')
ORDER BY c.apellido, c.nombre, c.dni;

aBB  dni (viaje |>cpDestino = codigoPostal nombreCiudad = “Bahia Blanca” (ciudad))

aCP  dni (viaje |>cpDestino = codigoPostal nombreCiudad = “Carmen de Patagones” (ciudad))

cliente || (aBB  aCP)

SELECT *
FROM cliente
WHERE dni IN
(SELECT dni
FROM viaje INNER JOIN ciudad ON (cpDestino = codigoPostal)
WHERE nombreCiudad = 'Bahía Blanca')
AND dni IN
(SELECT dni
FROM viaje INNER JOIN ciudad ON (cpDestino = codigoPostal)
WHERE nombreCiudad = 'Carmen de Patagones')
ORDER BY apellido, nombre, dni;

3. Listar las agencias que tienen viajes con destino a “Lujan” y también tienen viajes con destino a “San Nicolas”.

{aagencia | ( v1viaje, d1ciudad)(v1.razonSocial=a.razonSocial  v1.cpDestino=d1.codigoPostal 


d1.nombreCiudad='Lujan')  ( v2viaje, d2ciudad)(v2.razonSocial=a.razonSocial 
v2.cpDestino=d2.codigoPostal  d2.nombreCiudad='San Nicolas')}

SELECT *
FROM agencia a
WHERE EXISTS
(SELECT *
FROM viaje v1 INNER JOIN ciudad d1 ON (v1.cpDestino=d1.codigoPostal)
WHERE v1.razonSocial=a.razonSocial AND d1.nombreCiudad='Lujan')
AND EXISTS
(SELECT *
FROM viaje v2 INNER JOIN ciudad d2 ON (v2.cpDestino=d2.codigoPostal)
WHERE v2.razonSocial=a.razonSocial AND d2.nombreCiudad='San Nicolas');

aL  razonSocial (viaje |>cpDestino = codigoPostal nombreCiudad = “Lujan” (ciudad))

aSN  razonSocial (viaje |>cpDestino = codigoPostal nombreCiudad = “San Nicolas” (ciudad))

agencia || (aL  aSN)


Base de Datos Curso Servetto2 de 6
SELECT *
FROM agencia
WHERE razonSocial IN
(SELECT razonSocial
FROM viaje INNER JOIN ciudad ON (cpDestino = codigoPostal)
WHERE nombreCiudad = Lujan')
AND razonSocial IN
(SELECT razonSocial
FROM viaje INNER JOIN ciudad ON (cpDestino = codigoPostal)
WHERE nombreCiudad = 'San Nicolas');

4. Listar ordenados por apellido, nombre y DNI a los clientes que tengan viajes con origen en “La Plata” pero que no
tengan ninguno con destino a la misma ciudad.

{ (c.apellido, c.nombre, c.dni, c.telefono, c.direccion) | ccliente  ( v1viaje, ociudad)(v1.dni=c.dni 


v1.cpDestino=o.codigoPostal  d1.nombreCiudad='La Plata'  ( v2viaje)(v2.dni=c.dni 
v2.cpDestino=v1.cpOrigen))}

SELECT *
FROM cliente c
WHERE EXISTS
(SELECT *
FROM viaje v1 INNER JOIN ciudad o ON (v1.cpDestino=o.codigoPostal)
WHERE v1.dni=c.dni AND o.nombreCiudad='La Plata'
AND NOT EXISTS
(SELECT *
FROM viaje v2
WHERE v2.dni=c.dni AND v2.cpDestino=v1.cpOrigen))
ORDER BY c.apellido, c.nombre, c.dni;

deLP  dni (viaje |>cpOrigen = codigoPostal nombreCiudad = “La Plata” (ciudad))

aLP  dni (viaje |>cpDestino = codigoPostal nombreCiudad = “La Plata” (ciudad))

cliente || (deLP – aLP)

SELECT *
FROM cliente
WHERE dni IN
(SELECT v.dni
FROM viaje v INNER JOIN ciudad ori ON (v.cpOrigen = ori.codigoPostal)
WHERE ori.nombreCiudad = 'La Plata')
AND dni NOT IN
(SELECT v.dni
FROM viaje v INNER JOIN ciudad des ON (v.cpDestino = des.codigoPostal)
WHERE ori.nombreCiudad = 'La Plata')
ORDER BY apellido, nombre, dni;

5. Listar DNI, nombre y apellido de los clientes que viajaron con todas las agencias. Ordenar por apellido y nombre.

{(c.dni, c.apellido, c.nombre) | ccliente  ( aagencia)(( vviaje)(v.razonSocial=a.razonSocial 


v.dni=c.dni))}

Base de Datos Curso Servetto3 de 6


por equivalencia:

{(c.dni, c.apellido, c.nombre) | ccliente  ( aagencia)(( vviaje)(v.razonSocial=a.razonSocial 


v.dni=c.dni))}

SELECT c.dni, c.nombre, c.apellido


FROM cliente c
WHERE NOT EXISTS
(SELECT *
FROM agencia a
WHERE NOT EXISTS
(SELECT *
FROM viaje v
WHERE v.razonSocial=a.razonSocial AND v.dni=c.dni))
ORDER BY c.apellido, c.nombre;

dni, apellido, nombre, razonSocial (Cliente || Viaje )  razonSocial (agencia)

V(A, B)  W(B)  A(V) – A((A(V)  W) – V)


Se resta a los viajeros quienes no hayan viajado por alguna de las agencias

dni, apellido, nombre (Cliente |>dni Viaje ) – dni, apellido, nombre ((dni, apellido, nombre (Cliente |>dni Viaje )  razonSocial (agencia)) –
dni, apellido, nombre, razonSocial (Cliente || Viaje ))

SELECT dni, apellido, nombre


FROM cliente INNER JOIN viaje USING (dni)
WHERE (dni, apellido, nombre) NOT IN
(SELECT dni, apellido, nombre
FROM (SELECT dni, apellido, nombre, razonSocial
FROM cliente INNER JOIN viaje USING (dni), agencia
WHERE (dni, apellido, nombre, razonSocial) NOT IN
(SELECT dni, apellido, nombre razonSocial
FROM cliente NATURAL JOIN viaje)))
ORDER BY apellido, nombre;

6. Listar razón social y cantidad de viajes de cada agencia en el año 2019. Las agencias que no registren viajes ese año
deben aparecer con 0 viajes.

{(razonSocial, cantViajes) | ( vviaje)(v.razonSocial=razonSocial  1/1/2019 <= v.fecha<=31/12/2019 


cantViajes=COUNT(*))}

{(a.razonSocial, 0) | aagencia  ( vviaje)(v.razonSocial=a.razonSocial  1/1/2019 <= v.fecha<=31/12/2019)}

(SELECT razonSocial, COUNT(*) AS cantViajes


FROM viaje
WHERE EXTRACT(YEAR FROM fecha)=2019
GROUP BY razonSocial)
UNION
(SELECT razonSocial, 0 AS cantViajes
FROM agencia a
WHERE NOT EXISTS
(SELECT *

Base de Datos Curso Servetto4 de 6


FROM viaje v
WHERE EXTRACT(YEAR FROM fecha)=2019 AND v.razonSocial=a.razonSocial));

razonSocialcantidad_viajes=COUNT(fecha, hora, dni) (agencia | 1/1/2019 <= fecha <= 31/12/2019 (viaje))1

SELECT a.razonSocial, COUNT(DISTINCT v.fecha, v.hora, v.dni)2 AS cantidad_viajes


FROM agencia a LEFT JOIN (SELECT * FROM viaje WHERE year(v.fecha)=2019) v USING(razonSocial)
GROUP BY razonSocial;

7. Listar los datos de los clientes que tengan más de 3 viajes con destino a “Colon”.

{ccliente | ( (aColon))(aColon>3  ( vviaje, dciudad)(d.nombreCiudad='Colon' 


v.cpDestino=d.codigoPostal  v.dni=c.dni  aColon=COUNT(*)))}

SELECT *
FROM cliente c
WHERE EXISTS
(SELECT COUNT(*) AS aColon
FROM viaje v INNER JOIN ciudad d ON (v.cpDestino=d.codigoPostal)
WHERE d.nombreCiudad='Colon' AND v.dni=c.dni
HAVING aColon>3);

clienteaColon=COUNT(*) > 3 (cliente |>dni (viaje |>cdDestino = codigoPostal nombreCiudad = “Colon” (ciudad)))

SELECT c.*, COUNT(*) AS aColon


FROM cliente c INNER JOIN viaje USING (dni) INNER JOIN ciudad ON (cpDestino=codigoPostal)
WHERE nombreCiudad = 'Colon'
GROUP BY c.dni
HAVING aColon > 3;

8. Mostrar dni (en caso de que haya clientes homónimos), la fecha del primer viaje, la fecha del último viaje, la cantidad
total de viajes y la cantidad de empresas distintas por la que viajó el cliente Cristian Olivera.

{(dni, fPrimero, fUltimo, cantViajes, cantEmpresas) | ( vviaje, ccliente)(c.nombre='Cristian' 


c.apellido='Olivera'  v.dni=c.dni  fPrimero=MIN(v.fecha)  fUltimo=MAX(v.fecha)  cantViajes=COUNT(*) 
cantEmpresas=COUNT(razonSocial))}

SELECT dni, MIN(v.fecha) AS fPrimero, MAX(v.fecha) AS fUltimo, COUNT(*) AS cantViajes, COUNT(DISTINCT


v.razonSocial) AS cantEmpresas
FROM viaje v NATURAL JOIN cliente c
WHERE c.nombre='Cristian' AND c.apellido='Olivera';

dnifPrimero=MIN(fecha), fUltimo=MAX(fecha), cantViajes=COUNT(*), cantEmpresas=COUNT(DISTINCT razonSocial) (viaje |>dni cnombre = “Cristian”  apellido =
“Olivera” (cliente))

SELECT dni, MIN(v.fecha) AS fPrimero, MAX(v.fecha) AS fUltimo, COUNT(*) AS cantViajes, COUNT(DISTINCT


v.razonSocial) AS cantEmpresas
FROM viajes v INNER JOIN (SELECT * FROM cliente WHERE nombre='Cristian' AND apellido='Olivera') USING (dni);

9. Eliminar al cliente Cristian Olivera (manteniendo la integridad referencial en la base de datos).

1
En la función de agregación COUNT se especifica contar valores (no nulos) de los campos fecha, hora y dni de viaje.
2
En MySQL, para contar valores de claves compuestas se debe usar la restricción DISTINCT.
Base de Datos Curso Servetto5 de 6
viaje=viaje – {vviaje | ( ccliente)(c.nombre='Cristian'  c.apellido='Olivera'  c.dni=v.dni)}

DELETE FROM viaje v


WHERE EXISTS (SELECT * FROM cliente c WHERE c.nombre='Cristian' AND c.apellido='Olivera' AND c.dni=v.dni);

cliente=cliente – {ccliente | c.nombre='Cristian'  c.apellido='Olivera'}

DELETE FROM cliente c


WHERE c.nombre='Cristian' AND c.apellido='Olivera';

viaje = viaje – viaje |dni nombre = “Cristian”  apellido = “Olivera” (cliente)

cliente = cliente - nombre = “Cristian”  apellido = “Olivera” (cliente)

DELETE FROM viaje


WHERE dni IN (SELECT dni FROM cliente WHERE nombre='Cristian' AND apellido='Olivera');

DELETE FROM ciente


WHERE nombre='Cristian' AND apellido='Olivera';

10. Modificar la dirección de la agencia “Expedia” a “Calle 23 Num 243”.

{a.direccion='Calle 23 Num 243' | aagencia  a.razonSocial='Expedia'}

dirección = “Calle 23 Num 243” (razonSocial = “Expedia” (agencia))

UPDATE agencia
SET dirección='Calle 23 Num 243'
WHERE razonSocial='Expedia';

11. Agregar la agencia “El Rapido Argentino” con dirección en “Calle 522 Num 3498-3598”, teléfono “0221-4249748” y
email “rapido.argentino@gmail.com”.

agencia=agencia  {('El Rápido Argentino', 'Calle 522 Num 3498-3598', '0221-4249748',


'rapido.argentino@gmail.com')}

INSERT INTO agencia (razonSocial, dirección, teléfono, email)


VALUE ('El Rapido Argentino', 'Calle 522 Num 3498-3598', '0221-4249748', 'rapido.argentino@gmail.com');

12. Agréguese como cliente y regístrese un viaje por “El Rápido Argentino” desde “La Plata” a “Mar Chiquita”.

cliente=cliente  {(12345678, 'Arturo', 'Servetto', '+54911-55555555', 'Calle x Num y')}

INSERT INTO cliente (dni, nombre, apellido, teléfono, direccion)


VALUE (12345678, 'Arturo', 'Servetto', '+54911-55555555', 'Calle x Num y');

viaje=viaje  {('2020-06-09', '12:00', 12345678, o.codigoPostal, d.codigoPostal, 'El Rapido Argentino', '') |
ociudad, dciudad, o.nombreCiudad='La Plata'  d.nombreCiudad='Mar Chiquita'  o.codigoPostal=v.cpOrigen
 d.codigoPostal=v.cpDestino)}

viaje=viaje  {('2020-06-09', '12:00', 12345678, codigoPostal (nombreCiudad = “La Plata” (ciudad)), codigoPostal (nombreCiudad =
“Mar Chiquta” (ciudad)), 'El Rapido Argentino', '')}

INSERT INTO viaje (fecha, hora, dni, cpOrigen, cpDestino, razonSocial)


VALUE ('2020-06-09', '12:00', 12345678, SELECT codigoPostal FROM ciudad WHERE nombreCiudad='La Plata',
SELECT codigoPostal FROM ciudad WHERE nombreCiudad='Mar Chiquita', 'El Rapido Argentino');

Base de Datos Curso Servetto6 de 6

También podría gustarte