詳解SQL嵌套子查詢_Mssql數(shù)據(jù)庫(kù)教程
推薦:詳解SQL命令大全--中文翻譯SQL語(yǔ)句功能 -- 數(shù)據(jù)操作 SELECT--從數(shù)據(jù)庫(kù)表中檢索數(shù)據(jù)行和列 INSERT--向數(shù)據(jù)庫(kù)表添加新數(shù)據(jù)行 DELETE--從數(shù)據(jù)庫(kù)表中刪除數(shù)據(jù)行 UPDATE--更新數(shù)據(jù)庫(kù)表中的數(shù)據(jù) -- 數(shù)據(jù)定義 CREATETABLE--創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)表 DROPTABLE--從數(shù)據(jù)庫(kù)中刪除表 ALTERTABLE--修改數(shù)
一些初級(jí)程序員常常對(duì)SQL語(yǔ)法中的子查詢,由其對(duì)嵌套子查詢(子查詢中包含一個(gè)子查詢)的使用比較生疏,本文就此做一個(gè)基本講解,相信新手會(huì)有一定收獲。
使用子查詢的原則
1.一個(gè)子查詢必須放在圓括號(hào)中。
2.將子查詢放在比較條件的右邊以增加可讀性。
子查詢不包含 ORDER BY 子句。對(duì)一個(gè) SELECT 語(yǔ)句只能用一個(gè) ORDER BY 子句,
并且如果指定了它就必須放在主 SELECT 語(yǔ)句的最后。
ORDER BY 子句可以使用,并且在進(jìn)行 Top-N 分析時(shí)是必須的。
3.在子查詢中可以使用兩種比較條件:?jiǎn)涡羞\(yùn)算符和多行運(yùn)算符。
子查詢的類型
單行子查詢:從內(nèi) SELECT 語(yǔ)句只返回一行的查詢
多行子查詢:從內(nèi) SELECT 語(yǔ)句返回多行的查詢
單行子查詢
單行子查詢是從內(nèi)查詢返回一行的查詢。在該子查詢類型中用一個(gè)單行操作符�;脽羝辛谐隽藛涡胁僮鞣�。
例
| 顯示那些 job ID 與雇員 141 相同的雇員。 SELECT last_name, job_id FROM employees WHERE job_id = (SELECT job_id FROM employees WHERE employee_id = 141); SELECT last_name, job_id, salary FROM employees WHERE job_id = (SELECT job_id FROM employees WHERE employee_id = 141) AND salary > (SELECT salary FROM employees WHERE employee_id = 143); 顯示 job ID 與雇員 141 相同,并且薪水 高于雇員 143 的那些雇員。 注:外和內(nèi)查詢可以從不同的表中取得數(shù)據(jù)。 SELECT last_name, job_id, salary FROM employees WHERE salary = (SELECT MIN(salary) FROM employees); 求所有人誰(shuí)的工資最小。 SELECT department_id, MIN(salary) FROM employees GROUP BY department_id HAVING MIN(salary) > (SELECT MIN(salary) FROM employees WHERE department_id = 50); 求每個(gè)部門的最小工資,但是要高于50號(hào)部門的工資。 SELECT employee_id, last_name FROM employees WHERE salary = (SELECT MIN(salary) FROM employees GROUP BY department_id); 問題出現(xiàn)在:?jiǎn)涡凶硬樵兎祷亓硕鄠(gè)查詢值; 應(yīng)改為: SELECT employee_id, last_name FROM employees WHERE salary in (SELECT MIN(salary) FROM employees GROUP BY department_id); SELECT last_name, job_id FROM employees WHERE job_id = (SELECT job_id FROM employees WHERE last_name = ’Haas’); 如果子查詢返回的是零值,不會(huì)對(duì)主程序造成影響; 如果子查詢返回的是空值,那么會(huì)影響主程序的返回值; SELECT employee_id, last_name FROM employees WHERE employee_id NOT IN (SELECT manager_id FROM employees) SELECT employee_id, last_name FROM employees WHERE employee_id NOT IN (SELECT manager_id FROM employees WHERE manager_id IS NOT NULL) 放在select下的子查詢的返回值必須是一個(gè)具體值, from后面也可以加子查詢; having后面也可以加子查詢; order by后面也可以; |
多列子查詢適應(yīng)于:成對(duì)比較;非成對(duì)比較。
SELECT employee_id, manager_id, department_id
FROM employees
WHERE (manager_id, department_id) IN
(SELECT manager_id, department_id
FROM employees
WHERE employee_id IN (178,174))
AND employee_id NOT IN (178,174);
輸出:176 149 80
只有要查詢的東西和你子查詢返回的東西一一對(duì)應(yīng)上了,你的查詢才能成功。
如果有一個(gè) 對(duì)應(yīng)不上那么你的查詢不會(huì)成功。
非成對(duì)的子查詢:
SELECT employee_id, manager_id, department_id
FROM employees
WHERE manager_id IN (SELECT manager_id
FROM employees
WHERE employee_id IN (174,141))
AND department_id IN (SELECT department_id
FROM employees
WHERE employee_id IN (174,141))
AND employee_id NOT IN(174,141);
輸出:144 124 50
143 124 50
142 124 50
176 149 80
上面兩個(gè)程序就是成對(duì)子查詢和非成對(duì)子查詢兩者之間的區(qū)別。
如果我想去顯示員工信息,要求:?jiǎn)T工的工資高于本部門的平均工資。
SELECT a.last_name,
a.salary,
a.department_id
FROM employees a
WHERE a.salary >
(SELECT AVG(salary)
FROM employees b
WHERE b.department_id = a.department_id);
in line view(內(nèi)聯(lián)視圖)
SELECT a.last_name, a.salary,
a.department_id, b.salavg
FROM employees a, (SELECT department_id,
AVG(salary) salavg
FROM employees
GROUP BY department_id) b
WHERE a.department_id = b.department_id
AND a.salary > b.salavg;
數(shù)據(jù)分散于多個(gè)表中需要進(jìn)行拼合
SELECT DISTINCT c.LastName, c.FirstName
FROM Person.Contact c JOIN HumanResources.Employee e
ON e.ContactID = c.ContactID WHERE EmployeeID IN
(SELECT SalesPersonID
FROM Sales.SalesOrderHeader
WHERE SalesOrderID IN
(SELECT SalesOrderID
FROM Sales.SalesOrderDetail
WHERE ProductID IN
(SELECT ProductID
FROM Production.Product p
WHERE ProductNumber LIKE 'FW123%')));
分享:揭秘SQL Server2000安全設(shè)置全攻略Microsoft建立了一種既靈活又強(qiáng)大的安全管理機(jī)制,它能夠?qū)τ脩粼L問SQLServer服務(wù)器系統(tǒng)和數(shù)據(jù)庫(kù)的安全進(jìn)行全面地管理。按照本文介紹的步驟,你可以為SQLServer2000構(gòu)造出一個(gè)靈活的、可管理的安全策略,而且它的安全性經(jīng)得起考驗(yàn)。 一、驗(yàn)證方法選擇 本文對(duì)
- sql 語(yǔ)句練習(xí)與答案
- 深入C++ string.find()函數(shù)的用法總結(jié)
- SQL Server中刪除重復(fù)數(shù)據(jù)的幾個(gè)方法
- sql刪除重復(fù)數(shù)據(jù)的詳細(xì)方法
- SQL SERVER 2000安裝教程圖文詳解
- 使用sql server management studio 2008 無法查看數(shù)據(jù)庫(kù),提示 無法為該請(qǐng)求檢索數(shù)據(jù) 錯(cuò)誤916解決方法
- SQLServer日志清空語(yǔ)句(sql2000,sql2005,sql2008)
- Sql Server 2008完全卸載方法(其他版本類似)
- sql server 2008 不允許保存更改,您所做的更改要求刪除并重新創(chuàng)建以下表
- SQL Server 2008 清空刪除日志文件(瞬間日志變幾M)
- Win7系統(tǒng)安裝MySQL5.5.21圖解教程
- 將DataTable作為存儲(chǔ)過程參數(shù)的用法實(shí)例詳解
Mssql數(shù)據(jù)庫(kù)教程Rss訂閱編程教程搜索
Mssql數(shù)據(jù)庫(kù)教程推薦
- SQL Server2008中刪除重復(fù)記錄的方法分享
- 詳解SQL Server 2008安裝過程
- 解讀SQL和Oracle對(duì)數(shù)據(jù)庫(kù)事務(wù)處理的差異
- 談SQL Server 數(shù)據(jù)挖掘應(yīng)用于商業(yè)智能中
- mssql2005數(shù)據(jù)庫(kù)鏡像搭建教程
- 解析應(yīng)對(duì)SQL Server數(shù)據(jù)庫(kù)崩潰的方法
- 謹(jǐn)記SQL Server索引管理的六大鐵律
- 循序漸進(jìn)講解數(shù)據(jù)表的十二個(gè)設(shè)計(jì)原則
- SQL Server 2005中五個(gè)動(dòng)態(tài)管理對(duì)象
- 如何巧妙規(guī)劃使用Oracle數(shù)據(jù)空間
猜你也喜歡看這些
- 通過mysqladmin遠(yuǎn)程管理mysql的方法
- MySQL前綴索引導(dǎo)致的慢查詢分析總結(jié)
- Mysql的主從數(shù)據(jù)庫(kù)沒有同步的解決辦法
- 如何通過配置自動(dòng)實(shí)現(xiàn)ValueList中hql語(yǔ)句的整型參數(shù)轉(zhuǎn)換
- JDBC數(shù)據(jù)庫(kù)的使用操作總結(jié)
- MySQL數(shù)據(jù)庫(kù)備份和還原的常用命令
- 如何修改mysql數(shù)據(jù)庫(kù)的max_allowed_packet參數(shù)
- SQLServer導(dǎo)出數(shù)據(jù)到MySQL實(shí)例介紹
- SQL查詢超時(shí)的設(shè)置方法(關(guān)于timeout的處理)
- MySQL筆記之觸發(fā)器的應(yīng)用
- 相關(guān)鏈接:
- 教程說明:
Mssql數(shù)據(jù)庫(kù)教程-詳解SQL嵌套子查詢
。