MySQL學習足跡記錄12--使用子查詢 1.子查詢(subquery):即嵌套在其他查詢中的查詢 原始數據如下:
mysql> SELECT order_num FROM orderitems; +-----------+ | order_num | +-----------+ | 20005 | | 20005 | | 20009 | | 20005 | | 20009 | | 20008 | | 20006 | | 20009 | | 20009 | | 20005 | | 20007 | +-----------+ 11 rows in set (0.01 sec) mysql> SELECT cust_id FROM orders; +---------+ | cust_id | +---------+ | 10001 | | 10001 | | 10003 | | 10004 | | 10005 | +---------+ 5 rows in set (0.01 sec) 現在先分步查詢 step1: mysql> SELECT order_num -> FROM orderitems -> WHERE prod_id = 'TNT2'; +-----------+ | order_num | +-----------+ | 20005 | | 20007 | +-----------+ 2 rows in set (0.00 sec) step2: mysql> SELECT cust_id FROM orders -> WHERE order_num IN( 20005,20007); +---------+ | cust_id | +---------+ | 10001 | | 10004 | +---------+ 2 rows in set (0.00 sec) Step3: 使用子查詢把step1,step2組合起來(即把20005,20007換掉) mysql> SELECT cust_id -> FROM orders -> WHERE order_num IN( SELECT order_num -> FROM orderitems -> WHERE prod_id = 'TNT2'); +---------+ | cust_id | +---------+ | 10001 | | 10004 | +---------+ 2 rows in set (0.00 sec) TIPS: 在SELECT語句中,子查詢總是從內向外處理的。 子查詢可以嵌套多重 step4: mysql> SELECT cust_name,cust_contact -> FROM customers -> WHERE cust_id IN (10001,10004); #(10001,10004)既是step3查詢的結果 +----------------+--------------+ | cust_name | cust_contact | +----------------+--------------+ | Coyote Inc. | Y Lee | | Yosemite Place | Y Sam | +----------------+--------------+ 2 rows in set (0.01 sec) step5:把step4的IN (10001,10004)換成子查詢 mysql> SELECT cust_name,cust_contact -> FROM customers -> WHERE cust_id IN (SELECT cust_id -> FROM orders -> WHERE order_num IN (SELECT order_num -> FROM orderitems -> WHERE prod_id = 'TNT2')); +----------------+--------------+ | cust_name | cust_contact | +----------------+--------------+ | Coyote Inc. | Y Lee | | Yosemite Place | Y Sam | +----------------+--------------+ 2 rows in set (0.00 sec)
2.計算字段使用子查詢 原始數據
mysql> SELECT cust_id FROM orders; +---------+ | cust_id | +---------+ | 10001 | | 10001 | | 10003 | | 10004 | | 10005 | +---------+ 5 rows in set (0.01 sec) mysql> SELECT cust_id FROM customers; +---------+ | cust_id | +---------+ | 10001 | | 10002 | | 10003 | | 10004 | | 10005 | +---------+ 5 rows in set (0.00 sec) mysql> SELECT cust_id,(SELECT COUNT(*) FROM orders -> WHERE orders.cust_id = customers.cust_id) AS orders -> FROM customers -> ORDER BY cust_id; +---------+--------+ | cust_id | orders | +---------+--------+ | 10001 | 2 | | 10002 | 0 | | 10003 | 1 | | 10004 | 1 | | 10005 | 1 | +---------+--------+ 5 rows in set (0.00 sec)
TIPS: 子查詢最常見的使用是在WHERE子句的IN操作符中,以及用來填充計算列