在SQL中,去重的方式主要有以下几种:
1、使用DISTINCT关键字
DISTINCT是最常用的去重方式,它可以直接在SELECT语句中使用,用于返回唯一不同的值,如果我们有一个名为"students"的表,其中包含"name"和"age"两个字段,我们想要查询所有不同的年龄,可以使用以下语句:
SELECT DISTINCT age FROM students;
2、使用GROUP BY子句
GROUP BY子句可以对结果集进行分组,每个组中的所有行都是唯一的,如果我们想要查询每个不同的年龄的学生数量,可以使用以下语句:
SELECT age, COUNT(*) FROM students GROUP BY age;
3、使用HAVING子句
HAVING子句可以过滤掉GROUP BY子句的结果集中的空组,如果我们想要查询至少有两名学生的每个不同的年龄,可以使用以下语句:
SELECT age, COUNT(*) FROM students GROUP BY age HAVING COUNT(*) >= 2;
4、使用ROW_NUMBER()函数
ROW_NUMBER()函数可以为结果集中的每一行分配一个唯一的数字,我们可以使用WHERE子句来过滤掉那些行号大于1的行,从而实现去重,如果我们想要查询每个不同的年龄的学生数量,可以使用以下语句:
SELECT age, COUNT(*) AS student_count FROM (SELECT age, ROW_NUMBER() OVER (PARTITION BY age ORDER BY age) AS row_num FROM students) t WHERE t.row_num = 1 GROUP BY age;
5、使用UNION ALL和NOT IN子句
UNION ALL可以将两个或多个SELECT语句的结果集合并在一起,而NOT IN子句可以过滤掉那些在另一个结果集中存在的行,如果我们想要查询所有不在"students"表中的年龄,可以使用以下语句:
SELECT age FROM (SELECT age FROM students UNION ALL SELECT age FROM other_table) t WHERE t.age NOT IN (SELECT age FROM students);
6、使用临时表和DELETE子句
我们可以创建一个临时表,将需要去重的表插入到临时表中,然后删除重复的行,如果我们想要查询每个不同的年龄的学生数量,可以使用以下语句:
CREATE TEMPORARY TABLE temp_students AS SELECT * FROM students; DELETE FROM temp_students WHERE id NOT IN (SELECT MIN(id) FROM temp_students GROUP BY age); SELECT * FROM temp_students;
7、使用窗口函数和CASE表达式
窗口函数可以在每个窗口分区中执行计算,而CASE表达式可以根据条件选择不同的值,如果我们想要查询每个不同的年龄的学生数量,可以使用以下语句:
SELECT age, COUNT(*) AS student_count FROM (SELECT age, COUNT(*) OVER (PARTITION BY age) AS count, CASE WHEN COUNT(*) > 1 THEN 'duplicate' ELSE 'unique' END AS status FROM students) t WHERE t.status = 'unique' GROUP BY age;
以上就是SQL中去重的几种主要方式,每种方式都有其适用的场景和限制,我们需要根据实际的需求和数据结构来选择合适的去重方式。
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/205817.html