Solución ejercicios tema 3. Las consultas multitabla


Ejercicio 1

SELECT oficinas.oficina, ciudad, numemp, nombre
FROM oficinas INNER JOIN empleados ON oficinas.oficina = empleados.oficina
WHERE region = 'este'


Como la columna de emparejamiento oficinas.oficina es clave principal en la tabla oficinas, es mejor utilizar el JOIN que un producto cartesiano. Emparejamos las dos tablas por el campo oficina. Las oficinas que no tengan empleados no salen (es un INNER).

Como queremos sólo las oficinas del este añadimos la cláusula WHERE con la condicion. El valor este debe ir entre comillas (es un valor alfanumérico).

Observar que en la lista de selección la columna oficina está cualificada (su nombre está precedido del nombre de la tabla), es necesario cualificarla porque en las dos tablas existe una columna llamada oficina y el sistema no sabría cuál de las dos escoger.

SELECT oficinas.oficina, ciudad, numemp, nombre
FROM oficinas LEFT JOIN empleados ON oficinas.oficina = empleados.oficina
WHERE region = 'este'


Si queremos que también aparezcan las oficinas que no tienen empleados cambiamos INNER por LEFT (queremos todas las oficinas y la tabla oficinas está a la izquierda de la palabra JOIN).

Ojo, si en la lista de selección ponemos empleados.oficina en vez de oficinas.oficina, en las filas de oficinas que no tienen empleados el número de oficina aparece nulo.

SELECT oficinas.oficina, ciudad, numemp, nombre
FROM empleados RIGHT JOIN oficinas ON oficinas.oficina = empleados.oficina
WHERE region = 'este'


Esta SELECT es equivalente a la anterior pero hemos cambiado LEFT por RIGHT porque ahora la tabla oficinas está a la derecha de la palabra JOIN.

Ejercicio 2

SELECT numpedido, importe, clientes.nombre AS cliente, limitecredito
FROM pedidos INNER JOIN clientes ON pedidos.clie = clientes.numclie

En este ejercicio no pueden haber pedidos sin cliente, y lo que nos interesa son los pedidos, luego tampoco tienen que aparecer los clientes que no tienen pedidos, por lo tanto utilizamos un INNER JOIN.

 

 

Ejercicio 3

SELECT empleados.*, ciudad, region
FROM empleados LEFT JOIN oficinas ON empleados.oficina = oficinas.oficina

Aquí hemos utilizado LEFT JOIN para que también salgan los empleados que no tienen oficina asignada.
Como queremos todos los datos del empleado utilizamos empleados.* para acortar.

Ejercicio 4

SELECT oficinas.*, nombre AS director
FROM empleados RIGHT JOIN oficinas ON empleados.numemp = oficinas.dir
WHERE objetivo > 600000

Nos interesan las oficinas con objetivo superior a 600.000pts. luego nos tenemos que asegurar que salgan todas incluso si no tienen director asignado por eso utilizamos RIGHT JOIN.
En los valores numéricos no utilizar el punto para separar los miles (lo consideraría coma decimal y entendería 600 en vez de 600000).

Ejercicio 5

SELECT numpedido, importe, empleados.nombre AS representante, clientes.nombre AS cliente
FROM (pedidos INNER JOIN clientes ON pedidos.clie = clientes.numclie) INNER JOIN empleados ON pedidos.rep = empleados.numemp
WHERE importe > 25000

En este ejercicio no pueden haber pedidos sin representante ni cliente, y lo que nos interesa son los pedidos, luego tampoco tienen que aparecer los representantes que no tienen pedidos ni los clientes que no tienen pedidos, por lo tanto utilizamos un INNER JOIN.

Primero añadimos a cada línea de pedido los datos del cliente corespondiente (con el primer INNER) y a cada fila resultante añadimos los datos del representante correspondiente.

Nota: el representante que nos interesa es el que ha realizado el pedido y ese dato lo tenemos en el campo rep de pedidos por eso la condición de emparejamiento es pedidos.rep = empleados.rep.

Si hubiesemos querido el nombre del representante asignado al cliente, la condición hubiera sido clientes.repclie = empleados.numemp.

Ejercicio 6

SELECT empleados.*
FROM empleados INNER JOIN pedidos ON pedidos.rep = empleados.numemp
WHERE fechapedido = contrato

 

Los representantes que buscamos tienen un pedido con la misma fecha que la de su contrato, tenemos que añadir a los pedidos los datos del representante correspondiente para poder comparar los dos campos.

Ejercicio 7

SELECT empleados.*, jefes.numemp AS num_jefe, jefes.nombre AS nombre_jefe, jefes.cuota AS cuota_jefe
FROM empleados INNER JOIN empleados jefes ON empleados.jefe = jefes.numemp
WHERE empleados.cuota > jefes.cuota

 

En una misma línea necesito los datos del empleado y los datos de su jefe, luego tengo que combinar empleados con empleados. No interesan los empleados que no tienen jefe luego utilizo INNER. El alias de tabla es obligatorio ya que combino empleados con la misma.

Ejercicio 8

SELECT numemp
FROM empleados LEFT JOIN pedidos ON pedidos.rep = empleados.numemp
WHERE importe > 10000 OR cuota < 10000

 

Una posible solución es combinar pedidos con empleados para poder seleccionar las líneas de importe > 10000 o cuota < 10000. Hay que utilizar LEFT para que puedan aparecer empleados con cuota < 10000 que no tengan pedidos.

SELECT rep
FROM pedidos
WHERE importe > 10000
UNION
SELECT numemp
FROM empleados
WHERE cuota < 10000

Esta es otra solución, obtener por una parte los códigos de los empleados con una línea de pedido > 10000, por otra parte los códigos de los empleados con cuota < 10000 y finalmente unir las dos listas con una UNION.

 




Página inicial  Cursos Informática Gratuitos

Síguenos en:   Facebook       Sobre aulaClic            Política de Cookies


© aulaClic. Todos los derechos reservados. Prohibida la reproducción por cualquier medio.