天天看點

oracle資料庫查詢下級_Oracle資料庫進階查詢(一)子查詢

在一個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,商品名稱和價格

我們使用=操作符的時候,會報一個錯誤

oracle資料庫查詢下級_Oracle資料庫進階查詢(一)子查詢

我們應進行這樣的修改

将=操作符改為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這個内容

oracle資料庫查詢下級_Oracle資料庫進階查詢(一)子查詢

知道了ROWNUM,SQL就出來了

select id,name,saledate from es_product where rownum<=5

需求繼續更新,我們這次要查詢最新上架的前五條商品的記錄,很可能大家會這樣寫

oracle資料庫查詢下級_Oracle資料庫進階查詢(一)子查詢

但這是錯誤的,錯誤的原因是

select的執行順序

它總是先執行where子句再執行order by語句

而我們的要求是先對表的記錄進行排序,再取前五條記錄

其思路如下

oracle資料庫查詢下級_Oracle資料庫進階查詢(一)子查詢

如果有排序,先把排序後的表當成一個虛拟表,再進行操作

上述需求的SQL語句如下

select id,name,saledate,rownum from(select * from es_product order by saledate desc) where rownum<=5

切記rownum是動态生成的,在表實體中不存在,是以諸如saledate.rownum并不存在