1 概述html
1.1 已發佈【SqlServer系列】文章sql
1.2 本篇文章內容概要數據庫
子查詢和錶鏈接,主要是針對兩張及以上表之間關聯關係進行查詢。子查詢,按是否獨立劃分,分爲獨立子查詢和相關子查詢;按內部查詢返回是否爲單值,分爲單值子查詢(注意:應理解單值子查詢和標量子查詢關係)和多值子查詢;以下表格內容爲按子查詢是否獨立來劃分的。學習
1.3 本章測試樣表和sql測試
業務場景:spa
有兩張表,分別爲顧客表(顧客ID,顧客姓名,顧客公司),即Customers(CustID,CustName,CustCompany)和顧客訂單表(顧客ID,訂單ID,訂單日期),即Orders(CustID,OrderID,OrderDate),兩張表經過顧客ID(CustID)進行關聯。3d
SQL語句分別以下:code
(1)建立子查詢DB:WJM_CHildQueryhtm
1 --建立子查詢數據庫WJM_ChildQuery
2 IF DB_ID('WJM_CHildQuery') IS NOT NULL
3 DROP DATABASE WJM_ChildQuery 4 GO
5 CREATE DATABASE WJM_ChildQuery
(2)建立Customers表並初始化blog
1 USE WJM_CHildQuery 2
3 --CREATE TABLE Customers
4 CREATE TABLE Customers 5 ( 6 CustID INT IDENTITY(1,1) NOT NULL PRIMARY KEY, --顧客ID
7 CustName VARCHAR(50),--顧客姓名
8 CustCompany VARCHAR(50) --顧客公司
9 ) 10
11 --Initial Customers
12
13 INSERT INTO Customers VALUES('趙武','A') 14 INSERT INTO Customers VALUES('劉楊','B') 15 INSERT INTO Customers VALUES('張永爲','C') 16 INSERT INTO Customers VALUES('李龍飛','D') 17 INSERT INTO Customers VALUES('鄧華','E') 18 INSERT INTO Customers VALUES('張濤明','F')
執行查詢語句:
1 SELECT *
2 FROM Customers
查詢結果爲:
(3)建立Orders表並初始化
1 USE WJM_CHildQuery 2
3 CREATE TABLE Orders 4 ( 5 OrderID INT IDENTITY(1,1) PRIMARY KEY NOT NULL, --訂單ID
6 CustID INT NOT NULL, --顧客ID
7 OrderDate DATE --訂單日期
8 ) 9
10 --Initial Orders
11
12 INSERT INTO Orders VALUES(1,'2015-06-25') 13 INSERT INTO Orders VALUES(2,'2017-06-03') 14 INSERT INTO Orders VALUES(3,'2016-04-25') 15 INSERT INTO Orders VALUES(4,'2016-03-04') 16 INSERT INTO Orders VALUES(5,'2013-03-04') 17 INSERT INTO Orders VALUES(6,'2017-01-01') 18 INSERT INTO Orders VALUES(2,'2016-08-25') 19 INSERT INTO Orders VALUES(5,'2016-12-25')
執行查詢語句:
1 SELECT *
2 FROM Orders
查詢結果爲:
2 獨立子查詢
2.1 獨立標量子查詢
問題:請用兩種方法返回Orders表中的訂單ID最大的訂單信息。
方法一:標量單值子查詢
1 --返回Orders表中訂單ID最大的記錄
2 SELECT OutQueryOrders.OrderID,OutQueryOrders.CustID,YEAR(OutQueryOrders.OrderDate) AS OrderDateYear 3 FROM Orders AS OutQueryOrders 4 WHERE OutQueryOrders.OrderID=
5 ( 6 SELECT MAX(InnerQueryOrders.OrderID) 7 FROM Orders InnerQueryOrders 8 )
查詢結果:
結果分析
a.指望結果
b.查詢語句分析
方法二:採用變量
1 DECLARE @MaxOrderID AS INT=
2 ( 3 SELECT MAX(OD.OrderID) 4 FROM Orders AS OD 5 ) 6
7 SELECT *
8 FROM Orders 9 WHERE Orders.OrderID=@MaxOrderID
查詢結果:
結果分析:
a.指望結果
b.查詢語句分析
2.2 獨立子查詢
問題:返回訂單表中訂單ID>5的顧客信息
1 --返回訂單表中訂單ID>5的顧客信息
2 SELECT C.CustID,C.CustName,C.CustCompany 3 FROM Customers AS C 4 WHERE C.CustID IN
5 ( 6 SELECT Orders.CustID 7 FROM Orders 8 WHERE Orders.OrderID>5
9 )
查詢結果:
結果分析:
a.指望結果
b.查詢語句分析
2.3 小結
a.每一個子查詢均有所屬的外部查詢;
b.獨立子查詢獨立於其外部查詢;
c.能夠把獨立子查詢單獨運行;
d.獨立子查詢在執行外部查詢以前先執行一次,接着外部查詢再使用子查詢的結果繼續進行查詢;
e.標量子查詢只返回單個值,無論其是不是獨立子查詢;
f.標量子查詢能夠出如今外部查詢中指望使用單個值的任何地方(WHERE、SELECT等)
g.算術運算符(>,>=,<,<=,!=,=)其後只能爲單值;
h.若是標量子查詢沒有返回任何值,其結果就轉換爲NULL,和NULL進行比較獲得的是UNKNOWN,查詢過濾器不會返回任何讓過濾表達式計算結果爲UNKOWN的行;
i.多值子查詢,通常與謂詞連用,如IN,NOT IN,EXISTS等;
j.在子查詢中,通常單值和多值是混合用,如常見與BETWEEN......AND.....連用等;
3 相關子查詢
3.1 SQL示例及示例結果
問題:在訂單表Orders表中,爲每一個客戶返回其訂單ID最大的訂單
1 --爲每一個客戶返回其訂單ID最大的訂單
2
3 SELECT OutQueryOrders.OrderID,OutQueryOrders.CustID,YEAR(OutQueryOrders.OrderDate) AS OrderDateYear 4 FROM Orders AS OutQueryOrders 5 WHERE OutQueryOrders.OrderID=
6 ( 7 SELECT MAX(InnerQueryOrders.OrderID) 8 FROM Orders InnerQueryOrders 9 WHERE OutQueryOrders.CustID=InnerQueryOrders.CustID 10 )
查詢結果:
3.2 示例結果分析
a.指望結果
b.查詢語句分析
3.3 小結
a.相關子查詢內部查詢依賴於外部查詢,不能獨立運行;
b.相關子查詢內部查詢中,受限制於外部查詢的條件,如上述例子中的WHERE以後的條件;
c.在邏輯上,子查詢會爲每一個外部查詢單獨計算一次;
d.多值子查詢,通常與謂詞連用,如IN,NOT IN,EXISTS等;
e.在子查詢中,通常單值和多值是混合用,如常見與BETWEEN......AND.....連用等;
4 子查詢拓展
關於子查詢,還有不少內容,如返回先後記錄查詢,連續聚合,行爲不當等,但這部份內容屬於子查詢的中高級部分,準備放在【SqlServer系列】中高級部分來與你們分享。
5 參考文獻
【01】Microsoft SqlServer 2008技術內幕:T-SQL 語言基礎
【02】Microsoft SqlServer 2008技術內幕:T-SQL 查詢
6 版權