在一個SQL語句中嵌套另外一個sql語句稱為子查詢
而這個查詢語句作為另一個查詢語句它的條件,其中包含其他sql語句的這個sql語句稱為父查詢
示例如下
如果需要查詢商品類别中為圖書的所有商品id,名稱,價格
select id,name,price from es_product
where sort_id =(
select id from es_sort where sortname=
'圖書' )
在where條件中子查詢的一般實作步驟如下:
1.我們得先知道需要查詢的是什麼,明确要顯示的結果
比如說我們上述的就是id,name,price
2.結果來源于哪裡
顯然這些商品的相關資訊來自于商品表es_product
3.需要的查詢條件是什麼
這裡需要的是查詢分類為圖書,就是sort_id=(圖書類别id)
4.條件中需要的值來源于哪裡
它來自于一個子查詢
sort_id=(SELECT id FROM es_sort WHERE sortname =' 圖書')
5.最後子查詢的sql語句就自然而然出來了
又例如,我們要查詢以李青青為下單人的訂單号,收貨方式以及訂單狀态
1.明确顯示的結果 id,payment,status
2.結果來自于哪裡 es_order
3.需要的條件 user_id=('李青青'的id)
4.這個條件需要的值來自于一個子查詢
user_id =(select id from es_user where realname='李青青')
以上說的子查詢都是傳回的是單行結果,是以使用了=的操作符,
其實我們可以使用>\>=\\!=的操作符
例如,我們要編寫sql語句,查詢大于商品平均價格的商品id,名稱,價格
select id,name,price from es_product
where price>(select avg(price) as 商品平均價格 from es_product)
但是有時子查詢傳回的結果可能不止一行
比如要查詢一号訂單下的所有商品id,商品名稱和價格
我們使用=操作符的時候,會報一個錯誤
我們應進行這樣的修改
将=操作符改為in,即
select id,name,price from es_product
where id in(select prod_id from es_orderdetail where order_id=1)
除了使用in我們還可以使用any,all,exists
另外我們需要查詢商品表中前5條商品的id,商品名稱以及上架時間
要實作這個需求,我們首先要知道有ROWNUM這個内容
知道了ROWNUM,SQL就出來了
select id,name,saledate from es_product where rownum<=5
需求繼續更新,我們這次要查詢最新上架的前五條商品的記錄,很可能大家會這樣寫
但這是錯誤的,錯誤的原因是
select的執行順序
它總是先執行where子句再執行order by語句
而我們的要求是先對表的記錄進行排序,再取前五條記錄
其思路如下
如果有排序,先把排序後的表當成一個虛拟表,再進行操作
上述需求的SQL語句如下
select id,name,saledate,rownum from(select * from es_product order by saledate desc) where rownum<=5
切記rownum是動态生成的,在表實體中不存在,是以諸如saledate.rownum并不存在