1. 程式人生 > >DQL資料查詢語言--select的巧妙用法

DQL資料查詢語言--select的巧妙用法

DQL資料查詢語言–select的巧妙用法

今天是週六,趕著這冬日的太陽,記下生活!記下經驗!
巧用SQL的資料查詢語句Select可以大大提高查詢效率,針對測試開發都非常有用。

1 完整的SELECT查詢語句

SELECT 欄位名 / * / 表示式 / 函式呼叫
FROM 表1,表2,…
WHERE 分組前的過濾條件
GROUP BY 分組欄位
HAVING 分組後的過濾條件
ORDER BY 欄位名  排序規則(ASC / DESC)

下面以藥品管理系統(DrugManagementSystem)中的藥品資訊表(Drug)為例,表明SELECT查詢語句實際用法。

2 查詢所有資料

查詢所有資料,是針對不知道表中欄位,也不清楚查看錶結構的情況使用的,為避免增加查詢過程的不必要的消耗(CPU、記憶體等),儘量查詢所需欄位的資料。

--檢視Drug表的結構
sp_help Drug

--查詢Drug表的所有資料
SELECT * FROM Drug

--查詢Drug表中多個欄位DrugName, DrugPrice, …的所屬列資料
SELECT DrugName, DrugPrice, … FROM Drug

--給欄位取別名後(AS可省略),查詢Drug表中多個欄位DrugName, DrugPrice, …的所屬列資料
SELECT DrugName AS 藥品名稱, DrugPrice 藥品價格, … FROM Drug

--查詢多張表Drug, Price,…中所有欄位
SELECT * FROM Drug, Price,…  

--檢視前n行資料
SELECTE TOP n FROM Drug

3 條件查詢

條件查詢的語法:WHERE 分組前的過濾條件 ;其中分組前的過濾條件可以是如下表達方式:

  • (1)關係運算:>、>= 、< 、<= 、= 、<>
  • (2)確定範圍:BETWEEN … AND
  • (3)確定集合:IN(IN中的數值越多,產生的消耗就越大,能用BETWEEN就儘量不用IN)
  • (4)字元匹配:LIKE
  • (5)空值判斷:IS NULL、IS NOT NULL(考慮到對NULL的判斷會致使引擎放棄使用索引而進行全表查詢,儘量避免使用NULL)
  • (6)邏輯操作:NOT、AND、OR(如果限制條件中有欄位沒有索引,則儘量少用OR,使用UNION或UNION ALL來代替OR)
  • (7)合併查詢:UNION、UNION ALL、INTERSECT、MINUS(儘量用UNION ALL來代替UNION,因為UNION需要將結果集合後再進行唯一性過濾,這會增加CUP運算,加大資源的消耗和延遲,但是UNION ALL的使用前提是 2個結果集合沒有相重複的資料)
  • (8)注意:條件查詢前,先確定WHERE中欄位的引數型別,避免和實際傳入的引數型別不一致
--單條件查詢
SELECT * FROM Drug WHERE DrugName = ‘健胃消食片’

--多條件查詢,並關係
SELECT * FROM Drug WHERE DrugName = ‘健胃消食片’ AND DrugPrice = 12

--多條件查詢,或關係
SELECT * FROM Drug WHERE DrugName = ‘健胃消食片’ OR DrugPrice = 12

--範圍查詢
SELECT * FROM Drug WHERE DrugPrice >= 12 AND DrugPrice <= 22

--範圍查詢
SELECT * FROM Drug WHERE DrugPrice BETWEEN 12 AND 22

4 模糊查詢

模糊查詢的語法:欄位名 like ‘匹配字串’ ;其中匹配字串可以是如下表達方式:

  • %:0個或者多個字元(任意個字元)
  • _:任意一個字元
  • [ ]:在範圍內的一個字元
  • [^]:不在範圍內的一個字元
--查詢DrugName以“消食片”結尾的藥品
SELECT * FROM Drug WHERE DrugName LIKE ‘%消食片’

--查詢DrugName中間含有“消食”的藥品
SELECT * FROM Drug WHERE DrugName LIKE ‘%消食%’

--查詢DrugName以“消食”開頭的藥品
SELECT * FROM Drug WHERE DrugName LIKE ‘消食%’

--已知DrugCode是6個字元,查詢出DrugCode以‘A0000’開頭的藥品資訊
SELECT * FROM Drug WHERE DrugCode LIKE ‘A0000_’

--只能表示一個字元,表示字元範圍以A、B、C結尾前面的任意
SELECT * FROM Drug WHERE DrugCode LIKE ‘%[A-C]’

5 統計查詢

統計查詢,即用多行函式(組函式、聚集函式)來根據一列或多列對結果進行查詢。

  • COUNT( ) 統計記錄條數
  • MAX( ) 求最大值
  • MIN( ) 求最小值
  • SUM( ) 求總和
  • AVG( ) 求平均數
--查詢Drug表中有多少條資料
SELECT COUNT( DrugPrice ) FROM Drug

--查詢Drug表中DrugPrice的最大值
SELECT MAX( DrugPrice ) FROM Drug

--查詢Drug表中DrugPrice的最小值
SELECT MIN( DrugPrice ) FROM Drug

--查詢Drug表中所有藥品DrugPrice的總和
SELECT SUM( DrugPrice ) FROM Drug

--查詢Drug表中所有藥品DrugPrice的平均值
SELECT AVG( DrugPrice ) FROM Drug

6 分組查詢

分組查詢的語法:GROUP BY語句 HAVING 分組後的過濾條件;其中GROUP BY子句用於結合組函式,根據一個或多個列對結果集進行分組

--不含分組後的過濾條件
SELECT DrugName, SUM( DrugPrice ) FROM Drug WHERE DrugTime = ‘2019/1’ GROUP BY DrugName

--含分組後的過濾條件
DrugName, SUM( DrugPrice ) FROM Drug WHERE DrugTime = ‘2019/1’ GROUP BY DrugName HAVING SUM( DrugPrice ) > 600

7 排序查詢

排序查詢的語法:ORDER BY 欄位名 排序規則(ASC:升序,從小到大 / DESC:降序,從大到小);ORDER BY子句一定在SELECT語句的末尾,本質就是在查詢會結果後改變輸出順序

--按照藥品價格DrugPrice升序排列
SELECT * FROM Drug ORDER BY DrugPrice ASC

--按照藥品價格DrugPrice降序排列
SELECT * FROM Drug ORDER BY DrugPrice DESC

--按照藥品Drug多個欄位依次排序,預設為升序排序
SELECT * FROM Drug ORDER BY DrugPrice, DrugName

8 分頁查詢

分頁查詢的語法:LIMIT 範圍;合理的使用分頁方式可以提高分頁效率

--只需要1條資料時,可使用LIMIT 1
SELECT * FROM Drug LIMIT 1

--跳轉到第n條資料查詢第n條資料後的m條資料(資料範圍為n+1至n+m)
SELECT * FROM Drug LIMIT n,m

--跳轉到第n條資料查詢第n條資料後的m條資料(這種比上一種語法更優)
SELECT * FROM Drug WHERE DrugId > n-1 LIMIT m

9 去重查詢

--去重查詢,查詢其除了藥品資訊表Drug中藥品名稱DrugName重複的資料
SELECT DISTINCT DrugName FROM Drug

10 連線查詢

--左外連線(left jion):左表(table_name1) / 右表(table_name2)
SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name

--右外連線(right jion):左表(table_name1) / 右表(table_name2)
SELECT column_name(s) FROM table_name1 RIGHT JOIN table_name2 ON table_name1.column_name=table_name2.column_name

  • 致謝
    若對大家有用,感謝點贊或評論;若有不足或補充之處,也感謝大家評論進行指正,後期我將對本文進行補充完善。相信這是互相進步的開始