mysql - unir - ¿Cuándo usar una unión externa izquierda?
unir dos tablas sql server (5)
Creo que la pregunta 3 (b) es confusa porque todo su premisa está equivocada: no es necesario usar una combinación externa para "resolver la consulta". Considere esto (siguiendo el estilo de sintaxis en el documento de examen probablemente sea sabio):
SELECT FNAME, LNAME, DEPENDENT_NAME
FROM EMPLOYEE, DEPENDENT
WHERE SSN = ESSN
AND RELATIONSHIP = ''SPOUSE''
UNION
SELECT FNAME, LNAME, NULL
FROM EMPLOYEE
EXCEPT
SELECT FNAME, LNAME, DEPENDENT_NAME
FROM EMPLOYEE, DEPENDENT
WHERE SSN = ESSN
AND RELATIONSHIP = ''SPOUSE''
No entiendo el concepto de una combinación externa izquierda, una combinación externa derecha, o de hecho, ¿por qué tenemos que usar una unión en absoluto? La pregunta con la que estoy luchando y la tabla en la que estoy trabajando está aquí: Link
Pregunta 3 (b)
Construya un comando en SQL para resolver la siguiente consulta, explicando por qué tuvo que emplear el método de combinación (externo). [5 Marcas] "Encuentre el nombre de cada miembro del personal y su cónyuge dependiente, si corresponde"
Pregunta 3 (c) -
Construya un comando en SQL para resolver la siguiente consulta, utilizando (i) el método de unión, y (ii) el método de subconsulta. [10 Marcas] "Encuentre el nombre de identidad de cada miembro del personal que haya trabajado más de 20 horas en el Proyecto de informatización"
¿Alguien puede explicarme esto simplemente?
En general: JOIN une dos tablas juntas. Use INNER JOIN cuando quiera "buscar", como buscar información detallada de cualquier columna específica. Use OUTER JOIN cuando quiera "demostrar", como enumerar toda la información de las 2 tablas.
Las uniones se utilizan para combinar dos tablas relacionadas entre sí.
En su ejemplo, puede combinar la tabla Employee y la tabla Department, así:
SELECT FNAME, LNAME, DNAME
FROM
EMPLOYEE INNER JOIN DEPARTMENT ON EMPLOYEE.DNO=DEPARTMENT.DNUMBER
Esto daría como resultado un conjunto de registros como:
FNAME LNAME DNAME
----- ----- -----
John Smith Research
John Doe Administration
INNER JOIN
arriba. INNER JOIN
s combina dos tablas para que solo se muestren los registros con coincidencias en ambas tablas, y se unen en este caso, en el número de departamento (campo DNO en Empleado, DNUMBER en la tabla Departamento).
LEFT JOIN
s te permite combinar dos tablas cuando tienes registros en la primera tabla, pero es posible que no tengan registros en la segunda tabla. Por ejemplo, supongamos que desea una lista de todos los empleados, más los dependientes:
SELECT EMPLOYEE.FNAME as employee_first, EMPLOYEE.LNAME as employee_last, DEPENDENT.FNAME as dependent_last, DEPENDENT.LNAME as dependent_last
FROM
EMPLOYEE INNER JOIN DEPENDENT ON EMPLOYEE.SSN=DEPENDENT.ESSN
El problema aquí es que si un empleado no tiene un dependiente, entonces su registro no se mostrará en absoluto, porque no hay un registro coincidente en la tabla DEPENDIENTE.
Por lo tanto, utiliza una combinación de la izquierda que mantiene todos los datos en la "izquierda" (es decir, la primera tabla) y extrae los datos coincidentes en la "derecha" (la segunda tabla):
SELECT EMPLOYEE.FNAME as employee_first, EMPLOYEE.LNAME as employee_last, DEPENDENT.FNAME as dependent_first, DEPENDENT.LNAME as dependent_last
FROM
EMPLOYEE LEFT JOIN DEPENDENT ON EMPLOYEE.SSN=DEPENDENT.ESSN
Ahora obtenemos todos los registros de los empleados. Si no hay dependientes que coincidan para un empleado determinado, los campos dependent_first
y dependent_last
serán nulos.
Utiliza combinaciones externas cuando necesita todos los resultados de una de las tablas de combinación, ya sea que haya una fila coincidente en la otra tabla o no.
ejemplo (no usa tus tablas de ejemplo :-)
Tengo una empresa de alquiler de vehículos.
Table car
id: integer primary key autoincrement
licence_plate: varchar
purchase_date: date
Table customer
id: integer primary key autoincrement
name: varchar
Table rental
id: integer primary key autoincrement
car_id: integer
bike_id: integer
customer_id: integer
rental_date: date
Simple ¿verdad? Tengo 10 registros para autos porque tengo 10 autos.
He estado manejando este negocio por 10 años, así que tengo 1000 clientes.
Y alquilo los autos aproximadamente 20x por año por carros = 10 años x 10 carros x 20 = 2000 alquileres.
Si guardo todo en una gran mesa, tengo 10x1000x2000 = 20 millones de registros.
Si lo almaceno en 3 tablas, tengo 10 + 1000 + 2000 = 3010 registros.
Eso es 3 órdenes de magnitud, por eso uso 3 tablas.
Pero debido a que utilizo 3 tablas (para ahorrar espacio y tiempo) tengo que usar uniones para sacar los datos nuevamente
(al menos si quiero nombres y placas de matrícula en lugar de números) .
Usando uniones internas
Todos los alquileres para el cliente 345?
SELECT * FROM customer
INNER JOIN rental on (rental.customer_id = customer.id)
INNER JOIN car on (car.id = rental.car_id)
WHERE customer.id = 345.
Esa es una INNER JOIN
, porque solo queremos saber sobre los autos linked to
alquileres linked to
clientes que realmente sucedieron.
Tenga en cuenta que también tenemos un bike_id, que enlaza con la mesa de bicis, que es bastante similar a la mesa de coche pero diferente. ¿Cómo obtendríamos todos los alquileres de bicicletas + autos para el cliente 345?
Podemos intentar y hacer esto
SELECT * FROM customer
INNER JOIN rental on (rental.customer_id = customer.id)
INNER JOIN car on (car.id = rental.car_id)
INNER JOIN bike on (bike.id = rental.bike_id)
WHERE customer.id = 345.
¡Pero eso dará un juego vacío!
Esto se debe a que un alquiler puede ser un bicycle_rental O un car_rental, pero no ambos al mismo tiempo.
Y la consulta de inner join
no funciona solo dará resultados para todos los alquileres en los que alquilamos tanto una bicicleta como un automóvil en la misma transacción.
Estamos tratando de obtener y boolean OR
relación usando un Boolean AND
join.
Usando uniones externas
Para resolver esto, necesitamos una outer join
.
Vamos a resolverlo con la left join
SELECT * FROM customer
INNER JOIN rental on (rental.customer_id = customer.id) <<-- link always
LEFT JOIN car on (car.id = rental.car_id) <<-- link half of the time
LEFT JOIN bike on (bike.id = rental.bike_id) <<-- link (other) 0.5 of the time.
WHERE customer.id = 345.
Míralo de esta manera. Una inner join
es una AND
y una left join
es una OR
como en el siguiente pseudocódigo:
if a=1 AND a=2 then {this is always false, no result}
if a=1 OR a=2 then {this might be true or not}
Si crea las tablas y ejecuta la consulta, puede ver el resultado.
en la terminología
Una left join
es lo mismo que una left outer join
. join
sin prefijos adicionales es una inner join
También hay una full outer join
. En 25 años de programación, nunca he usado eso.
Por qué Izquierda unirse
Bueno, hay dos tablas involucradas. En el ejemplo que vinculamos
cliente a alquilar con una inner join
, en una combinación interna ambas tablas deben vincularse para que no haya diferencia entre la left:customer
tabla de left:customer
y la right:rental
tabla de right:rental
.
El siguiente enlace era una left join
left:rental
entre la left:rental
y right:car
. En el lado izquierdo, todas las filas deben vincularse y, en el lado derecho, no es necesario. Es por eso que es una left join