在開始了解子查詢之前,首先做下准備工作,建立3個表,
一個是customers表,其中包括:客戶名字、客戶ID、客戶Tel等。 一個是orders表,其中包括:訂單號、客戶ID、訂單時間等。 一個是ordersitems表,其中包括:訂單物品、訂單號、物品數量。
建customers表的命令如下,其它的表與之類似:
create table customers(cust_name varchar(10),cust_id int(10),cust_tel varchar(10));
為customers表插入內容的命令如下,其它的與子類似:
insert into customers values('wu',2,'1387234');
最後三個表的內容截圖如下:
前面我們所學的東西都是簡單的查詢,即從單個數據庫表中檢索數據的單條語句。
到底什麼是子查詢呢?通過下面這個例子,相信我們就更好的理解了。
上面我們建了三個表,分別為customers/orders/ordersitems.
現在,假如,我們想看下訂購了物品 apple的所有客戶信息,應該怎樣檢索呢?
下面列出具體的步驟:
第一步:在ordersitems表中找出包含有apple的訂單號order_id. 第二步:根據上一步查找的結果,找出訂單號為order_id的客戶ID(cust_id). 最後:根據上一步查找的結果,在customers表中根據客戶ID(cust_id)找出客戶信息。
現在我們按照步驟來查詢下,觀察下結果:
從上面可以看出,我們就是按照步驟,將第一步的結果當做第二步的條件來進行查詢,將第二步的結果直接作為第三步的條件來進行查詢,最後得到最終的結果。
現在,我們分別把第一個子查詢(返回訂單號的那一個)變為子查詢組合到第二個查詢中。
第一個查詢的代碼如下:
select order_id from ordersitems where content='apple';
作為子查詢組合到第二個查詢後的代碼如下:
select cust_id from orders where order_id in ( select order_id from ordersitems where content='apple' );
結果如下,從結果可以看出,與我們單個查詢的結果是一致的:
現在,我們就把上面的查詢作為子查詢組合到第三個查詢中,代碼如下:
select cust_name,cust_tel from customers where cust_id in( select cust_id from orders where order_id in( select order_id from ordersitems where content='apple') ) );
注意:包含子查詢的select語句難以閱讀和調試,特別是他們較為復雜時。如上所示把子查詢分解為多行並且適當地進行縮進,能極大地簡化子查詢的使用。
在where子句中使用子查詢能夠編寫出功能很強並且很靈活的SQL語句。對於能嵌套的子查詢的數目沒有限制,不過在實際使用時由於性能的限制,不能嵌套太多的子查詢。
注意:在子查詢中,列必須匹配
上面介紹的都是作為條件使用子查詢,下面就介紹下作為計算字段使用子查詢。
還是以一個例子來進行說明。
假如需要顯示customers表中每個客戶的訂單總數。
為執行這個操作,步驟如下:
從customers表中檢索客戶列表 對於檢索出的每個客戶,統計其在orders表中的訂單數目。
例如:查詢客戶id=1的訂單數的命令如下:
select count(*) as order_total from orders where cust_id=1;
將上面的命令作為字段的子查詢的代碼如下:
select cust_name,cust_tel,(select count(*) from orders where orders.cust_id==customers.cust_id) from customers ;
子查詢可以理解為嵌套,這裡方便理解一點。但是在我們使用子查詢的過程中,要先分步驟來完成,然後將子查詢一個一個的組合起來,直到這個子查詢加入之後得到的結果是符合要求的,然後繼續將下一個子查詢組合進行直至完成所有的子查詢都全部正確的加入。