Salta el contingut

Jardineria - Subconsultes

Amb operadors bàsics de comparació

  1. Retorna el nom del client amb el límit de crèdit major.

    Possible solució
    SELECT nombre_cliente, limite_credito
    FROM cliente
    WHERE limite_credito = (SELECT MAX(limite_credito)
                            FROM cliente);
    
  2. Retorna el nom del producte que té el preu de venda més car.

    Possible solució
    SELECT nombre, precio_venta
    FROM producto
    WHERE precio_venta = (SELECT MAX(precio_venta)
                          FROM producto);
    
  3. Els clients amb límit de crèdit major que els pagaments que hagi realitzat. (Sense utilitzar JOIN).

    Possible solució
    SELECT nombre_cliente, limite_credito
    FROM cliente c
    WHERE limite_credito > (SELECT SUM(total)
                            FROM pago p
                            WHERE p.codigo_cliente = c.codigo_cliente);  
    

    En aquest cas, a la subconsulta, fem referència a un camp de la consulta principal

  4. Retorna el producte que té més unitats en stock.

    Possible solució
    SELECT codigo_producto, nombre, CANTIDAD_EN_STOCK 
    FROM producto
    WHERE cantidad_en_stock = (SELECT MAX(cantidad_en_stock)
                               FROM producto); 
    
  5. Retorna el producte que té menys unitats en stock.

    Possible solució
    SELECT codigo_producto, nombre, CANTIDAD_EN_STOCK 
    FROM producto
    WHERE cantidad_en_stock = (SELECT MIN(cantidad_en_stock)
                               FROM producto); 
    
  6. Retorna el nom, els cognoms i l'email dels empleats que estan a càrrec de Alberto Soria.

    Possible solució
    SELECT nombre, apellido1, apellido2, email
    FROM empleado
    WHERE codigo_jefe = (SELECT codigo_empleado 
                         FROM empleado 
                         WHERE NOMBRE = 'Alberto' AND apellido1 = 'Soria');
    

    Subconsultes amb ALL i ANY

  7. Retorna el nom del producte del que s'han venut més unitats. (Tingues en compte que cal calcular el nombre total d'unitats venudes de cada producte a partir deles dades de la taula detalle_pedido)

    Possible solució
    SELECT codigo_producto, sum(cantidad), nombre
    FROM detalle_pedido JOIN producto USING (codigo_producto)
    GROUP BY codigo_producto, nombre
    HAVING SUM(cantidad) >= ALL (SELECT SUM(cantidad)
                                 FROM detalle_pedido
                                 GROUP BY codigo_producto);
    

    En MariaDB i MySQL no podem utilitzar MAX(SUM(cantidad))

    I al posar >= ALL equival a = MAX

  8. Retorna el nom del client amb més límit de crèdit.

    Possible solució
    Amb ALL
    SELECT nombre_cliente, limite_credito
    FROM cliente
    WHERE limite_credito >= ALL (SELECT limite_credito
                                 FROM cliente);
    

    o bé

    Amb = MAX
    SELECT nombre_cliente, limite_credito
    FROM cliente
    WHERE limite_credito =  (SELECT MAX(limite_credito)
                             FROM cliente);
    
  9. Retorna el nom del producte que té el preu de venta més car.

    Possible solució
    Amb ALL
    SELECT nombre, precio_venta
    FROM producto 
    WHERE precio_venta >= ALL (SELECT precio_venta
                               FROM producto);
    

    o bé

    Amb = MAX
    SELECT nombre, precio_venta
    FROM producto 
    WHERE precio_venta = ALL (SELECT MAX(precio_venta)
                              FROM producto);
    
  10. Retorna el producte que té menys unitats en stock.

    Possible solució
    Amb ALL
    SELECT nombre, cantidad_en_stock
    FROM producto 
    WHERE cantidad_en_stock <= ALL (SELECT cantidad_en_stock
                                    FROM producto);
    

    o bé

    Amb = MIN
    SELECT nombre, cantidad_en_stock
    FROM producto 
    WHERE cantidad_en_stock = (SELECT MIN(cantidad_en_stock)
                               FROM producto);
    

    Subconsultes con IN i NOT IN

  11. Retorna el nombre, apellido1 i cargo dels empleats que no representen a cap client.

    Possible solució
    SELECT nombre, apellido1, apellido2, puesto
    FROM empleado
    WHERE codigo_empleado NOT IN (SELECT codigo_empleado_rep_ventas
                                FROM cliente);
    
  12. Retorna una llista que mostri només els clients que no han realitzat cap pagament.

    Possible solució
    SELECT nombre_cliente
    FROM cliente
    WHERE codigo_cliente NOT IN (SELECT DISTINCT codigo_cliente
                                 FROM pago);
    
  13. Retorna una llista que mostri només els clients que sí han realitzat algún pagament.

    Possible solució
    SELECT nombre_cliente
    FROM cliente
    WHERE codigo_cliente IN (SELECT DISTINCT codigo_cliente
                             FROM pago);
    
  14. Retorna una llista dels productes que no han aparegut mai a cap comanda.

    Possible solució
    SELECT codigo_producto, nombre
    FROM producto
    WHERE codigo_producto NOT IN (SELECT DISTINCT codigo_producto
                                  FROM detalle_pedido);
    
  15. Retorna el nom, cognoms, lloc de treball i telèfon de l'oficina d'aquells empleats que no son representant de vendes de cap client.

    Possible solució
    SELECT nombre, apellido1, apellido2, puesto
    FROM empleado
    WHERE codigo_empleado NOT IN (SELECT DISTINCT codigo_empleado_rep_ventas
                                  FROM cliente);
    
  16. Retorna les oficinas on no treballa cap dels empleats que sigui representant de vendes d'algún client que hagi realitzat la compra de algún producte de la gama Frutales.

    Possible solució
    SELECT codigo_oficina, linea_direccion1, linea_direccion2, ciudad, telefono
    FROM oficina
    WHERE codigo_oficina NOT IN (SELECT DISTINCT codigo_oficina
                                 FROM empleado 
                                      JOIN cliente ON (codigo_empleado = codigo_empleado_rep_ventas)
                                      JOIN pedido USING (codigo_cliente) 
                                      JOIN detalle_pedido USING (codigo_pedido)
                                      JOIN producto USING (codigo_producto)
                                      JOIN gama_producto USING (gama)
                                 WHERE gama = 'Frutales'
                                );
    
  17. Retorna una llista amb els clients que han realitzat alguna comanda però no han realitzat cap pagament.

    Possible solució
    SELECT nombre_cliente
    FROM cliente
    WHERE codigo_cliente IN (SELECT DISTINCT codigo_cliente
                             FROM pedido)
          AND
          codigo_cliente NOT IN (SELECT DISTINCT codigo_cliente
                                 FROM pago);
    

    Subconsultes amb EXISTS i NOT EXISTS

  18. Retorna una llista que mostri només els clients que no han realitzat cap pagament.

    Possible solució
    SELECT nombre_cliente
    FROM cliente c
    WHERE NOT EXISTS (SELECT *
                      FROM pedido p
                      WHERE p.codigo_cliente = c.codigo_cliente);
    
  19. Retorna una llista que mostri només els clients que sí han realitzat algún pagament.

    Possible solució
    SELECT nombre_cliente
    FROM cliente c
    WHERE EXISTS (SELECT *
                  FROM pedido p
                  WHERE p.codigo_cliente = c.codigo_cliente);
    
  20. etorna una llista dels productes que mai han aparegut en una comanda.

    Possible solució
    SELECT codigo_producto, nombre, gama
    FROM producto p
    WHERE NOT EXISTS (SELECT *
                      FROM detalle_pedido dp
                      WHERE p.codigo_producto = dp.codigo_producto);
    
  21. Retorna una llista dels productes que han aparegut en alguna comanda, alguna vegada.

    Possible solució
    SELECT codigo_producto, nombre, gama
    FROM producto p
    WHERE EXISTS (SELECT *
                  FROM detalle_pedido dp
                  WHERE p.codigo_producto = dp.codigo_producto);