第04講_1 chp3-4_數(shù)據(jù)查詢new_第1頁
第04講_1 chp3-4_數(shù)據(jù)查詢new_第2頁
第04講_1 chp3-4_數(shù)據(jù)查詢new_第3頁
第04講_1 chp3-4_數(shù)據(jù)查詢new_第4頁
第04講_1 chp3-4_數(shù)據(jù)查詢new_第5頁
已閱讀5頁,還剩70頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、 SQL Server2021-12-211第四章第四章 數(shù)據(jù)查詢數(shù)據(jù)查詢 (參見第五版教材(參見第五版教材P89) SQL Server22021-12-21學(xué)習(xí)要點學(xué)習(xí)要點 SELECT語句 1基本查詢2高級查詢3 SQL Server32021-12-214.1 SELECT語句 SELECT語句的作用語句的作用根據(jù)客戶的要求從數(shù)據(jù)庫中搜索出所需要的信息,并且可以按規(guī)定的格式進行分類、統(tǒng)計、排序,再返回給客戶。 另外,利用SELECT語句還可以設(shè)置和顯示系統(tǒng)信息、給局部變量賦值等。 SQL Server42021-12-214.1 SELECT語句 基本語法格式基本語法格式SELECT

2、ALL| DISTINCT TOP n PERCENT select_list INTO new_table FROM table_name WHERE search_condition GROUP BY group_by_expression HAVING search_condition ORDER BY order_expression ASC | DESC SQL Server52021-12-214.1 SELECT語句 說明說明 SELECT:關(guān)鍵字,用于從數(shù)據(jù)庫中檢索數(shù)據(jù)。 select_list:描述進入結(jié)果集的列,它指定了結(jié)果集中要包含的列的名稱,是一個逗號分隔的表達式列表。

3、 table_name:用于指定產(chǎn)生查詢結(jié)果集的表名。 SQL Server62021-12-214.2 基本查詢1.1.選擇列選擇列2.2.選擇行選擇行基本查詢基本查詢3.3.排序排序4.4.使用使用TOPTOP和和DISTINCTDISTINCT關(guān)鍵字關(guān)鍵字 SQL Server72021-12-214.2.1 選擇列 指定列指定列格式:SELECT column_name1,column_name2, FROM table_name圖4-1例4.1 從sales數(shù)據(jù)庫的產(chǎn)品表Product中查詢出產(chǎn)品ID(ProductID)、產(chǎn)品名稱(ProductName)和單價(Price)的數(shù)據(jù)

4、信息。SELECT ProductID,ProductName,PriceFROM Product SQL Server82021-12-214.2.1 選擇列 選擇所有列選擇所有列在SELECT子句中可以使用星號(*),顯示表中所有的列。例4.2 顯示Orders表中的所有信息。SELECT *FROM Orders注意:在數(shù)據(jù)查詢時,列的顯示順序由SELECT語句的SELECT子句指定,該順序可以和列定義時順序不同,這并不影響數(shù)據(jù)在表中的存儲順序。作用:無條件地把Orders表中的全部信息都查詢出來。該語句也稱全表查詢,這是最簡單的一種查詢。 SQL Server92021-12-214.

5、2.1 選擇列 使用計算列使用計算列 在SELECT子句中可以使用算術(shù)運算符對數(shù)值型數(shù)據(jù)列進行加(+)、減(-)、乘(*)、除(/)和取模(%)運算,構(gòu)造計算列。例4.3 從Product表中檢索出產(chǎn)品ID(ProductID)、產(chǎn)品名稱(ProductName)、產(chǎn)品單價(Price)、產(chǎn)品庫存量(Stocks)及產(chǎn)品的總價值。SELECT ProductID,ProductName,Price,Stocks,Price*StocksFROM Product SQL Server102021-12-214.2.1 選擇列例4.4 為例4.3中的計算列指定一個列標(biāo)題“總價值”。SELECT P

6、roductID,ProductName,Price,Stocks,total cost=Price*StocksFROM Product說明:產(chǎn)品的總價值是一個計算表達式,是產(chǎn)品單價和產(chǎn)品庫存量的乘積。需注意,對表中列的計算只是影響查詢結(jié)果,并不改變表中的數(shù)據(jù)。 SQL Server112021-12-214.2.1 選擇列例4.5 顯示銷售員信息,姓名姓名性別性別出生日期出生日期地址地址SELECT SaleName AS 姓名,Sex AS 性別, Birthday AS 出生日期,Address AS 地址FROM Seller關(guān)鍵字關(guān)鍵字ASAS可以省略可以省略 SQL Server

7、122021-12-214.2.2 選擇行 在實際工作中,大部分查詢并不是針對表中所有數(shù)據(jù)記錄的查詢,而是要找出滿足某些條件的數(shù)據(jù)記錄。此時可以在SELECT語句中使用WHERE子句。語法格式如下:SELECT column_name1,column_name2,FROM table_nameWHERE search_condition 查詢條件中可以使用關(guān)系運算符查詢條件中可以使用關(guān)系運算符查詢條件查詢條件 SQL Server132021-12-214.2.2 選擇行例4.6 查詢Product表中價格小于5元的產(chǎn)品記錄。SELECT ProductID,ProductName,Price

8、FROM productWHERE Price=5.0 AND Price=10.0 SQL Server162021-12-214.2.2 選擇行例4.9 查詢AdventureWorks數(shù)據(jù)庫中的HumanResources模式的Department表,顯示部門所屬組為Manufacturing或Quality Assurace的部門的詳細信息。USE AdventureWorksGOSELECT * FROM HumanResources.DepartmentWHERE GroupName=Manufacturing OR GroupName=Quality Assurance SQL

9、Server172021-12-214.2.2 選擇行例4.10 查詢AdventureWorks數(shù)據(jù)庫中的HumanResources模式的Department表,顯示部門所屬組不是Manufacturing或Quality Assurace的部門的詳細信息。SELECT * FROM HumanResources.DepartmentWHERE NOT(GroupName=Manufacturing OR GroupName=Quality Assurance)注意:如果NOT所修飾的查詢條件不是單個的,而是復(fù)合的,則需要用圓括號()把復(fù)合條件括起來。 SQL Server182021-1

10、2-214.2.2 選擇行使用字符串模糊匹配使用字符串模糊匹配 使用LIKE關(guān)鍵字進行模糊查詢。語法格式為: expression NOT LIKE stringESCAPE 換碼字符 string:是匹配字符串。其含義是查找指定的屬性列值與匹配字符串相匹配的記錄。匹配字符串可以是一個完整的字符串,也可以使用四種匹配符。匹配符匹配符 描述描述 % 包含零個或多個字符的任意字符串包含零個或多個字符的任意字符串 _ 代表一個任意字符代表一個任意字符 表示指定范圍內(nèi)的任意單個字符表示指定范圍內(nèi)的任意單個字符 表示不在指定范圍內(nèi)的任意單個字符表示不在指定范圍內(nèi)的任意單個字符 SQL Server192

11、021-12-21字符匹配(續(xù))匹配串為含通配符的字符串匹配串為含通配符的字符串例例15 查詢所有姓劉學(xué)生的姓名、學(xué)號和性別。查詢所有姓劉學(xué)生的姓名、學(xué)號和性別。 SELECT Sname,Sno,Ssex FROM Student WHERE Sname LIKE 劉%;例例16 查詢姓查詢姓歐陽歐陽且全名為三個字的學(xué)生的姓名。且全名為三個字的學(xué)生的姓名。 SELECT Sname FROM Student WHERE Sname LIKE 歐陽_; SQL Server202021-12-21字符匹配(續(xù))例例17 查詢名字中第查詢名字中第2個字為個字為陽陽字的學(xué)生的姓名和學(xué)號。字的學(xué)生的

12、姓名和學(xué)號。 SELECT Sname,Sno FROM Student WHERE Sname LIKE _陽%;例例18 查詢所有不姓劉的學(xué)生姓名。查詢所有不姓劉的學(xué)生姓名。 SELECT Sname,Sno,Ssex FROM Student WHERE Sname NOT LIKE 劉%; SQL Server212021-12-214.2.2 選擇行例4.11 從Seller表中檢索出所有姓張的銷售人員的資料。SELECT *FROM SellerWHERE SaleName LIKE 張%表達式 描述 LIKE RA% 將搜索以字母“RA”開頭的所有字符串 LIKE %ion 將搜

13、索以字母“ion”結(jié)尾的所有字符串 LIKE %ir% 將搜索任意位置中包含字母“ir”的所有字符串 LIKE _mt 將搜索以字母“mt”結(jié)尾的所有三個字母組成的字符串 LIKE BC% 將搜索以字母“B”或“C”開頭的所有字符串 LIKE B-Kair 將搜索以字母“B”到“K”中任意一個字母開頭,以“air”結(jié)尾的字符串 LIKE Ba% 將搜索以字母“B”開頭,第二個字母不是“a”的所有字符串 SQL Server222021-12-214.2.2 選擇行例4.12 從Seller表中檢索出名字的第二個字不是“芳”和“偉”的銷售人員的資料。SELECT *FROM SellerWHER

14、E SaleName LIKE _芳偉%注意:如果用戶要查詢的匹配字符串本身就含有“%”或“_”,比如要查找名字為“佳能XS200_IS”的產(chǎn)品信息,這時就要使用“ESCAPE”關(guān)鍵字對匹配符進行轉(zhuǎn)義。 SQL Server232021-12-21字符匹配(續(xù))3) 使用使用換碼字符換碼字符將通配符轉(zhuǎn)義為普通字符將通配符轉(zhuǎn)義為普通字符 格式:格式: NOT LIKE ESCAPE 例例19 查詢查詢DB_Design課程的課程號和學(xué)分。課程的課程號和學(xué)分。 SELECT Cno,Ccredit FROM Course WHERE Cname LIKE DB_Design ESCAPE ;例例2

15、0 查詢以查詢以DB_開頭,且倒數(shù)第開頭,且倒數(shù)第3個字符為個字符為 i的課程的詳細情況。的課程的詳細情況。 SELECT * FROM Course WHERE Cname LIKE DB_%i_ ESCAPE ;ESCAPE :表示:表示緊隨緊隨“ ”之后的之后的一個一個通配符是普通字符,代表其通配符是普通字符,代表其本身本身 SQL Server242021-12-214.2.2 選擇行 使用查詢范圍使用查詢范圍 在WHERE子句中使用BETWEEN關(guān)鍵字可以對表中某一范圍內(nèi)的數(shù)據(jù)進行查詢。其語法格式為:column_name NOT BETWEEN expression1 AND ex

16、pression2例4.13 從Product表中查詢出價格在510元之間的產(chǎn)品信息。SELECT *FROM ProductWHERE Price BETWEEN 5 AND 10NOT BETWEENAND表示不在某一范圍內(nèi) SQL Server252021-12-214.2.2 選擇行 使用查詢列表使用查詢列表 如果列值的取值范圍不是一個連續(xù)的區(qū)間,而是一些離散的值,應(yīng)使用另一個關(guān)鍵字IN。其語法格式為: column_name NOT IN (value1,value2,)例4.14 查詢Seller表中SaleID為s01,s05,s07的銷售人員信息SELECT * FROM Se

17、llerWHERE SaleID IN (S01,S05,S07)等價于:SELECT * FROM SellerWHERE SaleID =S01 OR SaleID=S05 OR SaleID=S07NOT IN用于查詢屬性值不屬于指定集合的記錄。 SQL Server262021-12-214.2.2 選擇行例4.15 查詢AdventureWorks數(shù)據(jù)庫中的HumanResources模式的Employee表,顯示職務(wù)不是Recruiter或Stocker的員工記錄。SELECT * FROM HumanResources.EmployeeWHERE Title NOT IN(Rec

18、ruiter,Stocker) SQL Server272021-12-214.2.2 選擇行 空值的判定空值的判定 在SQL Server中,用NULL表示空值,它僅僅是一個符號,不等于空格,也不等于0,空值判定的語法格式如下:column_name IS NOT NULL例4.16 檢索Salers表中雇用日期為空的銷售人員的資料。SELECT *FROM SellerWHERE HireDate IS NULL SQL Server282021-12-21涉及空值的查詢n謂詞:謂詞: IS NULL 或 IS NOT NULLn “IS” 不能用 “=” 代替 例例21 某些學(xué)生選修課程

19、后沒有參加考試,所以有選課記錄,但沒某些學(xué)生選修課程后沒有參加考試,所以有選課記錄,但沒 有考試成績。查詢?nèi)鄙俪煽兊膶W(xué)生的學(xué)號和相應(yīng)的課程號。有考試成績。查詢?nèi)鄙俪煽兊膶W(xué)生的學(xué)號和相應(yīng)的課程號。 SELECT Sno,Cno FROM SC WHERE Grade IS NULL 例例22 查所有有成績的學(xué)生學(xué)號和課程號。查所有有成績的學(xué)生學(xué)號和課程號。 SELECT Sno,Cno FROM SC WHERE Grade IS NOT NULL; SQL Server292021-12-214.2.3 排序通常情況下,SQL Server數(shù)據(jù)庫中的數(shù)據(jù)記錄行在顯示時是無序的,按插入時的順序排

20、列,因此用SELECT語句查詢的結(jié)果也是無序的。通過ORDER BY子句,可以將查詢結(jié)果進行排序顯示。其語法格式為:SELECT column_name1,column_name2,FROM table_nameWHERE search_condition ORDER BY column_name ASC | DESC , column_name ASC | DESC 關(guān)鍵字ASC表示按升序排列,可省略DESC表示按降序排列 SQL Server302021-12-214.2.3 排序例4.17 從Seller表中按姓名順序檢索出所有銷售員的信息。SELECT *FROM SellerORDE

21、R BY SaleName ASC SQL Server312021-12-214.2.3 排序例4.18 按出生日期列的降序排列Seller表。SELECT * FROM SellerORDER BY Birthday DESC例4.19 按出生日期的升序排列Seller表。SELECT SaleID,SaleName,Birthday,AddressFROM SellerORDER BY 3注意:在默認情況下,ORDER BY子句按升序進行排序,即默認使用的是ASC關(guān)鍵字,如果特別要求按降序進行排列,必須使用DESC關(guān)鍵字。使用列所處的位置來指定排序列 SQL Server322021-1

22、2-214.2.3 排序 當(dāng)ORDER BY子句指定了多個排序列時,系統(tǒng)先按照ORDER BY子句中第一列的順序排列,當(dāng)該列出現(xiàn)相同值時,再按照第二列的順序排列,依次類推。例4.20 查詢Orders表中的數(shù)據(jù),先按CustomerID的升序排列,當(dāng)CustomerID相同時再按照SaleID的降序排列。SELECT *FROM OrdersORDER BY CustomerID,SaleID DESC SQL Server332021-12-214.2.4 使用TOP和DISTINCT關(guān)鍵字 TOP關(guān)鍵字關(guān)鍵字在SELECT子句中利用TOP關(guān)鍵字限制返回到結(jié)果集中的行數(shù)。其語法格式為:SEL

23、ECT TOP integer | TOP integer PERCENT column_nameFROM table_name其中: TOP integer:表示返回表中最前面的幾行,用integer表示返回的行數(shù)。 TOP integer PERCENT:用百分比表示返回的行數(shù)。 SQL Server342021-12-214.2.4 使用TOP和DISTINCT關(guān)鍵字例4.21 分別從Customer表中檢索出前5個及表中前20的顧客信息。SELECT TOP 5 * FROM CustomerSELECT TOP 20 PERCENT *FROM Customer SQL Server

24、352021-12-214.2.4 使用TOP和DISTINCT關(guān)鍵字例4.22 查詢Product表中,價格最高的6種商品。SELECT TOP 6 *FROM ProductORDER BY Price DESC SQL Server362021-12-214.2.4 使用TOP和DISTINCT關(guān)鍵字 DISTINCT關(guān)鍵字關(guān)鍵字使用DISTINCT關(guān)鍵字可以從返回的結(jié)果集中刪除重復(fù)的行,使結(jié)果更簡潔。其語法格式為: SELECT ALL | DISTINCT column_name1,column_name2,FROM table_nameWHERE search_condition允

25、許重復(fù)數(shù)據(jù)行的出現(xiàn),是默認的關(guān)鍵字從結(jié)果集中剔除重復(fù)的行 SQL Server372021-12-214.2.4 使用TOP和DISTINCT關(guān)鍵字例4.23 查詢OrderDetail表,顯示訂購的產(chǎn)品編號,如果多張訂單訂購了同一產(chǎn)品,只需顯示一次產(chǎn)品編號。SELECT DISTINCT ProductIDFROM OrderDetail注意:DISTINCT關(guān)鍵字的作用范圍是整個查詢的結(jié)果集,而不是單獨的一列。如果同時對兩列數(shù)據(jù)進行查詢時,使用了DISTINCT關(guān)鍵字,將返回這兩列數(shù)據(jù)的唯一組合。 SQL Server382021-12-214.3 高級查詢1. 多表查詢多表查詢 2.分組

26、和匯總分組和匯總 高級查詢高級查詢3.嵌套查詢嵌套查詢 4.合并數(shù)據(jù)集合并數(shù)據(jù)集 5.在查詢的基在查詢的基礎(chǔ)上創(chuàng)建新表礎(chǔ)上創(chuàng)建新表 SQL Server392021-12-214.3.1 多表查詢 SQL Server提供了實現(xiàn)多表查詢的方法連接查詢。所謂連接查詢是將多個表以某個或某些列為條件進行連接,從中檢索出關(guān)聯(lián)數(shù)據(jù)。 ANSI連接語法格式連接語法格式SELECT column_listFROM table_name1 join_type JOIN table_name2 ON connection_condition ,nWHERE search_condition 連接條件連接類型 S

27、QL Server402021-12-214.3.1 多表查詢 內(nèi)連接(INNER JOIN) 所謂內(nèi)連接是多個表通過連接條件進行的比較連接。當(dāng)未指明連接類型時,默認為內(nèi)連接。 內(nèi)連接值顯示兩個表中所有匹配數(shù)據(jù)的行。 SQL Server412021-12-214.3.1 多表查詢例4.24 顯示OrderID為10249的產(chǎn)品ID、產(chǎn)品數(shù)量及價格。分析:由于ProductID以及Quantity來自于OrderDetailOrderDetail表表,而Price來自于ProductProduct表表,因此涉及到多表,用連接查詢。連接條件為兩個表中的ProductID列值相等。SELECT O

28、rderDetail.ProductID, Quantity, PriceFROM OrderDetail JOIN Product ON OrderDetail.ProductID=Product.ProductIDWHERE OrderID=10249注意:缺省了連接類型,默認為內(nèi)連接。 SQL Server422021-12-214.3.1 多表查詢注意:當(dāng)查詢引用多個表時,所有列都必須明確。重復(fù)的列名必須用表名限定。如果某個列名在查詢用到的多個表中不重復(fù),則不必用表名限定。為了增加可讀性,可以使用表的別名。表的別名的命令語法格式為:FROM table_name table_alias

29、表的別名 SQL Server432021-12-214.3.1 多表查詢例4.25 修改例4.24,使用表的別名,結(jié)果相同。SELECT O.ProductID, Quantity, PriceFROM OrderDetail O JOIN Product P ON O.ProductID=P.ProductIDWHERE OrderID=10249注意:一旦使用了別名代替某個表,則在連接時必須用表的別名,不能再用表的原名。 SQL Server442021-12-214.3.1 多表查詢例4.26 查詢OrderID為10248的顧客ID、顧客姓名、銷售員ID、銷售員姓名。SELECT O

30、.CustomerID,ConnectName,O.SaleID,SaleNameFROM Orders O INNER JOIN Customer C ON O.CustomerID=C.CustomerIDINNER JOIN Seller S ON O.SaleID=S.SaleIDWHERE OrderID=10248 SQL Server452021-12-214.3.1 多表查詢 外連接(OUTER JOIN)外連接顯示包含來自一個表中所有行和來自另一個表中匹配行的結(jié)果集。外連接又分為左外連接、右外連接和完全外連接。1)左外連接(LEFT OUER JOIN) SQL Server

31、462021-12-214.3.1 多表查詢左外連接返回LEFT OUTER JOIN關(guān)鍵字左側(cè)指定的表(左表)的所有行和右側(cè)指定的表(右表)的匹配的行。如果沒有匹配的行則顯示NULL值。例4.27 顯示所有產(chǎn)品的ProductID、ProductName、Price以及被顧客定購的OrderID、Quantity。SELECT P.ProductID,ProductName,Price,OrderID,QuantityFROM Product P LEFT OUTER JOIN OrderDetail O ON P.ProductID=O.ProductID SQL Server472021

32、-12-214.3.1 多表查詢例4.28 顯示所有顧客的信息以及他們訂購產(chǎn)品的訂單ID、銷售員ID和訂購日期。SELECT C.CustomerID,CompanyName,ConnectName,OrderID,SaleID,OrderDateFROM Customer C LEFT OUTER JOIN Orders O ON C.CustomerID=O.CustomerID結(jié)果:左表Customer中的所有行都顯示出來,而不管Orders表中是否訂購了這種產(chǎn)品。 SQL Server482021-12-214.3.1 多表查詢2)右外連接(RIGHT OUTER JOIN)右外連接即

33、在連接兩表時,不管左表中是否有匹配數(shù)據(jù),結(jié)果將保留右表中的所有行。例4.29 修改例4.28使用右外連接。SELECT OrderID,Quantity,P.ProductID,ProductName,PriceFROM OrderDetail O RIGHT OUTER JOIN Product P ON O.ProductID=P.ProductID結(jié)果:包含了右表中的所有數(shù)據(jù)行,而不管左表中是否有匹配數(shù)據(jù)。 SQL Server492021-12-214.3.1 多表查詢3)完全外連接完全外連接是左外連接和右外連接的組合。這個連接返回來自兩個表的所有匹配和非匹配行。其中,匹配記錄僅被顯示

34、一次。例4.30 需要了解所有產(chǎn)品的基本信息和類別信息。SELECT ProductID,ProductName,Price,Stocks, C.CategoryID,CategoryNameFROM Product P FULL OUTER JOIN Category C ON P.CategoryID=C.CategoryID SQL Server502021-12-214.3.1 多表查詢 交叉連接 兩個表之間的交叉連接,也稱為“笛卡兒積”,是用左表中的每一行與右表中的每一行進行連接。交叉連接使用關(guān)鍵字CROSS JOIN。例4.31: SELECT CustomerID,Company

35、Name,ConnectName,SaleID,SaleNameFROM Customer CROSS JOIN Seller結(jié)果:Customer表中9條記錄,Seller表中9條記錄,交叉查詢的結(jié)果集中包含81條記錄。 SQL Server512021-12-214.3.2 分組和匯總 在實際的應(yīng)用中,常常會對表中的數(shù)據(jù)進行分類、統(tǒng)計、匯總等操作,為此SQL Server提供了很多方法來匯總數(shù)據(jù)。 使用聚合函數(shù)使用聚合函數(shù) 聚合函數(shù)可以返回一列、幾列或全部列的匯總數(shù)據(jù),用于計數(shù)或?qū)ふ夷沉械钠骄档取?這類函數(shù)僅作用于數(shù)值型列,并且在列上使用聚合函數(shù)時,不考慮NULL值。 常用的聚合函數(shù)有:

36、函數(shù)名函數(shù)名 描述描述 AVG( ALL | DISTINCT expression ) 返回表達式的平均值 MAX( expression ) 返回表達式中的最大值 MIN( expression ) 返回表達式中的最小值 SUM( ALL | DISTINCT expression ) 返回表達式中所有值的和 COUNT(ALL|DISTINCT expression ) 返回表中指定列的數(shù)據(jù)記錄行數(shù)。使用DISTINCT關(guān)鍵字刪除重復(fù)值 COUNT( * ) 返回表中所有數(shù)據(jù)記錄的行數(shù) SQL Server522021-12-214.3.2 分組和匯總例例4.32 求求Product表中

37、,所有產(chǎn)品的平均價格、最高表中,所有產(chǎn)品的平均價格、最高價、最低價以及總庫存價、最低價以及總庫存。SELECT AVG(Price) AS 平均價格 FROM ProductSELECT MAX(Price) AS 最高價格 FROM ProductSELECT MIN(Price) AS 最低價格 FROM ProductSELECT SUM(Stocks) AS 總庫存 FROM Product SQL Server532021-12-214.3.2 分組和匯總例例4.33 統(tǒng)計統(tǒng)計Product表中,庫存量表中,庫存量200的產(chǎn)品數(shù)量的產(chǎn)品數(shù)量SELECT COUNT(ProductID

38、) FROM ProductWHERE Stocks200例例4.34 統(tǒng)計統(tǒng)計Product表中的產(chǎn)品種數(shù)。表中的產(chǎn)品種數(shù)。SELECT COUNT(*) FROM Product SQL Server542021-12-214.3.2 分組和匯總使用分組匯總子句使用分組匯總子句 顯示分組的匯總數(shù)據(jù),使用GROUP BY子句。該子句根據(jù)指定的列,將表中數(shù)據(jù)分成多個組后進行匯總。其語法格式為:SELECT column_name1,n FROM table_nameWHERE search_conditionGROUP BY ALL colum_name1,n HAVING search_co

39、ndition SQL Server552021-12-214.3.2 分組和匯總例例4.35 將將Product表中的數(shù)據(jù)按表中的數(shù)據(jù)按CategoryID進行分組,然后進行分組,然后分別統(tǒng)計每一組產(chǎn)品的平均價格及總庫存。分別統(tǒng)計每一組產(chǎn)品的平均價格及總庫存。SELECT CategoryID,AVG(Price) AS 平均價格, SUM(Stocks) AS 總庫存 FROM ProductGROUP BY CategoryID注意:使用注意:使用GROUP BY子句為每一個組產(chǎn)生一個匯總結(jié)子句為每一個組產(chǎn)生一個匯總結(jié)果,每個組只返回一行,不返回詳細信息。果,每個組只返回一行,不返回詳細

40、信息。 SQL Server562021-12-214.3.2 分組和匯總 SELECT子句中指定的列必須是GROUP BY子句中指定的列,或者是和聚合函數(shù)一起使用。 如果包含WHERE子句,則只對滿足WHERE條件的行進行分組匯總。 如果GROUP BY子句使用關(guān)鍵字ALL,則被WHERE子句刪選掉的分組仍會保留。 HAVING子句可進一步排除不滿足條件的組。例4.36 在上例基礎(chǔ)上只顯示平均價格低于10元的分組匯總信息。 SQL Server572021-12-214.3.2 分組和匯總SELECT CategoryID, AVG(Price) AS 平均價格, SUM(Stocks) A

41、S 總庫存 FROM ProductGROUP BY CategoryIDHAVING AVG(Price)50GROUP BY CategoryIDHAVING AVG(Price)80注意:如果GROUP BY子句中指定了多個列,則表示要基于這些列的唯一組合來進行分組。在分組過程中,首先按第一列進行分組并按升序排列,然后再按第二列進行分組并按升序排列,依次類推,最后在分好的組中進行匯總。 SQL Server592021-12-214.3.3 嵌套查詢 所謂嵌套查詢指的是在一個SELECT查詢內(nèi)再嵌入一個SELECT查詢。 外層的SELECT語句叫外部查詢; 內(nèi)層的SELECT語句叫子查詢

42、。 使用子查詢時需注意: 子查詢可以嵌套多層。 子查詢需用圓括號()括起來。 子查詢中不能使用COMPUTE BY 和INTO子句。 子查詢的SELECT語句中不能使用image、text或ntext數(shù)據(jù)類型。 SQL Server602021-12-214.3.3 嵌套查詢 子查詢返回值的類型為單值單列子查詢返回值的類型為單值單列例4.41 查詢訂單ID為10249的顧客信息。SELECT * FROM CustomerWHERE CustomerID=(SELECT CustomerID FROM Orders WHERE OrderID=10249)執(zhí)行過程:首先對子查詢求值(僅一次),

43、求出OrderID為10249的CustomerID為c02,然后作外部查詢,外部查詢依賴于子查詢的結(jié)果。 SQL Server612021-12-21例4.42 顯示所有價格高于平均價格的產(chǎn)品。SELECT *FROM ProductWHERE Price(SELECT avg(Price) FROM Product)注意:在例4.41和例4.42中,子查詢的結(jié)果是用于比較的單值單列數(shù)據(jù);如果子查詢中返回的是單列多值,則必須在子查詢前使用關(guān)鍵字ALL或ANY,否則系統(tǒng)會提示錯誤信息。4.3.3 嵌套查詢關(guān)鍵字關(guān)鍵字 含義含義 示例示例 ALL 比較子比較子查詢的查詢的所有值所有值A(chǔ)LL 大于

44、子查詢結(jié)果中的所有值(大于最大的)大于子查詢結(jié)果中的所有值(大于最大的) =ALL 大于等于子查詢結(jié)果中的所有值大于等于子查詢結(jié)果中的所有值 =ALL 小于等于子查詢結(jié)果中的所有值小于等于子查詢結(jié)果中的所有值 =ALL 等于子查詢結(jié)果中的所有值(通常沒有實際等于子查詢結(jié)果中的所有值(通常沒有實際意義)意義) ALL 不等于子查詢結(jié)果中的任何一個值不等于子查詢結(jié)果中的任何一個值 SQL Server622021-12-214.3.3 嵌套查詢ANY 比較子比較子查詢的查詢的任一值任一值 ANY 大于子查詢結(jié)果中的某個值(大于最小)大于子查詢結(jié)果中的某個值(大于最?。?=ANY 大于等于子查詢結(jié)果

45、中的某個值大于等于子查詢結(jié)果中的某個值 =ANY 小于等于子查詢結(jié)果中的某個值小于等于子查詢結(jié)果中的某個值 ANY 不等于子查詢結(jié)果中的某個值不等于子查詢結(jié)果中的某個值 ANY 等于子查詢結(jié)果中的某個值等于子查詢結(jié)果中的某個值 SQL Server632021-12-214.3.3 嵌套查詢例4.43 查詢訂單ID為10248的所訂購的產(chǎn)品信息。SELECT * FROM ProductWHERE ProductID =ANY(SELECT ProductID FROM OrderDetail WHERE OrderID=10248)例4.44 試比較下列兩個查詢語句的不同。SELECT St

46、ocks FROM ProductWHERE StocksALL(SELECT Stocks FROM Product)SELECT Stocks FROM ProductWHERE StocksANY(SELECT Stocks FROM Product) SQL Server642021-12-214.3.3 嵌套查詢 子查詢返回值類型為單列多值子查詢返回值類型為單列多值 IN 表示屬于,即是否在子查詢的結(jié)果集中。 NOT IN 表示不屬于集合 或 不是集合的成員。例例4.45 修改例修改例4.43使用關(guān)鍵字使用關(guān)鍵字IN。SELECT * FROM ProductWHERE Produc

47、tID IN(SELECT ProductID FROM OrderDetail WHERE OrderID=10248)首先,內(nèi)部子查詢返回訂單ID為10248的所訂購的產(chǎn)品ID (P01003,P01005,P02002)。然后,這些值被帶入外部查詢中,在Product中查找與上述標(biāo)識號相匹配的產(chǎn)品信息。 SQL Server652021-12-214.3.3 嵌套查詢例4.46 顯示沒有訂購過p03001產(chǎn)品的顧客ID。SELECT CustomerID FROM OrdersWHERE OrderID NOT IN( SELECT OrderID FROM OrderDetail WH

48、ERE ProductID=p03001) SQL Server662021-12-214.3.3 嵌套查詢 帶關(guān)鍵字帶關(guān)鍵字 NOT EXISTS的子查詢的子查詢在WHERE子句中使用EXISTS關(guān)鍵字,表示判斷子查詢的結(jié)果集是否為空,如果子查詢至少返回一行時,WHERE子句的條件為真,返回TRUE;否則條件為假,返回FALSE。 如果EXISTS前面加上關(guān)鍵字NOT,則剛好相反。 SQL Server672021-12-214.3.3 嵌套查詢例例4.47查找下過訂單的客戶的信息,使用查找下過訂單的客戶的信息,使用EXISTS關(guān)鍵字。關(guān)鍵字。SELECT * FROM CustomerWHERE EXISTS( SELECT * FROM Orders WHERE Customer.CustomerID=Orders.CustomerID) SQL Server682021-12-214.3.3 嵌套查詢使用EXISTS引入的子查詢需注意: EXISTS關(guān)鍵字前面沒有列名、常量或其他表達式。 由EXISTS引出的子查詢,其選擇列表達式通常都用(*),這是因為,帶EXISTS的子查詢只是測試是否存在符合子查詢中指定條件的行,所以不

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論