UNION
Fa parte della sezione Fondamenti del percorso SQL di Coddy. Lezione 48 di 72.
Le unioni sono diverse dai join. I join usano condizioni per combinare le tabelle, mentre le unioni si limitano ad aggiungere una tabella all’altra. Per usare UNION, scriveremo:
SELECT col1, col2, ... FROM table1
UNION
SELECT col1, col2, ... FROM table2Entrambi i comandi SELECT devono rispettare le seguenti regole:
- Il numero di colonne deve essere uguale
- L'ordine è importante
- Le colonne nella stessa posizione devono contenere lo stesso tipo di dati (SQLite non ne verifica i tipi)
Ad esempio, supponiamo di avere le seguenti tabelle:
germany_people
| id | name |
| 1 | Lena |
| 2 | Leonie |
england_people
| id | name |
| 1 | George |
| 2 | Lena |
Problema: vogliamo creare un'unica grande tabella con tutti i nomi che abbiamo.
SELECT name from germany_people
UNION
SELECT name from england_peopleRisultato:
| nome |
| Lena |
| Leonie |
| George |
UNION restituisce solo valori distinti, mentre UNION ALL restituisce tutti i record così come sono:
SELECT name from germany_people
UNION ALL
SELECT name from england_peopleRisultato:
| name |
| Lena |
| Leonie |
| George |
| Lena |
Puoi anche combinare UNION ALL con le funzioni di aggregazione, GROUP BY e ORDER BY per riepilogare i dati di più tabelle. Il trucco consiste nell racchiudere UNION ALL in una sottoquery, quindi applicare il raggruppamento e l'ordinamento.
Per esempio, supponiamo di voler contare quante volte compare ogni nome in entrambe le tabelle:
SELECT name, COUNT(*) AS total_count
FROM (
SELECT name FROM germany_people
UNION ALL
SELECT name FROM england_people
) AS combined
GROUP BY name
ORDER BY total_count DESCRisultato:
| name | total_count |
| Lena | 2 |
| Leonie | 1 |
| George | 1 |
Qui si usa UNION ALL (non UNION) affinché i duplicati come Lena vengano mantenuti. Altrimenti verrebbero rimossi prima del conteggio. La sottoquery unisce tutte le righe e poi GROUP BY + COUNT le riepilogano. ORDER BY ordina il risultato finale.
Sfida
FacileTabelle e colonne disponibili:
sales_2009:product_id,quantity_soldsales_2010:product_id,quantity_soldsales_2011:product_id,quantity_sold
Ci sono 3 tabelle di vendita.
Trova la somma delle vendite per ogni prodotto considerando tutte le tabelle insieme.
Il risultato deve includere product_id e le vendite totali.
Assegna a questa colonna il nome total_sales.
Ordina i risultati in base alle vendite totali, in ordine decrescente.
Provalo tu
-- Unisci le tre tabelle in un unico risultato, mantenendo tutte le righe
SELECT product_id, ____ AS total_sales
FROM (
SELECT * FROM sales_2009
____
SELECT * FROM sales_2010
____
SELECT * FROM sales_2011
)
-- Una riga per prodotto, con il totale più alto per primo
GROUP BY ____
ORDER BY ____ DESC;Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Fondamenti
4Altre parole chiave
La parola chiave INLa parola chiave BETWEENLa parola chiave LIKELa parola chiave ASRiepilogo - Modelli di telefoni cellulari2Condizioni
Basi delle condizioniLa parola chiave ANDLa parola chiave ORLa parola chiave NOTCombinare più condizioniParentesiValori booleani5Operazioni aritmetiche
Operatori matematiciColonne matematicheL’operazione moduloLa funzione ROUND()3Formato di restituzione specifico
Valori nullOrdinare i risultati Parte 1Ordinare i risultati Parte 2Riepilogo - Azienda di sicurezza informaticaLimitare il numero di recordRiepilogo - Fabbrica di veicoli6Sfide introduttive
Ripasso - Elezione parlamentareRipasso - Arresto di un criminale da parte della poliziaRipasso - Contenitore per bevande da barRipasso - Progetta nuove colonne9Tabelle multiple
JOIN di base, parte 1JOIN di base, parte 2Riepilogo - JOINSelf joinRiepilogo - Self joinUNIONSemplificare le query, parola chiave WITHRiepilogo - Query con WITHRiepilogo - Impresa edile immobiliare12Funzioni finestra, parte 2
Funzioni RANK e DENSE_RANKRipasso: RANK e DENSE_RANKFunzione NTILEFunzioni di aggregazioneCriteri ROWS e RANGEEsercitati da solo: Playground SQL