SQLite - JOINS

SQLite Joinsviene utilizzata per combinare i record di due o più tabelle in un database. Un JOIN è un mezzo per combinare i campi di due tabelle utilizzando valori comuni a ciascuna.

SQL definisce tre principali tipi di join:

  • La CROCE JOIN
  • L'INNER JOIN
  • L'ESTERNO JOIN

Prima di procedere, consideriamo due tabelle AZIENDA e REPARTO. Abbiamo già visto le istruzioni INSERT per popolare la tabella COMPANY. Quindi supponiamo che l'elenco dei record disponibili nella tabella AZIENDA -

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

Un'altra tabella è DEPARTMENT con la seguente definizione:

CREATE TABLE DEPARTMENT(
   ID INT PRIMARY KEY      NOT NULL,
   DEPT           CHAR(50) NOT NULL,
   EMP_ID         INT      NOT NULL
);

Ecco l'elenco delle istruzioni INSERT per popolare la tabella 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 );

Infine, abbiamo il seguente elenco di record disponibili nella tabella DEPARTMENT:

ID          DEPT        EMP_ID
----------  ----------  ----------
1           IT Billing  1
2           Engineering 2
3           Finance     7

La CROCE JOIN

CROSS JOIN abbina ogni riga della prima tabella con ogni riga della seconda tabella. Se le tabelle di input hanno rispettivamente una riga x e y, la tabella risultante avrà una riga x * y. Poiché i CROSS JOIN hanno il potenziale per generare tabelle estremamente grandi, è necessario prestare attenzione a utilizzarli solo quando appropriato.

Di seguito è riportata la sintassi di CROSS JOIN -

SELECT ... FROM table1 CROSS JOIN table2 ...

Sulla base delle tabelle sopra, puoi scrivere un CROSS JOIN come segue:

sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;

La query precedente produrrà il seguente risultato:

EMP_ID      NAME        DEPT
----------  ----------  ----------
1           Paul        IT Billing
2           Paul        Engineering
7           Paul        Finance
1           Allen       IT Billing
2           Allen       Engineering
7           Allen       Finance
1           Teddy       IT Billing
2           Teddy       Engineering
7           Teddy       Finance
1           Mark        IT Billing
2           Mark        Engineering
7           Mark        Finance
1           David       IT Billing
2           David       Engineering
7           David       Finance
1           Kim         IT Billing
2           Kim         Engineering
7           Kim         Finance
1           James       IT Billing
2           James       Engineering
7           James       Finance

L'INNER JOIN

INNER JOIN crea una nuova tabella dei risultati combinando i valori di colonna di due tabelle (table1 e table2) in base al predicato di join. La query confronta ogni riga di table1 con ogni riga di table2 per trovare tutte le coppie di righe che soddisfano il predicato di join. Quando il predicato di join è soddisfatto, i valori di colonna per ciascuna coppia di righe di A e B abbinate vengono combinati in una riga di risultati.

Un INNER JOIN è il tipo di join più comune e predefinito. Puoi utilizzare la parola chiave INNER facoltativamente.

Di seguito è riportata la sintassi di INNER JOIN -

SELECT ... FROM table1 [INNER] JOIN table2 ON conditional_expression ...

Per evitare ridondanze e mantenere la frase più breve, le condizioni INNER JOIN possono essere dichiarate con a USINGespressione. Questa espressione specifica un elenco di una o più colonne.

SELECT ... FROM table1 JOIN table2 USING ( column1 ,... ) ...

UN NATURAL JOIN è simile a un file JOIN...USING, solo che verifica automaticamente l'uguaglianza tra i valori di ogni colonna presente in entrambe le tabelle -

SELECT ... FROM table1 NATURAL JOIN table2...

Sulla base delle tabelle sopra, puoi scrivere un INNER JOIN come segue:

sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT
   ON COMPANY.ID = DEPARTMENT.EMP_ID;

La query precedente produrrà il seguente risultato:

EMP_ID      NAME        DEPT
----------  ----------  ----------
1           Paul        IT Billing
2           Allen       Engineering
7           James       Finance

L'ESTERNO JOIN

OUTER JOIN è un'estensione di INNER JOIN. Sebbene lo standard SQL definisca tre tipi di OUTER JOIN: LEFT, RIGHT e FULL, SQLite supporta soloLEFT OUTER JOIN.

OUTER JOIN hanno una condizione identica a INNER JOIN, espressa utilizzando una parola chiave ON, USING o NATURAL. La tabella dei risultati iniziali viene calcolata allo stesso modo. Una volta calcolato il JOIN primario, un OUTER JOIN prenderà tutte le righe non unite da una o entrambe le tabelle, le riempirà con NULL e le aggiungerà alla tabella risultante.

Di seguito è riportata la sintassi di LEFT OUTER JOIN -

SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...

Per evitare ridondanza e mantenere la frase più breve, le condizioni OUTER JOIN possono essere dichiarate con un'espressione USING. Questa espressione specifica un elenco di una o più colonne.

SELECT ... FROM table1 LEFT OUTER JOIN table2 USING ( column1 ,... ) ...

Sulla base delle tabelle precedenti, puoi scrivere un inner join come segue:

sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT
   ON COMPANY.ID = DEPARTMENT.EMP_ID;

La query precedente produrrà il seguente risultato:

EMP_ID      NAME        DEPT
----------  ----------  ----------
1           Paul        IT Billing
2           Allen       Engineering
            Teddy
            Mark
            David
            Kim
7           James       Finance