varios unir una tablas tabla misma ejemplo consultas consulta mysql sql database-design join

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