Ejercicios - Jardinería
Descarga la base de datos completa en formato SQL
Consultas sobre una tabla
Devuelve un listado con el código de oficina y la ciudad donde hay oficinas.
Mostrar solución
sqlSELECT codigo_oficina, ciudad FROM oficina;Devuelve un listado con la ciudad y el teléfono de las oficinas de España.
Mostrar solución
sqlSELECT ciudad, telefono FROM oficina WHERE pais = 'España';Devuelve un listado con el nombre, apellidos y email de los empleados cuyo jefe tiene un código de jefe igual a 7.
Mostrar solución
sqlSELECT nombre, apellido1, apellido2, email FROM empleado e WHERE e.codigo_jefe = 7;Devuelve el nombre del puesto, nombre, apellidos y email del jefe de la empresa.
Mostrar solución
sqlSELECT puesto, nombre, apellido1, apellido2, email FROM empleado e WHERE e.codigo_jefe IS NULL;Devuelve un listado con el nombre, apellidos y puesto de aquellos empleados que no sean representantes de ventas.
Mostrar solución
sqlSELECT nombre, apellido1, apellido2, puesto FROM empleado e WHERE e.puesto <> 'Representante Ventas';Devuelve un listado con el nombre de los todos los clientes españoles.
Mostrar solución
sqlSELECT c.nombre_cliente FROM cliente c WHERE c.pais = 'Spain';Devuelve un listado con los distintos estados por los que puede pasar un pedido.
Mostrar solución
sqlSELECT DISTINCT p.estado FROM pedido p;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.
Mostrar solución
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';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.
Mostrar solución
sqlSELECT p.codigo_pedido, p.codigo_cliente, p.fecha_esperada, p.fecha_entrega FROM pedido p WHERE p.fecha_entrega > p.fecha_esperada;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 -?
Mostrar solución
sql/* 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;Devuelve un listado de todos los pedidos que fueron rechazados en 2009.
Mostrar solución
sqlSELECT * FROM pedido p WHERE p.estado = 'Rechazado' AND YEAR(p.fecha_pedido) = 2009;Devuelve un listado de todos los pedidos que han sido entregados en el mes de enero de cualquier año.
Mostrar solución
sqlSELECT * FROM pedido p WHERE MONTH(p.fecha_entrega) = 01;Devuelve un listado con todos los pagos que se realizaron en el año 2008 mediante Paypal. Ordene el resultado de mayor a menor.
Mostrar solución
sqlSELECT * FROM pago p WHERE YEAR(p.fecha_pago) = 2008 AND p.forma_pago = 'Paypal';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.
Mostrar solución
sqlSELECT DISTINCT p.forma_pago FROM pago p;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.
Mostrar solución
sqlSELECT * FROM producto p WHERE p.gama = 'Ornamentales' AND p.cantidad_en_stock > 100 ORDER BY p.precio_venta DESC;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.
Mostrar solución
sqlSELECT * FROM cliente c WHERE c.ciudad = 'Madrid' AND c.codigo_empleado_rep_ventas IN (11, 30);
Consultas multitabla (Composición interna)
Obtén un listado con el nombre de cada cliente y el nombre y apellido de su representante de ventas.
Mostrar solución
sqlSELECT 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;Muestra el nombre de los clientes que hayan realizado pagos junto con el nombre de sus representantes de ventas.
Mostrar solución
sqlSELECT 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;Muestra el nombre de los clientes que no hayan realizado pagos junto con el nombre de sus representantes de ventas.
Mostrar solución
sqlSELECT 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;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.
Mostrar solución
sqlSELECT 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;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.
Mostrar solución
sqlSELECT 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;Lista la dirección de las oficinas que tengan clientes en Fuenlabrada.
Mostrar solución
sqlSELECT 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';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.
Mostrar solución
sqlSELECT 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;Devuelve un listado con el nombre de los empleados junto con el nombre de sus jefes.
Mostrar solución
sqlSELECT 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;Devuelve un listado que muestre el nombre de cada empleados, el nombre de su jefe y el nombre del jefe de sus jefe.
Mostrar solución
sqlSELECT 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;Devuelve el nombre de los clientes a los que no se les ha entregado a tiempo un pedido.
Mostrar solución
sqlSELECT * FROM cliente c INNER JOIN pedido p ON c.codigo_cliente = p.codigo_cliente WHERE p.fecha_entrega > p.fecha_esperada;Devuelve un listado de las diferentes gamas de producto que ha comprado cada cliente.
Mostrar solución
sqlSELECT 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)
Devuelve un listado que muestre solamente los clientes que no han realizado ningún pago.
Mostrar solución
sqlSELECT c.nombre_cliente FROM cliente c LEFT JOIN pago p ON c.codigo_cliente = p.codigo_cliente WHERE p.codigo_cliente IS NULL;Devuelve un listado que muestre solamente los clientes que no han realizado ningún pedido.
Mostrar solución
sqlSELECT c.nombre_cliente FROM cliente c LEFT JOIN pedido p ON c.codigo_cliente = p.codigo_cliente WHERE p.codigo_cliente IS NULL;Devuelve un listado que muestre los clientes que no han realizado ningún pago y los que no han realizado ningún pedido.
Mostrar solución
sqlSELECT 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;Devuelve un listado que muestre solamente los empleados que no tienen una oficina asociada.
Mostrar solución
sqlSELECT 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;Devuelve un listado que muestre solamente los empleados que no tienen un cliente asociado.
Mostrar solución
sqlSELECT 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;Devuelve un listado que muestre solamente los empleados que no tienen un cliente asociado junto con los datos de la oficina donde trabajan.
Mostrar solución
sqlSELECT 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;Devuelve un listado que muestre los empleados que no tienen una oficina asociada y los que no tienen un cliente asociado.
Mostrar solución
sqlSELECT 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;Devuelve un listado de los productos que nunca han aparecido en un pedido.
Mostrar solución
sqlSELECT 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;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.
Mostrar solución
sqlSELECT 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;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.
Mostrar solución
sqlSELECT * 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');Devuelve un listado con los clientes que han realizado algún pedido pero no han realizado ningún pago.
Mostrar solución
sqlSELECT 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;Devuelve un listado con los datos de los empleados que no tienen clientes asociados y el nombre de su jefe asociado.
Mostrar solución
sqlSELECT 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
¿Cuántos empleados hay en la compañía?
Mostrar solución
sqlSELECT COUNT(e.codigo_empleado) as 'Cantidad de empleados' FROM empleado e;¿Cuántos clientes tiene cada país?
Mostrar solución
sqlSELECT c.pais, COUNT(c.pais) FROM cliente c GROUP BY c.pais;¿Cuál fue el pago medio en 2009?
Mostrar solución
sqlSELECT AVG(p.total) AS 'Promedio de pago en 2009' FROM pago p WHERE YEAR(p.fecha_pago) = 2009;¿Cuántos pedidos hay en cada estado? Ordena el resultado de forma descendente por el número de pedidos.
Mostrar solución
sqlSELECT p.estado, COUNT(p.estado) FROM pedido p GROUP BY p.estado;Calcula el precio de venta del producto más caro y más barato en una misma consulta.
Mostrar solución
sqlSELECT MIN(p.precio_venta) AS 'Producto mas barato', MAX(p.precio_venta) AS 'Producto mas caro' FROM producto p;Calcula el número de clientes que tiene la empresa.
Mostrar solución
sqlSELECT COUNT(c.nombre_cliente) FROM cliente c;¿Cuántos clientes existen con domicilio en la ciudad de Madrid?
Mostrar solución
sqlSELECT COUNT(c.codigo_cliente) AS 'Clientes de Madrid' FROM cliente c WHERE c.ciudad = 'Madrid';¿Calcula cuántos clientes tiene cada una de las ciudades que empiezan por M?
Mostrar solución
sqlSELECT COUNT(c.codigo_cliente) FROM cliente c WHERE ciudad LIKE 'M%';Devuelve el nombre de los representantes de ventas y el número de clientes al que atiende cada uno.
Mostrar solución
sqlSELECT 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;Calcula el número de clientes que no tiene asignado representante de ventas.
Mostrar solución
sqlSELECT 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;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.
Mostrar solución
sqlSELECT 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;Calcula el número de productos diferentes que hay en cada uno de los pedidos.
Mostrar solución
sqlSELECT 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;Calcula la suma de la cantidad total de todos los productos que aparecen en cada uno de los pedidos.
Mostrar solución
sqlSELECT 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;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.
Mostrar solución
sqlSELECT 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;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.
Mostrar solución
sqlSELECT 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);La misma información que en la pregunta anterior, pero agrupada por código de producto.
Mostrar solución
sqlSELECT 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;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.
Mostrar solución
sqlSELECT 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%';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).
Mostrar solución
sqlSELECT 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;Muestre la suma total de todos los pagos que se realizaron para cada uno de los años que aparecen en la tabla pagos.
Mostrar solución
sqlSELECT 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
Devuelve el nombre del cliente con mayor límite de crédito.
Mostrar solución
sqlSELECT c.nombre_cliente FROM cliente c WHERE c.limite_credito = (SELECT MAX(c.limite_credito) FROM cliente c);Devuelve el nombre del producto que tenga el precio de venta más caro.
Mostrar solución
sqlSELECT p.nombre FROM producto p WHERE p.precio_venta = (SELECT MAX(p.precio_venta) FROM producto p);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)
Mostrar solución
sqlSELECT 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);Los clientes cuyo límite de crédito sea mayor que los pagos que haya realizado. (Sin utilizar INNER JOIN).
Mostrar solución
sqlSELECT 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);Devuelve el producto que más unidades tiene en stock.
Mostrar solución
sqlSELECT p.nombre FROM producto p WHERE p.cantidad_en_stock = (SELECT MAX(p.cantidad_en_stock) FROM producto p);Devuelve el producto que menos unidades tiene en stock.
Mostrar solución
sqlSELECT p.nombre FROM producto p WHERE p.cantidad_en_stock = (SELECT MIN(p.cantidad_en_stock) FROM producto p);Devuelve el nombre, los apellidos y el email de los empleados que están a cargo de Alberto Soria.
Mostrar solución
sqlSELECT 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
Devuelve el nombre del cliente con mayor límite de crédito.
Mostrar solución
sqlSELECT c.nombre_cliente FROM cliente c WHERE c.limite_credito >= ALL(SELECT MAX(c.limite_credito) FROM cliente c);Devuelve el nombre del producto que tenga el precio de venta más caro.
Mostrar solución
sqlSELECT p.nombre FROM producto p WHERE p.precio_venta >= ALL(SELECT MAX(p.precio_venta) FROM producto p);Devuelve el producto que menos unidades tiene en stock.
Mostrar solución
sqlSELECT 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
Devuelve el nombre, apellido1 y cargo de los empleados que no representen a ningún cliente.
Mostrar solución
sqlSELECT e.nombre, e.apellido1, e.apellido2 FROM empleado e WHERE e.codigo_empleado NOT IN (SELECT c.codigo_empleado_rep_ventas FROM cliente c);Devuelve un listado que muestre solamente los clientes que no han realizado ningún pago.
Mostrar solución
sqlSELECT c.nombre_cliente FROM cliente c WHERE c.codigo_cliente NOT IN (SELECT p.codigo_cliente FROM pago p);Devuelve un listado que muestre solamente los clientes que sí han realizado algún pago.
Mostrar solución
sqlSELECT c.nombre_cliente FROM cliente c WHERE c.codigo_cliente IN (SELECT p.codigo_cliente FROM pago p);Devuelve un listado de los productos que nunca han aparecido en un pedido.
Mostrar solución
sqlSELECT p.nombre FROM producto p WHERE p.codigo_producto NOT IN (SELECT dp.codigo_producto FROM detalle_pedido dp);Devuelve el nombre, apellidos, puesto y teléfono de la oficina de aquellos empleados que no sean representante de ventas de ningún cliente.
Mostrar solución
sqlSELECT 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);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.
Mostrar solución
sqlSELECT 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');Devuelve un listado con los clientes que han realizado algún pedido pero no han realizado ningún pago.
Mostrar solución
sqlSELECT 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
Devuelve un listado que muestre solamente los clientes que no han realizado ningún pago.
Mostrar solución
sqlSELECT * FROM cliente c WHERE NOT EXISTS (SELECT * FROM pago p WHERE c.codigo_cliente = p.codigo_cliente);Devuelve un listado que muestre solamente los clientes que sí han realizado algún pago.
Mostrar solución
sqlSELECT * FROM cliente c WHERE EXISTS (SELECT * FROM pago p WHERE c.codigo_cliente = p.codigo_cliente);Devuelve un listado de los productos que nunca han aparecido en un pedido.
Mostrar solución
sqlSELECT * FROM cliente c WHERE NOT EXISTS (SELECT * FROM pedido p WHERE p.codigo_cliente = c.codigo_cliente);Devuelve un listado de los productos que han aparecido en un pedido alguna vez.
Mostrar solución
sqlSELECT * FROM cliente c WHERE EXISTS (SELECT * FROM pedido p WHERE p.codigo_cliente = c.codigo_cliente);
Consultas variadas
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.
Mostrar solución
sqlSELECT 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;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.
Mostrar solución
sqlSELECT 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;Devuelve el nombre de los clientes que hayan hecho pedidos en 2008 ordenados alfabéticamente de menor a mayor.
Mostrar solución
sqlSELECT 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;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.
Mostrar solución
sqlSELECT 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);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.
Mostrar solución
sqlSELECT 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;Devuelve el nombre, apellidos, puesto y teléfono de la oficina de aquellos empleados que no sean representante de ventas de ningún cliente.
Mostrar solución
sqlSELECT 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);Devuelve un listado indicando todas las ciudades donde hay oficinas y el número de empleados que tiene.
Mostrar solución
sqlSELECT o.ciudad, COUNT(e.codigo_oficina) AS 'Cantidad de empleados' FROM oficina o INNER JOIN empleado e USING(codigo_oficina) GROUP BY o.ciudad;

