Oracle資料庫 三 子查詢和連線

2021-08-15 17:38:33 字數 4552 閱讀 3211

使用子查詢

什麼是子查詢?子查詢就是巢狀查詢,它是巢狀在另乙個語句中的select語句。在很多情況下,where後面的條件不是乙個確切的值或表示式,而是另外乙個查詢語句的查詢結構。子查詢不僅僅出現在select語句中,也會出現在delete和update語句中,它本質上是where後面的乙個條件表示式。

子查詢返回單行:

--查詢產品型別為"***"的產品名稱和產品**

select productname,productprcie from productinfo

where category = (select categoryid from categoryinfo where categoryname = '***');

--查詢出產品**在最大值和最小值之間的產品,不包含兩端的值。指令碼如下:

select productname,productprice from productinfo

where productprice > (select min(productprcie) from productinfo) and productprice < (select max(productprice) from productinfo);

子查詢返回多行:

如果子查詢返回值為多行值,那麼需要用到in關鍵字,此時in的用法和前面介紹的方式一致,除此之外,也可以使用量化比較關鍵字some,any,all,這些需要配合<,<=,=,>,>=使用。

any:表示滿足子查詢結構的如何乙個 some:和any含義相同 all:查詢的所有結果

--從表productinfo中查詢出**低於知道**列表中的最大值。指定的**列表就是指定產品型別編碼為""0100030002" 的所有產品**

select productname,productprice from productinfo

where productprice <

any (select productprice from productinfo where category = '0100030002')and category <> '0100030002'

--some 的用法和any一樣,只不過any多用於非""="的環境中

select productname,productprice from productinfo

where productprice =

some (select productprice from productinfo where category = '0100030002')and category <> '0100030002';

--all 找出比指定**列表還低的產品資料

select productname,productprice from productinfo

where productprice <

all (select productprice from productinfo where category = '0100030002')

連線查詢

連線分為內連線,外鏈結和全連線,還有一種是自連線

內連線也稱為簡單連線,它會把兩個或多個表進行連線,只能查詢出匹配的記錄,不匹配的記錄將無法查詢出來,這種連線查詢是平常最常用的查詢。內連線中最常用的就是等值連線和不等值連線

等值連線:連線條件中使用」=」連線兩個條件列表

--查詢出productinfo表和categoryinfo表中產品型別編碼一致的資料

select p.productname,p.productprcie,c.categoryname

from productinfo p ,categoryinfo c where p.category = c.categoryid;

--或者

select p.productname,p.productprice,c.categoryname

from productinfo p inner join categoryinfo c on p.category = c.categoryid;

不等值連線:連線條件不是」=」,但這種方式通常需要和其他等值運算一起使用,否則檢索出來的資料很可能沒有實際意義

--內連線中的關鍵字""innner join" 可以直接寫成 "join",系統會把""join" 識別成內連線。但是""on" 不能省略

select p.productname,p.productprice,c.categoryname

from productinfo p inner join categoryinfo c on p.category in c.categoryid;

select p.productname,p.productprice,c.categoryname

from productinfo p , categoryinfo c where p.category in c.catgoryid;

自連線

所謂自連線,就是把自身表的乙個引用作為另乙個表來處理,這樣就能獲取一些特殊的資料

--獲取表productinfo中數量相等的不同產品

select p.productname,p.productprice,pr.productname,pr.productprice,pr.quantity

from productinfo p,productinfo pr

where p.productid != pr.productid

and p.quantity = pr.quantity

and p.rowid < pr.rowid; --去除重覆記錄,只取rowid比較小的那條

select p.productname,p.productprice,pr.productname,pr.productprice,pr.quantity

from productinfo p join productinfo pr

on p.productid != pr.productid

and p.quantity = pr.quantity

and p.rowid < pr.rowid; --去除重覆記錄,只取rowid比較小的那條

--語句中省略了""inner"關鍵字

外連線

外連線分為左外連線,右外連線,全外連線。它們所表示的含義如下:

左外連線:又稱為左向外連線。使用左外連線的查詢,返回結果不僅僅是符合連線條件的行記錄,還包含了左邊表中的全部記錄。也就是說,如果左表的某行記錄在右表中沒有匹配項,則在返回結果中右表的所有選擇列表均為空。

右外連線:又稱為右向外連線。它與左外連線相反,將右邊的表中所有的資料與左表進行匹配,返回的結果除了匹配成功的記錄,還包含右表中未匹配成功的記錄,並在其左表對應的列補空值

全外連線:返回所有匹配成功的記錄,並返回左表未匹配成功的記錄,也返回右表未匹配成功的記錄

--左連線 要求檢索出productinfo表中每個產品對應的產品型別的名稱。

select p.productname,p.productprice,p.category,c.categoryid,c.categoryname

from productinfo p left join categoryinfo c on p.category = c.categoryid;

--右連線 檢視那些產品型別還沒有對應的產品

select p.productname,p.productprice,p.category,c.categoryid,c.categoryname from productinfo p right join categoryinfo c on p.category = c.categoryid;

--全外連線 左右連線的綜合

select p.productname,p.productprice,p.category,c.categoryid,c.categoryname from productinfo p full join categoryinfo c on p.category = c.categoryid;

(+)的使用

在oracle使用外連線,可以用「(+)」表示外連線。雖然這種方式可以實現外連線,但開發人員最好還是使用outer join關鍵字

(+)的使用方法讀者可以簡單記一下,該操作符總是放在非主表的一方,並且需要使用where子句,不能存在outer join關鍵字

--左外連線使用(+)

select p.productname,p.productprice,p.category,c.categoryid,c.categoryname

from productinfo p,categoryinfo c

where p.category = c.categoryid(+);

--右連線使用(+)

select p.productname,p.productprice,p.category,c.categoryid,c.categoryname from productinfo p, categoryinfo c

where p.category(+) = c.categoryid;

資料庫常用SQL語句(三) 子查詢

一 為什麼會使用子查詢 雖然可以通過連線查詢來實現多表查詢資料記錄,但不建議使用,因為連線查詢的效能很差,為什麼呢?我們來進行分析,例如 我們要查詢部門表t dept 和雇員表t employee中的資料記錄,一般可能會寫成 select from t dept t1,t employee t2 w...

Oracle資料庫高階查詢(三)連線查詢

謝謝現在我們有這樣乙個需求 查詢所有使用者的使用者姓名,訂單號,已經訂單狀態,商品所屬分類名稱 其實我們這些資料 於兩張表 圖書表es product和圖書類別表es sort 我們可以通過表連線實現 select es product.id,name,price,sortname from es ...

三 子查詢 偽劣和常用函式

三 子查詢 偽劣和常用函式 select 語句可以當做返回的集合做為值 一 單行子查詢 1 子查詢做資料來源 select ename from select from emp 2 子查詢做條件 select ename from emp where sal select sal from emp ...