Sql Server-实用技巧-查询表中重复数据

下面直接放我比较常用的示例

正确示例:
  1. 使用子查询进行筛选
    SELECT * FROM [Demo].[dbo].[Table] a WHERE (SELECT Count(1) FROM [Demo].[dbo].[Table] WHERE Name = a.Name)>1 ORDER BY Name DESC
  2. 使用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的语句执行顺序:

  1. FROM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. AGG_FUNCTION
  7. WITH
  8. HAVING
  9. SELECT
  10. DISTINCT
  11. ORDER BY
  12. 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,都会有很好的使用效果

你可能感兴趣的:(Sql Server-实用技巧-查询表中重复数据)