第4章__關系型數據庫標準語言SQL_第1頁
第4章__關系型數據庫標準語言SQL_第2頁
第4章__關系型數據庫標準語言SQL_第3頁
第4章__關系型數據庫標準語言SQL_第4頁
第4章__關系型數據庫標準語言SQL_第5頁
已閱讀5頁,還剩107頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1第4章 關系型數據庫標準語言SQL24.1 SQL4.1 SQL概述概述lSQLStructured Query LanguageSQLStructured Query Language(結構化查詢語言)的(結構化查詢語言)的縮寫縮寫l SQLSQL目前已成為關系數據庫的標準語言。目前已成為關系數據庫的標準語言。l 現在所有的關系型數據庫管理系統都支持現在所有的關系型數據庫管理系統都支持SQLSQL, VFPVFP也不例也不例外。外。l SQLSQL包含了數據定義、數據操縱和數據控制功能。包含了數據定義、數據操縱和數據控制功能。3SQLSQL的主要特點的主要特點l SQLSQL是一種一體化的

2、語言,它包含數據定義、數據查詢、數是一種一體化的語言,它包含數據定義、數據查詢、數據操縱和數據控制等方面的功能,可以完成數據庫活動中的據操縱和數據控制等方面的功能,可以完成數據庫活動中的全部工作。全部工作。l SQLSQL是一種高度非過程化的語言是一種高度非過程化的語言l SQLSQL非常簡潔非常簡潔l SQLSQL可以直接以命令方式交互使用,也可以嵌入到程序設計可以直接以命令方式交互使用,也可以嵌入到程序設計語言中以程序方式使用。語言中以程序方式使用。4表表4-1 SQL4-1 SQL命令動詞命令動詞SQL功能功能命令動詞命令動詞數據查詢數據查詢 SELECT 數據定義數據定義 CREATE

3、、DROP 、ALTER 數據操縱數據操縱 INSERT、UPDATE、DELETE數據控制數據控制 GRANT、REVOKE u SQLSQL命令動詞命令動詞54.2 4.2 查查 詢詢 功功 能能 查詢是查詢是SQLSQL的核心的核心 SQLSQL的查詢命令的查詢命令SELECTSELECT SQL-SELECT SQL-SELECT命令可以從一個表或多個表或視圖中檢索數據命令可以從一個表或多個表或視圖中檢索數據64.2.1 4.2.1 創建創建SELECTSELECT命令命令 l SELECTSELECT命令詳解:命令詳解:(參見(參見P128P128)74.2.1 4.2.1 創建創建

4、SELECTSELECT命令命令 可以在以下可以在以下3 3個區域中創建個區域中創建SELECTSELECT命令:命令:在命令窗口中在命令窗口中在在VFPVFP程序中程序中在查詢設計器中在查詢設計器中8后面例題以下面表中的數據為例后面例題以下面表中的數據為例Zg表表ck表表dgd表表gys表表94.2.2 4.2.2 簡單查詢簡單查詢簡單查詢簡單查詢是針對單個表的查詢是針對單個表的查詢 查詢僅涉及一個表,是一種最簡單的查詢。查詢僅涉及一個表,是一種最簡單的查詢。 無條件查無條件查由由SELECTSELECT和和FROMFROM短語構成無條件查詢短語構成無條件查詢 SELECT select_I

5、tem FROM TableNameSELECT select_Item FROM TableName 條件查詢條件查詢由由SELECTSELECT、FROMFROM和和WHEREWHERE短語構成條件查詢短語構成條件查詢 SELECT select_Item FROM TableName WHERE FilterConditionSELECT select_Item FROM TableName WHERE FilterCondition指定查指定查詢條件詢條件104.2.2 4.2.2 簡單查詢簡單查詢例例4.1 4.1 從從zgzg關系中檢索所有職工的工資值。關系中檢索所有職工的工資值。

6、SELECT SELECT 工資工資 FROM zgFROM zg結果顯示如圖結果顯示如圖4-24-2所示:所示:圖4-2 檢索所有的工資值 11例:檢索例:檢索zgzg關系的所有元組。關系的所有元組。SELECT SELECT 倉庫號倉庫號, ,職工號職工號, ,工資工資 FROM zgFROM zg或或SELECT SELECT * * FROM zg FROM zg查詢結果:查詢結果:12例例4.2 4.2 從從zgzg關系中檢索工資多于關系中檢索工資多于12201220元的職工號。元的職工號。SELECT SELECT 職工號職工號 FROM zg WHERE FROM zg WHER

7、E 工資工資12201220結果顯示如圖結果顯示如圖4-34-3所示:所示:圖4-3 檢索工資結果13例例4.3 4.3 檢索在倉庫檢索在倉庫WH2WH2或或WH1WH1工作,并且工資少于工作,并且工資少于12501250元的職工元的職工的職工號。的職工號。SELECT SELECT 職工號職工號 FROM zg WHERE FROM zg WHERE (倉庫號(倉庫號=“WH2” OR =“WH2” OR 倉庫號倉庫號=“WH1”=“WH1”) AND AND 工資工資125012101210結果顯示如下圖所示:結果顯示如下圖所示: 上面結果中上面結果中“WH2”WH2”出現了兩次,顯然是重

8、復的,我們并不出現了兩次,顯然是重復的,我們并不希望看到這種情況的發生,為此我們可以使用希望看到這種情況的發生,為此我們可以使用DISTINCTDISTINCT短語來消短語來消除查詢中的重復結果(重復行)。除查詢中的重復結果(重復行)。15加入加入 DISTINCTDISTINCT 后的后的SELECTSELECT命令如下:命令如下: SELECT SELECT DISTINCTDISTINCT 倉庫號倉庫號 FROM zg WHERE FROM zg WHERE 工資工資12101210結果顯示如下圖所示:結果顯示如下圖所示:164.2.3 4.2.3 簡單的連接查詢簡單的連接查詢 簡單的連

9、接查詢是一類基于多個表的查詢簡單的連接查詢是一類基于多個表的查詢 一個數據庫中的多個表之間一般都存在某種內在聯系,它們一個數據庫中的多個表之間一般都存在某種內在聯系,它們共同提供有用的信息。共同提供有用的信息。 如果一個查詢同時涉及兩個以上的表,則稱為連接查詢。如果一個查詢同時涉及兩個以上的表,則稱為連接查詢。其基本格式是:其基本格式是:SELECT select_Item1,select_Item2 FROM TableName1, SELECT select_Item1,select_Item2 FROM TableName1, TableName2 WHERE JoinCondition

10、TableName2 WHERE JoinCondition 注:當注:當FROMFROM之后的多個關系中含有相同的屬性名時,引用該之后的多個關系中含有相同的屬性名時,引用該屬性名必須用關系前綴指明屬性所屬的關系,即屬性名必須用關系前綴指明屬性所屬的關系,即TableName.TableName.屬性屬性名,名,“.”.”前面的是關系名,后面是屬性名。前面的是關系名,后面是屬性名。174.2.3 4.2.3 簡單的連接查詢簡單的連接查詢例例4.7 4.7 找出工作在面積大于找出工作在面積大于340340的倉庫的職工的職工號和職工的倉庫的職工的職工號和職工所在的城市。所在的城市。SELECT S

11、ELECT 職工號職工號, ,城市城市 FROM ck,zg;FROM ck,zg;WHERE ck.WHERE ck.倉庫號倉庫號=zg.=zg.倉庫號倉庫號 AND AND 面積面積340 340 結果顯示如下圖所示:結果顯示如下圖所示:184.2.4 4.2.4 嵌套查詢嵌套查詢嵌套查詢嵌套查詢在在SQLSQL中,可以將一個中,可以將一個selectselect查詢語句嵌入到另一查詢語句嵌入到另一個個selectselect查詢語句中,這稱為嵌套查詢。查詢語句中,這稱為嵌套查詢。l 將內嵌的將內嵌的selectselect語句稱為子查詢。語句稱為子查詢。l 標準的標準的SQLSQL允許子

12、查詢可以嵌套多層,但在允許子查詢可以嵌套多層,但在VFPVFP中,不允許多中,不允許多層嵌套,即子查詢不能再嵌套了。層嵌套,即子查詢不能再嵌套了。 l 一般來說,當查詢所要求的結果出自一個關系,但查詢條件一般來說,當查詢所要求的結果出自一個關系,但查詢條件卻涉及多個關系時。例如,當檢索關系卻涉及多個關系時。例如,當檢索關系X X中的元組時,它的條件中的元組時,它的條件依賴于相關的關系依賴于相關的關系Y Y中的元組的屬性值,這時使用中的元組的屬性值,這時使用SQLSQL的嵌套查的嵌套查詢功能將非常方便。詢功能將非常方便。194.2.4 4.2.4 嵌套查詢嵌套查詢嵌套查詢的一般格式為:嵌套查詢的

13、一般格式為:SELECT select_Item1 FROM TableName1 WHERE SELECT select_Item1 FROM TableName1 WHERE FilterCondition1 IN;FilterCondition1 IN;(SELECT select_Item2 FROM TableName2 WHERE (SELECT select_Item2 FROM TableName2 WHERE FilterCondition2)FilterCondition2)注:內嵌的子查詢要用圓括號括起來。注:內嵌的子查詢要用圓括號括起來。204.2.4 4.2.4 嵌套

14、查詢嵌套查詢例例4.8 4.8 查詢哪些城市的倉庫至少有一個職工工資為查詢哪些城市的倉庫至少有一個職工工資為12201220元?元?嵌套查詢:嵌套查詢:SELECT SELECT 城市城市 FROM ck WHERE FROM ck WHERE 倉庫號倉庫號 IN; IN; (SELECT (SELECT 倉庫號倉庫號 FROM zg WHERE FROM zg WHERE 工資工資=1220)=1220)214.2.4 4.2.4 嵌套查詢嵌套查詢例例4.10 4.10 查詢和職工查詢和職工E4E4工資相同的所有職工的記錄工資相同的所有職工的記錄嵌套查詢:嵌套查詢:SELECT SELECT

15、 * * FROM zg WHERE FROM zg WHERE 工資工資 IN; IN; (SELECT (SELECT 工資工資 FROM zg WHERE FROM zg WHERE 職工號職工號=“E4”)=“E4”)結果顯示如下圖所示:結果顯示如下圖所示:224.2.4 4.2.4 嵌套查詢嵌套查詢例:查詢具有最高工資的職工的信息。例:查詢具有最高工資的職工的信息。嵌套查詢:嵌套查詢:SELECT SELECT * * FROM zg WHERE FROM zg WHERE 工資工資 IN; IN; (SELECT MAX(SELECT MAX(工資工資) FROM zg) FROM

16、 zg)結果顯示如下圖所示:結果顯示如下圖所示:234.2.5 4.2.5 幾個特殊運算符幾個特殊運算符SQL SELECTSQL SELECT有如下幾個特殊運算符:有如下幾個特殊運算符: BETWEENANDBETWEENAND介于介于和和之間,并且包括兩個邊界值。之間,并且包括兩個邊界值。 LIKELIKE字符串匹配運算符字符串匹配運算符 通配符通配符 “ “%” %” 表示表示0 0個或多個字符個或多個字符 通配符通配符 “ “_”_”(下劃線)表示一個字符(可以是一個(下劃線)表示一個字符(可以是一個ASCIIASCII碼字符,也可以是一個漢字字符)。碼字符,也可以是一個漢字字符)。

17、!= != 在在SQLSQL中中“不等于不等于”用用“!=”!=”表示,另外還可以用否表示,另外還可以用否定運算符定運算符 NOT NOT 寫出等價的命令。寫出等價的命令。244.2.5 4.2.5 幾個特殊運算符幾個特殊運算符例例4.11 4.11 查詢工資在查詢工資在1220122012701270元之間的職工所有信息。元之間的職工所有信息。SELECT SELECT * * FROM zg WHERE FROM zg WHERE 工資工資 BETWEEN 1220 AND BETWEEN 1220 AND 12701270等價于等價于SELECT SELECT * * FROM zg W

18、HERE FROM zg WHERE 工資工資=1220 AND =1220 AND 工資工資=1270= 2001-7-1 = 2001-7-1 AND AND 訂購日期訂購日期=2001-7-31=2001-7-31264.2.5 4.2.5 幾個特殊運算符幾個特殊運算符例例4.12 4.12 從從gysgys關系中查詢出全部公司的信息,不要工廠和其他關系中查詢出全部公司的信息,不要工廠和其他供應商的信息。供應商的信息。SELECT SELECT * * FROM gys WHERE FROM gys WHERE 供應商名供應商名 like “%like “%公司公司”查詢結果:查詢結果:

19、274.2.5 4.2.5 幾個特殊運算符幾個特殊運算符例例: : 從學生關系中檢索出所有王姓學生的信息。從學生關系中檢索出所有王姓學生的信息。SELECT SELECT * * FROM FROM 學生學生 WHERE WHERE 姓名姓名 like “like “王王%”%”查詢結果:查詢結果:284.2.5 4.2.5 幾個特殊運算符幾個特殊運算符例例: : 從學生關系中檢索出所有女生的信息。從學生關系中檢索出所有女生的信息。SELECT SELECT * * FROM FROM 學生學生 WHERE WHERE 性別性別=“=“女女”或或SELECT SELECT * * FROM F

20、ROM 學生學生 WHERE WHERE 性別性別 like “like “女女”查詢結果:查詢結果:29v例例4.134.134.2.5 4.2.5 幾個特殊運算符幾個特殊運算符304.2.6 4.2.6 排序排序 SQL SELECTSQL SELECT命令可以對查詢結果進行排序,實現排序的短語命令可以對查詢結果進行排序,實現排序的短語是是ORDER BYORDER BY,具體格式如下:,具體格式如下:ORDER BY Order_Item ASC | DESC,Order_Item ASC ORDER BY Order_Item ASC | DESC,Order_Item ASC |DE

21、SC|DESCl ORDER BY ORDER BY短語中的每個短語中的每個Order_ItemOrder_Item都必須對應查詢結果中的都必須對應查詢結果中的一列。一列。l 排序的順序可以是升序排序的順序可以是升序(ASC)(ASC)或降序或降序(DESC)(DESC)l 可以按一列或多列排序,當指定多列排序時,各列列名之間用可以按一列或多列排序,當指定多列排序時,各列列名之間用“,”,”分隔。分隔。314.2.6 4.2.6 排序排序例例4.14 4.14 查找出查找出zgzg表中所有職工的信息并將結果按工資升序排序。表中所有職工的信息并將結果按工資升序排序。SELECT SELECT *

22、 * FROM zg ORDER BY FROM zg ORDER BY 工資工資或或SELECT SELECT * * FROM zg ORDER BY FROM zg ORDER BY 工資工資 ASCASC查詢結果:查詢結果:324.2.6 4.2.6 排序排序例:檢索所有的學生的信息,結果按年齡降序排序,年齡相同的,例:檢索所有的學生的信息,結果按年齡降序排序,年齡相同的,按學號升序排序。按學號升序排序。SELECT SELECT * * FROM FROM 學生學生 ORDER BY ORDER BY 年齡年齡 DESC,DESC,學號學號或或SELECT SELECT * * FR

23、OM FROM 學生學生 ORDER BY ORDER BY 年齡年齡 DESC,DESC,學號學號 ASCASC查詢結果:查詢結果:334.2.7 4.2.7 簡單的計算查詢簡單的計算查詢 SQLSQL不僅可以查詢表中的數據,而且還可以對表中的數據不僅可以查詢表中的數據,而且還可以對表中的數據進行計算。進行計算。 例如,從例如,從zgzg表中檢索職工的平均工資,檢索某個倉庫中表中檢索職工的平均工資,檢索某個倉庫中職工的最高工資,統計某倉庫的職工人數等等。職工的最高工資,統計某倉庫的職工人數等等。344.2.7 4.2.7 簡單的計算查詢簡單的計算查詢SQLSQL用于計算查詢的函數:用于計算查

24、詢的函數: COUNTCOUNT計數函數計數函數用法:用法:(1) COUNT(column_name)(1) COUNT(column_name) 返回給定表中指定列的值的個數(返回給定表中指定列的值的個數(NULLNULL值不計入)值不計入) (2) COUNT( (2) COUNT(* *) ) 返回指定表中匹配指定條件的行的數目返回指定表中匹配指定條件的行的數目注:注:COUNT COUNT 和和 DISTINCT DISTINCT 經常被合起來使用經常被合起來使用354.2.7 4.2.7 簡單的計算查詢簡單的計算查詢例例4.16 4.16 查詢查詢gysgys表中供應商所在地的數目

25、。表中供應商所在地的數目。SELECT COUNT(DISTINCT SELECT COUNT(DISTINCT 地址地址) FROM gys) FROM gys或或SELECT COUNT(DISTINCT SELECT COUNT(DISTINCT 地址地址) AS ) AS 供應商所在地個數供應商所在地個數 FROM gysFROM gys!注意!注意:上面:上面COUNTCOUNT函數中函數中“地址地址”前面的前面的DISTINCTDISTINCT不可少,否不可少,否則結果是錯誤的,即則結果是錯誤的,即SELECT COUNT(SELECT COUNT(地址地址) FROM gys)

26、FROM gys得到的結果不是供應商所在地的個數。得到的結果不是供應商所在地的個數。364.2.7 4.2.7 簡單的計算查詢簡單的計算查詢例:查詢學生表中登記的學生的人數。例:查詢學生表中登記的學生的人數。SELECT COUNT(SELECT COUNT(* *) FROM ) FROM 學生學生或或SELECT COUNT(SELECT COUNT(* *) AS ) AS 學生人數學生人數 FROM FROM 學生學生或或SELECT COUNT(SELECT COUNT(學號學號) AS ) AS 學生人數學生人數 FROM FROM 學生學生注注:(1 1)此時此時“學號學號”前面

27、加不加前面加不加DISTINCT DISTINCT 所得到的結果都所得到的結果都是一致的,因為在學生表中是一致的,因為在學生表中“學號學號”值是彼此不同的。值是彼此不同的。(2 2)當查詢列是表達式或函數時,常對列進行命名。)當查詢列是表達式或函數時,常對列進行命名。374.2.7 4.2.7 簡單的計算查詢簡單的計算查詢例:查詢學生表中年齡在例:查詢學生表中年齡在1818歲至歲至2020歲之間的男生的人數。歲之間的男生的人數。SELECT COUNT(SELECT COUNT(* *) AS ) AS 人數人數 FROM FROM 學生學生; ;WHERE WHERE 年齡年齡 betwee

28、n 18 and 20 AND between 18 and 20 AND 性別性別=“=“男男”或或SELECT COUNT(SELECT COUNT(學號學號) AS ) AS 人數人數 FROM FROM 學生學生; ;WHERE WHERE 年齡年齡 between 18 and 20 AND between 18 and 20 AND 性別性別=“=“男男”384.2.7 4.2.7 簡單的計算查詢簡單的計算查詢 SUMSUM求和函數,計算指定列中數值的總和。求和函數,計算指定列中數值的總和。 AVGAVG求平均值函數,計算列中數值的平均值。求平均值函數,計算列中數值的平均值。 MA

29、XMAX最大值函數,求指定列中的最大值。最大值函數,求指定列中的最大值。 MINMIN最小值函數,求指定列中的最小值。最小值函數,求指定列中的最小值。注:這些函數可以在注:這些函數可以在SELECTSELECT短語中對查詢結果進行計算。短語中對查詢結果進行計算。394.2.7 4.2.7 簡單的計算查詢簡單的計算查詢例例4.17 4.17 計算支付給所有職工的工資總額。計算支付給所有職工的工資總額。SELECT SUM(SELECT SUM(工資工資) AS ) AS 工資總額工資總額 FROM zgFROM zg查詢結果:查詢結果:404.2.7 4.2.7 簡單的計算查詢簡單的計算查詢例例

30、4.18 4.18 求所在地為求所在地為“北京北京”和和“西安西安”的倉庫的職工的工資的倉庫的職工的工資總和。總和。SELECT SUM(SELECT SUM(工資工資) AS ) AS 工資總和工資總和 FROM zg;FROM zg;WHERE WHERE 倉庫號倉庫號 IN;IN;(SELECT (SELECT 倉庫號倉庫號 FROM ck WHERE FROM ck WHERE 城市城市=“=“北京北京” ” OR OR 城城市市=“=“西安西安”) )或或SELECT SUM(SELECT SUM(工資工資) AS ) AS 工資總和工資總和 FROM zg,ck;FROM zg,c

31、k;WHERE zg.WHERE zg.倉庫號倉庫號=ck.=ck.倉庫號倉庫號 AND (AND (城市城市=“=“北京北京” ” OR OR 城城市市=“=“西安西安”) )41v例例4.194.19v例例4.204.20424.2.8 4.2.8 分組與計算查詢分組與計算查詢在在SELECT-SQLSELECT-SQL命令中,常用命令中,常用GROUP BYGROUP BY子句對查詢結果進行分組。子句對查詢結果進行分組。其短語的格式如下:其短語的格式如下:GROUP BY GroupColumn ,GroupColumn HAVING GROUP BY GroupColumn ,Grou

32、pColumn HAVING FilterConditionFilterCondition對分組對分組結果進結果進行篩選行篩選指定篩選指定篩選條件條件43l 使用使用GROUP BYGROUP BY進行分組時,查詢結果是指定表按進行分組時,查詢結果是指定表按 分組的記錄集。分組的記錄集。l 可以按一列或多列分組,還可以用可以按一列或多列分組,還可以用HAVINGHAVING進一步限定分組的進一步限定分組的條件。條件。l HAVINGHAVING子句總是跟在子句總是跟在GROUP BYGROUP BY子句之后,而不可以單獨使用。子句之后,而不可以單獨使用。44注:注:當使用當使用 group b

33、y group by 時,查詢列(即緊跟在時,查詢列(即緊跟在selectselect后面的字后面的字段名或表達式)中除了在段名或表達式)中除了在group bygroup by中出現的那(些)個字段可中出現的那(些)個字段可以以字段名形式出現外,其他的列上要用統計函數以以字段名形式出現外,其他的列上要用統計函數(sum,max,min,count sum,max,min,count 等),不然那句等),不然那句SQLSQL就是錯的。就是錯的。454.2.8 4.2.8 分組與計算查詢分組與計算查詢例:求支付給每個倉庫的職工的工資總額。例:求支付給每個倉庫的職工的工資總額。SELECT SEL

34、ECT 倉庫號倉庫號,SUM(,SUM(工資工資) AS ) AS 工資總額工資總額 FROM zg;FROM zg;GROUP BY GROUP BY 倉庫號倉庫號查詢結果:查詢結果:464.2.8 4.2.8 分組與計算查詢分組與計算查詢例:求各倉庫的職工人數。例:求各倉庫的職工人數。SELECT SELECT 倉庫號倉庫號,COUNT(,COUNT(* *) AS ) AS 職工人數職工人數 FROM zg;FROM zg;GROUP BY GROUP BY 倉庫號倉庫號說明:說明:SQLSQL的分組功能常常與計算函數結合使用。的分組功能常常與計算函數結合使用。474.2.8 4.2.8

35、 分組與計算查詢分組與計算查詢例:求各倉庫工資高于例:求各倉庫工資高于12101210元的職工的人數。元的職工的人數。SELECT SELECT 倉庫號倉庫號,COUNT(,COUNT(* *) AS ) AS 職工人數職工人數 FROM zg;FROM zg;WHERE WHERE 工資工資1210;1210;GROUP BY GROUP BY 倉庫號倉庫號查詢結果:查詢結果:484.2.8 4.2.8 分組與計算查詢分組與計算查詢例:檢索平均工資大于或等于例:檢索平均工資大于或等于12301230元的倉庫的倉庫號。元的倉庫的倉庫號。SELECT SELECT 倉庫號倉庫號 FROM zg;

36、FROM zg;GROUP BY GROUP BY 倉庫號倉庫號 HAVING AVG(HAVING AVG(工資工資)=1230)=1230494.2.8 4.2.8 分組與計算查詢分組與計算查詢例:在例:在dgddgd關系中檢索關系中檢索20012001年年6 6月月1 1日之后(含該天)簽訂過兩件日之后(含該天)簽訂過兩件以上(含兩件)訂單的職工的職工號。以上(含兩件)訂單的職工的職工號。SELECT SELECT 職工號職工號 FROM dgd;FROM dgd;WHERE WHERE 訂購日期訂購日期2001-6-1;2001-6-1;GROUP BY GROUP BY 職工號職工號

37、 HAVING COUNT(HAVING COUNT(* *)=2)=2說明:說明: HAVINGHAVING子句和子句和WHEREWHERE子句并不矛盾,它們可以同時使用。子句并不矛盾,它們可以同時使用。在查詢中總是先用在查詢中總是先用WHEREWHERE子句限定元組,然后進行分組,最后再子句限定元組,然后進行分組,最后再用用HAVINGHAVING子句對分組進行篩選。子句對分組進行篩選。504.2.9 4.2.9 利用空值查詢利用空值查詢SQLSQL支持空值(支持空值(NULLNULL),在),在SQLSQL中可以利用空值進行查詢。中可以利用空值進行查詢。空值可寫成空值可寫成“NULL”N

38、ULL”或或“null”null”,也可寫成,也可寫成“.NULL.”.NULL.”或或“.null.”.null.”NULLNULL值具有以下特點:值具有以下特點: 等價于沒有任何值。等價于沒有任何值。 與與0 0、空格和空字符串不同。、空格和空字符串不同。 排序時具有最大的優先權。排序時具有最大的優先權。 可以用于計算和大多數的函數中。可以用于計算和大多數的函數中。 NULLNULL值不改變變量或字段的數據類型。值不改變變量或字段的數據類型。 NULLNULL值會影響命令、函數、表達式的執行。值會影響命令、函數、表達式的執行。514.2.9 4.2.9 利用空值查詢利用空值查詢例例4.23

39、4.23:從:從dgddgd關系中查詢尚未確定供應商的訂購單信息。關系中查詢尚未確定供應商的訂購單信息。SELECT SELECT * * FROM dgd WHERE FROM dgd WHERE 供應商號供應商號 IS NULLIS NULL注意:注意:上面命令中上面命令中“供應商供應商 IS NULL”IS NULL”不能寫成不能寫成 “ “供應商供應商=NULL”=NULL” “NULL” “NULL”不是一個值,它只表示不是一個值,它只表示“還沒有值還沒有值”,不能作相等的,不能作相等的比較。比較。524.2.9 4.2.9 利用空值查詢利用空值查詢例例4.24 4.24 從從dgd

40、dgd關系中查詢已經確定了供應商的訂購單信息。關系中查詢已經確定了供應商的訂購單信息。SELECT SELECT * * FROM dgd WHERE FROM dgd WHERE 供應商號供應商號 IS NOT NULLIS NOT NULL等價于等價于SELECT SELECT * * FROM dgd WHERE NOT FROM dgd WHERE NOT 供應商號供應商號 IS NULLIS NULL534.2.10 4.2.10 別名與自連接查詢別名與自連接查詢1. 1. 關系別名關系別名 在關系的連接操作中經常需要使用關系名作前綴來引用關在關系的連接操作中經常需要使用關系名作前綴

41、來引用關系的屬性(表的字段),例如,系的屬性(表的字段),例如,SELECT SELECT 學生學生. .學號學號, ,學生學生. .姓名姓名, ,課程課程. .課程號課程號, ,課程課程. .課程名課程名, ,成成績績. .成績成績; ;FROM FROM 學生學生, ,成績成績, ,課程課程; ;WHERE WHERE 學生學生. .學號學號= =成績成績. .學號學號 and and 成績成績. .課程號課程號= =課程課程. .課程課程號號 有時這樣顯得很麻煩,特別是在關系名較長的時候。因此,有時這樣顯得很麻煩,特別是在關系名較長的時候。因此,SQLSQL允許在允許在FROMFROM短

42、語和短語和JOINJOIN短語中為關系名定義別名。短語中為關系名定義別名。544.2.10 4.2.10 別名與自連接查詢別名與自連接查詢為關系定義別名的格式為:為關系定義別名的格式為: AS AS 例如:例如:SELECT s.SELECT s.學號學號,s.,s.姓名姓名,c.,c.課程號課程號,c.,c.課程名課程名,sc.,sc.成績成績; ;FROM FROM 學生學生 s,s,成績成績 sc,sc,課程課程 c;c;WHERE s.WHERE s.學號學號=sc.=sc.學號學號 and sc.and sc.課程號課程號=c.=c.課程號課程號使用別名后,這一使用別名后,這一SEL

43、ECTSELECT命令寫得更簡潔了。命令寫得更簡潔了。55其中“雇員號”和“經理”這兩個屬性出自同一屬性域,同一元組的這兩個屬性值是上、下級(領導與被領導)關系。因此,可以將雇員關系與其自身連接得到具體反映各雇員間上、下級關系的關系。2. 2. 自連接查詢自連接查詢關系的自連接關系的自連接對有些關系來說,可以將它與其自身進行連對有些關系來說,可以將它與其自身進行連接,例如,雇員(雇員號,雇員姓名,經理),稱這種關系與接,例如,雇員(雇員號,雇員姓名,經理),稱這種關系與其自身的連接為自連接。其自身的連接為自連接。說明:說明:能夠作自連接的能夠作自連接的關系必須滿足的條件是,關系必須滿足的條件是

44、,它有兩個出于同一屬性它有兩個出于同一屬性域的屬性(顯然這兩個域的屬性(顯然這兩個屬性是不同名的),其屬性是不同名的),其中一個屬性以另一屬性中一個屬性以另一屬性的取值為值,例如,上的取值為值,例如,上面面“雇員雇員”關系中的關系中的“經理經理”以以“雇員號雇員號”作為自身的取值。作為自身的取值。56v參見例參見例4.254.25注意其工作過程注意其工作過程574.2.11 4.2.11 內外層相互關聯的嵌套查詢內外層相互關聯的嵌套查詢 內外層相互關聯的嵌套查詢內外層相互關聯的嵌套查詢前面討論過的嵌套查詢前面討論過的嵌套查詢都是外層查詢依賴于內層查詢的結果,而內層查詢與外層查都是外層查詢依賴于

45、內層查詢的結果,而內層查詢與外層查詢無關。實際上,有時候,內層查詢的條件需要外層查詢指詢無關。實際上,有時候,內層查詢的條件需要外層查詢指定的關系來提供值,而外層查詢的條件涉及內層查詢的結果。定的關系來提供值,而外層查詢的條件涉及內層查詢的結果。584.2.11 4.2.11 內外層相互關聯的嵌套查詢內外層相互關聯的嵌套查詢例例4.264.26:設有如下的的訂購單表:設有如下的的訂購單表dgd2.dbfdgd2.dbf,查詢每個職工經手,查詢每個職工經手的具有最高總金額的訂購單信息。的具有最高總金額的訂購單信息。訂購單表訂購單表dgd2dgd2:594.2.11 4.2.11 內外層相互關聯的

46、嵌套查詢內外層相互關聯的嵌套查詢上面查詢對應命令如下:上面查詢對應命令如下:SELECT SELECT * * FROM dgd2 out WHERE FROM dgd2 out WHERE 總金額總金額; ;(SELECT MAX(SELECT MAX(總金額總金額) FROM dgd2 inn WHERE inn.) FROM dgd2 inn WHERE inn.職工職工號號out.out.職工號職工號) )查詢結果如下圖所示:查詢結果如下圖所示:604.2.12 4.2.12 使用量詞和謂詞的查詢使用量詞和謂詞的查詢1. 1. 量詞量詞量詞包括:量詞包括:ANYANY、ALLALL和和

47、SOMESOME其格式為:其格式為: ANY | ALL | SOME(ANY | ALL | SOME(子查詢子查詢) )其中,其中,ANYANY和和SOMESOME同義,在進行比較運算時只要子查詢中有一行同義,在進行比較運算時只要子查詢中有一行(一個元組)使條件為真,則結果就為真;而(一個元組)使條件為真,則結果就為真;而ALLALL則要求子查詢則要求子查詢中的所有行都使條件為真時,結果才為真。中的所有行都使條件為真時,結果才為真。注:注:格式中的格式中的“ ”通常是查詢中指定關系的屬性名。通常是查詢中指定關系的屬性名。614.2.12 4.2.12 使用量詞和謂詞的查詢使用量詞和謂詞的查

48、詢1. 1. 量詞量詞例例4.294.29:檢索有職工的工資大于或等于:檢索有職工的工資大于或等于WH1WH1倉庫中所有職工的工倉庫中所有職工的工資的倉庫的倉庫號。資的倉庫的倉庫號。SELECT SELECT 倉庫號倉庫號 FROM zg WHERE FROM zg WHERE 工資工資=ALL;=ALL;(SELECT (SELECT 工資工資 FROM zg WHERE FROM zg WHERE 倉庫號倉庫號=“WH1”)=“WH1”)上面命令等價于上面命令等價于SELECT SELECT 倉庫號倉庫號 FROM zg WHERE FROM zg WHERE 工資工資=;=;(SELEC

49、T MAX(SELECT MAX(工資工資) FROM zg WHERE ) FROM zg WHERE 倉庫號倉庫號=“WH1”)=“WH1”)624.2.12 4.2.12 使用量詞和謂詞的查詢使用量詞和謂詞的查詢2. 2. 謂詞謂詞EXISTSEXISTS格式:格式: NOT EXISTS (NOT EXISTS (子查詢子查詢) )EXISTSEXISTS或或NOT EXISTSNOT EXISTS是用來檢查在子查詢中是否有結果返回是用來檢查在子查詢中是否有結果返回(即存在元組或不存在元組)。(即存在元組或不存在元組)。注:注:NOT EXISTS (NOT EXISTS (子查詢子查

50、詢) ) 用于構成外層查詢的查詢條件,用于構成外層查詢的查詢條件,當子查詢中有結果返回(即子查詢中存在元組)時,當子查詢中有結果返回(即子查詢中存在元組)時,EXISTS EXISTS ( (子查詢子查詢) )為真,此時為真,此時NOT EXISTS (NOT EXISTS (子查詢子查詢) )為假;當子查詢中為假;當子查詢中沒有結果返回(即子查詢中不存在元組)時,沒有結果返回(即子查詢中不存在元組)時,EXISTS (EXISTS (子查詢子查詢) )為假,此時為假,此時NOT EXISTS (NOT EXISTS (子查詢子查詢) )為真。為真。634.2.12 4.2.12 使用量詞和謂

51、詞的查詢使用量詞和謂詞的查詢2. 2. 謂詞謂詞EXISTSEXISTS例例4.28 4.28 檢索那些至少有一名職工的倉庫的信息。檢索那些至少有一名職工的倉庫的信息。SELECT SELECT * * FROM ck WHERE EXISTS; FROM ck WHERE EXISTS;(SELECT (SELECT * * FROM zg WHERE FROM zg WHERE 倉庫號倉庫號=ck.=ck.倉庫號倉庫號) )上面命令等價于上面命令等價于SELECT SELECT * * FROM ck WHERE FROM ck WHERE 倉庫號倉庫號 IN;IN;(SELECT (SE

52、LECT 倉庫號倉庫號 FROM zg)FROM zg)644.2.12 4.2.12 使用量詞和謂詞的查詢使用量詞和謂詞的查詢2. 2. 謂詞謂詞EXISTSEXISTS例例4.274.27:檢索那些還沒有職工的倉庫的信息。:檢索那些還沒有職工的倉庫的信息。SELECT SELECT * * FROM ck WHERE NOT EXISTS; FROM ck WHERE NOT EXISTS;(SELECT (SELECT * * FROM zg WHERE FROM zg WHERE 倉庫號倉庫號=ck.=ck.倉庫號倉庫號) )上面命令等價于上面命令等價于SELECT SELECT *

53、* FROM ck WHERE FROM ck WHERE 倉庫號倉庫號 NOT IN;NOT IN;(SELECT (SELECT 倉庫號倉庫號 FROM zg)FROM zg)654.2.13 4.2.13 超連接查詢超連接查詢 除了前面講過的等值連接,新的除了前面講過的等值連接,新的SQLSQL標準還支持兩個新的標準還支持兩個新的關系連接運算符,它們是關系連接運算符,它們是 “ “* *=” =” 和和 “ “= =* *”。664.2.13 4.2.13 超連接查詢超連接查詢左連左連接示接示意圖意圖:l “* *=” =” 稱為左連接稱為左連接674.2.13 4.2.13 超連接查詢

54、超連接查詢右連右連接示接示意圖:意圖:l “= =* *”稱為右連稱為右連接接68指定連接指定連接條件條件4.2.13 4.2.13 超連接查詢超連接查詢注意:注意:Visual FoxProVisual FoxPro并不支持并不支持 “ “* *=” =” 和和 “ “= =* *” ” 運算符,在運算符,在VFPVFP中是通過使用中是通過使用JOINJOIN短語來實現超連接查詢的。短語來實現超連接查詢的。與超連接有關的語法格式如下:與超連接有關的語法格式如下:SELECT SELECT FROM Table AS Local_Alias INNER | LEFT | RIGHT | FRO

55、M Table AS Local_Alias INNER | LEFT | RIGHT | FULL JOIN Table AS Local_Alias ON FULL JOIN Table AS Local_Alias ON JoinConditionJoinConditionWHERE WHERE 進行表的連接運算,連接的類型有:進行表的連接運算,連接的類型有:INNER JOIN內連接;LEFT JOIN左連接;RIGHT JOIN右連接;FULL JOIN全連接。694.2.13 4.2.13 超連接查詢超連接查詢l INNER JOININNER JOIN內連接(這是超連接的默認類型

56、)內連接(這是超連接的默認類型) 內連接與前面講的等值連接的結果一致。內連接與前面講的等值連接的結果一致。l LEFT JOINLEFT JOIN左連接左連接l RIGHT JOINRIGHT JOIN右連接右連接l FULL JOINFULL JOIN全連接全連接704.2.13 4.2.13 超連接查詢超連接查詢例例4.314.31:內連接(與等值連接的結果一致,即兩個表中只有滿足:內連接(與等值連接的結果一致,即兩個表中只有滿足連接條件的記錄才出現在查詢結果中)。連接條件的記錄才出現在查詢結果中)。SELECT ck.SELECT ck.倉庫號倉庫號, ck., ck.城市城市,ck.,

57、ck.面積面積,zg.,zg.職工號職工號,zg.,zg.工資工資; ;FROM ck JOIN zg ON ck.FROM ck JOIN zg ON ck.倉庫號倉庫號=zg.=zg.倉庫號倉庫號等價于等價于SELECT ck.SELECT ck.倉庫號倉庫號, ck., ck.城市城市,ck.,ck.面積面積,zg.,zg.職工號職工號,zg.,zg.工資工資; ;FROM ck INNER JOIN zg ON ck.FROM ck INNER JOIN zg ON ck.倉庫號倉庫號=zg.=zg.倉庫號倉庫號714.2.13 4.2.13 超連接查詢超連接查詢上面命令也等價于上面命

58、令也等價于SELECT ck.SELECT ck.倉庫號倉庫號, ck., ck.城市城市,ck.,ck.面積面積,zg.,zg.職工號職工號,zg.,zg.工資工資; ;FROM ck,zg WHERE ck.FROM ck,zg WHERE ck.倉庫號倉庫號=zg.=zg.倉庫號倉庫號查詢結果:查詢結果:724.2.13 4.2.13 超連接查詢超連接查詢例:查詢工資在例:查詢工資在12101210元以上的職工的職工號,工資及其所在城市。元以上的職工的職工號,工資及其所在城市。SELECT zg.SELECT zg.職工號職工號,zg.,zg.工資工資, ck., ck.城市城市; ;F

59、ROM zg JOIN ck ON zg.FROM zg JOIN ck ON zg.倉庫號倉庫號=ck.=ck.倉庫號倉庫號; ;WHERE zg.WHERE zg.工資工資12101210等價于等價于SELECT zg.SELECT zg.職工號職工號,zg.,zg.工資工資,ck.,ck.城市城市; ;FROM zg,ck WHERE ck.FROM zg,ck WHERE ck.倉庫號倉庫號=zg.=zg.倉庫號倉庫號 AND zg.AND zg.工資工資12101210734.2.13 4.2.13 超連接查詢超連接查詢例:多表的內連接(結果中只會含有多個表的滿足連接條件的記例:多表

60、的內連接(結果中只會含有多個表的滿足連接條件的記錄)。錄)。SELECT ck.SELECT ck.倉庫號倉庫號, ck., ck.城市城市,ck.,ck.面積面積,zg.,zg.職工號職工號,zg.,zg.工資工資,;,;dgd.dgd.訂購單號訂購單號,dgd.,dgd.供應商號供應商號,dgd.,dgd.訂購日期訂購日期; ;FROM ck JOIN zg JOIN dgd ON zg.FROM ck JOIN zg JOIN dgd ON zg.職工號職工號=dgd.=dgd.職工號職工號 ON ck.ON ck.倉庫號倉庫號=zg.=zg.倉庫號倉庫號744.2.13 4.2.13

溫馨提示

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

評論

0/150

提交評論