1. 程式人生 > >sql子查詢 嵌套SELECT實用語句

sql子查詢 嵌套SELECT實用語句

exp ring union res pda als 老師 效果 存在

嵌套SELECT語句也叫子查詢,一個 SELECT 語句的查詢結果能夠作為另一個語句的輸入值。子查詢不但能夠出現在Where子句中,也能夠出現在from子句中,作為一個臨時表使用,也能夠出現在select list中,作為一個字段值來返回。

1、單行子查詢 :單行子查詢是指子查詢的返回結果只有一行數據。當主查詢語句的條件語句中引用子查詢結果時可用單行比較符號(=, >, <, >=, <=, <>)來進行比較。

例:
select ename,deptno,sal
from emp
where deptno=(select deptno from dept where loc=‘NEW YORK‘);

2、多行子查詢:多行子查詢即是子查詢的返回結果是多行數據。當主查詢語句的條件語句中引用子查詢結果時必須用多行比較符號(IN,ALL,ANY)來進行比較。其中,IN的含義是匹配子查詢結果中的任一個值即可("IN" 操作符,能夠測試某個值是否在一個列表中),ALL則必須要符合子查詢的所有值才可,ANY要符合子查詢結果的任何一個值即可。而且須註意ALL 和ANY 操作符不能單獨使用,而只能與單行比較符(=、>、< 、>= 、<= 、<>)結合使用。

例:

1).多行子查詢使用IN操作符號例子:查詢選修了老師名叫Rona(假設唯一)的學生名字

sql> select stName

from Student

where stId in(selectdistinct stId from score where teId=(select teId from teacher where teName=‘Rona‘));

查詢所有部門編號為A的資料:

SELECT ename,job,sal

FROM EMP

WHERE deptno in ( SELECT deptno FROM dept WHERE dname LIKE ‘A%‘);
2).多行子查詢使用ALL操作符號例子:查詢有一門以上的成績高於Kaka的最高成績的學生的名字:

sql> select stName

from Student

where stId in(select distinct stId from score where score >all(select score from score where stId=(select stId from Student where stName= ‘Kaka‘) ));
3). 多行子查詢使用ANY操作符號例子:查詢有一門以上的成績高於Kaka的任何一門成績的學生的名字:

sql> select stName

from Student

where stId in(select distinct stId from score where score >any(select score from score where stId=(select stId from Student where stName=‘Kaka‘)));

3、多列子查詢:當是單行多列的子查詢時,主查詢語句的條件語句中引用子查詢結果時可用單行比較符號(=, >, <, >=, <=, <>)來進行比較;當是多行多列子查詢時,主查詢語句的條件語句中引用子查詢結果時必須用多行比較符號(IN,ALL,ANY)來進行比較。

例:
SELECT deptno,ename,job,sal
FROM EMP
WHERE (deptno,sal) IN (SELECT deptno,MAX(sal) FROM EMP GROUP BY deptno);

4、內聯視圖子查詢

例:
(1)SELECT ename,job,sal,rownum
FROM (SELECT ename,job,sal FROM EMP ORDER BY sal);
(2)SELECT ename,job,sal,rownum
FROM ( SELECT ename,job,sal FROM EMP ORDER BY sal)
WHERE rownum<=5;

5、在HAVING子句中使用子查詢

例:
SELECT deptno,job,AVG(sal) FROM EMP GROUP BY deptno,job HAVING AVG(sal)>(SELECT sal FROM EMP WHERE ename=‘MARTIN‘);

讓我們再看看一些具體的實例,

  一、給出人口多於Russia(俄國)的國家名稱

SELECT name FROM bbc
WHERE population>
(SELECT population FROM bbc
WHERE name=‘Russia‘)

  二、給出‘India‘(印度), ‘Iran‘(伊朗)所在地區的任何國家的任何信息

SELECT * FROM bbc
WHERE region IN
(SELECT region FROM bbc
WHERE name IN (‘India‘,‘Iran‘))

  三、給出人均GDP超過‘United Kingdom‘(英國)的歐洲國家.

SELECT name FROM bbc
WHERE region=‘Europe‘ AND gdp/population >
(SELECT gdp/population FROM bbc
WHERE name=‘United Kingdom‘)


查考資料:

http://www.west263.com/info/html/wangluobiancheng/Mysql/20080225/32087.html

http://blog.csdn.net/rboyxxx/archive/2009/08/17/4455757.aspx

sql子查詢總結:

許多包含子查詢的 Transact-SQL 語句都可以改用聯接表示。在 Transact-SQL 中,包含子查詢的語句和語義上等效的不包含子查詢的語句在性能上通常沒有差別。但是,在一些必須檢查存在性的情況中,使用聯接會產生更好的性能。否則,為確保消除重復值,必須為外部查詢的每個結果都處理嵌套查詢。所以在這些情況下,聯接方式會產生更好的效果。
以下示例顯示了返回相同結果集的Select子查詢和Select聯接:


Select Name
FROM AdventureWor ks.Production.Product
Where ListPrice =
(Select ListPrice
FROM AdventureWor ks.Production.Product
Where Name = ’Chainring Bolts’ )


Select Prd1. Name
FROM AdventureWor ks.Production.Product AS Prd1
JOIN AdventureWor ks.Production.Product AS Prd2
ON (Prd1.ListPrice = Prd2.ListPrice)
Where Prd2. Name = ’Chainring Bolts’



嵌套在外部Select語句中的子查詢包括以下組件:

●包含常規選擇列表組件的常規Select查詢。
●包含一個或多個表或視圖名稱的常規 FROM 子句。
●可選的 Where 子句。
●可選的 GROUP BY 子句。
●可選的 HAVING 子句。

子查詢的Select查詢總是使用圓括號括起來。它不能包含COMPUTE 或 FOR BROWSE 子句,如果同時指定了 TOP 子句,則只能包含 or DER BY 子句。

子查詢可以嵌套在外部 Select,Insert,Update 或 Delete語句的 Where 或 HAVING 子句內,也可以嵌套在其他子查詢內。盡管根據可用內存和查詢中其他表達式的復雜程度的不同,嵌套限制也有所不同,但嵌套到 32 層是可能的。個別查詢可能不支持 32 層嵌套。任何可以使用表達式的地方都可以使用子查詢,只要它返回的是單個值。

如果某個表只出現在子查詢中,而沒有出現在外部查詢中,那麽該表中的列就無法包含在輸出(外部查詢的選擇列表)中。

包含子查詢的語句通常采用以下格式中的一種:

●Where expression [NOT] IN (subquery)
●Where expression comparison_operator [ANY | ALL] (subquery)
●Where [NOT] EXISTS (subquery)

在某些 Transact-SQL 語句中,子查詢可以作為獨立查詢來計算。從概念上說,子查詢結果會代入外部查詢(盡管這不一定是 Microsoft SQL Server 2005 實際處理帶有子查詢的 Transact-SQL 語句的方式)。

有三種基本的子查詢。它們是:

●在通過 IN 或由 ANY 或 ALL 修改的比較運算符引入的列表上操作。
●通過未修改的比較運算符引入且必須返回單個值。
●通過 EXISTS 引入的存在測試。

1.帶in的嵌套查詢

select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal in (select sal from scott.emp where ename=’’WARD’’);
上述語句完成的是查詢薪水和WARD相等的員工,也可以使用not in來進行查詢。

2.帶any的嵌套查詢
通過比較運算符將一個表達式的值或列值與子查詢返回的一列值中的每一個進行比較,只要有一次比較的結果為TRUE,則ANY測試返回TRUE。

select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal >any(select sal from scott.emp where job=’’MANAGER’’);
等價於下邊兩步的執行過程:
(1)執行“select sal from scott.emp where job=’’MANAGER’’”
(2)查詢到3個薪水值2975、2850和2450,父查詢執行下列語句:
select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal >2975 or sal>2850 or sal>2450;



3.帶some的嵌套查詢

select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal =some(select sal from scott.emp where job=’’MANAGER’’);
等價於下邊兩步的執行過程:
(1)子查詢,執行“select sal from scott.emp where job=’’MANAGER’’”。
(2)父查詢執行下列語句。
select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal =2975 or sal=2850 or sal=2450;
帶【any】的嵌套查詢和【some】的嵌套查詢功能是一樣的。早期的SQL僅僅允許使用【any】,後來的版本為了和英語的【any】相區分,引入了【some】,同時還保留了【any】關鍵詞。

4.帶all的嵌套查詢
通過比較運算符將一個表達式的值或列值與子查詢返回的一列值中的每一個進行比較,只要有一次比較的結果為FALSE,則ALL測試返回FALSE。
select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal >all(select sal from scott.emp where job=’’MANAGER’’);
等價於下邊兩步的執行過程:
(1)子查詢,執行“select sal from scott.emp where job=’’MANAGER’’”。
(2)父查詢執行下列語句。
select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal >2975 and sal>2850 and sal>2450;

5.帶exists的嵌套查詢

select emp.empno,emp.ename,emp.job,emp.sal from scott.emp,scott.dept where exists (select * from scott.emp where scott.emp.deptno=scott.dept.deptno);

6.並操作的嵌套查詢

並操作就是集合中並集的概念。屬於集合A或集合B的元素總和就是並集。
(select deptno from scott.emp) union (select deptno from scott.dept);

7.交操作的嵌套查詢

交操作就是集合中交集的概念。屬於集合A且屬於集合B的元素總和就是交集。

(select deptno from scott.emp) intersect (select deptno from scott.dept);

8.差操作的嵌套查詢

差操作就是集合中差集的概念。屬於集合A且不屬於集合B的元素總和就是差集。
(select deptno from scott.dept) minus (select deptno from scott.emp);
註意:並、交和差操作的嵌套查詢要求屬性具有相同的定義,包括類型和取值範圍。

左手邊是一個標量表達式列表.右手邊可以是一個等長的標量表達式的列表, 或者一個圓括弧括起來的子查詢,該查詢必須返回很左手邊表達式書目完全 一樣的字段.另外,該子查詢不能返回超過一行的數量.(如果它返回零行, 那麽結果就是 NULL.)左手邊逐行與右手邊的子查詢結果行,或者右手邊 表達式列表進行比較.目前,只允許使用 = 和 <> 操作符進行逐行比較. 如果兩行分別是相等或者不等,那麽結果為真.

通常,表達式或者子查詢行裏的 NULL 是按照 SQL 布爾表達式的一般規則 進行組合的.如果兩個行對應的成員都是非空並且相等,那麽認為這兩行 相等;如果任意對應成員為非空且不等,那麽該兩行不等; 否則這樣的行比較的結果是未知(NULL).

sql子查詢 嵌套SELECT實用語句