Ejercicios - Jardinería

DER Jardinería

Archivo de script para la creación de la Base de Datos Jardineria

Consultas sobre una tabla

  1. Devuelve un listado con el código de oficina y la ciudad donde hay oficinas.
     SELECT codigo_oficina, ciudad
     FROM oficina
    
  2. Devuelve un listado con la ciudad y el teléfono de las oficinas de España.
     SELECT ciudad, telefono
     FROM oficina
     WHERE pais = 'España'
    
  3. Devuelve un listado con el nombre, apellidos y email de los empleados cuyo jefe tiene un código de jefe igual a 7.
     SELECT nombre, apellido1, apellido2, email
     FROM empleado e
     WHERE e.codigo_jefe = 7
    
  4. Devuelve el nombre del puesto, nombre, apellidos y email del jefe de la empresa.
     SELECT puesto, nombre, apellido1, apellido2, email
     FROM empleado e
     WHERE e.codigo_jefe IS NULL
    
  5. Devuelve un listado con el nombre, apellidos y puesto de aquellos empleados que no sean representantes de ventas.
     SELECT nombre, apellido1, apellido2, puesto
     FROM empleado e
     WHERE e.puesto <> 'Representante Ventas'
    
  6. Devuelve un listado con el nombre de los todos los clientes españoles.
     SELECT c.nombre_cliente
     FROM cliente c
     WHERE c.pais = 'Spain'
    
  7. Devuelve un listado con los distintos estados por los que puede pasar un pedido.
     SELECT DISTINCT p.estado
     FROM pedido p
    
  8. Devuelve un listado con el código de cliente de aquellos clientes que realizaron algún pago en 2008. Tenga en cuenta que deberá eliminar aquellos códigos de cliente que aparezcan repetidos. Resuelva la consulta:
    • Utilizando la función YEAR de MySQL.
    • Utilizando la función DATE_FORMAT de MySQL.
    • Sin utilizar ninguna de las funciones anteriores. ```sql /* Utilizando la función YEAR */ SELECT DISTINCT p.codigo_cliente FROM pago p WHERE YEAR(p.fecha_pago) = 2008

    /* Utilizando la función DATE_FORMAT */ SELECT DISTINCT p.codigo_cliente FROM pago p WHERE DATE_FORMAT(p.fecha_pago, ‘%Y’) = 2008

    /* Sin utilizar ninguna de las funciones */ SELECT DISTINCT p.codigo_cliente FROM pago p WHERE p.fecha_pago BETWEEN ‘2008-01-01’ AND ‘2008-12-31’ ```

  9. Devuelve un listado con el código de pedido, código de cliente, fecha esperada y fecha de entrega de los pedidos que no han sido entregados a tiempo.
     SELECT p.codigo_pedido, p.codigo_cliente, p.fecha_esperada, p.fecha_entrega
     FROM pedido p
     WHERE p.fecha_entrega > p.fecha_esperada
    
  10. Devuelve un listado con el código de pedido, código de cliente, fecha esperada y fecha de entrega de los pedidos cuya fecha de entrega ha sido al menos dos días antes de la fecha esperada.
    • Utilizando la función ADDDATE de MySQL.
    • Utilizando la función DATEDIFF de MySQL.
    • ¿Sería posible resolver esta consulta utilizando el operador de suma + o resta -?
    /*
    Utilizando la función ADDDATE()
    */
    SELECT p.codigo_pedido, p.codigo_cliente, p.fecha_esperada, p.fecha_entrega
    FROM pedido p
    WHERE ADDDATE(p.fecha_entrega, 2) <= p.fecha_esperada
    /*
    Utilizando la función DATEDIFF()
    */
    SELECT p.codigo_pedido, p.codigo_cliente, p.fecha_esperada, p.fecha_entrega
    FROM pedido p
    WHERE DATEDIFF(p.fecha_esperada, p.fecha_entrega) >= 2
    /*
    Utilizando operador de suma (+)
    */
    SELECT p.codigo_pedido, p.codigo_cliente, p.fecha_esperada, p.fecha_entrega
    FROM pedido p
    WHERE p.fecha_entrega + 2 <= p.fecha_esperada
    
  11. Devuelve un listado de todos los pedidos que fueron rechazados en 2009.
    SELECT *
    FROM pedido p
    WHERE p.estado = 'Rechazado' AND YEAR(p.fecha_pedido) = 2009
    
  12. Devuelve un listado de todos los pedidos que han sido entregados en el mes de enero de cualquier año.
    SELECT *
    FROM pedido p 
    WHERE MONTH(p.fecha_entrega) = 01
    
  13. Devuelve un listado con todos los pagos que se realizaron en el año 2008 mediante Paypal. Ordene el resultado de mayor a menor.
    SELECT *
    FROM pago p
    WHERE YEAR(p.fecha_pago) = 2008 AND p.forma_pago = 'Paypal'
    
  14. Devuelve un listado con todas las formas de pago que aparecen en la tabla pago. Tenga en cuenta que no deben aparecer formas de pago repetidas.
    SELECT DISTINCT p.forma_pago
    FROM pago p
    
  15. Devuelve un listado con todos los productos que pertenecen a la gama Ornamentales y que tienen más de 100 unidades en stock. El listado deberá estar ordenado por su precio de venta, mostrando en primer lugar los de mayor precio.
    SELECT *
    FROM producto p
    WHERE p.gama = 'Ornamentales' AND p.cantidad_en_stock > 100
    ORDER BY p.precio_venta DESC
    
  16. Devuelve un listado con todos los clientes que sean de la ciudad de Madrid y cuyo representante de ventas tenga el código de empleado 11 o 30.
    SELECT *
    FROM cliente c
    WHERE c.ciudad = 'Madrid' AND c.codigo_empleado_rep_ventas IN (11, 30)
    

Consultas multitabla (Composición interna)

  1. Obtén un listado con el nombre de cada cliente y el nombre y apellido de su representante de ventas.
     SELECT c.nombre_cliente, e.nombre, e.apellido1, e.apellido2
     FROM cliente c INNER JOIN empleado e ON e.codigo_empleado = c.codigo_empleado_rep_ventas
    
  2. Muestra el nombre de los clientes que hayan realizado pagos junto con el nombre de sus representantes de ventas.
     SELECT c.nombre_cliente, e.nombre, e.apellido1, e.apellido2
     FROM cliente c INNER JOIN pago p ON c.codigo_cliente = p.codigo_cliente
                    INNER JOIN empleado e ON c.codigo_empleado_rep_ventas = e.codigo_empleado
    
  3. Muestra el nombre de los clientes que no hayan realizado pagos junto con el nombre de sus representantes de ventas.
     SELECT c.nombre_cliente, e.nombre, e.apellido1, e.apellido2
     FROM cliente c LEFT JOIN pago p ON c.codigo_cliente = p.codigo_cliente
                    INNER JOIN empleado e ON c.codigo_empleado_rep_ventas = e.codigo_empleado
     WHERE p.codigo_cliente IS NULL
    
  4. Devuelve el nombre de los clientes que han hecho pagos y el nombre de sus representantes junto con la ciudad de la oficina a la que pertenece el representante.
     SELECT c.nombre_cliente, e.nombre, e.apellido1, e.apellido2, o.ciudad
     FROM cliente c INNER JOIN pago p ON c.codigo_cliente = p.codigo_cliente
                    INNER JOIN empleado e ON c.codigo_empleado_rep_ventas = e.codigo_empleado
                    INNER JOIN oficina o ON e.codigo_oficina = o.codigo_oficina
    
  5. Devuelve el nombre de los clientes que no hayan hecho pagos y el nombre de sus representantes junto con la ciudad de la oficina a la que pertenece el representante.
     SELECT c.codigo_cliente, c.nombre_cliente, e.nombre, e.apellido1, e.apellido2, o.ciudad
     FROM cliente c LEFT JOIN pago p ON c.codigo_cliente = p.codigo_cliente
                    INNER JOIN empleado e ON c.codigo_empleado_rep_ventas = e.codigo_empleado
                    INNER JOIN oficina o ON e.codigo_oficina = o.codigo_oficina
     WHERE p.codigo_cliente IS NULL
    
  6. Lista la dirección de las oficinas que tengan clientes en Fuenlabrada.
     SELECT DISTINCT o.linea_direccion1, o.linea_direccion2
     FROM cliente c INNER JOIN pago p ON c.codigo_cliente = p.codigo_cliente
                    INNER JOIN empleado e ON c.codigo_empleado_rep_ventas = e.codigo_empleado
                    INNER JOIN oficina o ON e.codigo_oficina = o.codigo_oficina
     WHERE c.ciudad = 'Fuenlabrada'
    
  7. Devuelve el nombre de los clientes y el nombre de sus representantes junto con la ciudad de la oficina a la que pertenece el representante.
     SELECT c.nombre_cliente, CONCAT(e.nombre, ' ', e.apellido1, ' ', e.apellido2) AS 'Representante', o.ciudad
     FROM cliente c INNER JOIN empleado e ON e.codigo_empleado = c.codigo_empleado_rep_ventas
                    INNER JOIN oficina o ON o.codigo_oficina = e.codigo_oficina
    
  8. Devuelve un listado con el nombre de los empleados junto con el nombre de sus jefes.
     SELECT CONCAT(e.nombre, ' ', e.apellido1, ' ', e.apellido2) AS 'Empleado', CONCAT(j.nombre, ' ', j.apellido1, ' ', j.apellido2) AS 'Jefe'
     FROM empleado e INNER JOIN empleado j ON e.codigo_jefe = j.codigo_empleado
    
  9. Devuelve un listado que muestre el nombre de cada empleados, el nombre de su jefe y el nombre del jefe de sus jefe.
     SELECT CONCAT(e.nombre, ' ', e.apellido1, ' ', e.apellido2) AS 'Empleado',
            CONCAT(j.nombre, ' ', j.apellido1, ' ', j.apellido2) AS 'Jefe',
            CONCAT(m.nombre, ' ', m.apellido1, ' ', m.apellido2) AS 'Jefe del Jefe'
     FROM empleado e INNER JOIN empleado j ON e.codigo_jefe = j.codigo_empleado
                     INNER JOIN empleado m ON j.codigo_jefe = m.codigo_empleado
    
  10. Devuelve el nombre de los clientes a los que no se les ha entregado a tiempo un pedido.
    SELECT *
    FROM cliente c INNER JOIN pedido p ON c.codigo_cliente = p.codigo_cliente
    WHERE p.fecha_entrega > p.fecha_esperada
    
  11. Devuelve un listado de las diferentes gamas de producto que ha comprado cada cliente.
    SELECT DISTINCT c.nombre_cliente, pr.gama
    FROM cliente c INNER JOIN pedido pe ON c.codigo_cliente = pe.codigo_cliente
                   INNER JOIN detalle_pedido dp ON dp.codigo_pedido = pe.codigo_pedido
                   INNER JOIN producto pr ON pr.codigo_producto = dp.codigo_producto
    

Consultas multitabla (Composición externa)

  1. Devuelve un listado que muestre solamente los clientes que no han realizado ningún pago.
     SELECT c.nombre_cliente
     FROM cliente c LEFT JOIN pago p ON c.codigo_cliente = p.codigo_cliente
     WHERE p.codigo_cliente IS NULL
    
  2. Devuelve un listado que muestre solamente los clientes que no han realizado ningún pedido.
     SELECT c.nombre_cliente
     FROM cliente c LEFT JOIN pedido p ON c.codigo_cliente = p.codigo_cliente
     WHERE p.codigo_cliente IS NULL
    
  3. Devuelve un listado que muestre los clientes que no han realizado ningún pago y los que no han realizado ningún pedido.
     SELECT c.nombre_cliente
     FROM pedido pe RIGHT JOIN cliente c ON c.codigo_cliente = pe.codigo_cliente
                    LEFT JOIN pago pa ON c.codigo_cliente = pa.codigo_cliente
     WHERE pe.codigo_cliente IS NULL AND pa.codigo_cliente IS NULL
    
  4. Devuelve un listado que muestre solamente los empleados que no tienen una oficina asociada.
     SELECT CONCAT(e.nombre, ' ', e.apellido1, ' ', e.apellido2) AS 'Empleado'
     FROM empleado e LEFT JOIN oficina o ON e.codigo_oficina = o.codigo_oficina
     WHERE e.codigo_oficina IS NULL
    
  5. Devuelve un listado que muestre solamente los empleados que no tienen un cliente asociado.
     SELECT CONCAT(e.nombre, ' ', e.apellido1, ' ', e.apellido2) AS 'Empleado'
     FROM empleado e LEFT JOIN cliente c ON e.codigo_empleado = c.codigo_empleado_rep_ventas
     WHERE c.codigo_empleado_rep_ventas IS NULL
    
  6. Devuelve un listado que muestre solamente los empleados que no tienen un cliente asociado junto con los datos de la oficina donde trabajan.
     SELECT DISTINCT CONCAT(e.nombre, ' ', e.apellido1, ' ', e.apellido2) AS 'Empleado', o.linea_direccion1, o.linea_direccion2, o.ciudad, o.region, o.pais
     FROM empleado e LEFT JOIN cliente c ON e.codigo_empleado = c.codigo_empleado_rep_ventas
                     INNER JOIN oficina o ON e.codigo_oficina = o.codigo_oficina
     WHERE c.codigo_empleado_rep_ventas IS NULL 
    
  7. Devuelve un listado que muestre los empleados que no tienen una oficina asociada y los que no tienen un cliente asociado.
     SELECT DISTINCT CONCAT(e.nombre, ' ', e.apellido1, ' ', e.apellido2) AS 'Empleado'
     FROM (empleado e LEFT JOIN cliente c ON e.codigo_empleado = c.codigo_empleado_rep_ventas)
                      LEFT JOIN oficina o ON e.codigo_oficina = o.codigo_oficina
     WHERE e.codigo_oficina IS NULL OR c.codigo_empleado_rep_ventas IS NULL
    
  8. Devuelve un listado de los productos que nunca han aparecido en un pedido.
     SELECT p.nombre
     FROM producto p LEFT JOIN detalle_pedido dp ON p.codigo_producto = dp.codigo_producto
                     LEFT JOIN pedido pe ON dp.codigo_pedido = pe.codigo_pedido
     WHERE dp.codigo_producto IS NULL
    
  9. Devuelve un listado de los productos que nunca han aparecido en un pedido. El resultado debe mostrar el nombre, la descripción y la imagen del producto.
     SELECT p.nombre, p.descripcion, pe.comentarios
     FROM producto p LEFT JOIN detalle_pedido dp ON p.codigo_producto = dp.codigo_producto
                     LEFT JOIN pedido pe ON dp.codigo_pedido = pe.codigo_pedido
     WHERE dp.codigo_producto IS NULL
    
  10. Devuelve las oficinas donde no trabajan ninguno de los empleados que hayan sido los representantes de ventas de algún cliente que haya realizado la compra de algún producto de la gama Frutales.
    SELECT *
    FROM oficina o 
    WHERE o.codigo_oficina NOT IN (SELECT DISTINCT ofi.codigo_oficina
                                   FROM oficina ofi INNER JOIN empleado emp USING(codigo_oficina)
                                                    INNER JOIN cliente cli ON cli.codigo_empleado_rep_ventas = emp.codigo_empleado
                                                    INNER JOIN pedido pe USING(codigo_cliente)
                                                    INNER JOIN detalle_pedido dp USING(codigo_pedido)
                                                    INNER JOIN producto prod USING(codigo_producto)
                                   WHERE prod.gama = 'Frutales')
    
  11. Devuelve un listado con los clientes que han realizado algún pedido pero no han realizado ningún pago.
    SELECT DISTINCT c.codigo_cliente, c.nombre_cliente, c.nombre_contacto, c.apellido_contacto, c.telefono
    FROM (cliente c INNER JOIN pedido pe USING(codigo_cliente)) 
                    LEFT JOIN pago pa ON c.codigo_cliente = pa.codigo_cliente
    WHERE pa.codigo_cliente IS NULL
    
  12. Devuelve un listado con los datos de los empleados que no tienen clientes asociados y el nombre de su jefe asociado.
    SELECT CONCAT(e.nombre, ' ', e.apellido1, ' ', e.apellido2) AS 'Empleado', e.Email, e.Puesto, 
           CONCAT(j.nombre, ' ', j.apellido1, ' ', j.apellido2) AS 'Jefe'
    FROM empleado e LEFT JOIN cliente c ON e.codigo_empleado = c.codigo_empleado_rep_ventas
                    INNER JOIN empleado j ON e.codigo_jefe = j.codigo_empleado
    WHERE c.codigo_empleado_rep_ventas IS NULL 
    

Consultas resúmen

  1. ¿Cuántos empleados hay en la compañía?
     SELECT COUNT(e.codigo_empleado) as 'Cantidad de empleados'
     FROM empleado e
    
  2. ¿Cuántos clientes tiene cada país?
     SELECT c.pais, COUNT(c.pais) 
     FROM cliente c
     GROUP BY c.pais
    
  3. ¿Cuál fue el pago medio en 2009?
     SELECT AVG(p.total) AS 'Promedio de pago en 2009'
     FROM pago p
     WHERE YEAR(p.fecha_pago) = 2009
    
  4. ¿Cuántos pedidos hay en cada estado? Ordena el resultado de forma descendente por el número de pedidos.
     SELECT p.estado, COUNT(p.estado)
     FROM pedido p
     GROUP BY p.estado
    
  5. Calcula el precio de venta del producto más caro y más barato en una misma consulta.
     SELECT MIN(p.precio_venta) AS 'Producto mas barato', MAX(p.precio_venta) AS 'Producto mas caro'
     FROM producto p
    
  6. Calcula el número de clientes que tiene la empresa.
     SELECT COUNT(c.nombre_cliente)
     FROM cliente c
    
  7. ¿Cuántos clientes existen con domicilio en la ciudad de Madrid?
     SELECT COUNT(c.codigo_cliente) AS 'Clientes de Madrid'
     FROM cliente c
     WHERE c.ciudad = 'Madrid'
    
  8. ¿Calcula cuántos clientes tiene cada una de las ciudades que empiezan por M?
     SELECT COUNT(c.codigo_cliente)
     FROM cliente c
     WHERE ciudad LIKE 'M%'
    
  9. Devuelve el nombre de los representantes de ventas y el número de clientes al que atiende cada uno.
     SELECT c.codigo_empleado_rep_ventas AS 'Id Empleado', COUNT(c.codigo_empleado_rep_ventas) AS 'Cantidad de Clientes'
     FROM cliente c 
     GROUP BY c.codigo_empleado_rep_ventas
    
  10. Calcula el número de clientes que no tiene asignado representante de ventas.
    SELECT COUNT(c.codigo_cliente) AS 'Clientes sin Rep. Ventas'
    FROM cliente c INNER JOIN empleado e ON e.codigo_empleado = c.codigo_empleado_rep_ventas
    WHERE c.codigo_empleado_rep_ventas IS NULL
    
  11. Calcula la fecha del primer y último pago realizado por cada uno de los clientes. El listado deberá mostrar el nombre y los apellidos de cada cliente.
    SELECT c.nombre_contacto, c.apellido_contacto, MIN(p.fecha_pago) AS 'Primer pago', MAX(p.fecha_pago) AS 'Último pago'
    FROM pago p INNER JOIN cliente c ON p.codigo_cliente = c.codigo_cliente
    GROUP BY c.codigo_cliente
    
  12. Calcula el número de productos diferentes que hay en cada uno de los pedidos.
    SELECT pe.codigo_pedido, COUNT(DISTINCT pr.codigo_producto) AS 'Cantidad de productos distintos'
    FROM (producto pr INNER JOIN detalle_pedido dp ON pr.codigo_producto = dp.codigo_producto)
                      INNER JOIN pedido pe ON dp.codigo_pedido = pe.codigo_pedido
    GROUP BY pe.codigo_pedido
    
  13. Calcula la suma de la cantidad total de todos los productos que aparecen en cada uno de los pedidos.
    SELECT pe.codigo_pedido, SUM(pr.precio_venta) AS 'Suma de total de productos'
    FROM (producto pr INNER JOIN detalle_pedido dp ON pr.codigo_producto = dp.codigo_producto)
                      INNER JOIN pedido pe ON dp.codigo_pedido = pe.codigo_pedido
    GROUP BY pe.codigo_pedido
    
  14. Devuelve un listado de los 20 productos más vendidos y el número total de unidades que se han vendido de cada uno. El listado deberá estar ordenado por el número total de unidades vendidas.
    SELECT dp.codigo_producto, p.nombre, COUNT(dp.cantidad) AS Unidades
    FROM producto p INNER JOIN detalle_pedido dp ON p.codigo_producto = dp.codigo_producto
    GROUP BY dp.codigo_producto
    ORDER BY Unidades DESC
    LIMIT 20
    
  15. La facturación que ha tenido la empresa en toda la historia, indicando la base imponible, el IVA y el total facturado. La base imponible se calcula sumando el coste del producto por el número de unidades vendidas de la tabla detalle_pedido. El IVA es el 21 % de la base imponible, y el total la suma de los dos campos anteriores.
    SELECT SUM(dp.precio_unidad * dp.cantidad) AS 'Base Imponible', 
           SUM((dp.precio_unidad * dp.cantidad) * 0.21) AS 'IVA', 
           SUM(dp.precio_unidad * dp.cantidad + ((dp.precio_unidad * dp.cantidad) * 0.21)) AS 'Total'
    FROM ((((producto pr INNER JOIN detalle_pedido dp ON pr.codigo_producto = dp.codigo_producto)
                         INNER JOIN pedido pe ON dp.codigo_pedido = pe.codigo_pedido)
                         INNER JOIN cliente c ON c.codigo_cliente = pe.codigo_cliente)
                         INNER JOIN pago pa ON pa.codigo_cliente = c.codigo_cliente)
    
  16. La misma información que en la pregunta anterior, pero agrupada por código de producto.
    SELECT pr.codigo_producto, 
           SUM(dp.precio_unidad * dp.cantidad) AS 'Base Imponible', 
           SUM((dp.precio_unidad * dp.cantidad) * 0.21) AS 'IVA', 
           SUM(dp.precio_unidad * dp.cantidad + ((dp.precio_unidad * dp.cantidad) * 0.21)) AS 'Total'
    FROM ((((producto pr INNER JOIN detalle_pedido dp ON pr.codigo_producto = dp.codigo_producto)
                         INNER JOIN pedido pe ON dp.codigo_pedido = pe.codigo_pedido)
                         INNER JOIN cliente c ON c.codigo_cliente = pe.codigo_cliente)
                         INNER JOIN pago pa ON pa.codigo_cliente = c.codigo_cliente)
    GROUP BY pr.codigo_producto
    
  17. La misma información que en la pregunta anterior, pero agrupada por código de producto filtrada por los códigos que empiecen por OR.
    SELECT pr.codigo_producto, 
           SUM(dp.precio_unidad * dp.cantidad) AS 'Base Imponible', 
           SUM((dp.precio_unidad * dp.cantidad) * 0.21) AS 'IVA', 
           SUM(dp.precio_unidad * dp.cantidad + ((dp.precio_unidad * dp.cantidad) * 0.21)) AS 'Total'
    FROM ((((producto pr INNER JOIN detalle_pedido dp ON pr.codigo_producto = dp.codigo_producto)
                         INNER JOIN pedido pe ON dp.codigo_pedido = pe.codigo_pedido)
                         INNER JOIN cliente c ON c.codigo_cliente = pe.codigo_cliente)
                         INNER JOIN pago pa ON pa.codigo_cliente = c.codigo_cliente)
    GROUP BY pr.codigo_producto
    HAVING pr.codigo_producto LIKE 'OR%'
    
  18. Lista las ventas totales de los productos que hayan facturado más de 3000 euros. Se mostrará el nombre, unidades vendidas, total facturado y total facturado con impuestos (21% IVA).
    SELECT pr.codigo_producto, 
           dp.cantidad AS 'Unidades Vendidas',
           SUM(dp.precio_unidad * dp.cantidad) AS 'Total',
           SUM(dp.precio_unidad * dp.cantidad + ((dp.precio_unidad * dp.cantidad) * 0.21)) AS 'Total con impuestos'
    FROM ((((producto pr INNER JOIN detalle_pedido dp ON pr.codigo_producto = dp.codigo_producto)
                         INNER JOIN pedido pe ON dp.codigo_pedido = pe.codigo_pedido)
                         INNER JOIN cliente c ON c.codigo_cliente = pe.codigo_cliente)
                         INNER JOIN pago pa ON pa.codigo_cliente = c.codigo_cliente)
    GROUP BY pr.codigo_producto
    HAVING Total > 3000
    
  19. Muestre la suma total de todos los pagos que se realizaron para cada uno de los años que aparecen en la tabla pagos.
    SELECT YEAR(p.fecha_pago) AS 'Año', SUM(p.total) AS 'Total'
    FROM pago p
    GROUP BY Año
    ORDER BY Año ASC
    

Subconsultas

Con operadores básicos de comparación

  1. Devuelve el nombre del cliente con mayor límite de crédito.
     SELECT c.nombre_cliente
     FROM cliente c
     WHERE c.limite_credito = (SELECT MAX(c.limite_credito)           
                               FROM cliente c)
    
  2. Devuelve el nombre del producto que tenga el precio de venta más caro.
     SELECT p.nombre
     FROM producto p
     WHERE p.precio_venta = (SELECT MAX(p.precio_venta) 
                             FROM producto p)
    
  3. Devuelve el nombre del producto del que se han vendido más unidades. (Tenga en cuenta que tendrá que calcular cuál es el número total de unidades que se han vendido de cada producto a partir de los datos de la tabla detalle_pedido)
     SELECT p.nombre
     FROM producto p INNER JOIN detalle_pedido dp ON p.codigo_producto = dp.codigo_producto
     WHERE dp.cantidad = (SELECT MAX(dp.cantidad)
                          FROM detalle_pedido dp)
    
  4. Los clientes cuyo límite de crédito sea mayor que los pagos que haya realizado. (Sin utilizar INNER JOIN).
     SELECT c.Nombre_cliente, c.Limite_credito, p.Total
     FROM cliente c, pago p 
     WHERE p.total = (SELECT MAX(p2.total)
                      FROM pago p2
                      WHERE c.limite_credito > p2.total)
    
  5. Devuelve el producto que más unidades tiene en stock.
     SELECT p.nombre
     FROM producto p
     WHERE p.cantidad_en_stock = (SELECT MAX(p.cantidad_en_stock) 
                                  FROM producto p)
    
  6. Devuelve el producto que menos unidades tiene en stock.
     SELECT p.nombre
     FROM producto p
     WHERE p.cantidad_en_stock = (SELECT MIN(p.cantidad_en_stock) 
                                  FROM producto p)
    
  7. Devuelve el nombre, los apellidos y el email de los empleados que están a cargo de Alberto Soria.
     SELECT CONCAT(e.nombre, ' ', e.apellido1, ' ', e.apellido2) AS 'Empleados a cargo de Alberto Soria'
     FROM empleado e
     WHERE e.codigo_jefe = (SELECT e.codigo_empleado 
                            FROM empleado e
                            WHERE e.nombre = 'Alberto' AND e.apellido1 = 'Soria')
    

Subconsultas con ALL y ANY

  1. Devuelve el nombre del cliente con mayor límite de crédito.
     SELECT c.nombre_cliente
     FROM cliente c
     WHERE c.limite_credito >= ALL(SELECT MAX(c.limite_credito) 
                                   FROM cliente c)
    
  2. Devuelve el nombre del producto que tenga el precio de venta más caro.
     SELECT p.nombre
     FROM producto p
     WHERE p.precio_venta >= ALL(SELECT MAX(p.precio_venta)
                                 FROM producto p)
    
  3. Devuelve el producto que menos unidades tiene en stock.
     SELECT p.nombre
     FROM producto p
     WHERE p.cantidad_en_stock <= ALL(SELECT MIN(p.cantidad_en_stock)
                                      FROM producto p)
    

Subconsultas con IN y NOT IN

  1. Devuelve el nombre, apellido1 y cargo de los empleados que no representen a ningún cliente.
     SELECT e.nombre, e.apellido1, e.apellido2
     FROM empleado e
     WHERE e.codigo_empleado NOT IN (SELECT c.codigo_empleado_rep_ventas
                                     FROM cliente c)
    
  2. Devuelve un listado que muestre solamente los clientes que no han realizado ningún pago.
     SELECT c.nombre_cliente
     FROM cliente c
     WHERE c.codigo_cliente NOT IN (SELECT p.codigo_cliente 
                                    FROM pago p)
    
  3. Devuelve un listado que muestre solamente los clientes que sí han realizado algún pago.
     SELECT c.nombre_cliente
     FROM cliente c 
     WHERE c.codigo_cliente IN (SELECT p.codigo_cliente 
                                FROM pago p)
    
  4. Devuelve un listado de los productos que nunca han aparecido en un pedido.
     SELECT p.nombre
     FROM producto p
     WHERE p.codigo_producto NOT IN (SELECT dp.codigo_producto 
                                     FROM detalle_pedido dp)
    
  5. Devuelve el nombre, apellidos, puesto y teléfono de la oficina de aquellos empleados que no sean representante de ventas de ningún cliente.
     SELECT e.nombre, e.apellido1, e.apellido2, e.puesto, o.telefono
     FROM empleado e INNER JOIN oficina o ON e.codigo_oficina = o.codigo_oficina
     WHERE e.codigo_empleado NOT IN (SELECT c.codigo_empleado_rep_ventas 
                                     FROM cliente c)
    
  6. Devuelve las oficinas donde no trabajan ninguno de los empleados que hayan sido los representantes de ventas de algún cliente que haya realizado la compra de algún producto de la gama Frutales.
     SELECT o.codigo_oficina, o.ciudad, o.region, o.pais, o.codigo_postal, o.telefono, o.linea_direccion1, o.linea_direccion2
     FROM oficina o
     WHERE o.codigo_oficina NOT IN 
             (SELECT DISTINCT o.codigo_oficina 
              FROM oficina o INNER JOIN empleado e USING(codigo_oficina)
                             INNER JOIN cliente c ON c.codigo_empleado_rep_ventas = e.codigo_empleado
                             INNER JOIN pedido pe USING(codigo_cliente)
                             INNER JOIN detalle_pedido dp USING(codigo_pedido)
                             INNER JOIN producto pr USING(codigo_producto)
              WHERE pr.gama = 'Frutales')
    
  7. Devuelve un listado con los clientes que han realizado algún pedido pero no han realizado ningún pago.
     SELECT c.nombre_cliente
     FROM cliente c 
     WHERE c.codigo_cliente IN (SELECT p.codigo_cliente 
                                FROM pedido p)  AND 
           c.codigo_cliente NOT IN (SELECT p.codigo_cliente
                                    FROM pago p)
    

Subconsultas con EXISTS y NOT EXISTS

  1. Devuelve un listado que muestre solamente los clientes que no han realizado ningún pago.
     SELECT *
     FROM cliente c
     WHERE NOT EXISTS (SELECT *
                       FROM pago p
                       WHERE c.codigo_cliente = p.codigo_cliente)
    
  2. Devuelve un listado que muestre solamente los clientes que sí han realizado algún pago.
     SELECT 
     FROM cliente c
     WHERE EXISTS (SELECT *
                   FROM pago p
                   WHERE c.codigo_cliente = p.codigo_cliente)
    
  3. Devuelve un listado de los productos que nunca han aparecido en un pedido.
     SELECT * 
     FROM cliente c
     WHERE NOT EXISTS (SELECT * 
                       FROM pedido p
                       WHERE p.codigo_cliente = c.codigo_cliente)
    
  4. Devuelve un listado de los productos que han aparecido en un pedido alguna vez.
     SELECT * 
     FROM cliente c
     WHERE EXISTS (SELECT * 
                   FROM pedido p
                   WHERE p.codigo_cliente = c.codigo_cliente)
    

Consultas variadas

  1. Devuelve el listado de clientes indicando el nombre del cliente y cuántos pedidos ha realizado. Tenga en cuenta que pueden existir clientes que no han realizado ningún pedido.
     SELECT c.nombre_cliente, COUNT(p.codigo_cliente) AS 'Cantidad de pedidos realizados'
     FROM cliente c LEFT JOIN pedido p ON c.codigo_cliente = p.codigo_cliente
     GROUP BY c.nombre_cliente
    
  2. Devuelve un listado con los nombres de los clientes y el total pagado por cada uno de ellos. Tenga en cuenta que pueden existir clientes que no han realizado ningún pago.
     SELECT c.nombre_cliente, IFNULL(SUM(p.total), 0) AS 'Total pagado'
     FROM cliente c LEFT JOIN pago p ON c.codigo_cliente = p.codigo_cliente
     GROUP BY c.nombre_cliente
    
  3. Devuelve el nombre de los clientes que hayan hecho pedidos en 2008 ordenados alfabéticamente de menor a mayor.
     SELECT DISTINCT c.nombre_cliente
     FROM cliente c INNER JOIN pedido p USING(codigo_cliente)
     WHERE YEAR(p.fecha_pedido) = 2008
     ORDER BY c.nombre_cliente ASC
    
  4. Devuelve el nombre del cliente, el nombre y primer apellido de su representante de ventas y el número de teléfono de la oficina del representante de ventas, de aquellos clientes que no hayan realizado ningún pago.
     SELECT DISTINCT c.codigo_cliente, c.nombre_cliente, e.nombre, e.apellido1, e.apellido2, o.telefono
     FROM (((cliente c LEFT JOIN empleado e ON c.codigo_empleado_rep_ventas = e.codigo_empleado)
                       INNER JOIN oficina o ON e.codigo_oficina = o.codigo_oficina)
                       LEFT JOIN pago pa ON pa.codigo_cliente = c.codigo_cliente)
     WHERE c.codigo_cliente NOT IN (SELECT DISTINCT pa.codigo_cliente 
                                    FROM pago pa)
    
  5. Devuelve el listado de clientes donde aparezca el nombre del cliente, el nombre y primer apellido de su representante de ventas y la ciudad donde está su oficina.
     SELECT c.nombre_cliente, e.nombre, e.apellido1, o.ciudad
     FROM cliente c INNER JOIN empleado e ON c.codigo_empleado_rep_ventas = e.codigo_empleado
                    INNER JOIN oficina o ON o.codigo_oficina = e.codigo_oficina
    
  6. Devuelve el nombre, apellidos, puesto y teléfono de la oficina de aquellos empleados que no sean representante de ventas de ningún cliente.
     SELECT e.nombre, e.apellido1, e.apellido2, e.puesto, o.telefono
     FROM empleado e INNER JOIN oficina o USING(codigo_oficina)
     WHERE e.codigo_empleado NOT IN (SELECT DISTINCT c.codigo_empleado_rep_ventas 
                                     FROM cliente c)
    
  7. Devuelve un listado indicando todas las ciudades donde hay oficinas y el número de empleados que tiene.
     SELECT o.ciudad, COUNT(e.codigo_oficina) AS 'Cantidad de empleados'
     FROM oficina o INNER JOIN empleado e USING(codigo_oficina)
     GROUP BY o.ciudad
    

Diego J. Gonzalez