MySQL中,子查詢是指在主查詢中嵌套執行的查詢語句。子查詢可以通過選擇一組數據作為一個虛擬表格,然后在父查詢中使用這個表格進行查詢與限制。
子查詢可以嵌套多個查詢,因為MySQL的執行順序是先執行內層查詢,再執行外層查詢。例如下面這個例子:
SELECT * FROM orders WHERE customer_id IN ( SELECT customer_id FROM customers WHERE country = 'China' AND city = 'Beijing' );
在這個例子中,內層SELECT語句先執行,它從customers表格中挑選了符合條件的customer_id,然后把這些ID傳遞給外層SELECT,最終篩選出符合條件的訂單信息。
子查詢可以用在不同的語句中,例如SELECT、UPDATE、DELETE等,只要子查詢能返回一個結果集。子查詢的結果集可以是單個值、一行多列的值、多行多列的值等等。
-- 查詢customers表格中最年輕的客戶名字 SELECT name FROM customers WHERE customer_id = ( SELECT MIN(customer_id) FROM customers ); -- 將orders表格中所有成交金額大于1000的訂單都取消 DELETE FROM orders WHERE order_id IN ( SELECT order_id FROM order_details WHERE price * quantity >1000 );
當然,在實際應用中,我們需要掌握子查詢的優化技巧。尤其要注意的是,子查詢通常會導致性能問題,因為它需要反復掃描表格,產生大量的I/O操作。因此,盡量避免在WHERE語句中使用子查詢,可以使用JOIN語句代替;在使用子查詢時,盡量使用EXISTS或NOT EXISTS語句替代IN或NOT IN語句,因為EXISTS語句只需判斷是否存在結果集中的記錄,而IN語句則需要比較結果集中的每一條記錄。