|
Solución ejercicios tema
3. Las consultas multitabla
|
|
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.
|
|
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.
|
|
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.
|
|
SELECT oficinas.*,
nombre AS director
FROM empleados RIGHT JOIN oficinas ON empleados.oficina = oficinas.oficina
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).
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
Aviso legal: este curso es gratuito
siempre que se visualice desde la página web de aulaClic. No está permitido descargar el curso y utilizarlo en academias o centros de enseñanza
privados sin estar conectado a Internet.
|
© aulaClic. Todos los derechos reservados.
Free Computer tutorials .
Prohibida la reproducción por cualquier medio.
Abril -2001.aulaClic.com
|
|
|