SUBCONSULTAS
JOIN
OUTER JOIN
VISTAS
100

Devuelve el producto que más unidades tiene en stock.

select *

from producto 

where cantidad_en_stock >= all

    (select cantidad_en_stock

    from producto);

ó

select *

from producto 

where cantidad_en_stock =

    (select max(cantidad_en_stock)

    from producto); 

100

Obtén un listado con el nombre de cada empleado y el nombre y apellido de su jefe.

select e.nombre, je.nombre

from empleado e join empleado je on e.codigo_jefe = je.codigo_empleado;

100

Obtener el nombre del cliente y el código del pedido, mostrando también los clientes que no han hecho ningún pedido.

SELECT cliente.nombre_cliente, pedido.codigo_pedido

FROM cliente

LEFT JOIN pedido

ON cliente.codigo_cliente = pedido.codigo_cliente;

100

Realiza una vista "gamas_y_productos" con el nombre de cada gama y la cantidad de productos pertenecientes a ellas. 

Ahora realiza una consulta sobre esa vista que muestre la gama de la que se tienen más productos.

create or replace view gamas_y_productos as

select p.gama, count(*) as "productos"

from producto p

group by p.gama;


select gama, productos

from gamas_y_productos

where productos = (select max(productos) from gamas_y_productos);

200

Devuelve el nombre, apellido1 y cargo de los empleados que no representen a ningún cliente.

select e.nombre, e.apellido1, e.puesto

from empleado e

where e.codigo_empleado not in 

    (select c.codigo_empleado_rep_ventas

    from cliente c);

200

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 cl.nombre_cliente, e.nombre, o.ciudad

from cliente cl join empleado e on cl.codigo_empleado_rep_ventas = e.codigo_empleado

                join oficina o on o.codigo_oficina = e.codigo_oficina

where cl.codigo_cliente not in ( select codigo_cliente

                                from pago);

200

Obtener el nombre del empleado y el nombre del producto que ha vendido, mostrando también los empleados que no han vendido ningún producto.

SELECT e.nombre, pro.nombre

FROM empleado e

left JOIN cliente c ON e.codigo_empleado = c.codigo_empleado_rep_ventas

left JOIN pedido p ON c.codigo_cliente = p.codigo_cliente

left JOIN detalle_pedido dp ON p.codigo_pedido = dp.codigo_pedido

LEFT JOIN producto pro ON dp.codigo_producto = pro.codigo_producto;

200

Realize una vista "pagos_por_cliente" con el nombre, los importes de los pagos que ha hecho, y la fecha de cada pago. 

Ahora realize una consulta sobre la vista donde saque el nombre de los clientes y la cantidad total que pagaron cada año.

create or replace view pagos_por_cliente as

select c.nombre_cliente "nombre", p.total "importe", p.fecha_pago "fecha"

from cliente c join pago p using (codigo_cliente);


select nombre, sum(importe), year(fecha)

from pagos_por_cliente

group by year(fecha), nombre;

300

Devuelve un listado de los nombres de los productos que han aparecido en un pedido alguna vez. 

Debe aparecer una vez cada nombre.

select distinct(p.nombre)

from producto p

where exists (select dp.codigo_pedido

            from detalle_pedido dp

            where dp.codigo_producto = p.codigo_producto);

300

Lista la dirección de las oficinas que tengan clientes en Fuenlabrada

select o.linea_direccion1, o.linea_direccion2, o.ciudad

from oficina o join empleado e on e.codigo_oficina = o.codigo_oficina 

                join cliente c on e.codigo_empleado = c.codigo_empleado_rep_ventas

where c.ciudad like "%Fuenlabrada%";

300

Obtener el nombre del cliente y la gama del producto que ha comprado, de los clientes que han comprado Frutales mostrando también los clientes que no han comprado ningún producto de gama Frutales.


SELECT cliente.nombre_cliente, producto.gama 

FROM cliente 

LEFT JOIN pedido 

ON cliente.codigo_cliente = pedido.codigo_cliente 

LEFT JOIN detalle_pedido 

ON pedido.codigo_pedido = detalle_pedido.codigo_pedido 

LEFT JOIN producto 

ON detalle_pedido.codigo_producto = producto.codigo_producto 

AND producto.gama = 'Frutales';

300

Realiza una vista donde aparezca el nombre y apellidos de cada jefe, con los de sus empleados, y la oficina a la que pertenecen. Los nombres y apellidos tienen que estar en una sola columna

Ahora realiza una consulta sobre la vista donde se vea la ciudad de la oficina tiene mas empleados.

create or replace view jefes_y_empleados as

select concat (j.nombre," ",j.apellido1," ", j.apellido2) "jefe", 

        concat (e.nombre," ",e.apellido1," ", e.apellido2) "empleado", e.codigo_oficina "oficina"

from empleado e join empleado j on e.codigo_jefe = j.codigo_empleado; 


select o.ciudad

from oficina o join jefes_y_empleados je on je.oficina = o.codigo_oficina

group by o.codigo_oficina

order by count(je.empleado) desc

limit 1;

400

Devuelve un listado indicando todas las ciudades donde hay oficinas y el número de empleados que tiene.

select distinct(o.ciudad), (select count(*)

                            from empleado e

                            where e.codigo_oficina = o.codigo_oficina) as "Numero empleados"

from oficina o;

400

Devuelve el nombre de los clientes a los que no se les ha entregado a tiempo un pedido.

select distinct(c.nombre_cliente)

from cliente c join pedido p on c.codigo_cliente = p.codigo_cliente

where p.fecha_entrega > p.fecha_esperada;

400

Obtener el nombre de los clientes que hayan hecho un pedido de algún producto de la gama "Ornamentales", y tambien alguno de la gama "Frutales", incluídos aquellos que no cumplan esta condición.

SELECT distinct(c.nombre_cliente)

FROM cliente c

LEFT JOIN pedido p ON c.codigo_cliente = p.codigo_cliente

LEFT JOIN detalle_pedido dp ON p.codigo_pedido = dp.codigo_pedido

LEFT JOIN producto pr ON dp.codigo_producto = pr.codigo_producto

WHERE pr.gama = 'Ornamentales'

AND c.codigo_cliente IN (

  SELECT c2.codigo_cliente

  FROM cliente c2

  LEFT JOIN pedido p2 ON c2.codigo_cliente = p2.codigo_cliente

  LEFT JOIN detalle_pedido dp2 ON p2.codigo_pedido = dp2.codigo_pedido

  LEFT JOIN producto pr2 ON dp2.codigo_producto = pr2.codigo_producto

  WHERE pr2.gama = 'Frutales'

);

400

Realiza una vista donde aparezca el nombre de cada proveedor, y la cantidad de productos que se ha vendido del mismo en cada numero_linea.

Ahora realiza una consulta sobre dicha vista que devuelva la cantidad de proveedores distintos de los productos que se han cobrado en cada linea.

create or replace view proveedores_en_linea as

select p.proveedor `proveedor`, sum(dp.cantidad) `cantidad`, dp.numero_linea `linea`

from producto p join detalle_pedido dp using (codigo_producto)

group by dp.numero_linea, p.proveedor;


select distinct(count(proveedor)), linea

from proveedores_en_linea

group by linea

order by linea;

500

Devuelve el nombre de los clientes que hayan hecho pedidos en 2021 ordenados alfabéticamente de menor a mayor.

select c.nombre_cliente

from cliente c 

where c.codigo_cliente in 

    (select p.codigo_cliente

    from pedido p

    where year(p.fecha_pedido) = 2021)

order by c.nombre_cliente;    

500

Obtener la gama de producto que tiene el mayor precio promedio y su descripción

SELECT gama_producto.gama, gama_producto.descripcion_texto, AVG(producto.precio_venta) AS precio_promedio 

FROM gama_producto INNER JOIN producto ON gama_producto.gama = producto.gama 

GROUP BY gama_producto.gama 

ORDER BY precio_promedio DESC LIMIT 1;

500

Obtener la cantidad total de productos que ha vendido cada empleado, incluyendo aquellos empleados que no han vendido ningún producto:

SELECT e.nombre, COUNT(dp.codigo_producto) as cantidad_vendida

FROM empleado e

left JOIN cliente c ON e.codigo_empleado = c.codigo_empleado_rep_ventas

left JOIN pedido p ON c.codigo_cliente = p.codigo_cliente

left JOIN detalle_pedido dp ON p.codigo_pedido = dp.codigo_pedido

group by e.nombre ;

500

Realiza una vista con los nombres de los clientes, el limite de crédito que tienen, la cantidad de pedidos que ha hecho y la cantidad total de pagos que ha hecho.

Ahora realiza una consulta sobre dicha vista que muestre los clientes cuya cantidad de pedidos supere la media total. Ordénalos por límite de crédito de mayor a menor.

create or replace view datos_clientes as

select c.nombre_cliente "nombre", c.limite_credito "credito", count(pe.codigo_pedido) "num_pedidos", sum(pa.total) "total_pagos"

from cliente c join pago pa using (codigo_cliente) join pedido pe using (codigo_cliente)

group by c.codigo_cliente;


select dc.nombre, dc.credito

from datos_clientes dc

where dc.num_pedidos > (select avg(num_pedidos)

                    from datos_clientes)

order by dc.credito desc ;