欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SQL?Server?查詢(xún)?cè)O(shè)置??LIKE/DISTINCT/HAVING/排序詳解

 更新時(shí)間:2025年01月19日 10:36:04   作者:lu_rong_qq  
本文介紹了在SQLServer中使用LIKE、DISTINCT、HAVING等條件語(yǔ)句進(jìn)行復(fù)雜查詢(xún)的方法,包括模糊查詢(xún)、去重查詢(xún)、分組過(guò)濾以及排序等技巧,感興趣的朋友跟隨小編一起看看吧

背景

本專(zhuān)欄文章以 SAP 實(shí)施顧問(wèn)在實(shí)施項(xiàng)目中需要掌握的 sql 語(yǔ)句為偏向進(jìn)行選題,用例使用的是 SAP B1 的數(shù)據(jù)庫(kù),使用工具為 SQL Server。

本篇為復(fù)雜查詢(xún)中功能強(qiáng)大、使用邊界的條件語(yǔ)句 LIKE、DISTINCTHAVING,與排序、子查詢(xún)等查詢(xún)?cè)O(shè)置。

不考慮表連接的基礎(chǔ)上,在查詢(xún)信息時(shí),本文涉及到的各邏輯條件排列順序如下:

--()表示結(jié)構(gòu)可省略,[]表示該位置內(nèi)容
SELECT (DISTINCT) (TOP 獲取前幾條) [*/字段名] 
FROM [表名/子查詢(xún)]
(WHERE [字段名] LIKE [查詢(xún)模糊條件])
(GROUP BY [分組條件])
(HAVING [過(guò)濾條件])
(ORDER BY [排序字段] (ASC|DESC))

一、LIKE - 模糊查詢(xún)

模糊查詢(xún) LIKE 用于字符搜索,通過(guò)對(duì)所需查找的信息進(jìn)行條件設(shè)定,如某字開(kāi)頭、某字結(jié)尾、包含某字、不含某字、第幾位是某字等,將所需信息篩出。與之功能對(duì)應(yīng)的還有 REGEXP(正則表達(dá)式) ,并且其功能更強(qiáng)大,表達(dá)更簡(jiǎn)略。但是 SQL Server 不支持使用。

其基本語(yǔ)法如下:

SELECT [需要查詢(xún)的列名]
FROM [表名]
WHERE [條件列] LIKE '[條件內(nèi)容]'

1. 通配符 % 

使用模糊查詢(xún) LIKE 時(shí),對(duì)于所需核對(duì)的信息進(jìn)行位置限定,需要根據(jù)條件使用 “%”,若需要以某字開(kāi)頭則形式為 'X%' ,某字結(jié)尾則為 '%X' 。

:查找【業(yè)務(wù)伙伴主數(shù)據(jù)】表單中含有 “京” 字的公司。

此時(shí)需要在條件詞左右打上 “%”,對(duì)文本所在位置進(jìn)行限制,即 “京” 字出現(xiàn)在的任何一個(gè)位置,都將被查找出來(lái):

SELECT CardCode,CardName
FROM OCRD
WHERE CardName LIKE N'%京%' --查詢(xún)內(nèi)容為中文字符時(shí)需要增加前綴“N”才能被sql server識(shí)別

查詢(xún)結(jié)果為:

2. 占位符 _

如果對(duì)于查詢(xún)信息有嚴(yán)格的位數(shù)要求,如需要第幾位是某字,即可通過(guò)占位符 “_” 占出前面位數(shù),

例1:查找【業(yè)務(wù)伙伴主數(shù)據(jù)】表單中業(yè)務(wù)伙伴編碼第二位為 “1” 的公司。

使用占位符占用第一位,意思是無(wú)論第一位是什么都無(wú)所謂只要有東西就行,第二位是要求 “1”,其后一共幾位無(wú)所謂了所以用通配符 “%”。

SELECT CardCode,CardName
FROM OCRD
WHERE CardCode LIKE '_1%'

查詢(xún)結(jié)果:

例2:查找【業(yè)務(wù)伙伴主數(shù)據(jù)】表單中業(yè)務(wù)伙伴編碼為 6 位的公司。

SELECT CardCode,CardName
FROM OCRD
WHERE CardCode LIKE '______'--一共六條下劃線

查詢(xún)結(jié)果(結(jié)果行數(shù)較多,僅展示部分):

3. 指定集合 []

設(shè)定某一位,為在一定范圍內(nèi)任意一個(gè)值都可以,則使用 “[]” 框選集合,無(wú)論中括號(hào)內(nèi)放多少字符,中括號(hào)都只算一位。

例:查找【業(yè)務(wù)伙伴主數(shù)據(jù)】表單中業(yè)務(wù)伙伴編碼以 “C” 或 “V” 開(kāi)頭的公司。

SELECT CardCode,CardName
FROM OCRD
WHERE CardCode LIKE '[CV]%'

查詢(xún)結(jié)果(結(jié)果行數(shù)較多,僅展示部分):

3.1 表示否定 ^

否定符 “^” 僅能在中括號(hào)內(nèi)使用,哪怕只有一位,要使用否定符 “^”,也需要加上 “[]”。

例:查找【業(yè)務(wù)伙伴主數(shù)據(jù)】表單中業(yè)務(wù)伙伴編碼不以 “C” 開(kāi)頭的公司。

SELECT CardCode,CardName
FROM OCRD
WHERE CardCode LIKE '[^C]%' --不加[]的話(huà)數(shù)據(jù)庫(kù)會(huì)把^理解為判斷字符

查詢(xún)結(jié)果:

3.2 表示范圍 -

在 “[]” 內(nèi)設(shè)定內(nèi)容存在既定順序時(shí),可以使用 “-”,主要包含:字母按照字母表順序和數(shù)字按照大小順序。

例:查找【業(yè)務(wù)伙伴主數(shù)據(jù)】表單中業(yè)務(wù)伙伴名稱(chēng)含有數(shù)字的公司。

SELECT CardCode,CardName
FROM OCRD
WHERE CardName LIKE '%[0-9]%'

查詢(xún)結(jié)果:

4. 否定 NOT

對(duì)于 LIKE 級(jí)別的綜合否定,均可用 NOT LIKE 來(lái)實(shí)現(xiàn)。

例:查找【業(yè)務(wù)伙伴主數(shù)據(jù)】表單中業(yè)務(wù)伙伴名稱(chēng)不含有數(shù)字的公司。

SELECT CardCode,CardName
FROM OCRD
WHERE CardName NOT LIKE '%[0-9]%'

則會(huì)查詢(xún)出上一節(jié) 3.2 案例的查詢(xún)結(jié)果的補(bǔ)集,即返回上一案例以外的內(nèi)容行。

二、DISTINCT - 去重查詢(xún)

在 SELECT 之后增加 DISTINCT,可以對(duì)查詢(xún)數(shù)據(jù)去重。 

使用場(chǎng)景:比如在查詢(xún)所有下過(guò)采購(gòu)訂單的客戶(hù)時(shí),可以使用得到去重后的客戶(hù)名單

SELECT DISTINCT CardCode,CardName
FROM ORDR

三、HAVING - 過(guò)濾查詢(xún)

對(duì)分組后的數(shù)據(jù)過(guò)濾,一般會(huì)先使用 GROUP BY;倘若沒(méi)有出現(xiàn) GROUP BY,則默認(rèn) HAVING 把整張表當(dāng)作一組進(jìn)行過(guò)濾

HAVING 和 WHERE 的區(qū)別:

  • WHERE 在分組前過(guò)濾,HAVING 在分組后過(guò)濾。
  • WHERE 語(yǔ)句里不能包含聚合函數(shù),HAVING 語(yǔ)句可以,并且 HAVING 語(yǔ)句中的子句一般來(lái)說(shuō)不是聚合函數(shù)就是分組列。

例:查找平均銷(xiāo)售額大于 1000 的客戶(hù)。

SELECT CardCode,CardName,AVG(DocTotal) AS '平均銷(xiāo)售額'
FROM ORDR
GROUP BY CardCode,CardName
HAVING AVG(DocTotal)>1000

查詢(xún)結(jié)果:

四、小的查詢(xún)?cè)O(shè)置

1. ASC|DESC - 排序

放在 ORDER BY 后面,起到一個(gè)對(duì)分組進(jìn)行升序(ASC)或降序(DESC)續(xù)排列的作用。

例:按【銷(xiāo)售金額】對(duì)平均銷(xiāo)售額大于 1000 的客戶(hù)進(jìn)行【倒序】排列

SELECT CardCode,CardName,AVG(DocTotal) AS '平均銷(xiāo)售額'
FROM ORDR
GROUP BY CardCode,CardName 
HAVING AVG(DocTotal)>1000
ORDER BY AVG(DocTotal) DESC

查詢(xún)結(jié)果:

2. TOP - 限制

放在 SELECT 之后,按照 TOP + [數(shù)量] 的格式,實(shí)現(xiàn)對(duì)前 [數(shù)量] 行信息的效果。

例:查詢(xún)【銷(xiāo)售金額】對(duì)平均銷(xiāo)售額前十的客戶(hù)名單

SELECT TOP 10 CardCode,CardName FROM ORDR
GROUP BY CardCode,CardName
ORDER BY AVG(DocTotal) DESC

查詢(xún)結(jié)果:

3. 子查詢(xún)

在 WHERE 后,除了可以接某張已經(jīng)存在的具體表,還可以接一個(gè)【子查詢(xún)】,即由一個(gè)新的查詢(xún)構(gòu)建的新表,將其嵌套進(jìn)原有的查詢(xún)命令時(shí),形成一個(gè)【子查詢(xún)】。

注意:子查詢(xún)返回的值能且僅能為一個(gè)

例:查找銷(xiāo)售額最高的客戶(hù)在【業(yè)務(wù)伙伴主數(shù)據(jù)】中登記的業(yè)務(wù)伙伴代碼、業(yè)務(wù)伙伴名稱(chēng)、業(yè)務(wù)伙伴類(lèi)型、組代碼、電話(huà) 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
)

 查詢(xún)結(jié)果

4. not in - 取補(bǔ)集(LIMIT效果)

在 MySQL 中,可以利用 LIMIT 對(duì)查詢(xún)的信息條目進(jìn)行限制,如查前 x 條數(shù)據(jù)、跳過(guò)前 y 條數(shù)據(jù)查找后面的 z 條數(shù)據(jù)。但是 SQL Server 中不支持 LIMIT,可以使用 TOP 聯(lián)合 not 和 子查詢(xún)完成以上功能的實(shí)現(xiàn)。

例:跳過(guò)銷(xiāo)售金額平均值前十的客戶(hù),返回第 11-15 名的客戶(hù)名單

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
)

查詢(xún)結(jié)果:

到此這篇關(guān)于SQL Server 查詢(xún)?cè)O(shè)置 - LIKE/DISTINCT/HAVING/排序的文章就介紹到這了,更多相關(guān)SQL Server LIKE/DISTINCT/HAVING/排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論