官术网_书友最值得收藏!

第5章 簡單的查詢

查詢(SELECT)語句是SQL的核心,是SQL語句中使用最頻繁的語句之一。因為大量的選項可以用于SELECT語句,所以整個SQL數據查詢功能就是圍著SELECT語句進行的。查詢可以按復雜性進行劃分,從用一個簡單語句返回表中的所有行,到用一個語句連接多個表并定義搜索條件。本章在介紹SELECT語句基本結構的基礎上,主要介紹SQL的簡單查詢操作。

5.1 查詢的基本結構

在SQL語言中,對數據庫的讀操作就體現在SELECT查詢語句上。SELECT語句由一系列靈活的子句組成,這些子句共同確定檢索哪些數據。

5.1.1 SELECT語句的結構

SELECT語句的基本語法可以分成幾個特定的子句。通過每個子句細化查詢,以便返回需要的數據。SELECT語句的完整語法如下。

    SELECT [DISTINCT | ALL]   select_list
    FROM            table_name_source
    [ WHERE     search_condition ]
    [ GROUP BY  group_by_expression ]
    [ HAVING        search_condition ]
    [ ORDER BY  order_expression [ ASC | DESC ] ]

我們可以看出,必需的子句只有SELECT子句和FROM子句,其他的子句都是可選的。各子句具體含義如下。

? 關鍵詞SELECT后面輸入要顯示的字段清單。SELECT子句包含可選關鍵字DISTINCT和ALL。在需要刪除查詢結果中相同的行時,我們使用關鍵字DISTINCT;在需要返回查詢結果中的所有行時,使用關鍵字ALL。如果沒有指定任何一個關鍵字,那么關鍵字ALL就是默認的關鍵字。

? FROM子句包括關鍵字FROM和一個或多個表結構。如果表結構不止一個,那么它們之間必須用逗號分開。一般情況下,表結構是表的名稱,但也可以是一種子查詢。在WHERE子句中列出搜索標準,用于選擇要顯示的數據行。如果SELECT語句沒有WHERE子句,DBMS假設目標表中的所有行都滿足搜索條件。

? GROUP BY子句用于分組查詢結果,根據group_by_expression中列出的列,歸納信息類型,匯總相關數據。

? HAVING子句列出另外的行選擇標準,以便根據GROUP BY子句產生的結果篩選行。

? ORDER BY子句接受SELECT子句的輸出,并且按照ORDER BY子句中的規范對查詢結果進行排列。這里的規范就是ASC和DESC關鍵字。ASC關鍵字表示升序排列結果,DESC關鍵字表示降序排列結果。如果沒有指定任何一個關鍵字,那么ASC就是默認的關鍵字。如果沒有ORDER BY子句,DBMS將根據輸入表中的數據來顯示數據。

5.1.2 SELECT語句的執行步驟

由5.1.1節介紹的SELECT語句的語法結構可知,SELECT語句包含很多子句。當執行SELECT語句時,DBMS的執行步驟可表示如下。

(1)DBMS執行FROM子句,根據FROM子句中的一個或多個表創建工作表。如果在FROM子句中有兩個或多個表,DBMS將對表進行交叉連接,作為工作表。

(2)如果有WHERE子句,DBMS將WHERE子句列出的搜索條件作用于步驟(1)生成的工作表。DBMS將保留那些滿足搜索條件的行,刪除那些不滿足搜索條件的行。

(3)如果有GROUP BY子句,DBMS將步驟(2)生成的結果表中的行分成多個組,每個組所有行的group_by_expression字段具有相同的值,DBMS將每組減少到單行,然后將其添加到新的結果表中。

(4)如果有HAVING子句,DBMS將HAVING子句列出的搜索條件作用于步驟(3)生成的“組合”表中的每一行。DBMS將保留那些滿足搜索條件的行,刪除那些不滿足搜索條件的行。

(5)DBMS將SELECT子句作用于結果表,刪除結果表中不包含在select_list中的列。如果SELECT子句包含DISTINCT關鍵字,DBMS將從結果中刪除重復的行。

(6)如果有ORDER BY子句,DBMS按指定的排序規則對結果進行排序。

(7)對于交互式的SELECT語句,DBMS在屏幕上顯示結果,對于嵌入式SQL,使用游標將結果傳遞給宿主程序中。

以上就是SQL SELECT語句的基本執行過程,對于初學者來講,可能很難理解。本書之所以在這里提出,是為了讓讀者對SELECT語句有一個整體的了解。下面我們就從簡單的查詢開始,詳細講解SELECT查詢語句的具體使用。

5.2 列的查詢

在了解了查詢的基本結構后,本小節將介紹最簡單的查詢——列(字段)的查詢,包括單列查詢、多列查詢以及所有列的查詢。

5.2.1 本章用到的實例表

本章所有的查詢實例操作的表都是教師信息表(TEACHER)。TEACHER表的字段包括教工號(TNO)、教師姓名(TNAME)、所授課程的課程號(CNO)、工資(SAL)、所在系(DNAME)、性別(SEX)和年齡(AGE)。TEACHER表的結構和內容如表5-1所示。

表5-1 TEACHER表

TEACHER表創建的SQL代碼如下。

    CREATE TABLE_NAME TEACHER
    (
    TNO  INT  NOT NULL,
    TNAME  CHAR(10) NOT NULL,
    CNO  INT  NOT NULL,
    SAL  INT ,
    DNAME  CHAR(10) NOT NULL,
    TSEX   CHAR(2) NOT NULL,
    AGE  INT   NOT NULL
    )
    INSERT INTO TEACHER  VALUES(1,'王軍',4,800,'數學','男',32)
    INSERT INTO TEACHER  VALUES(2,'李彤',5,1200,'生物','女',54)
    ……

5.2.2 單列查詢

在數據庫表中,每個表都包含若干列信息。用戶在查詢表中的記錄時,大多數情況下只是關心表的一列或者幾列的信息。在SQL中,查詢表中某一列(字段)信息的語法可表示如下。

    SELECT      column
    FROM        table_name_name

SELECT關鍵詞指明了要查詢字段名稱(column),FROM關鍵詞指明了要獲取字段信息的表的名字。

實例1 單列查詢

查詢TEACHER表中所有教師的姓名信息。代碼如下。

    SELECT      TNAME
    FROM        TEACHER

運行結果如圖5-1所示。

圖5-1 單列查詢

從運行結果我們可以發現,SELECT語句返回了TNAME列的所有信息,包括重復信息——“李偉”。

注意

在SQL語言中,SQL關鍵詞對大小寫不敏感,所以對SELECT關鍵詞來說,SELECT、select或者Select都是一樣的;然而對于表名或者列名來說,可能對大小寫敏感,這取決于數據庫的DBMS。

5.2.3 使用DISTINCT去除重復信息

在查詢中,我們經常需要去除查詢結果中的重復信息。例如,一張學生成績表,其字段包含學生姓名、選修課程和課程成績3個字段。如果用戶想要查詢這張表中包含的所有學生的姓名信息,由于同一學生可能有多門選修課,同一學生在該表中就有多條記錄,那么查詢的姓名字段就會有多個重復值,顯然不能很好滿足用戶的需求。

在SELECT子句中,我們通過指明DISTINCT關鍵字,可以去除列中的重復信息。語法如下。

    SELECT  DISTINCT        column
    FROM                table_name_name

說明

DISTINCT關鍵字去除的是SELECT子句查詢的列,即column的重復信息。如果SELECT子句查詢的列為多列,那么只有這些列的信息同時重復的記錄才能被去除。

實例2 使用DISTINCT去除重復信息

在TEACHER表中查詢所有教師的姓名信息(TNAME),對于重復的姓名只顯示一個。實例代碼如下。

    SELECT  DISTINCT        TNAME
    FROM                TEACHER

運行結果如圖5-2所示。

圖5-2 去除列中的重復記錄

從執行結果我們可以發現,重名的“李偉”只顯示了一個,即去除了查詢結果中的重復值,并且對查詢結果進行了排序(升序)。實際上,DBMS的操作過程是先對查詢結果排序,然后查找并從結果中除去重復的值。

說明

對于漢字的排序,DBMS是根據其漢語拼音的第一個字母的順序進行的,如果第一個字母相同,則比較第二個字母,以此類推。

DISTINCT的使用是要付出代價的。因為我們要去掉重復值,必須對結果關系進行排序,相同的元組排在一起,只有按這種方法對元組分組,才能去掉重復值,而這一工作甚至比查詢本身還費時間。

5.2.4 多列查詢

同單列查詢一樣,多列查詢需要在SELECT關鍵詞后指定要查詢的列,但是各列之間必須用逗號分開。注意一點,列出的最后一列的名字后面不能加逗號,否則會造成語法錯誤。語法如下。

    SELECT      col1,col2,……,coln
    FROM        table_name

多列查詢只是在SELECT關鍵詞后羅列出所要查詢的列名并以逗號相互間隔。

實例3 多列查詢

從TEACHER表中查詢所有教師的姓名(TNAME)、工資(SAL)、年齡(AGE)信息。實例代碼如下。

    SELECT      TNAME,SAL,AGE
    FROM        TEACHER

運行結果如圖5-3所示。

圖5-3 多列查詢

查詢結果中,字段的左右位置與SELECT子句的位置相對應。

實例4 使用DISTINCT關鍵字

在實例3實例代碼的SELECT子句中使用DISTINCT關鍵字,代碼如下。

    SELECT  DISTINCT        TNAME,SAL,AGE
    FROM                TEACHER

運行結果如圖5-4所示。

圖5-4 去除多列中的重復記錄

比較兩個查詢結果可知,使用DISTINCT關鍵字后,查詢結果的記錄與未使用DISTINCT關鍵字的查詢記錄完全相同,只是進行了排序(升序)顯示。這是因為此時DISTINCT關鍵字作用的字段為TNAME、SAL和AGE 3個字段,只有這3個字段的記錄均相同的記錄才被作為重復記錄而被去除。

5.2.5 查詢所有的列

除了能夠進行單列查詢和多列查詢以外,使用SELECT語句還可以查詢表中的所有列,這是通過星號(*)通配符實現的。語法如下。

    SELECT      *
    FROM        table_name

使用“*”通配符,查詢結果將列出表中所有列的元素,而不必指明各列的列名,這在用戶不清楚表中各列的列名時非常有用。

實例5 查詢所有的列

查詢TEACHER表中所有列的信息。實例代碼如下。

    SELECT      *
    FROM        TEACHER

運行結果如圖5-5所示。

圖5-5 教師表記錄

說明

使用“*”通配符時我們要慎重,在不需要查詢所有列時,盡量采用前面介紹的單列查詢或多列查詢,以免占用過多的資源。

通過實例我們可以看到,無論是單列查詢、多列查詢還是查詢所有的列,查詢結果的縱向排序基本是按照其在表中存儲的位置排列(使用DISTINCT關鍵字的情況除外)。但是,在實際應用中往往需要查詢結果按照某一特定的順序排列,在5.3節我們將實現查詢結果的排序。

5.3 排序查詢結果

在本節中,我們將介紹如何在SELECT查詢語句中采用ORDER BY子句對查詢結果進行排序。

5.3.1 單列排序

這里所講的單列排序查詢結果的排列是按照某一列的順序(升序)進行排列顯示的,即ORDER BY子句后面只有一個字段。語法如下。

    SELECT      column1, column12,……
    FROM        table_name_name
    ORDER BY    column N

這里要說明的是,ORDER BY子句后面為需要排序的列名,一般情況下為查詢的列,當然如果有特殊的需求也可以是表中的其他列。

說明

ORDER BY子句一定要放在所有子句的最后(無論包含多少子句)。

實例6 查詢結果排序

在TEACHER表中查詢所有教師的姓名(TNAME)、教工號(TNO)和工資(SAL)信息,并將結果按姓名排序。實例代碼如下。

    SELECT      TNAME, TNO, SAL
    FROM        TEACHER
    ORDER BY    TNAME

運行結果如圖5-6所示。

圖5-6 按照姓名排序后的教師表

由此可見,查詢結果按照TNAME字段(即教師姓名)的升序順序排列,其排序原則前面已經介紹過了。對該例,如果我們要求查詢結果按SAL字段進行排序,代碼如下。

    SELECT      TNAME, TNO, SAL
    FROM        TEACHER
    ORDER BY    SAL

運行結果如圖5-7所示。

圖5-7 按照SAL字段排序后的教師表

由此可見,系統將空值NULL作為最小值進行排序。

5.3.2 多列排序

在實際應用中,我們往往需要根據多列信息進行排序,如根據性別和年齡對教師信息進行排序。使用ORDER BY子句同樣可以實現上述功能。語法如下。

    SELECT      col1,col2,……,coln
    FROM        table_name
    ORDER BY  col1,col2,……,colm

需要說明的是,實際排序結果是根據ORDER BY子句后面列名的順序確定優先級的,即查詢結果首先按照列col1的順序進行排列,而只有當列col1出現相同的信息時,這些相同的信息再按照列col2的順序進行排列,以此類推。

實例7 多列排序

在TEACHER表中查詢所有教師的姓名(TNAME)、工資(SAL)、年齡(AGE)、性別(TSEX)信息并按性別(TSEX)和年齡(AGE)對查詢結果排序。實例代碼如下。

    SELECT      TNAME,SAL,AGE, TSEX
    FROM        TEACHER
    ORDER BY    TSEX, AGE

運行結果如圖5-8所示。

圖5-8 按照多列排序后的教師表

從查詢結果我們可以發現,系統根據排序的優先級,首先依據TSEX字段的記錄進行排序,當TSEX字段的記錄相同時,如均為“男”或均為“女”,再依據AGE字段的記錄進行排序。當然,所有的排序都是按升序進行的。

5.3.3 采用序號進行多列排序

ORDER BY子句除了可以跟據列名進行排序外,還支持根據列的相對位置(即序號)進行排序。語法如下。

    SELECT      col1,col2,……,coln
    FROM        table_name
    ORDER BY    i,j,……

這里需要說明的是,ORDER BY子句后面的序號i,j,……實際上就是SELECT關鍵詞后面的列名的序號。如果i=2,那么ORDER BY 2就等同于ORDER BY col2。

實例8 采用序號進行多列排序

在TEACHER表中查詢所有教師的姓名(TNAME)、工資(SAL)、年齡(AGE)、性別(TSEX)信息并按性別(TSEX)和年齡(AGE)對查詢結果排序。實例代碼如下。

    SELECT      TNAME,SAL,AGE, TSEX
    FROM        TEACHER
    ORDER BY    4, 3

運行結果如圖5-9所示。

圖5-9 按照列序排序后的教師表

由此可見,得到了與5.3.2節實例7相同的查詢結果。

注意

當ORDER BY所需要的列不在SELECT語句所選的范圍內時,采用列的序號顯然是行不通的。當然,我們可以將列別與序號混合起來解決這個問題。

5.3.4 反向排序

前面提到的排序,默認是按照升序進行的(例如,對于字符來說,其升序方向為A~Z)。同樣,ORDER BY子句支持反向排序即降序排序(對于字符來說,其降序方向為Z~A)。要實現反向(降序)排序,我們必須使用關鍵字“DESC”。語法如下。

    SELECT      col1,col2,……,coln
    FROM        table_name
    ORDER BY    col1 DESC,col2

這里需要說明的是,在該語法中,查詢結果按照col1列降序、col2列升序的方向進行排序。如果col2列也要按照降序的方向排序,則在col2后也要加上關鍵字DESC。

注意

對大小寫字符的排序,一般的數據庫管理系統認為二者是等同的。

實例9 按照多列降序排序

在TEACHER表中查詢所有教師的姓名(TNAME)、工資(SAL)、年齡(AGE)、性別(TSEX)信息,按性別(TSEX)升序和年齡(AGE)降序的順序對查詢結果排序。實例代碼如下。

    SELECT      TNAME,SAL,AGE, TSEX
    FROM        TEACHER
    ORDER BY    TSEX, 3 DESC

運行結果如圖5-10所示。

圖5-10 按照多列降序排列

實現代碼中,對列的排序采用了列名與序號相結合的方式,TSEX列升序,而序號3代表的列就是SELECT語句后面的第3列,即AGE列。

5.4 使用WHERE子句定義搜索條件查詢

數據庫中的表往往包含大量的數據,用戶一般很少需要查詢表中所有數據行的信息,而只是需要其中一些滿足特定條件的信息。在SELECT語句中,按一定條件進行查詢是通過WHERE子句來實現的。

5.4.1 WHERE子句單條件查詢

WHERE子句獲取FROM子句返回的結果集并應用WHERE子句中定義的搜索條件對結果集進行篩選。WHERE子句相當于從FROM子句返回結果的篩選器,對FROM子句返回結果的每一行都要根據搜索條件進行校驗,符合搜索條件的那些行作為查詢結果的一部分返回,不符合搜索條件的從結果中去除。

WHERE子句中定義的搜索條件可以是簡單的單值比較條件,也可以使用各種運算符、組合子句條件。本章介紹的是簡單的值比較條件。復雜的查詢條件將在第6章介紹。語法如下。

    SELECT      column
    FROM        table_name
    WHERE       column condition value

需要說明的是,該語句用來查詢表table_name中的column列,但不是返回column列的所有信息,而是返回那些滿足value條件的信息。

實例10 使用WHERE子句單條件查詢

在TEACHER表中查詢計算機系的教師的姓名(TNAME)、系(DNAME)、年齡(AGE)、性別(TSEX)信息。實例代碼如下。

    SELECT      TNAME, DNAME,AGE, TSEX
    FROM        TEACHER
    WHERE       DNAME='計算機'
    ORDER BY        AGE

運行結果如圖5-11所示。

圖5-11 TEACHER表中計算機系教師的相關信息

在該例中,WHERE子句中使用了“=”運算符,它要求兩邊的數值類型必須相同。DNAME所在列為CHAR型,所以后面的“計算機”必須寫在單引號內,表明它是一個字符串;如果是數值,如INT型,直接寫值即可。

注意

當ORDER BY子句和WHERE子句同時存在的時候,ORDER BY子句一定要在WHERE子句的后面。

5.4.2 單值比較運算符

在5.4.1節的實例中,在WHERE子句中用到了“=”(等于)運算符。它是一種最常用的單值比較運算符。實際上,除了它之外,WHERE子句還支持多種運算符,如表5-2所示。

表5-2 WHERE子句單值比較運算符

注意

不是所有的數據庫管理系統都支持這些運算符,運用時我們需要根據自己的數據庫管理系統選擇合適的運算符。

下面我們就通過具體的實例講一下運算符的用法。這里主要通過兩個例子說明一下“>=”和“<>”運算符的運用。

1.“>=”運算符

實例11 對數值類型使用“>=”運算符進行條件查詢

在TEACHER表中查詢年齡大于等于40歲的教師的姓名(TNAME)、所在系(DNAME)、年齡(AGE)、性別(TSEX)信息。實例代碼如下。

    SELECT      TNAME, DNAME,AGE, TSEX
    FROM        TEACHER
    WHERE       AGE >=40
    ORDER BY    AGE

運行結果如圖5-12所示。

圖5-12 TEACHER表中查詢年齡大于等于40歲教師的相關信息

由此可見,使用該運算符可以成功搜索出年齡大于等于40歲的教師的相關信息。同樣,對于字符串類型的記錄也可以使用“>=”運算符,它的比較是根據字符的排列順序進行的。

實例12 對字符串類型使用“>=”運算符進行條件查詢

在TEACHER表中查詢系名(DNAME)排在“計算機”后的所有教師的姓名(TNAME)、工資(SAL)、年齡(AGE)、性別(TSEX)信息。實例代碼如下。

    SELECT      TNAME, DNAME,AGE, TSEX
    FROM        TEACHER
    WHERE       DNAME >= '計算機'
    ORDER BY        DNAME

運行結果如圖5-13所示。

圖5-13 TEACHER表中系名(DNAME)排在“計算機”后的所有教師的相關信息

由此可見,“>=”運算符對字符串型數據也是有效的。

2.“<>”運算符

“<>”運算符表示不等于,實際上“<>”運算符與“!=”運算符是完全相同的。

實例13 對字符串類型使用“<>”運算符進行條件查詢

在TEACHER表中查詢不在計算機系的所有教師的姓名(TNAME)、所在系(DNAME)、年齡(AGE)、性別(TSEX)信息。實例代碼如下。

    SELECT      TNAME, DNAME,AGE, TSEX
    FROM        TEACHER
    WHERE       DNAME<>'計算機'
    ORDER BY        DNAME

運行結果如圖5-14所示。

圖5-14 TEACHER表中不在計算機系的所有教師的相關信息

同樣,“<>”運算符也可以對數值型數據進行操作。

實例14 對數值型使用“<>”運算符進行條件查詢

在TEACHER表中查詢工資不為1200的所有教師的姓名(TNAME)、所在系(DNAME)、工資(SAL)、年齡(AGE)、性別(TSEX)信息。實例代碼如下。

    SELECT      TNAME, DNAME,AGE, TSEX
    FROM        TEACHER
    WHERE       SAL <>1200
    ORDER BY        SAL

運行結果如圖5-15所示。

圖5-15 TEACHER表中工資不為1200的所有教師的相關信息

從結果中我們不難發現,工資為1200的教師信息不在查詢結果內,但是同時工資為NULL的教師信息也不在查詢結果內。NULL值參與任何比較運算,結果都將視為False,即,無論是“NULL<>1200”還是“NULL =1200”,其結果都為False,因此對應的記錄都不滿足WHERE子句查詢條件。

5.4.3 BETWEEN運算符范圍篩選

在WHERE子句中,我們可以采用BETWEEN運算符在兩個值之間進行比較篩選。例如,我們選擇范圍在5~10之間的數,采用BETWEEN運算符可以表示為BETWEEN 5 AND 10。下面給出一個用BETWEEN運算符進行范圍篩選的實例。

實例15 對數值型使用BETWEEN運算符進行范圍篩選

在TEACHER表中查詢年齡在30歲到50歲之間的教師的姓名(TNAME)、所在系(DNAME)、年齡(AGE)、性別(TSEX)信息。實例代碼如下。

    SELECT      TNAME, DNAME,AGE, TSEX
    FROM        TEACHER
    WHERE       AGE BETWEEN 30 AND 50
    ORDER BY        AGE

運行結果如圖5-16所示。

圖5-16 TEACHER表中年齡在30歲到50歲之間的教師的相關信息

BETWEEN運算符也可以對字符型數據進行操作。

實例16 對字符型使用BETWEEN運算符進行范圍篩選

在TEACHER表中,查詢所在系的系名在“計算機”和“生物”之間的教師的姓名(TNAME)、所在系(DNAME)、年齡(AGE)、性別(TSEX)信息。實例代碼如下。

    SELECT      TNAME, DNAME,AGE, TSEX
    FROM        TEACHER
    WHERE       DNAME BETWEEN '計算機' AND '生物'
    ORDER BY        DNAME

運行結果如圖5-17所示。

圖5-17 TEACHER表中所在系的系名在“計算機”和“生物”之間的教師的信息

說明

我們進行運算符操作,如“BETWEEN A1 AND A2”,在進行結果篩選時,滿足查詢要求的結果是A1到A2之間的信息,并且包含A1和A2。

5.4.4 NULL值的判斷

在前面表的創建中我們提到,在表中有些列的值可以為NULL,即不含任何值,稱之為空值。在實際查詢中,我們經常遇到針對NULL值的操作。例如,我們經常需要獲取某列的信息,并把該列的信息進行某種運算,這時就要求該列不能包含NULL值,因為NULL值不能參與運算。而有時,我們需要查詢某列中記錄為NULL的信息。在SQL中,有關空值的運算符為IS [NOT] NULL,用于判斷數值是否為NULL。下面我們通過具體實例說明IS NULL運算符的用法。

實例17 NULL值的判斷

在TEACHER表中,查詢工資不為空的教師的姓名(TNAME)、工資(SAL)、年齡(AGE)、性別(TSEX)信息。實例代碼如下。

    SELECT      TNAME, SAL,AGE, TSEX
    FROM        TEACHER
    WHERE       SAL IS NOT NULL
    ORDER BY        SAL

運行結果如圖5-18所示。

圖5-18 TEACHER表中工資不為空的教師的信息

判斷列中的值是否為NULL,只能通過IS [NOT] NULL運算符。如上述實例代碼中的判斷工資不為NULL,我們只能表示成“SAL IS NOT NULL”,不可以寫成“SAL <> NULL”或者“SAL != NULL”,如下面的代碼所示。

    SELECT      TNAME, SAL,AGE, TSEX
    FROM        TEACHER
    WHERE       SAL <> NULL
    ORDER BY    SAL

運行結果如圖5-19所示。

圖5-19 用“SAL <> NULL”判斷列中的值是否為NULL

由此可見,查詢結果中不包含任何記錄,即SAL列中沒有任何記錄滿足“SAL <> NULL”條件。這是因為表達式“SAL <> NULL”實際上是把NULL值與SAL值進行比較運算,而NULL值與任何值參與任何比較運算,結果都可以視為False,也就沒有滿足要求的查詢記錄。

注意

SAL IS NULL不可以寫成SAL=NULL;除了IS [NOT] NULL之外,空值不滿足任何查找條件;如果NULL參與算術運算,則該算術表達式的值為NULL;如果NULL參與比較運算,則結果可視為False,在SQL-92中可看成UNKNOWN;如果NULL參與聚集運算,則除count(*)之外其他聚集函數都忽略NULL。

主站蜘蛛池模板: 吴江市| 筠连县| 大石桥市| 德化县| 鄂托克前旗| 昔阳县| 南郑县| 鲜城| 祁东县| 武夷山市| 手游| 富宁县| 邓州市| 安仁县| 张家港市| 祁阳县| 安达市| 新巴尔虎右旗| 屏东市| 淮安市| 保康县| 阿拉善左旗| 盘山县| 收藏| 安康市| 阜阳市| 汶上县| 化隆| 马鞍山市| 海原县| 双柏县| 灯塔市| 湘潭县| 区。| 阳城县| 岳阳县| 岫岩| 永胜县| 南安市| 马边| 潍坊市|