English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In questo tutorial, imparerai come嵌入 una query SQL in un'altra query.
La subquery, anche detta query annidata o subselezione, èSELECTIncorporata in un'altra query SQL WHERE o HAVINGQuery nella clausola. I dati restituiti dalla subquery vengono utilizzati dall'istruzione esterna, allo stesso modo in cui vengono utilizzati valori testuali.
La subquery offre un metodo semplice ed efficace per gestire le query che dipendono da un altro risultato di query. Sono quasi identici ai comuni statement SELECT, ma senza limitazioni. I punti più importanti sono i seguenti:
La sottoquery deve sempre apparire tra parentesi.}
La sottoquery deve restituire sempre una singola colonna. Questo significa che non è possibile utilizzare SELECT * nella sottoquery, a meno che il tavolo riferito abbia solo una colonna. Se l'obiettivo è la comparazione delle righe, è possibile utilizzare una sottoquery che restituisce più colonne.
È possibile utilizzare solo l'operatore di valore multipli di ritorno (ad esempioIN o NOT INoperatore) di più righe di sottoquery.
La sottoquery non può essereUNIONè permesso un solo'istruzione SELECT'.
La sottoquery viene utilizzata più spesso conSELECTpossono essere utilizzati insieme all'istruzioneINSERT,UPDATEoDELETEpossono essere utilizzate all'interno di un'istruzione o in un'altra sottoquery.
Le seguenti istruzioni restituiscono i dettagli dei clienti con un valore di ordine superiore a 5000 dollari nella tabella ordini. Degli注意的是,abbiamo utilizzato la parola chiaveDISTINCTI valori duplicati di cust_id sono stati rimossi dal risultato.
SELECT * FROM customers WHERE cust_id IN (SELECT DISTINCT cust_id FROM orders WHERE order_value > 5000);
Suggerimento:La sottoquery può restituire un singolo valore, una singola riga, una singola colonna o una tabella che contiene una o più righe o una o più colonne.
Attenzione:La sottoquery può essere annidata nell'esternoSELECT,INSERT,UPDATEoDELETEdellaWHEREoHAVINGla clausola può essere annidata in altre sottoquery.
La sottoquery può anche essere utilizzata con l'istruzione INSERT. Ecco un esempio:
INSERT INTO premium_customers SELECT * FROM customers WHERE cust_id IN (SELECT DISTINCT cust_id FROM orders WHERE order_value > 5000);
La seguente istruzione inserirà i record dei clienti premium nella tabella premium_customers utilizzando i dati restituiti dalla sottoquery. I clienti premium sono quelli che hanno effettuato un ordine con un valore superiore a 5000 dollari.
Suggerimento: consultareRiguardoSQL clonare la tabellaper capire come utilizzare l'istruzione INSERT ... SELECT per inserire rapidamente più righe da un'altra tabella nella tabella.
È possibile anche combinare la sottoquery con l'istruzione UPDATE per aggiornare una singola colonna o più colonne nella tabella, come mostrato di seguito:
UPDATE orders SET order_value = order_value + 10 WHERE cust_id IN (SELECT cust_id FROM customers WHERE postal_code = 75016);
Aumentando di 10 dollari il valore attuale dell'ordine, la frase sopra aggiornerà il valore dell'ordine dei clienti nella regione con il codice postale 75016 nel tavolo degli ordini (orders).
Inoltre, è possibile combinare la sottoricerca con la frase DELETE per eliminare una riga o più righe della tabella, come segue:
DELETE FROM orders DELETE FROM orders WHERE order_id IN (SELECT order_id FROM order_details WHERE product_id = 5);
La frase SQL dell'esempio sopra partirà da quelli che contengonoproduct_idEliminare questi ordini dal tavolo degli ordini dei prodotti per 5.