注意 Where,GroupBy,Having,OrderBy 順序。
執行步驟:
先從from字句一個表或多個表創建工作表將where條件應用于1)的工作表,保留滿足條件的行GroupBy 將2)的結果分成多個組Having 將條件應用于3)組合的條件過濾,只保留符合要求的組。Order By對結果進行排序。FROM子句是SELECT語句中必不可少的子句,可以使用FROM子句指定查詢所需要的數據源名稱。語法如下:
FROM table_source其中,table_source指定要在SQL語句中使用的表,視圖。雖然語句中可用的表源個數的限值可以用內存和查詢中其他表達式的復雜性而有所不同,但一個語句中可最多使用256個表源。
注:如果查詢中引用了很多表,查詢性能會受到影響,編譯和優化時間也受到其他因素的影響。
在數據庫中查詢數據時,有時只希望查詢所需要的數據,而非數據表中的所有數據,那么就可以使用SELECT語句中的WHERE子句來實現。
WHERE子句通過條件表達式描述關系中元組的選擇條件。數據庫系統處理該語句時,按行為單位,逐個檢查每個行是否滿足條件,將不滿足條件的行篩選掉。WHERE子句的基本格式如下:
WHERE search_conditions其中,search_conditions為用戶所選所需要查詢數據行的條件,即查詢返回行記錄的滿足條件。對于用戶所需要的所有行,search_conditions條件為true;而對于其他行,search_conditions條件為false或未知。
WHERE子句使用的條件
類別 | 運算符 | 說明 |
---|---|---|
比較運算符 | =,<,>,<=,>=,<> | 比較兩個表達式 |
邏輯運算符 | AND ,OR, NOT | 組合兩個表達式的運算結果或取反 |
范圍運算符 | BETWEEN,NOT BETWEEN | 搜索值是否在范圍內 |
列表運算符 | IN,NOT IN | 查詢值是否屬于列表值之一 |
字符匹配符 | LIKE ,NOT LIKE | 字符串是否匹配 |
未知值 | IS NULL ,IS NOT NULL | 查詢值是否為NULL |
expression1 ,expression2表示要比較的表達式 ,comparison_operator 比較運算符。
有時,在查詢時指定一個查詢條件也很難滿足用戶需求,需要同時指定多個查詢條件,那么久可以使用邏輯運算符將多個查詢條件連接起來。
WHERE NOT (expression|expression1 logical_operator expression2 )logical_operator為邏輯運算符
運算符 | 功能 |
---|---|
AND | 只有所有條件滿足時才會返回結果結果 |
OR | 只要其中一個條件滿足就會返回查詢結果 |
NOT | 條件不成立時返回查詢結果 |
在WHERE子句中使用BETWEEN關鍵字查詢在一定某個范圍內的數據,使用NOT BETWEEN關鍵字查找不在某一范圍內的數據。
WHERE expression [NOT] BETWEEN value AND value2在WHERE子句中,使用IN關鍵字可以確定表達式的取值是否屬于某一列表值,同樣,如果查詢表達式不屬于某一列值時可以使用NOT IN 關鍵字。
WHERE expression [NOT] IN value_listvalue_list為列表值,當值不止一個時需要將這些值用括號起來,各列表值之間使用逗號隔開。
在WHERE子句中 使用字符匹配符LIKE或NOT LIKE 可以把表達式與字符串進行比較,從而實現對字符串的模糊查詢。語法如下:
WHERE expression [NOT] LIKE ‘string’其中,[NOT]為可選項,‘string’表示進行比較的字符串。WHERE子句實現對字符串的模糊匹配,進行模糊匹配是在string字符串中使用通配符。
通配符 | 說明 | 示例 |
---|---|---|
% | 任意多個字符 | H% 表示查詢以H開頭的任意字符串,如Hello —– %h 表示查詢以h結尾的任意字符串,如Growth —— %h% 表示查詢在任何位置包含字母的h的所有字–符串,如hui,zhi |
_ | 單個字符 | H_ 表示查詢以H開頭,后面跟任意一個字符的兩位字符串,如Hi,He |
[] | 指定范圍的單個字符 | H[ea]% 表示查詢以H開頭,第二個字符是e或a的所有字符串,如:Health,Hand ———- [A-G]% 表示查詢以A到G之間的任意字符開頭的所有字符串,如:Apple,Banana,Guide |
[^] | 不在指定范圍的單個字符 | H[^ea]% 表示查詢以H開頭,的一個字符不是e或a的所有字符串,如:Hope,Hub ——— [^A_G]% 表示查詢不是以A到G之間的任意字符開頭的字符串,如;Job,Zoo |
例如:查找【圖書表】中【圖書名】還有【人】的所有圖書
當查詢數據庫中的值為NULL時,可以使用包含IS NULL關鍵字的WHERE子句進行查詢。反之要查詢數據庫中的值不為NULL時,可以使用IS NOT NULL關鍵字。
WHERE column IS [NOT] NULL例如:在【圖書表】中查詢還關鍵字不為NULL的數據
有些時候,在使用SELECT語句進行數據查詢后,想先看到眾多數據中最新的信息或某列的最大值,就可以使用ORDER BY子句對生成的結果集進行排序。ORDER BY子句在SELECT語句中的語法格式:
ORDER BY order_experssion[ASC | DESC]其中,order_experssion表示用于排序的列或列名及表達式。當有多個排序列時,每個排序了列用逗號隔開,而且列后都可以跟一個排序要求。
ASC—–升序排序(默認值)DESC—降序排序
例如:將【圖書表】中的信息按【BookName】倒序排序
例如:將【圖書表】中的信息按【BookName】倒序排序和【BookID】倒序排序
使用GROUP BY 子句可以將查詢結果按照某一列數據值進行分類,換句話說,就是對查詢結果的信息進行歸納,以匯總相關數據。
GROUP BY group_by_expression[ WITH ROLLUP|CUBE ]其中 ,group_by_expression表示分組所依據的列,ROLLUP表示只返回第一個分組條件指定的列的統計行,若改變列的順序就會使返回的結果行數據發生變化。CUBE是ROLLUP的擴展,表示除了返回由GROUP BY子句指定的列外,還返回按組統計的行。GROUP BY 子句通常與統計函數聯合使用。如下表:
函數名 | 功能 |
---|---|
COUNT | 求組中項數 |
SUM | 求和 |
AVG | 求平均值 |
MAX | 求最大值 |
MIN | 求最小值 |
ABS | 求絕對值 |
ASCII | 求ASCII碼 |
RAND | 產生隨機數 |
在使用GROUP BY子句時,將GROUP BY子句中的列稱為分割列或分組列,而且必須保證SELECT語句中列是可計算的值并且GROUP BY列表中。
例如:查找【圖書表】中,相同書名的書籍存在多少本
HAVING子句的用法類似WHERE子句,它指定了組或集合的搜索條件。HAVING子句通常與GROUP BY子句一起使用。HAVING子句的語法格式為:
HAVING search_conditions其中search_conditions為查詢所需的條件,即返回查詢結果的滿足條件。在使用GROUP BY 子句時,HAVING子句將限定整個GROUP BY子句創建的組。其具體規則如下:
如果指定了GROUP BY 子句,則HAVING 子句的查詢條件應用于GROUP BY子句創建的組如果指定了WHERE子句而沒有指定GROUP BY子句,則HAVING子句的查詢條件將應用于WHERE子句的輸出結果集如果既沒有指定WHERE子句又沒有指定GROUP BY子句,則HAVING子句的查詢條件將用于FROM子句的輸出結果集
在此查詢語句中。HAVING自己與WHERE子句一樣,可以使用各種運算符。
在實際查詢應用中,用戶所需要的數據并不都是在一個表或視圖中,而是多個表中,這時就要使用多表查詢。多表查詢把多個表中數據組合,再從中獲取所需要的數據信息。多表查詢首先要在這些表中建立連接, 表之間的連接就是查詢的結果集,而實現連接的好處是在向數據庫添加新類型數據時沒有限制的,具有很大的靈活性。通常總是通過連接創建一個新表,以包含不同表中的數據。如果新表有合適的域,就可以把它連接到現有的表中。
在進行多表操作時,最簡單的連接方式就是在SELECT語句中引用多個表的字段,在其FROM子句中用逗號將不同的基本表隔開。如果使用WHERE子句創建一個同等連接則能使查詢結果集更加豐富。同等連接是指第一個或多個列值與第二個基表中對應一個或多個列值相等的連接。通常情況下使用鍵碼建立連接,即一個基表中的主鍵碼與第二個基表中的外鍵碼保持一致,以保持整個數據庫的參照完整性。
用戶在進行基本連接操作時,可以遵循以下基本原則。
SELECT子句列表中,每個目標列都要加上基表名稱FROM子句應包括所有使用的基表WHERE子句應定義一個同等連接例子:查詢【圖書表】和【關鍵字表】,通過BookCode相關聯
使用JOIN連接查詢和基本連接查詢一樣都是通過連接 多個表進行操作。其連接條件主要是通過以下方法定義。
指定每個表中用于連接的目標列。即在一個基本表中指定外鍵,在另一個基本表中指定與其關聯的鍵指定在比較各目標列的值時要使用的比較運算符
連接可以在SELECT語句的FROM子句或WHERE子句中創建。連接條件WHERE子句和HAVING子句組合,用于控制在FROM子句引用的基表中所選定的行。JOIN連接查詢的語法格式為:
SELECT select_listFROM table1 join_type table [on join_conditions][WHERE search_conditions][ORDER BY order_expression]上訴語法中,table1hetable2為基表,join_type指定連接類型,join_conditions指定連接條件。其中類型分為內連接,外連接,交叉連接和自連接。
內連接是一種比較常用的數據連接查詢方式,它使用比較運算符進行多個基表間數據的比較操作,并列出這些基表中與連接條件相匹配的所有數據行。一般用INNER JOIN或JOIN關鍵字來指定內連接,它是連接查詢默認的連接方式。
內連接返回的條件是:當且僅當至少有一個同屬于兩個表的行符合連接條件。內連接從第一個表中消除與另一個表中任何不匹配的行。(2張表都存在的行數據)
外連接與內連接不同,內連接消除與另一個表任何不匹配的行,外連接會返回From子句中提到的至少一個表或視圖所有的行,只要這些行符合任何搜索條件。因為在外鏈接中參與連接的表中有主次之分,以主表的數據行去匹配從表中的數據行如果符合連接條件則直接返回查詢結果中,如果主表中的行在從表中沒有找到匹配的行,主表的行任然保留返回查詢結果中,相應地表中的行被填上空值后也返回到查詢結果中。
鏈接方式 | 返回數據 |
---|---|
左外連接(LEFT OUTER JOIN) | 返回所有匹配行并從關鍵字JOIN左表中返回所有不匹配發行 |
右外連接(RIGHT OUTER JOIN) | 返回所有匹配行并從關鍵字JOIN右表中返回所有不匹配發行 |
完全連接(FULL OUTER JOIN) | 返回兩個表中所有匹配行和不匹配行 |
1. 左外連接
2.右外連接
3.完全連接
當對兩個基表使用交叉連接查詢時,將生成來自這兩個基表各行所有可能的組合。即在結果集中,兩個基表中每兩個可能成對的行占一行。在交叉連接中,查詢條件一般限定在WHERE子句中,查詢生成的結果集分為以下兩種情況:
當交叉連接查詢語句中沒有使用WHERE子句時,返回的結果集是被連接的兩個基表所有行的笛卡爾積,即返回到結果集中的行數等于一個基表中符合查詢條件的行數乘以另一個基表中的符合條件的行數。
當交叉連接查詢語句中使用WHERE子句時,返回的結果集是被連接的兩個基表所有的行的笛卡爾積減去WHERE子句條件搜索到的數據的行數。
自連接是指一個表與自身相連接的查詢。自連接操作通過給基表定義別名的方式來實現。
聯合查詢是指將多個不同的查詢結果連接在一起組成一組數據的查詢方式。聯合查詢使用UNION關鍵字連接SELECT子句,將兩個或多個查詢結果集組合為單個結果集,該集包含了所有查詢結果集匯總的全部行數據。
注:在使用UNION關鍵字進行聯合查詢時,應保證每個聯合查詢語句的選擇列表中具有相同數量的表達式,并且每個查詢選擇表達式應具有相同的數據類型,或者可以自動將它們轉化為相同的數據類型。在自動轉換時,對于數值類型,系統將低精度的數據類型轉換為高精度的數據類型
子查詢和連接查詢一樣提供了使用單個查詢操作多個表中的數據的方法。子查詢在其他查詢結果的基礎上提供了一種有效的方式來表示WHERE子句的條件。子查詢可以分為返回多行的子查詢,返回單值和嵌套子查詢3種。
返回多行子查詢是指查詢語句獲得的結果集中返回了多行數據的子查詢。在子查詢中可以使用IN,EXISTS和比較運算符來連接表。
IN關鍵字 用來判斷一個表中指定列的值是否包含在已定義的列表或另一個表中。通過使用IN關鍵字把原表中目標列的值和子查詢的返回結果進行比較,如果列值與子查詢的結果一致或存在與之匹配的數據行,則查詢結果集中就包含該數據行。EXISTS關鍵字 表示子查詢不需要返回多行數據,而只需要返回一個真值或假值。也就是說,它的作用是在WHERE子句中測試子查詢返回的行是否存在。如果存在則返回真值,如果不返回則返回假值。比較運算符 與使用IN關鍵字引入的子查詢一樣,由比較運算符與一些關鍵字(ANY|ALL|SOME)引入的子查詢返回一個值列表。例如:使用IN查詢–
在SQL中子查詢是可以嵌套使用的,并且用戶可以在一個查詢中嵌套任意多個子查詢,即一個子查詢中還可以包含另一個子查詢。
新聞熱點
疑難解答