SQL: sottoquery vs JOIN

Dec 19 2022
Subquery e join sono due concetti importanti in SQL, il linguaggio di programmazione standard per la gestione e la manipolazione dei database. In questo blog, esploreremo cosa sono le sottoquery e i join, in che modo differiscono e quando utilizzarli nelle query SQL.

Subquery e join sono due concetti importanti in SQL, il linguaggio di programmazione standard per la gestione e la manipolazione dei database. In questo blog, esploreremo cosa sono le sottoquery e i join, in che modo differiscono e quando utilizzarli nelle query SQL.

Cosa sono le sottoquery?

Una sottoquery è una query all'interno di una query. È un modo per nidificare un'istruzione SELECT all'interno di un'altra istruzione SELECT, INSERT, UPDATE o DELETE o all'interno di un'istruzione CREATE VIEW. Le sottoquery possono essere utilizzate per eseguire una varietà di attività, come:

  • Filtrare le righe in base a una condizione
  • Calcolo dei valori da utilizzare nella query esterna
  • Restituzione di un singolo valore o di più valori come parte della query esterna

Un join è un modo per combinare le righe di due o più tabelle in base a una colonna correlata tra di esse. Esistono diversi tipi di join, tra cui INNER JOIN, OUTER JOIN e CROSS JOIN.

Un INNER JOIN restituisce solo le righe che soddisfano la condizione di join.

Un OUTER JOIN restituisce tutte le righe di entrambe le tabelle, incluse quelle che non soddisfano la condizione di join. Esistono due tipi di outer join: LEFT JOIN e RIGHT JOIN. Un LEFT JOIN restituisce tutte le righe della tabella di sinistra (la prima tabella nella query) e tutte le righe corrispondenti della tabella di destra. Un RIGHT JOIN restituisce tutte le righe della tabella di destra (la seconda tabella nella query) e tutte le righe corrispondenti della tabella di sinistra.

Un CROSS JOIN restituisce il prodotto cartesiano delle due tabelle, che è una combinazione di tutte le righe di entrambe le tabelle.

Esempio pratico:

In questo scenario, abbiamo un database di Hogwarts e le seguenti tabelle sono elencate di seguito:

  • course_table: questa tabella contiene i dati relativi ai nomi dei corsi ed è identificata utilizzando una chiave primaria univoca
  • student_table: questa tabella contiene i dati relativi ai nomi degli studenti identificati da una chiave primaria univoca
  • enrollment_table: questa tabella è la tabella JOIN che stabilisce la relazione tra studenti e corsi. Ogni volta che uno studente si iscrive a un corso viene creato un nuovo record. il course_id è la chiave esterna per identificare un corso dal course_table, e il student_id è una chiave esterna per identificare uno studente dal student_table.
  • course: 
    +─────+────────────────────────────────+
    | id  | course                         |
    +─────+────────────────────────────────+
    | 1   | Defense against the dark arts  | 
    | 2   | Potions                        | 
    | 3   | History of magic               | 
    +─────+────────────────────────────────+
    
    
    student:
    +─────+────────────────────────────────+
    | id  | student                        |
    +─────+────────────────────────────────+
    | 1   | Harry Potter                   | 
    | 2   | Hermione Granger               | 
    | 3   | Ron Weasly                     |
    | 4   | Voldemort                      |   
    | 5   | Draco Malfoy                   |
    +─────+────────────────────────────────+
    
    enrollment:
    +─────+────────────+─────────────+
    | id  | course_id  | student_id  | 
    +─────+────────────+─────────────+
    | 1   | 1          | 1           | 
    | 2   | 2          | 1           |  
    | 3   | 3          | 2           |  
    | 4   | 2          | 3           | 
    | 5   | 3          | 4           | 
    | 6   | 1          | 5           |
    | 7   | 3          | 1           |   
    | 8   | 1          | 4           |  
    +─────+────────────+─────────────+
    
    
    

Di seguito è riportato un esempio dell'approccio Subquery.

SELECT * FROM enrollment
WHERE enrollment.course_id IN (SELECT * FROM courses WHERE course_id = 1);

GIUNTURA

Di seguito è elencato l'approccio Join.

SELECT * FROM course AS c 
  LEFT JOIN enrollment AS e ON c.id = e.course_id
WHERE e.course_id = 1

Quando utilizzare subquery e join

Sia le sottoquery che i join possono essere utilizzati per recuperare dati da più tabelle, ma hanno casi d'uso diversi. Le sottoquery vengono generalmente utilizzate quando si desidera utilizzare i risultati della query interna nella clausola WHERE o HAVING della query esterna. Sono inoltre utili quando si desidera restituire un singolo valore o più valori come parte della query esterna.

I join vengono generalmente utilizzati quando si desidera recuperare dati da più tabelle in base a una colonna correlata tra di esse. Sono inoltre utili quando si desidera restituire tutte le righe di entrambe le tabelle, incluse quelle che non corrispondono alla condizione di join.

In generale, le sottoquery tendono ad essere più efficienti quando è necessario restituire solo poche righe, mentre i join sono più efficienti quando è necessario restituire un numero elevato di righe. Tuttavia, la differenza di prestazioni tra i due può variare a seconda delle dimensioni delle tabelle e della complessità delle query.

In conclusione, sottoquery e join sono due strumenti importanti per recuperare dati da più tabelle in SQL. Le sottoquery sono utili per filtrare le righe e restituire valori come parte della query esterna, mentre i join sono utili per combinare righe da più tabelle in base a una colonna correlata. Entrambi possono essere utilizzati per raggiungere obiettivi simili, ma la scelta di quale utilizzare dipende dai requisiti specifici della query.