sql >> Base de Datos >  >> RDS >> Oracle

unión propia vs unión interna

Encuentro útil pensar en todas las tablas en una instrucción SELECT como si representaran sus propios conjuntos de datos.

Antes de aplicar cualquier condición, puede pensar que cada conjunto de datos está completo (toda la tabla, por ejemplo).

Una combinación es solo una de varias formas de comenzar a refinar esos conjuntos de datos para encontrar la información que realmente desea.

Aunque un esquema de base de datos puede diseñarse teniendo en cuenta ciertas relaciones (Clave principal <-> Clave externa), estas relaciones realmente solo existen en el contexto de una consulta en particular. El escritor de consultas puede relacionar lo que quiera con lo que quiera. Daré un ejemplo de esto más adelante...

Un INNER JOIN relaciona dos tablas entre sí. A menudo hay varias operaciones JOIN en una consulta para encadenar varias tablas. Puede ser tan complicado como sea necesario. Para un ejemplo simple, considere las siguientes tres tablas...

STUDENT

| STUDENTID | LASTNAME | FIRSTNAME |
------------------------------------
      1     |  Smith   |   John
      2     |  Patel   |  Sanjay
      3     |   Lee    |  Kevin
      4     |  Jackson |  Steven
ENROLLMENT

| ENROLLMENT ID | STUDENTID | CLASSID |
---------------------------------------
        1       |     2     |    3
        2       |     3     |    1
        3       |     4     |    2
CLASS

| CLASSID | COURSE | PROFESSOR |
--------------------------------
     1    | CS 101 |   Smith
     2    | CS 201 |  Ghandi
     3    | CS 301 |  McDavid
     4    | CS 401 |  Martinez

La mesa ESTUDIANTE y la mesa CLASE fueron diseñadas para relacionarse entre sí a través de la mesa INSCRIPCIÓN. Este tipo de tabla se llama Tabla de unión .

Para escribir una consulta que muestre a todos los estudiantes y las clases en las que están inscritos, se usarían dos uniones internas...

SELECT stud.LASTNAME, stud.FIRSTNAME, class.COURSE, class.PROFESSOR
FROM STUDENT stud
INNER JOIN ENROLLMENT enr
    ON stud.STUDENTID = enr.STUDENTID
INNER JOIN CLASS class
    ON class.CLASSID = enr.CLASSID;

Lea atentamente lo anterior y debería ver lo que está sucediendo. Lo que obtendrá a cambio es el siguiente conjunto de datos...

 | LASTNAME | FIRSTNAME | COURSE | PROFESSOR |
 ---------------------------------------------
     Patel  |   Sanjay  | CS 301 |  McDavid
      Lee   |   Kevin   | CS 101 |   Smith
    Jackson |  Steven   | CS 201 |  Ghandi

Usando las cláusulas JOIN, hemos limitado los conjuntos de datos de las tres tablas a solo aquellos que coinciden entre sí. Las "coincidencias" se definen mediante ON cláusulas. Tenga en cuenta que si ejecuta esta consulta, no vea la fila CLASSID 4 de la tabla CLASS o la fila STUDENTID 1 de la tabla STUDENT porque esas ID no existen en las coincidencias (en este caso, la tabla INSCRIPCIÓN). Consulte las UNIONES "IZQUIERDA"/"DERECHA"/"COMPLETA EXTERNA" para obtener más información sobre cómo hacer que funcione un poco diferente.

Tenga en cuenta que, según mis comentarios sobre "relaciones" anteriores, no hay ninguna razón por qué no pudo ejecutar una consulta que relacione la tabla ESTUDIANTE y la tabla CLASE directamente en las columnas APELLIDO y PROFESOR. Esas dos columnas coinciden en el tipo de datos y, ¡mira eso! ¡Incluso tienen un valor en común! Este probablemente sería un conjunto de datos extraño para obtener a cambio. Mi punto es que se puede hacer y nunca se sabe qué necesidades podría tener en el futuro para conexiones interesantes en sus datos. Comprenda el diseño de la base de datos, pero no piense en las "relaciones" como reglas que no se pueden ignorar.

Mientras tanto... ¡EL AUTOMISMO SE UNE!

Considere la siguiente tabla...

PERSON

| PERSONID | FAMILYID |  NAME  |
--------------------------------
      1    |     1    |  John
      2    |     1    | Brynn
      3    |     2    | Arpan
      4    |     2    | Steve
      5    |     2    |  Tim
      6    |     3    | Becca

Si te sentiste tan inclinado como para hacer una base de datos de todas las personas que conoces y cuáles son de la misma familia, esto podría ser lo que parece.

Si quisiera devolver una persona, PERSONID 4, por ejemplo, escribiría...

SELECT * FROM PERSON WHERE PERSONID = 4;

Aprenderías que él está en la familia con FAMILYID 2. Luego para encontrar todos de las PERSONAS de su familia escribirías...

SELECT * FROM PERSON WHERE FAMILYID = 2;

¡Hecho y hecho! SQL, por supuesto, puede lograr esto en una consulta usando, lo adivinó, un AUTO ÚNETE.

Lo que realmente desencadena la necesidad de una ÚNICA AUTOMÁTICA aquí está que la tabla contiene una columna única (PERSONID) y una columna que sirve como una especie de "Categoría" (FAMILYID). Este concepto se llama Cardinalidad y en este caso representa un uno a muchos o 1:M relación. Solo hay uno de cada PERSONA pero hay muchos PERSONAS en una FAMILIA .

Entonces, lo que queremos devolver es todo de los miembros de una familia si uno se conoce el PERSONID del miembro de la familia...

SELECT fam.*
FROM PERSON per
JOIN PERSON fam
    ON per.FamilyID = fam.FamilyID
WHERE per.PERSONID = 4;

Esto es lo que obtendrías...

| PERSONID | FAMILYID |  NAME  |
--------------------------------
      3    |     2    | Arpan
      4    |     2    | Steve
      5    |     2    |  Tim

Notemos un par de cosas. Las palabras AUTO UNIÓN no ocurren en ninguna parte. Eso es porque un AUTO UNIÓN es solo un concepto. La palabra ÚNETE en la consulta anterior podría haber sido LEFT JOIN en cambio, habrían sucedido cosas diferentes. El punto de AUTO UNIÓN es que estás usando la misma tabla dos veces.

Considere mi caja de jabón de antes en conjuntos de datos. Aquí hemos comenzado dos veces con el conjunto de datos de la tabla PERSONA. Ninguna instancia del conjunto de datos afecta al otro a menos que digamos que lo hace.

Empecemos por la parte inferior de la consulta. El por El conjunto de datos se limita solo a aquellas filas donde PERSONID =4. Conociendo la tabla, sabemos que devolverá exactamente una fila. La columna FAMILYID en esa fila tiene un valor de 2.

En la cláusula ON estamos limitando la fam conjunto de datos (que en este punto sigue siendo la tabla PERSONA completa) a solo aquellas filas donde el valor de FAMILYID coincide con uno o más de los FAMILYID del per conjunto de datos Como comentamos, conocemos el per el conjunto de datos solo tiene una fila, por lo tanto, un valor FAMILYID. Por lo tanto, la fam el conjunto de datos ahora contiene solo filas donde FAMILYID =2.

Finalmente, en la parte superior de la consulta estamos SELECCIONANDO todas las filas en la fam conjunto de datos.

¡Voila! Dos consultas en una.

En conclusión, un INNER JOIN es uno de varios tipos de operaciones JOIN. Lo haría fuertemente Sugerimos leer más en LEFT, RIGHT y FULL OUTER JOIN (que, en conjunto, se denominan OUTER JOIN). ). ¡Personalmente perdí una oportunidad de trabajo por tener un conocimiento débil de OUTER JOIN una vez y no dejaré que vuelva a suceder!

UNA UNIÓN PROPIA es simplemente cualquier operación JOIN en la que está relacionando una tabla consigo misma. La forma en que elija UNIR esa tabla a sí misma puede usar un INNER JOIN o una UNIÓN EXTERNA. Tenga en cuenta que con AUTO UNIÓN , para no confundir su motor SQL, debe use alias de tabla (fam y per de arriba. Invente lo que tenga sentido para su consulta) o no hay forma de diferenciar las diferentes versiones de la misma mesa.

Ahora que comprende la diferencia, abra su mente de manera amplia y comprensible que una sola consulta podría contener todos los tipos diferentes de JOIN a la vez. Es solo una cuestión de qué datos desea y cómo tiene que torcer y modificar su consulta para obtenerlos. Si se encuentra ejecutando una consulta y tomando el resultado de esa consulta y usándolo como entrada de otra consulta, probablemente pueda usar JOIN para convertirlo en una consulta en su lugar.

Para jugar con SQL, intente visitar W3Schools.com Hay una base de datos almacenada localmente allí con un montón de tablas que están diseñadas para relacionarse entre sí de varias maneras y ¡está llena de datos! Puede CREAR, SOLTAR, INSERTAR, ACTUALIZAR y SELECCIONAR todo lo que desee y devolver la base de datos a su valor predeterminado en cualquier momento. Pruebe todo tipo de SQL para experimentar con diferentes trucos. Yo mismo he aprendido mucho allí.

Lo siento si esto fue un poco prolijo, pero personalmente luché con el concepto de JOIN cuando estaba comenzando a aprender SQL y explicar un concepto usando un montón de otros conceptos complejos me atascó. A veces es mejor empezar desde abajo.

Espero que ayude. Si puede poner JOIN en su bolsillo trasero, ¡puede hacer magia con SQL!

¡Feliz consulta!