Ingeniero Técnico en Informática de Sistemas


SQL (Structured Query Language)


TRABAJO PRACTICO - LENGUAJES DE CONSULTA

Ej 1.- Sea la siguiente BD:

PROVEEDORES (nro_p, nom_p, categoria, ciud_p)

ITEMS (nro_i, descripcion_i, ciud_i)

PEDIDOS (nro_p, nro_c, nro_i, cantidad, precio)

CLIENTES (nro_c, nom_c, ciud_c)

a) Listar los proveedores de Córdoba

SELECT Nro_P, Nom_P

FROM PROVEEDORES

WHERE CIUD_P = 'CORDOBA';

b) Listar los proveedores que proveen el ítem 1

SELECT P.Nro_P, P.Nom_P

FROM ITEMS AS I, PEDIDOS AS PD, PROVEEDORES AS P

WHERE I.Descripcion_I = 'I1'

AND PD.Nro_I = I.Nro_I

AND P.Nro_P = PD.Nro_P;

c) Listar los clientes que solicitan ítems provistos por el proveedor 1

SELECT C.NRO_C, C.Nom_C

FROM CLIENTES AS C, PEDIDOS AS PD, PROVEEDORES AS P

WHERE P.Nom_P = 'P1'

AND PD.Nro_P = P.Nro_P

AND C.Nro_C = PD.Nro_C;

d) Listar los clientes que solicitan algún ítem provistos por proveedores con categoría

mayor que 4

SELECT C.Nro_C, C.Nom_C

FROM CLIENTES AS C

WHERE C.Nro_C IN (

SELECT DISTINCT PD.Nro_C

FROM PEDIDOS AS PD, PROVEEDORES AS P

WHERE P.Categoria > 4

AND PD.Nro_P = P.Nro_P

);

o bien :

SELECT DISTINCT CL.nro_c, CL.nom_c

FROM clientes CL

WHERE EXISTS (

SELECT *

FROM pedidos PE, proveedores PR

WHERE PE.nro_p = PR.nro_p

AND CL.nro_c = PE.nro_c

AND PR.categoria > 4

)

e) Listar los ítems pedidos por clientes de Rosario.

SELECT I.Nro_I, I.Descripcion_I

FROM ITEMS AS I

WHERE I.Nro_I IN (

SELECT PD.Nro_I

FROM CLIENTES AS C, PEDIDOS AS PD

WHERE C.Ciud_C = 'Rosario'

AND PD.Nro_C = C.Nro_C

);

o bien :

SELECT IT.nro_i, IT.descripcion_i

FROM items IT

WHERE EXISTS (

SELECT *

FROM clientes CL, pedidos PE

WHERE CL.nro_c = PE.nro_c

AND IT.nro_i = PE.nro_i

AND CL.ciud_c = 'rosario'

);

f) Listar los pedidos en los cuales un cliente de rosarios solicita artículos fabricados en Mendoza.

SELECT PR.nom_p, CL.nom_c, IT.descripcion_i, PE.cantidad, PE.precio

FROM proveedores AS PR, clientes AS CL, items AS IT, pedidos AS PE

WHERE PR.nro_p = PE.nro_p

AND CL.nro_c = PE.nro_c

AND IT.nro_i = PE.nro_i

AND CL.ciud_c = 'rosario'

AND IT.ciud_i = 'mendoza';

g) Listar los pedidos en los que el cliente 23 solicita ítems no solicitados por el cliente 30

SELECT PR1.nom_p, CL1.nom_c, IT1.descripcion_i, PE1.cantidad, PE1.precio

FROM proveedores PR1, clientes CL1, items IT1, pedidos PE1

WHERE PR1.nro_p = PE1.nro_p

AND CL1.nro_c = PE1.nro_c

AND IT1.nro_i = PE1.nro_i

AND PE1.nro_c = 23

AND PE1.nro_i not in (

SELECT IT2.nro_i

FROM items IT2, pedidos PE2

WHERE IT2.nro_i = PE2.nro_i

AND PE2.nro_c = 30

);

h) Listar las ciudades en la forma (ciudad1, ciudad2) tales que un proveedor en la ciudad1 provea ítems solicitados por clientes en ciudad2

SELECT DISTINCT P.Ciud_P AS Ciudad1, C.Ciud_C AS Ciudad2

FROM PROVEEDORES AS P, CLIENTES AS C, PEDIDOS AS PD

WHERE P.Nro_P = PD.Nro_P

AND C.Nro_C = PD.Nro_C;

i) Listar los números de proveedores cuya categoría sea mayor que la de todos los proveedores que proveen el ítem "cuaderno"

SELECT P.Nro_P, P.Nom_P

FROM PROVEEDORES AS P

WHERE P.Categoria > (

SELECT MAX(P.Categoria)

FROM PROVEEDORES AS P, PEDIDOS as PD, ITEMS AS I

WHERE I.Descripcion_I = 'Cuaderno'

AND PD.Nro_I = I.Nro_I

AND P.Nro_P = PD.Nro_P

);

j) Listar los clientes que han pedido dos o más ítems distintos.

SELECT DISTINCT PD1.Nro_C, C.Nom_C

FROM PEDIDOS AS PD1, PEDIDOS AS PD2, CLIENTES AS C

WHERE PD1.Nro_C = PD2.Nro_C

AND PD1.Nro_I <> PD2.Nro_I

AND C.Nro_C = PD1.Nro_C;

k) Listar los proveedores que proveen a todos los clientes de Córdoba una cantidad mayor que el promedio de las cantidades pedidas por los clientes de Rosario.

SELECT P.Nro_P, P.Nom_P

FROM PROVEEDORES AS P, PEDIDOS AS PD, CLIENTES AS C

WHERE C.Ciud_C = 'Cordoba'

AND PD.Nro_C = C.Nro_C

AND PD.Cantidad > (

SELECT AVG(SUMA)

FROM TEMP

)

AND P.Nro_P = PD.Nro_P

GROUP BY P.Nro_P, P.Nom_P

HAVING COUNT(C.Nro_C) = (

SELECT COUNT(C2.Nro_C)

FROM CLIENTES C2 , PEDIDOS PD2

WHERE C2.Ciud_C = 'Cordoba' AND

C2.Nro_C = PD2.Nro_C AND

PD2.Nro_P = P.Nro_P

);

TABLA TEMP

----------

SELECT C2.Nro_C, SUM(PD2.Cantidad) AS Suma

FROM PEDIDOS AS PD2, CLIENTES AS C2

WHERE PD2.Nro_C = C2.Nro_C AND

C2.Ciud_C = 'Rosario'

GROUP BY C2.Nro_C;

Ej 2.- Una oficina gubernamental desea construir un complejo habitacional, para lo cual elaboro la siguiente Base de Datos:

TRAMO (c_ciudadA, c_ciudadB, Distancia)

CIUDADES (c_ciudad, nombre, cant_escuelas, cant_fabricas)

Para decidir donde instalarlo, desea conocer los siguientes datos:

a) Las ciudades alcanzables desde la ciudad con mayor cantidad de fabricas, recorriendo no más de dos tramos, c/u de los cuales no puede tener mas de 10km de longitud.

SELECT CB.Nombre

FROM CIUDADES CA, TRAMO T, CIUDADES CB

WHERE CA.Cant_Fabricas = (

SELECT MAX(Cant_Fabricas)

FROM CIUDADES

)

AND T.Distancia <= 10

AND T.C_CiudadA = CA.C_Ciudad

AND CB.C_Ciudad = T.C_CiudadB

AND CB.C_Ciudad <> CA.C_Ciudad

UNION

SELECT CB.Nombre

FROM CIUDADES CA, TRAMO T1, TRAMO T2, CIUDADES CB

WHERE CA.Cant_Fabricas = (

SELECT MAX(Cant_Fabricas)

FROM CIUDADES

)

AND T1.Distancia <= 10

AND T2.Distancia <= 10

AND T1.C_CiudadA = CA.C_Ciudad

AND T1.C_CiudadB = T2.C_CiudadA

AND CB.C_Ciudad = T2.C_CiudadB

AND CB.C_Ciudad <> CA.C_Ciudad;

b) Las ciudades con mas de 10 fabricas que estén conectadas con todas las demás en forma directa, siempre que ningún tramo supere los 50km.

SELECT DISTINCT C_Ciudad, C.Nombre

FROM CIUDADES AS C, TRAMO AS T

WHERE C.Cant_Fabricas > 10 AND

C.C_Ciudad = T.C_CiudadA AND

T.Distancia < 50

GROUP BY C.C_CIUDAD, C.Nombre

HAVING COUNT(C.C_Ciudad) = (

SELECT COUNT (C1.C_CIUDAD) - 1

FROM CIUDADES C1

);

c) Los pares de ciudades, de la forma (ciudad1, ciudad2), que son alcanzables a través de, a lo sumo, otra ciudad, llámese a esta, ciudad3 (esto es, encontrar los caminos ciudad1-ciudad3-ciudad2).

SELECT CA.Nombre, CB.Nombre

FROM CIUDADES AS CA, TRAMO AS T1, TRAMO AS T2, CIUDADES AS CB

WHERE T1.C_CiudadA = CA.C_Ciudad

AND T1.C_CiudadB = T2.C_CiudadA

AND CB.C_Ciudad = T2.C_CiudadB

AND CB.C_Ciudad <> CA.C_Ciudad;

Ej 3.- Dada la BD:

FRECUENTA (nombre-pers, nombre-bar)

SIRVE (nombre-bar, nombre-cerveza)

GUSTA (nombre-pers, nombre-cerveza)

  • Encontrar las personas que frecuentan un bar que sirven una cerveza que les gusta.

  • SELECT DISTINCT F.Nombre_Pers

    FROM FRECUENTA AS F, SIRVE AS S, GUSTA AS G

    WHERE S.Nombre_Cerveza = G.Nombre_Cerveza

    AND F.Nombre_Bar = S.Nombre_Bar

    AND F.Nombre_Pers = G.Nombre_Pers;

  • Encontrar a las personas que beben en el mismo bar que las personas a las que les gusta la cerveza “Quilmes”

  • SELECT DISTINCT FAux.Nombre_Pers

    FROM FRECUENTA AS F, SIRVE AS S, GUSTA AS G, Frecuenta AS FAux

    WHERE G.Nombre_Cerveza = 'Quilmes'

    AND S.Nombre_Cerveza = G.Nombre_Cerveza

    AND F.Nombre_Bar = S.Nombre_Bar

    AND F.Nombre_Pers = G.Nombre_Pers

    AND FAux.Nombre_Pers <> F.Nombre_Pers

    AND FAux.Nombre_Bar = F.Nombre_Bar;

  • Encontrar las personas que beben en el mismo bar que aquellas a las que le gusta una marca de cerveza que sirva dicho bar y que le guste a Juan Pérez.

  • SELECT DISTINCT FAux.Nombre_Pers

    FROM FRECUENTA AS F, SIRVE AS S, GUSTA AS G, Frecuenta AS FAux

    WHERE G.Nombre_Cerveza IN (

    SELECT Nombre_Cerveza

    FROM GUSTA

    WHERE Nombre_Pers = 'Juan Perez'

    )

    AND S.Nombre_Cerveza = G.Nombre_Cerveza

    AND F.Nombre_Bar = S.Nombre_Bar

    AND F.Nombre_Pers = G.Nombre_Pers

    AND FAux.Nombre_Pers <> F.Nombre_Pers

    AND FAux.Nombre_Bar = F.Nombre_Bar;

  • Encontrar las personas que frecuentan solamente bares que sirven alguna cerveza que les gusta (asumir que cada persona frecuenta al menos un bar y le gusta al menos una cerveza)

  • SELECT DISTINCT G.Nombre_Pers

    FROM FRECUENTA AS F, SIRVE AS S, GUSTA AS G

    WHERE F.Nombre_Pers = G.Nombre_Pers AND

    F.Nombre_Bar = S.Nombre_Bar AND

    G.Nombre_Cerveza = S.Nombre_Cerveza

    GROUP BY G.Nombre_Pers

    HAVING COUNT(F.Nombre_Bar) = (SELECT COUNT(F1.Nombre_Bar) FROM FRECUENTA F1 WHERE G.Nombre_Pers = F1.Nombre_Pers );

  • Encontrar las personas que no frecuentan ningún bar que sirven cerveza que les gusta.

  • SELECT DISTINCT F.Nombre_Pers

    FROM FRECUENTA AS F

    WHERE NOT EXISTS(

    SELECT FAux.Nombre_Pers

    FROM FRECUENTA AS FAux, SIRVE AS S, GUSTA AS G

    WHERE S.Nombre_Cerveza = G.Nombre_Cerveza

    AND FAux.Nombre_Bar = S.Nombre_Bar

    AND FAux.Nombre_Pers = G.Nombre_Pers

    );

    Ej 4.- Sea la BD:

    PERSONAS (tipo_doc, num_doc, nomyap, dir, tel, fnac, sexo)

    PROGENITOR (tipo_doc, num_doc, tipo_doc_hijo, num_doc_hijo)

  • Listar para cada Juan Pérez los tipo y numero de documento, nombre y apellido y teléfono de todos sus hijos.

  • SELECT DISTINCT PH.*

    FROM PERSONAS AS PH, PERSONAS AS PP, PROGENITOR AS P

    WHERE PP.NomYAp = 'Juan Perez'

    AND P.Tipo_Doc = PP.Tipo_Doc

    AND P.Nro_Doc = PP.Num_Doc

    AND PH.Tipo_Doc = P.Tipo_Doc_Hijo

    AND PH.Num_Doc = P.Nro_Doc_Hijo;

  • Idem a, de:

  • todos sus hermanos (los hijos de su madre y/o su padre)

  • SELECT DISTINCT PH.*

    FROM PERSONAS AS PH, PERSONAS AS PP, PROGENITOR AS P1, PROGENITOR AS P2

    WHERE PP.NomYAp = 'Juan Perez'

    AND P1.Tipo_Doc_Hijo = PP.Tipo_Doc

    AND P1.Nro_Doc_HIjo = PP.Num_Doc

    AND P2.Tipo_Doc = P1.Tipo_Doc

    AND P2.Nro_Doc = P1.Nro_Doc

    AND PH.Tipo_Doc = P2.Tipo_Doc_Hijo

    AND PH.Num_Doc = P2.Nro_Doc_Hijo

    AND PH.NomYAp <> PP.NomYAp;

  • su madre

  • SELECT DISTINCT PM.*

    FROM PERSONAS AS PM, PERSONAS AS PP, PROGENITOR AS P

    WHERE PP.NomYAp = 'Juan Perez'

    AND P.Tipo_Doc_Hijo = PP.Tipo_Doc

    AND P.Nro_Doc_HIjo = PP.Num_Doc

    AND PM.Tipo_Doc = P.Tipo_Doc

    AND PM.Num_Doc = P.Nro_Doc

    AND PM.Sexo = 'F';

  • su abuelo materno

  • SELECT DISTINCT PA.*

    FROM PERSONAS AS PM, PERSONAS AS PP, PERSONAS AS PA, PROGENITOR AS P1, PROGENITOR AS P2

    WHERE PP.NomYAp = 'Juan Perez'

    AND P1.Tipo_Doc_Hijo = PP.Tipo_Doc

    AND P1.Nro_Doc_HIjo = PP.Num_Doc

    AND PM.Tipo_Doc = P1.Tipo_Doc

    AND PM.Num_Doc = P1.Nro_Doc

    AND PM.Sexo = 'F'

    AND P2.Tipo_Doc_Hijo = PM.Tipo_Doc

    AND P2.Nro_Doc_HIjo = PM.Num_Doc

    AND PA.Tipo_Doc = P2.Tipo_Doc

    AND PA.Num_Doc = P2.Nro_Doc

    AND PA.Sexo = 'M';

  • todos sus nietos

  • SELECT DISTINCT PN.*

    FROM PERSONAS AS PH, PERSONAS AS PP, PERSONAS AS PN, PROGENITOR AS P1, PROGENITOR AS P2

    WHERE PP.NomYAp = 'Juan Perez'

    AND P1.Tipo_Doc = PP.Tipo_Doc

    AND P1.Nro_Doc = PP.Num_Doc

    AND PH.Tipo_Doc = P1.Tipo_Doc_Hijo

    AND PH.Num_Doc = P1.Nro_Doc_Hijo

    AND P2.Tipo_Doc = PH.Tipo_Doc

    AND P2.Nro_Doc = PH.Num_Doc

    AND PN.Tipo_Doc = P2.Tipo_Doc_Hijo

    AND PN.Num_Doc = P2.Nro_Doc_Hijo;

    Diego Balseiro Bases de Datos

    Sebastián Bromberg

    Martín Mirad

    Página 9




    Descargar
    Enviado por:Diego Balseiro Y Otros
    Idioma: castellano
    País: Argentina

    Te va a interesar