MySQL使用DISTINCT过滤重复数据
在 MySQL 中使用 SELECT 语句执行简单的数据查询时,返回的是所有匹配的记录。如果表中的某些字段没有唯一性约束,那么这些字段就可能存在重复值。为了实现查询不重复的数据,MySQL 提供了 DISTINCT 关键字。
DISTINCT 关键字的主要作用就是对数据表中一个或多个字段重复的数据进行过滤,只返回其中的一条数据给用户。
DISTINCT 关键字的语法格式为:
SELECT DISTINCT <字段名> FROM <表名>;
其中,“字段名”为需要消除重复记录的字段名称,多个字段时用逗号隔开。
使用 DISTINCT 关键字时需要注意以下几点:
-
DISTINCT 关键字只能在 SELECT 语句中使用。
-
在对一个或多个字段去重时,DISTINCT 关键字必须在所有字段的最前面。
-
如果 DISTINCT 关键字后有多个字段,则会对多个字段进行组合去重,也就是说,只有多个字段组合起来完全是一样的情况下才会被去重。
例 1
下面通过一个具体的实例来说明如何实现查询不重复数据。
test 数据库中 student 表的表结构和数据如下所示:
mysql> SELECT * FROM test.student;
+----+----------+------+-------+
| id | name | age | stuno |
+----+----------+------+-------+
| 1 | zhangsan | 18 | 23 |
| 2 | lisi | 19 | 24 |
| 3 | wangwu | 18 | 25 |
| 4 | zhaoliu | 18 | 26 |
| 5 | zhangsan | 18 | 27 |
| 6 | wangwu | 20 | 28 |
+----+----------+------+-------+
6 rows in set (0.00 sec)
结果显示,student 表中存在 6 条记录。
下面对 student 表的 age 字段进行去重,SQL 语句和运行结果如下:
mysql> SELECT DISTINCT age FROM student;
+------+
| age |
+------+
| 18 |
| 19 |
| 20 |
+------+
3 rows in set (0.00 sec)
对 student 表的 name 和 age 字段进行去重,SQL 语句和运行结果如下:
mysql> SELECT DISTINCT name,age FROM student;
+----------+------+
| name | age |
+----------+------+
| zhangsan | 18 |
| lisi | 19 |
| wangwu | 18 |
| zhaoliu | 18 |
| wangwu | 20 |
+----------+------+
5 rows in set (0.00 sec)
对 student 表中的所有字段进行去重,SQL 语句和运行结果如下:
mysql> SELECT DISTINCT * FROM student;
+----+----------+------+-------+
| id | name | age | stuno |
+----+----------+------+-------+
| 1 | zhangsan | 18 | 23 |
| 2 | lisi | 19 | 24 |
| 3 | wangwu | 18 | 25 |
| 4 | zhaoliu | 18 | 26 |
| 5 | zhangsan | 18 | 27 |
| 6 | wangwu | 20 | 28 |
+----+----------+------+-------+
6 rows in set (0.00 sec)
因为 DISTINCT 只能返回它的目标字段,而无法返回其它字段,所以在实际情况中,我们经常使用 DISTINCT 关键字来返回不重复字段的条数。
查询 student 表中对 name 和 age 字段去重之后记录的条数,SQL 语句和运行结果如下:
mysql> SELECT COUNT(DISTINCT name,age) FROM student;
+--------------------------+
| COUNT(DISTINCT name,age) |
+--------------------------+
| 5 |
+--------------------------+
1 row in set (0.01 sec)
结果显示,student 表中对 name 和 age 字段去重之后有 5 条记录。
mysql数据库实战训练
https://edu.csdn.net/course/detail/39021
MySQL AS:设置别名
为了查询方便,
MySQL
提供了 AS 关键字来为表和字段指定别名。本节主要讲解如何为表和字段指定一个别名。
为表指定别名
当表名很长或者执行一些特殊查询的时候,为了方便操作,可以为表指定一个别名,用这个别名代替表原来的名称。
为表指定别名的基本语法格式为:
<表名> [AS] <别名>
其中各子句的含义如下:
-
<表名>
:数据库中存储的数据表的名称。
-
<别名>
:查询时指定的表的新名称。
-
AS
关键字可以省略,省略后需要将表名和别名用空格隔开。
注意:表的别名不能与该数据库的其它表同名。字段的别名不能与该表的其它字段同名。在条件表达式中不能使用字段的别名,否则会出现“ERROR 1054 (42S22): Unknown column”这样的错误提示信息。
例 1
下面为 tb_students_info 表指定别名 stu,SQL 语句和运行结果如下。
mysql> SELECT stu.name,stu.height FROM tb_students_info AS stu;
+--------+--------+
| name | height |
+--------+--------+
| Dany | 160 |
| Green | 158 |
| Henry | 185 |
| Jane | 162 |
| Jim | 175 |
| John | 172 |
| Lily | 165 |
| Susan | 170 |
| Thomas | 178 |
| Tom | 165 |
+--------+--------+
10 rows in set (0.04 sec)
为字段指定别名
在使用 SELECT 语句查询数据时,MySQL 会显示每个 SELECT 后面指定输出的字段。有时为了显示结果更加直观,我们可以为字段指定一个别名。
为字段指定别名的基本语法格式为:
<字段名> [AS] <别名>
其中,各子句的语法含义如下:
-
<字段名>
:为数据表中字段定义的名称。
-
<字段别名>
:字段新的名称。
-
AS
关键字可以省略,省略后需要将字段名和别名用空格隔开。
例 2
查询 tb_students_info 表,为 name 指定别名 student_name,为 age 指定别名 student_age,SQL 语句和运行结果如下。
mysql> SELECT name AS student_name, age AS student_age FROM tb_students_info;
+--------------+-------------+
| student_name | student_age |
+--------------+-------------+
| Dany | 25 |
| Green | 23 |
| Henry | 23 |
| Jane | 22 |
| Jim | 24 |
| John | 21 |
| Lily | 22 |
| Susan | 23 |
| Thomas | 22 |
| Tom | 23 |
+--------------+-------------+
10 rows in set (0.00 sec)
注意:表别名只在执行查询时使用,并不在返回结果中显示。而字段定义别名之后,会返回给客户端显示,显示的字段为字段的别名。
mysql数据库实战训练
https://edu.csdn.net/course/detail/39021