資料庫的檢索語句

weixin_30639719發表於2020-04-05

1、SELECT 基本使用方法

  1.1簡單的資料檢索

1.1.1檢索出須要的列

      僅僅要執行“SELECT * FROM  名”就可以。SELECT * FROM T_Employee 。

SELECT  *  FROM  T_Employee語句會把資料庫的全部列的資訊從資料庫中讀出來,快取到記憶體中。檢索出全部的列的 SQL 語句為“SELECT * FROM    T_Employee” ,當中的星號“*”就意味著“全部列” 。那麼我們僅僅要將星號 “*”替換成我們要檢索的列名就能夠了。如SELECT FNumber FROM T_Employee 。

僅僅要在 SELECT 語句後列出各個列的列名就能夠了,須要注意的就是各個列之間要用半形的逗號“,”分隔開。比方我們執行以下的 SQL 語句:SELECT FName,FAge FROM T_Employee 。

1.1.2列別名

 別名的定義格式為 “列名  AS  別名” , 比方我們要為 FNumber  欄位取別名為 Number14
。FName 欄位取別名為 Name、FAge 欄位取別名為 Age、為 FSalary欄位取別名為 Salary。那麼編寫以下的 SQL 就可以:SELECT  FNumber  AS  Number1,FName  AS  Name,FAge  AS  Age,FSalary  AS  Salary  FROM
T_Employee 

定義別名的時候“AS”不是必須的。是能夠省略的,比方以下的 SQL 也是正確的:
SELECT  FNumber  Number1,FName  Name,FAge  Age,FSalary  Salary  FROM  T_Employee 。

1.1.3按條件過濾

因為將表中全部的資料都從資料庫中檢索出來,所以會有很大的記憶體消耗以及網路資源消耗。 須要逐條檢索每條資料是否符合過濾條件,所以檢索速度很慢。當資料量大的時候這樣的速度是讓人無法忍受的。無法實現複雜的過濾條件。SELECT FName FROM T_Employee WHERE FSalary<5000 。SELECT * FROM T_Employee WHERE FSalary<5000 OR FAge>25 。使用 WHERE 子句僅僅需指定過濾條件就能夠。我們無需關心資料庫系統是假設進行查詢的。資料庫會採用適當的優化演算法進行查詢,大大減少了 CPU 資源的佔用。

SQL 標準中規定了以下幾種聚合函式:


這幾個聚合函式都有一個引數。這個參數列示要統計的欄位名。 第一個樣例是查詢年齡大於 25 歲的員工的最高工資,執行以下的 SQL:
SELECT MAX(FSalary) FROM T_Employee WHERE FAge>25 。

為了方面的引用查詢的結果, 也能夠為聚合函式的計算結果指定一個別名, 執行以下的 SQL:

SELECT MAX(FSalary) as MAX_SALARY FROM T_Employee WHERE FAge>25 。


SELECT AVG(FAge) FROM    T_Employee WHERE FSalary>3800 。


SELECT SUM(FSalary) FROM  T_Employee 。

SELECT MIN(FSalary),MAX(FSalary) FROM    T_Employee 。


最後一個介紹的函式就是統計記錄數量的 COUNT,這個函式有一特別。由於它的即能夠像其它聚合函式一樣使用欄位名做引數。 也能夠使用星號 “*” 做為引數。 我們執行以下的 SQL:
SELECT COUNT(*),COUNT(FNumber) FROM    T_Employee 。


COUNT(*)統計的是結果集的總條數。而COUNT(FName)統計的則是除了結果集中 FName 不為空值(也就是不等於 NULL)的記錄的總條數。


1.1.4排序

SELECT 語句同意使用 ORDER BY 子句來執行結果集的排序方式。ORDER BY 子句位於 SELECT 語句的末尾,它同意指定依照一個列或者多個列進行排序,還能夠指定排序方式是升序(從小到大排列)還是降序(從大到小排列)。

比方以下的 SQL 語句演示了依照年齡排序全部員工資訊的列表:
SELECT * FROM    T_EmployeeORDER BY FAge ASC 。

     ASC 代表升序,升序是預設的排序方式。SELECT * FROM    T_Employee ORDER BY FAge 。

假設須要依照降序排列,那麼僅僅要將 ASC 替換為 DESC 就可以,當中 DESC 代表降序。執行以下的 SQL 語句:SELECT * FROM    T_Employee ORDER BY FAge DESC 。


由於 ORDER BY語句同意指定多個排序列。各個列之間使用逗號隔開就可以。

執行以下的 SQL 語句:
SELECT * FROM    T_Employee ORDER BY FAge DESC,FSalary DESC  。 能夠看到年齡同樣的記錄依照工資從高到低的順序排列了。

對於多個排序規則,資料庫系統會依照優先順序進行處理。資料庫系統首先依照第一個排序規則進行排序; 假設依照第一個排序規則無法區分兩條記錄的順序, 則依照第二個排序規則進行排序; 假設依照第二個排序規則無法區分兩條記錄的順序, 則依照第三個排序規則進行排序。 ……以此類推。ORDER  BY 子句全然能夠與 WHERE 子句一起使用,唯一須要注意的就是 ORDER  BY 子句要放到 WHERE 子句之後,不能顛倒它們的順序。

SELECT * FROM T_Employee WHERE FAge>23 ORDER BY FAge DESC,FSalary DESC 。

1.2高階過濾功能

高階資料過濾技巧差不多適用於 Update 語句和 Delete 語句中的Where 子句。

1.2.1萬用字元過濾

SQL 中的萬用字元過濾使用 LIKE keyword,是一個二元操作符, 左表示式為待匹配的欄位。 而右表示式為待匹配的萬用字元表示式

1.2.1.1單字元匹配

“b_d” 匹配第一個字元為 b、第二個字元為隨意字元、第三個字元為 d 的字串。萬用字元表示式“_oo_”匹配第一個字元為隨意字元、第二個字元為 o、第三個字元為 o、第四個字元為隨意字元的字串。

SELECT * FROM T_Employee WHERE FName LIKE '_erry'  。

SELECT * FROM T_Employee WHERE FName LIKE '__n_' 。

1.2.1.2多字元匹配

進行多字元匹配的萬用字元為半形百分號“%” ,它匹配隨意次數(零或多個)出現的隨意字元。

比方萬用字元表示式“k%”匹配以“k”開頭、隨意長度的字串。

SELECT * FROM T_Employee WHERE FName LIKE 'T%' 。

SELECT * FROM T_Employee WHERE FName LIKE '%n%'。


字元匹配和多字元匹配還能夠一起使用。SELECT * FROM T_Employee WHERE FName LIKE '%n_' 。


1.2.2空值檢測

沒有加入非空約束列是能夠為空值的(也就是 NULL)。待檢測欄位名IS NULL”,比方要查詢全部姓名未知的員工資訊,則執行以下的SQL語句:SELECT * FROM T_Employee WHERE FNAME IS NULL 。

假設要檢測“欄位不為空”,則要使用IS  NOT  NULL,用法為“待檢測欄位名IS  NOT NULL”,比方要查詢全部姓名已知的員工資訊,則執行以下的SQL語句:SELECT * FROM T_Employee WHERE FNAME IS NOT NULL 。


SELECT * FROM T_Employee WHERE FNAME IS NOT NULL AND FSalary<5000。


1.2.3反義運算子

 同一時候SQL提供了通用的表示 “不等於” 的運算子 “<>” , 這樣 “不等於”、“不大於”和“不小於”就分別能夠表示成“<>”、“<=”和“>=”。

檢索全部年齡不等於22歲而且工資不小於2000元”,我們能夠編寫以下的SQL語
句:SELECT * FROM T_Employee WHERE FAge<>22 AND FSALARY>=2000  。

因此要完畢以下的功能“檢索全部年齡不等於22歲而且工資不小於2000元”。我們能夠編寫以下的SQL語句:
SELECT * FROM T_Employee WHERE NOT(FAge=22) AND NOT(FSALARY<2000) 。

1.2.4多值檢測

能夠使用OR語句來連線多個等於推斷。SQL語句例如以下:SELECT FAge,FNumber,FName FROM T_EmployeeWHERE FAge=23 OR FAge=25 OR FAge=28  。


SELECT FAge,FNumber,FName FROM T_Employee WHERE FAge IN(23,25,28) 。


1.2.5範圍檢測

檢索全部年齡介於23歲到27歲之間的員工資訊” ,能夠使用以下的SQL語
句:SELECT * FROM T_Employee WHERE FAGE>=23 AND FAGE <=27
 。

SQL提供了一個專門用語範圍值檢
測的語句“BETTWEEN AND”,它能夠用來檢測一個值是否處於某個範圍中(包含範圍的邊界值,也就是閉區間)。用法例如以下“欄位名  BETTWEEN  左範圍值  AND 右範圍值”。SELECT * FROM T_Employee 
WHERE FAGE BETWEEN 23 AND 27 。


檢索全部工資介於2000元到3000元之間以及5000元到8000元的員工資訊” ,能夠使用以下的SQL語句:
SELECT * FROM T_Employee WHERE (FSalary BETWEEN 2000 AND 3000)OR (FSalary BETWEEN 5000 AND 8000) 。


資料庫系統對“BETTWEEN AND”進行了查詢優化。使用它進行範圍值檢測將會得到比其它方式更好的效能。因此在進行範圍值檢測的時候應該優先使用“BETTWEEN AND”。須要注意的就是“BETTWEEN AND”在進行檢測的時候是包含了範圍的邊界值的(也就是閉區間)。假設須要進行開區間或者半開半閉區間的範圍值檢測的話就必須使用其它的解決方式了。

1.2.6低效的where 1=1

由於使用加入了 “1=1”的過濾條件以後資料庫系統就無法使用索引等查詢優化策略,資料庫系統將會被迫對每行資料進行掃描 (也就是全表掃描) 以比較此行是否滿足過濾條件。 當表中資料量比較大的時候查詢速度會很慢。

因此假設資料檢索對效能有比較高的要求就不要使用這樣的 “簡便” 的方式。


1.3資料分組

SQL語句中使用GROUP BY子句進行分組。使用方式為“GROUP BY 分組欄位”。分組語句必須和聚合函式一
起使用。GROUP BY子句負責將資料分成邏輯組,而聚合函式則對每個組進行統計計算。

SELECT FAge FROM T_Employee GROUP BY FAge。

 GROUP  BY子句將檢索結果劃分為多個組,每一個組是全部記錄的一個子集。GROUP BY子句必須放到SELECT語句的之後,假設SELECT語句有WHERE子句。則GROUPBY子句必須放到WHERE語句的之後。

SELECT FAge FROM T_Employee WHERE FSubCompany = 'Beijing'GROUP BY FAge 須要分組的全部列都必須位於GROUP  BY子句的列名列表中,也就是沒有出如今GROUP  BY子句中的列(聚合函式除外)是不能放到SELECT語句後的列名列表中的。



SELECT FAge,AVG(FSalary) FROM T_Employee GROUP BY FAge 。GROUP  BY子句中能夠指定多個列。僅僅須要將多個列的列名用逗號隔開就可以。

指定多個分組規則以後, 資料庫系統將依照定義的分組順序來對資料進行逐層分組, 首先依照第一個分組列進行分組。然後在每一個小組內依照第二個分組列進行再次分組……逐層分組。從而實現“組中組”的效果, 而查詢的結果集是以最末一級分組來進行輸出的。


SELECT FSubCompany,FDepartment FROM T_Employee GROUP BY FSubCompany,FDepartment 。


SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge 。

SELECT FSubCompany,FAge,COUNT(*) AS CountOfThisSubCompAge FROM T_Employee GROUP BY FSubCompany,FAge 。


SELECT FSubCompany,FAge,COUNT(*) AS CountOfThisSubCompAge FROM T_Employee GROUP BY FSubCompany,FAge ORDER BY FSubCompany 。


“COUNT(*)”對每一個分組統計總數,這樣就能夠統計出每一個公司每一個年齡段的員工的人數了。SUM、AVG、MIN、MAX也能夠在分組中使用。

比方以下的SQL能夠統計每一個公司中的工資
的總值:SELECT FSubCompany,SUM(FSalary) AS FSalarySUM FROM T_Employee GROUP BY FSubCompany 。


1.3.1having子句

有的時候須要對部分分組進行過濾,能夠在資料庫系統中執行以下的SQL的時候, 資料庫系統會提示語法錯誤, 這是由於聚合函式不能在WHERE語句中使用,必須使用HAVING子句來取代。比方:SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*)>1 。



HAVING語句中也能夠像WHERE語句一樣使用複雜的過濾條件。比方以下的SQL用來檢索人數為1個或者3個的年齡段。能夠使用以下的SQL:SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee 
GROUP BY FAge HAVING COUNT(*)=1 OR COUNT(*)=3 。



MYSQL中提供了LIMITkeyword用來限制返回的結果集。 LIMIT放在SELECT語句的最後位置,語法為 “LIMIT  首行行號,要返回的結果集的最大數目” 。

比方以下的SQL語句將返回依照工資降序排列的從第二行開始(行號從0開始)的最多五條記錄:SELECT * FROM T_Employee ORDER BY FSalary DESC LIMIT 2,5 。



 DISTINCTkeyword是用來進行反覆資料抑制的最簡單的功能。並且全部的資料庫系統都支援DISTINCT,DISTINCT的使用也很easy。僅僅要在SELECT之後新增DISTINCT就可以。 DISTINCT是對整個結果集進行資料反覆抑制的。 而不是針對每個列, 執行以下的SQL語句:SELECT DISTINCT FDepartment,FSubCompany FROM T_Employee 。

DISTINCT是對整個結果集進行資料反覆抑制的。


聯合結果集
有的時候我們須要組合兩個全然不同的查詢結果集, 而這兩個查詢結果之間沒有必定的聯絡。僅僅是我們須要將他們顯示在一個結果集中而已。在SQL中能夠使用UNION運算子來將兩個或者多個查詢結果集聯合為一個結果集中。


僅僅要用UNION操作符連線這兩個查詢語句就能夠將兩個查詢結果集聯合為一個結果集。
SQL語句例如以下:
SELECT FNumber ,FName,FAge FROM T_Employee 
UNION 
SELECT FIdCardNumber ,FName,FAge FROM T_T empEmpl oyee 。



聯合結果集的原則
聯合結果集不必受被聯合的多個結果集之間的關係限制,只是使用UNION仍然有兩個主要的原則須要遵守:一是每一個結果集必須有同樣的列數; 二是每一個結果集的列必須型別相容。



轉載於:https://www.cnblogs.com/yxwkf/p/5055235.html

相關文章