SQL?Server?查詢設(shè)置??LIKE/DISTINCT/HAVING/排序詳解
背景
本專欄文章以 SAP 實施顧問在實施項目中需要掌握的 sql 語句為偏向進行選題,用例使用的是 SAP B1 的數(shù)據(jù)庫,使用工具為 SQL Server。
本篇為復(fù)雜查詢中功能強大、使用邊界的條件語句 LIKE、DISTINCT、HAVING,與排序、子查詢等查詢設(shè)置。
不考慮表連接的基礎(chǔ)上,在查詢信息時,本文涉及到的各邏輯條件排列順序如下:
--()表示結(jié)構(gòu)可省略,[]表示該位置內(nèi)容 SELECT (DISTINCT) (TOP 獲取前幾條) [*/字段名] FROM [表名/子查詢] (WHERE [字段名] LIKE [查詢模糊條件]) (GROUP BY [分組條件]) (HAVING [過濾條件]) (ORDER BY [排序字段] (ASC|DESC))
一、LIKE - 模糊查詢
模糊查詢 LIKE 用于字符搜索,通過對所需查找的信息進行條件設(shè)定,如某字開頭、某字結(jié)尾、包含某字、不含某字、第幾位是某字等,將所需信息篩出。與之功能對應(yīng)的還有 REGEXP(正則表達式) ,并且其功能更強大,表達更簡略。但是 SQL Server 不支持使用。
其基本語法如下:
SELECT [需要查詢的列名] FROM [表名] WHERE [條件列] LIKE '[條件內(nèi)容]'
1. 通配符 %
使用模糊查詢 LIKE 時,對于所需核對的信息進行位置限定,需要根據(jù)條件使用 “%”,若需要以某字開頭則形式為 'X%' ,某字結(jié)尾則為 '%X' 。
例:查找【業(yè)務(wù)伙伴主數(shù)據(jù)】表單中含有 “京” 字的公司。
此時需要在條件詞左右打上 “%”,對文本所在位置進行限制,即 “京” 字出現(xiàn)在的任何一個位置,都將被查找出來:
SELECT CardCode,CardName FROM OCRD WHERE CardName LIKE N'%京%' --查詢內(nèi)容為中文字符時需要增加前綴“N”才能被sql server識別
查詢結(jié)果為:
2. 占位符 _
如果對于查詢信息有嚴(yán)格的位數(shù)要求,如需要第幾位是某字,即可通過占位符 “_” 占出前面位數(shù),
例1:查找【業(yè)務(wù)伙伴主數(shù)據(jù)】表單中業(yè)務(wù)伙伴編碼第二位為 “1” 的公司。
使用占位符占用第一位,意思是無論第一位是什么都無所謂只要有東西就行,第二位是要求 “1”,其后一共幾位無所謂了所以用通配符 “%”。
SELECT CardCode,CardName FROM OCRD WHERE CardCode LIKE '_1%'
查詢結(jié)果:
例2:查找【業(yè)務(wù)伙伴主數(shù)據(jù)】表單中業(yè)務(wù)伙伴編碼為 6 位的公司。
SELECT CardCode,CardName FROM OCRD WHERE CardCode LIKE '______'--一共六條下劃線
查詢結(jié)果(結(jié)果行數(shù)較多,僅展示部分):
3. 指定集合 []
設(shè)定某一位,為在一定范圍內(nèi)任意一個值都可以,則使用 “[]” 框選集合,無論中括號內(nèi)放多少字符,中括號都只算一位。
例:查找【業(yè)務(wù)伙伴主數(shù)據(jù)】表單中業(yè)務(wù)伙伴編碼以 “C” 或 “V” 開頭的公司。
SELECT CardCode,CardName FROM OCRD WHERE CardCode LIKE '[CV]%'
查詢結(jié)果(結(jié)果行數(shù)較多,僅展示部分):
3.1 表示否定 ^
否定符 “^” 僅能在中括號內(nèi)使用,哪怕只有一位,要使用否定符 “^”,也需要加上 “[]”。
例:查找【業(yè)務(wù)伙伴主數(shù)據(jù)】表單中業(yè)務(wù)伙伴編碼不以 “C” 開頭的公司。
SELECT CardCode,CardName FROM OCRD WHERE CardCode LIKE '[^C]%' --不加[]的話數(shù)據(jù)庫會把^理解為判斷字符
查詢結(jié)果:
3.2 表示范圍 -
在 “[]” 內(nèi)設(shè)定內(nèi)容存在既定順序時,可以使用 “-”,主要包含:字母按照字母表順序和數(shù)字按照大小順序。
例:查找【業(yè)務(wù)伙伴主數(shù)據(jù)】表單中業(yè)務(wù)伙伴名稱含有數(shù)字的公司。
SELECT CardCode,CardName FROM OCRD WHERE CardName LIKE '%[0-9]%'
查詢結(jié)果:
4. 否定 NOT
對于 LIKE 級別的綜合否定,均可用 NOT LIKE 來實現(xiàn)。
例:查找【業(yè)務(wù)伙伴主數(shù)據(jù)】表單中業(yè)務(wù)伙伴名稱不含有數(shù)字的公司。
SELECT CardCode,CardName FROM OCRD WHERE CardName NOT LIKE '%[0-9]%'
則會查詢出上一節(jié) 3.2 案例的查詢結(jié)果的補集,即返回上一案例以外的內(nèi)容行。
二、DISTINCT - 去重查詢
在 SELECT 之后增加 DISTINCT,可以對查詢數(shù)據(jù)去重。
使用場景:比如在查詢所有下過采購訂單的客戶時,可以使用得到去重后的客戶名單
SELECT DISTINCT CardCode,CardName FROM ORDR
三、HAVING - 過濾查詢
對分組后的數(shù)據(jù)過濾,一般會先使用 GROUP BY;倘若沒有出現(xiàn) GROUP BY,則默認(rèn) HAVING 把整張表當(dāng)作一組進行過濾
HAVING 和 WHERE 的區(qū)別:
- WHERE 在分組前過濾,HAVING 在分組后過濾。
- WHERE 語句里不能包含聚合函數(shù),HAVING 語句可以,并且 HAVING 語句中的子句一般來說不是聚合函數(shù)就是分組列。
例:查找平均銷售額大于 1000 的客戶。
SELECT CardCode,CardName,AVG(DocTotal) AS '平均銷售額' FROM ORDR GROUP BY CardCode,CardName HAVING AVG(DocTotal)>1000
查詢結(jié)果:
四、小的查詢設(shè)置
1. ASC|DESC - 排序
放在 ORDER BY 后面,起到一個對分組進行升序(ASC)或降序(DESC)續(xù)排列的作用。
例:按【銷售金額】對平均銷售額大于 1000 的客戶進行【倒序】排列
SELECT CardCode,CardName,AVG(DocTotal) AS '平均銷售額' FROM ORDR GROUP BY CardCode,CardName HAVING AVG(DocTotal)>1000 ORDER BY AVG(DocTotal) DESC
查詢結(jié)果:
2. TOP - 限制
放在 SELECT 之后,按照 TOP + [數(shù)量] 的格式,實現(xiàn)對前 [數(shù)量] 行信息的效果。
例:查詢【銷售金額】對平均銷售額前十的客戶名單
SELECT TOP 10 CardCode,CardName FROM ORDR GROUP BY CardCode,CardName ORDER BY AVG(DocTotal) DESC
查詢結(jié)果:
3. 子查詢
在 WHERE 后,除了可以接某張已經(jīng)存在的具體表,還可以接一個【子查詢】,即由一個新的查詢構(gòu)建的新表,將其嵌套進原有的查詢命令時,形成一個【子查詢】。
注意:子查詢返回的值能且僅能為一個。
例:查找銷售額最高的客戶在【業(yè)務(wù)伙伴主數(shù)據(jù)】中登記的業(yè)務(wù)伙伴代碼、業(yè)務(wù)伙伴名稱、業(yè)務(wù)伙伴類型、組代碼、電話 1、聯(lián)系人信息。
SELECT CardCode,CardName,CardType,GroupCode,Phone1,CntctPrsn FROM OCRD WHERE CardCode = ( SELECT TOP 1 CardCode FROM ORDR GROUP BY CardCode ORDER BY SUM(DocTotal) DESC )
查詢結(jié)果
4. not in - 取補集(LIMIT效果)
在 MySQL 中,可以利用 LIMIT 對查詢的信息條目進行限制,如查前 x 條數(shù)據(jù)、跳過前 y 條數(shù)據(jù)查找后面的 z 條數(shù)據(jù)。但是 SQL Server 中不支持 LIMIT,可以使用 TOP 聯(lián)合 not 和 子查詢完成以上功能的實現(xiàn)。
例:跳過銷售金額平均值前十的客戶,返回第 11-15 名的客戶名單
SELECT TOP 5 CardCode,CardName FROM OPOR WHERE CardCode NOT IN( SELECT TOP 10 CardCode FROM ORDR GROUP BY CardCode ORDER BY AVG(DocTotal) DESC )
查詢結(jié)果:
到此這篇關(guān)于SQL Server 查詢設(shè)置 - LIKE/DISTINCT/HAVING/排序的文章就介紹到這了,更多相關(guān)SQL Server LIKE/DISTINCT/HAVING/排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SqlServer 基礎(chǔ)知識 數(shù)據(jù)檢索、查詢排序語句
SqlServer 基礎(chǔ)知識 數(shù)據(jù)檢索、查詢排序語句,需要的朋友可以參考下。2011-10-10sqlserver/mysql按天、按小時、按分鐘統(tǒng)計連續(xù)時間段數(shù)據(jù)【推薦】
最近小編接到這樣的需求,公司需要按天,按小時查看數(shù)據(jù),可以直觀的看到時間段的數(shù)據(jù)峰值。這篇文章主要介紹了sqlserver/mysql按天,按小時,按分鐘統(tǒng)計連續(xù)時間段數(shù)據(jù) ,需要的朋友可以參考下2019-06-06