MySQL - DISTINCT 子句:揭示唯一性的力量
你好,未来的数据库大师们!今天,我们将踏上一段激动人心的旅程,探索MySQL世界,特别是一个非常实用的特性——DISTINCT子句。如果你是编程新手,不用担心——我会成为你的友好向导,我们将一步一步地攻克这个话题。所以,拿起你最喜欢的饮料,让我们一起跳进去吧!

MySQL DISTINCT 子句是什么?
想象你在聚会上,你想知道有多少种不同的饮料被提供。你不会分别计算每一罐可乐,对吧?你会只记下“可乐”一次。这正是MySQL中的DISTINCT子句所做的——它帮助我们识别和检索数据库表中的唯一值。
DISTINCT子句在SELECT语句中使用,以消除结果集中的重复行。它就像夜总会的VIP保镖,只让每个相同客人群体中的代表进入。
让我们来看一个简单的例子:
SELECT DISTINCT column_name
FROM table_name;
这个查询将返回指定列中的所有唯一值。
现实世界的例子
假设我们有一个名为employees的表,其中包含以下数据:
| id | name | department |
|---|---|---|
| 1 | Alice | Sales |
| 2 | Bob | Marketing |
| 3 | Carol | Sales |
| 4 | David | IT |
| 5 | Eve | Marketing |
如果我们想知道公司中所有的不同部门,我们可以使用:
SELECT DISTINCT department
FROM employees;
这将给我们:
| department |
|---|
| Sales |
| Marketing |
| IT |
看看它是如何干净地移除重复项的?这就是DISTINCT的魔力!
DISTINCT 子句与COUNT()函数结合
现在,让我们升级一下,将DISTINCT与另一个有用的函数COUNT()结合起来。这对动态组合允许我们计算列中的唯一值数量。
SELECT COUNT(DISTINCT column_name)
FROM table_name;
使用我们的前一个例子,如果我们想知道我们有多少个不同的部门,我们可以使用:
SELECT COUNT(DISTINCT department)
FROM employees;
这将返回:
| COUNT(DISTINCT department) |
|---|
| 3 |
就像在问,“我们提供多少种冰淇淋口味?”而不是“我们卖了多少份冰淇淋?”
在多个列上使用DISTINCT
这里事情变得非常有趣。DISTINCT可以在一次操作中在多个列上施展其魔法。它将列的组合视为一个单元来识别唯一值。
SELECT DISTINCT column1, column2
FROM table_name;
让我们扩展我们的employees表:
| id | name | department | city |
|---|---|---|---|
| 1 | Alice | Sales | New York |
| 2 | Bob | Marketing | Chicago |
| 3 | Carol | Sales | New York |
| 4 | David | IT | Boston |
| 5 | Eve | Marketing | Chicago |
| 6 | Frank | Sales | Boston |
如果我们想知道所有唯一的部门-城市组合:
SELECT DISTINCT department, city
FROM employees;
这将给我们:
| department | city |
|---|---|
| Sales | New York |
| Marketing | Chicago |
| IT | Boston |
| Sales | Boston |
注意“Sales”出现了两次,因为它在不同的城市。
DISTINCT 与 NULL值
这里有一个有趣的事实:在DISTINCT的世界里,NULL被认为是唯一值。如果你在列中有多个NULL值,DISTINCT只会返回一个NULL。
让我们修改我们的employees表:
| id | name | department | project |
|---|---|---|---|
| 1 | Alice | Sales | Alpha |
| 2 | Bob | Marketing | NULL |
| 3 | Carol | Sales | Beta |
| 4 | David | IT | NULL |
| 5 | Eve | Marketing | Alpha |
如果我们运行:
SELECT DISTINCT project
FROM employees;
我们将得到:
| project |
|---|
| Alpha |
| NULL |
| Beta |
看看只有一个NULL,尽管我们的表中有两个NULL值?
使用客户端程序使用DISTINCT子句
现在,让我们将所有这些知识付诸实践,使用MySQL客户端程序。我将使用MySQL命令行客户端作为示例,但原则适用于任何MySQL客户端。
首先,让我们创建我们的employees表:
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
department VARCHAR(50),
project VARCHAR(50)
);
INSERT INTO employees VALUES
(1, 'Alice', 'Sales', 'Alpha'),
(2, 'Bob', 'Marketing', NULL),
(3, 'Carol', 'Sales', 'Beta'),
(4, 'David', 'IT', NULL),
(5, 'Eve', 'Marketing', 'Alpha');
现在,让我们尝试一些我们学到的查询:
-
获取所有唯一的部门:
SELECT DISTINCT department FROM employees; -
计算唯一项目的数量:
SELECT COUNT(DISTINCT project) FROM employees; -
获取所有唯一的部门-项目组合:
SELECT DISTINCT department, project FROM employees;
在你的MySQL客户端中尝试这些,观看DISTINCT子句施展其魔法!
结论
就这样,伙计们!我们已经穿越了DISTINCT的土地,从基本用法到更高级的应用。记住,DISTINCT就像一个有用的助手,整理你的数据,移除重复项,给你一个更清晰的信息视图。
在你继续MySQL冒险的过程中,你会发现DISTINCT是你数据库工具箱中的忠实工具。它特别适用于处理大型数据集时,需要快速识别唯一值或组合。
继续练习,保持好奇心,在你知道之前,你将以资深数据库专业人士的自信编写复杂的查询。下次见,快乐查询!
Credits: Image by storyset
