下面直接放我比较常用的示例
正确示例:
- 使用子查询进行筛选
SELECT * FROM [Demo].[dbo].[Table] a WHERE (SELECT Count(1) FROM [Demo].[dbo].[Table] WHERE Name = a.Name)>1 ORDER BY Name DESC
- 使用having进行筛选
SELECT * FROM [Demo].[dbo].[Table] WHERE Name IN (SELECT Name FROM [Demo].[dbo].[Table] GROUP BY Name HAVING COUNT(Name) > 1) ORDER BY Name DESC
这两种都是查询重复数据的方法,作用是一样的,但是我用的比较惯的一般还是第一种,以上示例是重复一列的时候的查询方法,多列重复的方法往查询语句中加入对应列即可。
这个文章的起因是因为我之前在查询过程中遇到了报错,当时不明白,后来查找了文章理解以后明白这其实是由于Sql Server的语法导致的报错
错误实例:
SELECT * FROM [Demo].[dbo].[Table] a WHERE COUNT(Name) > 1 ORDER BY Name DESC
'聚合不应出现在WHERE子句中',要理解这句话首先要明白Sql Server的语句执行顺序:
- FROM
- ON
- JOIN
- WHERE
- GROUP BY
- AGG_FUNCTION
- WITH
- HAVING
- SELECT
- DISTINCT
- ORDER BY
- LIMIT/OFFSET
写一个简单的例子,展示各个语句执行的顺序:
SELECT Name, /*9. 选出指定列*/
avg(Point) AS [avgPoint]
FROM [Demo].[dbo].[Table] /*1. 获取不同数据源的数据集*/
WHERE Name IS NOT NULL /*4. 根据指定的条件对数据进行筛选*/
GROUP BY Name /*5. 分组*/
HAVING /*8. 根据指定的条件对数据进行筛选*/
COUNT(Point)>70 /*6. 计算聚合函数*/
ORDER BY Point DESC /*11. 排列*/
Limit 10 /*12. 指定返回行*/
其中计算聚合函数aggregate_function是什么意思呢?SQL Aggregate 函数计算从列中取得的值,返回一个单一的值。常用的 Aggregate 函数包涵以下几种:
AVG:返回平均值
COUNT:返回行数
FIRST:返回第一个记录的值
LAST:返回最后一个记录的值
MAX:返回最大值
MIN:返回最小值
SUM:返回总和
而聚合函数是针对结果集进行的,但是where条件并不是在查询出结果集之后运行,所以主函数放在where语句中,则会出现错误'聚合不应出现在WHERE子句中',所以我们要小心,不能在where中使用聚合函数
而having不一样,having是针对结果集做筛选的,且where和having的主要作用相同,所以一般吧聚合函数放在having中,用having来代替where
PS:
1.having一般跟在group by后
2.having在很多特别的情况下如求重复名称的得分平均值之类SELECT Name,avg(Point) FROM [Demo].[dbo].[Table] GROUP BY Name HAVING COUNT(Name)>1
,都会有很好的使用效果