1. 简介
在处理大量数据的时候,经常会遇到需要去重查询的场景,SQL中提供了多种去重查询的方式,可以根据具体的业务需求选择合适的方式进行查询。
2. DISTINCT关键词去重查询
2.1 语法
SELECT DISTINCT column_name(s)
FROM table_name;
DISTINCT关键词用于在查询的时候去除重复的记录,只返回唯一的记录。
在上述语法中,column_name是要去重的列名,table_name是要查询的表名。
2.2 示例
假设我们有一张员工表employees,包含了每个员工的姓名和所在部门,如下所示:
姓名 | 部门 |
---|---|
张三 | 销售部 |
李四 | 人力资源部 |
王五 | 研发部 |
张三 | 销售部 |
赵六 | 财务部 |
王五 | 研发部 |
如果要查询所有员工所在的部门,但是不想出现重复的部门名称,可以使用DISTINCT关键词:
SELECT DISTINCT 部门
FROM employees;
查询结果如下:
部门 |
---|
销售部 |
人力资源部 |
研发部 |
财务部 |
3. GROUP BY关键词去重查询
3.1 语法
SELECT column_name(s)
FROM table_name
GROUP BY column_name(s);
GROUP BY关键词用于在查询的时候按照指定的列对记录进行分组,并且可以对每组记录进行聚合计算。
在上述语法中,column_name是要分组的列名,table_name是要查询的表名。
3.2 示例
继续使用上面的员工表employees,如果想要查询每个部门的员工数量,可以使用GROUP BY关键词:
SELECT 部门, COUNT(*) AS 员工数量
FROM employees
GROUP BY 部门;
查询结果如下:
部门 | 员工数量 |
---|---|
销售部 | 2 |
人力资源部 | 1 |
研发部 | 2 |
财务部 | 1 |
4. HAVING子句去重查询
4.1 语法
SELECT column_name(s)
FROM table_name
GROUP BY column_name(s)
HAVING condition;
HAVING子句用于在分组之后过滤掉不符合条件的记录。
在上述语法中,column_name是要分组的列名,table_name是要查询的表名,condition是筛选条件。
4.2 示例
继续使用上面的员工表employees,如果想要查询每个部门员工数量大于等于2的部门,可以使用GROUP BY关键词和HAVING子句:
SELECT 部门, COUNT(*) AS 员工数量
FROM employees
GROUP BY 部门
HAVING COUNT(*) >= 2;
查询结果如下:
部门 | 员工数量 |
---|---|
销售部 | 2 |
研发部 | 2 |
5. UNION关键词去重查询
5.1 语法
SELECT column_name(s)
FROM table_name1
UNION
SELECT column_name(s)
FROM table_name2;
UNION关键词用于将两个或多个SELECT语句的结果集合并到一起,并且去掉重复的记录。
在上述语法中,column_name是要查询的列名,table_name1和table_name2是要查询的表名。
5.2 示例
假设我们有两张学生表:student_1和student_2,每张表包含了学生的姓名和成绩,如下所示:
表名 | 姓名 | 成绩 |
---|---|---|
student_1 | 张三 | 90 |
student_1 | 李四 | 80 |
student_1 | 王五 | 85 |
student_2 | 张三 | 90 |
student_2 | 赵六 | 75 |
student_2 | 钱七 | 95 |
如果想要查询所有学生的姓名和成绩,可以使用UNION关键词:
SELECT 姓名, 成绩
FROM student_1
UNION
SELECT 姓名, 成绩
FROM student_2;
查询结果如下:
姓名 | 成绩 |
---|---|
张三 | 90 |
李四 | 80 |
王五 | 85 |
赵六 | 75 |
钱七 | 95 |
6. 结论
以上就是常见的SQL去重查询方式,根据实际情况选择合适的方式可以大大提高SQL的执行效率。