SQLite Join
de SQLiteJoinLa cláusula se utiliza para combinar registros de dos o más tablas en la base de datos. JOIN es un medio para combinar campos de dos tablas mediante valores comunes.
SQL define tres tipos principales de combinaciones:
Combinación cruzada - CROSS JOIN
Combinación interna - INNER JOIN
Combinación externa - OUTER JOIN
Antes de continuar, supongamos que tenemos dos tablas: COMPANY y DEPARTMENT. Ya hemos visto las sentencias INSERT utilizadas para poblar la tabla COMPANY. Ahora supongamos que la lista de registros de la tabla COMPANY es la siguiente:
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 20000.0 2 Allen 25 Texas 15000.0 3 Teddy 23 Norway 20000.0 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0 6 Kim 22 South-Hall 45000.0 7 James 24 Houston 10000.0
La otra tabla es DEPARTMENT, definida de la siguiente manera:
CREATE TABLE DEPARTMENT( ID INT PRIMARY KEY NOT NULL, DEPT CHAR(50) NOT NULL, EMP_ID INT NOT NULL );
A continuación se muestran las sentencias INSERT para poblar la tabla DEPARTMENT:
INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID) VALUES (1, 'IT Billing', 1 ); INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID) VALUES (2, 'Engineering', 2 ); INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID) VALUES (3, 'Finance', 7 );
Finalmente, tenemos la siguiente lista de registros en la tabla DEPARTMENT:
ID DEPT EMP_ID ---------- ---------- ---------- 1 IT Billing 1 2 Engineerin 2 3 Finance 7
Combinación cruzada - CROSS JOIN
La combinación cruzada (CROSS JOIN) empareja cada fila de la primera tabla con cada fila de la segunda tabla. Si las dos tablas de entrada tienen x e y filas respectivamente, la tabla resultante tendrá x*y filas. Dado que la combinación cruzada (CROSS JOIN) puede producir tablas muy grandes, se debe usar con precaución y solo cuando sea apropiado.
La operación de combinación cruzada devuelve el producto cartesiano de todas las filas de datos de las dos tablas combinadas. El número de filas devuelto es igual al número de filas que cumplen la condición de consulta en la primera tabla multiplicado por el número de filas que cumplen la condición de consulta en la segunda tabla.
A continuación se muestra la sintaxis de la combinación cruzada (CROSS JOIN):
SELECT ... FROM table1 CROSS JOIN table2 ...
Basándonos en las tablas anteriores, podemos escribir una combinación cruzada (CROSS JOIN) de la siguiente manera:
sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;
La consulta anterior producirá el siguiente resultado:
EMP_ID NAME DEPT ---------- ---------- ---------- 1 Paul IT Billing 2 Paul Engineerin 7 Paul Finance 1 Allen IT Billing 2 Allen Engineerin 7 Allen Finance 1 Teddy IT Billing 2 Teddy Engineerin 7 Teddy Finance 1 Mark IT Billing 2 Mark Engineerin 7 Mark Finance 1 David IT Billing 2 David Engineerin 7 David Finance 1 Kim IT Billing 2 Kim Engineerin 7 Kim Finance 1 James IT Billing 2 James Engineerin 7 James Finance
Combinación interna - INNER JOIN
La combinación interna (INNER JOIN) crea una nueva tabla de resultados combinando los valores de las columnas de dos tablas (table1 y table2) según un predicado de combinación. La consulta compara cada fila de table1 con cada fila de table2 y encuentra todos los pares de filas que cumplen el predicado de combinación. Cuando se cumple el predicado, los valores de las columnas de cada par coincidente de filas A y B se fusionan en una fila de resultado.
La combinación interna (INNER JOIN) es el tipo de combinación más común y es el tipo de combinación predeterminado. La palabra clave INNER es opcional.
A continuación se muestra la sintaxis de la combinación interna (INNER JOIN):
SELECT ... FROM table1 [INNER] JOIN table2 ON conditional_expression ...
Para evitar redundancia y mantener una redacción más breve, se puede usarUSINGuna expresión para declarar la condición de la combinación interna (INNER JOIN). Esta expresión especifica una lista de una o más columnas:
SELECT ... FROM table1 JOIN table2 USING ( column1 ,... ) ...
La combinación natural (NATURAL JOIN) es similar aJOIN...USINGsolo que comprueba automáticamente la igualdad de valores entre cada columna que existe en ambas tablas:
SELECT ... FROM table1 NATURAL JOIN table2...
Basándonos en las tablas anteriores, podemos escribir una combinación interna (INNER JOIN) de la siguiente manera:
sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
La consulta anterior producirá el siguiente resultado:
EMP_ID NAME DEPT ---------- ---------- ---------- 1 Paul IT Billing 2 Allen Engineerin 7 James Finance
Combinación externa - OUTER JOIN
La combinación externa (OUTER JOIN) es una extensión de la combinación interna (INNER JOIN). Aunque el estándar SQL define tres tipos de combinaciones externas: LEFT, RIGHT y FULL, SQLite solo admitela combinación externa izquierda (LEFT OUTER JOIN)。
La forma de declarar la condición en la combinación externa (OUTER JOIN) es la misma que en la combinación interna (INNER JOIN), utilizando las palabras clave ON, USING o NATURAL. La tabla de resultados inicial se calcula de la misma manera. Una vez que se completa la combinación principal, la combinación externa (OUTER JOIN) incorpora cualquier fila no combinada de una o ambas tablas, utilizando valores NULL para las columnas de la combinación externa, y las agrega a la tabla de resultados.
A continuación se muestra la sintaxis de la combinación externa izquierda (LEFT OUTER JOIN):
SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...
Para evitar redundancia y mantener una redacción más breve, se puede usarUSINGuna expresión para declarar la condición de la combinación externa (OUTER JOIN). Esta expresión especifica una lista de una o más columnas:
SELECT ... FROM table1 LEFT OUTER JOIN table2 USING ( column1 ,... ) ...
Basándonos en las tablas anteriores, podemos escribir una combinación externa (OUTER JOIN) de la siguiente manera:
sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
La consulta anterior producirá el siguiente resultado:
EMP_ID NAME DEPT
---------- ---------- ----------
1 Paul IT Billing
2 Allen Engineerin
Teddy
Mark
David
Kim
7 James Finance
Otras extensiones