Problema:
Ti piacerebbe visualizzare i dati di determinate colonne (di un tipo di dati simile) da due tabelle in SQL.
Esempio:
Ci sono due tabelle nel nostro database:employee e customer .
Il employee la tabella contiene i dati nelle seguenti colonne:id , nome , cognome e età .
| id | nome | cognome | età |
|---|---|---|---|
| 1 | Tom | Mugnaio | 22 |
| 2 | Giovanni | Smith | 26 |
| 3 | Lisa | Williams | 30 |
| 4 | Carlo | Davis | 21 |
| 5 | Giacomo | More | 22 |
Il customer la tabella contiene i dati nelle seguenti colonne:id , nome , cognome e età .
| id | nome | cognome | età |
|---|---|---|---|
| 1 | Milano | Smith | 45 |
| 2 | Carlo | Davis | 21 |
| 3 | Segna | Sostenitore | 19 |
In un set di risultati, mostriamo il nome, il cognome e l'età di tutte le persone nel database, sia dipendenti che clienti.
Soluzione 1:
Useremo UNION ALL per unire i dati dalle colonne in due tabelle.
Ecco la domanda che scriveresti:
SELECT first_name, last_name, age FROM employee UNION ALL SELECT first_name, last_name, age FROM customer;
Ecco il risultato:
| first_name | cognome | età |
|---|---|---|
| Tom | Mugnaio | 22 |
| Giovanni | Fabio | 26 |
| Lisa | Williams | 30 |
| Charles | Davis | 21 |
| Giacomo | More | 28 |
| Milano | Fabio | 45 |
| Charles | Davis | 21 |
| Segna | Sostenitore | 19 |
Discussione:
Utilizzare la clausola UNION ALL per unire i dati dalle colonne in due o più tabelle. Nel nostro esempio, uniamo i dati del employee e customer tavoli. A sinistra della parola chiave UNION ALL, inserisci la prima istruzione SELECT per ottenere i dati dalla prima tabella (nel nostro esempio, la tabella employee ). A destra, usa un'altra istruzione SELECT per ottenere i dati dalla seconda tabella (nel nostro esempio, customer ).
Ricorda che i dati selezionati in entrambe le tabelle devono essere dello stesso tipo di dati in ogni colonna. Ad esempio, se la prima colonna nel primo SELECT è un tipo di dati stringa, anche la prima colonna nel secondo SELECT deve essere un tipo di dati stringa. Se la seconda colonna nella prima istruzione SELECT è un numero intero, anche la seconda colonna nella seconda tabella deve essere di tipo intero.
Nella prima query, abbiamo selezionato l'età (l'età del dipendente, che è un tipo di dati intero) per la terza colonna. Pertanto, anche la terza colonna nel secondo SELECT è un valore intero; è l'età del cliente.
Le seconde colonne in entrambe le istruzioni SELECT sono dello stesso tipo di dati. Tuttavia, se i valori sono gli stessi in entrambe le tabelle, verranno visualizzati più volte; ad esempio, "Charles Davis 21" viene mostrato due volte nel set di risultati.
E se non si desiderassero più record identici nella tabella dei risultati? In questo caso, usa UNION . È simile a UNION ALL , ma rimuove i record duplicati. Guarda il seguente esempio.
Soluzione 2:
Ecco la query che evita i record duplicati:
SELECT first_name, last_name FROM employee UNION SELECT first_name, last_name FROM customer;
Ecco il risultato della query precedente:
| first_name | cognome |
|---|---|
| Marco | Sostenitore |
| Giacomo | More |
| Giovanni | Smith |
| Carlo | Davis |
| Milano | Fabio |
| Tom | Mugnaio |
| Lisa | Williams |
Nota:
UNION ALL è più veloce di UNION , ma UNION rimuove le righe duplicate. La scelta dipende dai dati del risultato di cui abbiamo bisogno.