資料庫的檢索語句,資料庫檢索語句

來源:互聯網
上載者:User

資料庫的檢索語句,資料庫檢索語句

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 關鍵字,是一個二元操作符, 左運算式為待匹配的欄位, 而右運算式為待匹配的萬用字元運算式。

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中提供了LIMIT關鍵字用來限制返回的結果集, LIMIT放在SELECT語句的最後位置,文法為 “LIMIT  首行行號,要返回的結果集的最大數目” 。比如下面的SQL語句將返回按照工資降序排列的從第二行開始(行號從0開始)的最多五條記錄:SELECT * FROM T_Employee ORDER BY FSalary DESC LIMIT 2,5 。



 DISTINCT關鍵字是用來進行重複資料抑制的最簡單的功能,而且所有的資料庫系統都支援DISTINCT,DISTINCT的使用也非常簡單,只要在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仍然有兩個基本的原則需要遵守:一是每個結果集必須有相同的列數; 二是每個結果集的列必須類型相容。




資料庫 表資料的檢索,SQL語句怎寫

好糾結的題目啊,你要篩選NULL還是NOT NULL
如果要篩選NOT NULL就用
SELECT * FROM table WHERE 列3 IS NOT NULL
 
資料庫 表資料的檢索,SQL語句怎寫

好糾結的題目啊,你要篩選NULL還是NOT NULL
如果要篩選NOT NULL就用
SELECT * FROM table WHERE 列3 IS NOT NULL
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.