DQL資料查詢語言--select的巧妙用法
阿新 • • 發佈:2019-01-05
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
- 致謝
若對大家有用,感謝點贊或評論;若有不足或補充之處,也感謝大家評論進行指正,後期我將對本文進行補充完善。相信這是互相進步的開始