MySQL(30)如何使用DISTINCT去除重复记录?

87 阅读2分钟

DISTINCT 关键字用于从查询结果中删除重复的记录。它可以与一个或多个列一起使用,以确保返回的行是唯一的。使用 DISTINCT 可以帮助您获取唯一值的列表,并避免重复数据的影响。

基本语法

SELECT DISTINCT column1, column2, ...
FROM table_name;

示例数据库和表结构

假设我们有一个公司数据库,其中有两个表:employeesdepartments

-- 创建数据库
CREATE DATABASE company;

-- 选择数据库
USE company;

-- 创建表 departments
CREATE TABLE departments (
    dept_id INT AUTO_INCREMENT PRIMARY KEY,
    dept_name VARCHAR(100) NOT NULL
);

-- 创建表 employees
CREATE TABLE employees (
    emp_id INT AUTO_INCREMENT PRIMARY KEY,
    emp_name VARCHAR(100) NOT NULL,
    emp_position VARCHAR(100),
    emp_salary DECIMAL(10, 2),
    hire_date DATE,
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

-- 插入示例数据到 departments 表
INSERT INTO departments (dept_name)
VALUES 
('HR'),
('Engineering'),
('Marketing');

-- 插入示例数据到 employees 表
INSERT INTO employees (emp_name, emp_position, emp_salary, hire_date, dept_id)
VALUES 
('John Doe', 'Manager', 75000.00, '2023-10-01', 1),
('Jane Smith', 'Developer', 60000.00, '2023-09-01', 2),
('Alice Johnson', 'Analyst', 50000.00, '2023-08-01', 1),
('Bob Brown', 'Developer', 70000.00, '2023-07-01', 2),
('Charlie Brown', 'Tester', 55000.00, '2023-11-01', 3),
('Emma White', 'Developer', 60000.00, '2023-08-20', 2);

使用 DISTINCT 的示例

1. 获取所有职位的唯一列表

SELECT DISTINCT emp_position 
FROM employees;

结果:

emp_position
------------
Manager
Developer
Analyst
Tester

2. 获取所有部门的唯一列表

SELECT DISTINCT dept_id 
FROM employees;

结果:

dept_id
-------
1
2
3

3. 获取不同组合的部门和职位

SELECT DISTINCT dept_id, emp_position
FROM employees;

结果:

dept_id | emp_position
--------|--------------
1       | Manager
1       | Analyst
2       | Developer
2       | Tester
3       | Tester

使用 DISTINCT 和 COUNT 结合

4. 计算唯一职位的数量

SELECT COUNT(DISTINCT emp_position) AS unique_positions
FROM employees;

结果:

unique_positions
----------------
4

5. 计算每个部门中唯一职位的数量

SELECT dept_id, COUNT(DISTINCT emp_position) AS unique_positions
FROM employees
GROUP BY dept_id;

结果:

dept_id | unique_positions
--------|------------------
1       | 2
2       | 1
3       | 1

使用 DISTINCT 和 JOIN 结合

6. 获取每个部门中的唯一职位名称和部门名称

SELECT DISTINCT d.dept_name, e.emp_position
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id;

结果:

dept_name   | emp_position
------------|--------------
HR          | Manager
HR          | Analyst
Engineering | Developer
Marketing   | Tester

使用 DISTINCT 和 ORDER BY 结合

7. 获取所有唯一的职位,并按字母顺序排序

SELECT DISTINCT emp_position
FROM employees
ORDER BY emp_position ASC;

结果:

emp_position
------------
Analyst
Developer
Manager
Tester

8. 获取所有唯一的部门,并按部门ID降序排序

SELECT DISTINCT dept_id
FROM employees
ORDER BY dept_id DESC;

结果:

dept_id
-------
3
2
1

小结

通过使用 DISTINCT 关键字,您可以从查询结果中删除重复的记录,从而获取唯一值的列表。DISTINCT 关键字可以与多个列、聚合函数(如 COUNT)以及其他 SQL 子句(如 JOINORDER BY)结合使用,以实现更加复杂的数据查询和分析。上述示例展示了不同情况下如何使用 DISTINCT 关键字,这在数据清洗和去重中非常有用。