在MySQL数据库表中数据有时候会有重复数据那怎么呢?本文章讲解如何防止重复出现,查询重复数据和过滤重复数据及删除重复数据。
防止表出现重复数据,设置主键或者唯一索引
1.设置字段为主键
将d表的id设置为主键,MySQL的表主键值是能重复的,这样就可以防止出现重复数据
ALTER TABLE `d` ADD PRIMARY KEY (`id`);
2.设置字段为唯一索引
唯一索引的值是不能重复的
ALTER TABLE `d` ADD UNIQUE INDEX `id` (`id`) ;
在MySQL数据库中,DISTINCT关键字用于从结果集中选择唯一不同的值。它用于查询指定列中的唯一记录,以消除结果集中的重复行。
使用 DISTINCT 关键字时需要注意以下几点:
DISTINCT 关键字只能在 SELECT 语句中使用。
在对一个或多个字段去重时,DISTINCT 关键字必须在所有字段的最前面。
如果 DISTINCT 关键字后有多个字段,则会对多个字段进行组合去重,也就是说,只有多个字段组合起来完全是一样的情况下才会被去重。
过滤重复数据在选择数据库和表后可在sql选项卡输入语句后执行,将不回出现有id重复的数据
一、DISTINCT语句语法
DISTINCT关键字可以与SELECT语句一起使用,用于选择指定列中的唯一值。语法如下:
SELECT {DISTINCT <列名1>,...<列名n>}[<列名1>,...<列名n>] FROM <表名>;
语法说明:[ ]中的内容是可选的,<>是中文解释。
二、DISTINCT语句案例
下面是一些使用DISTINCT语句的案例。test 数据库中 student 表的表结构和数据,列分别是学生id、学生姓名、学生年龄、学生学号。
+----+----------+------+-------+ | 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 | +----+----------+------+-------+
三、案例:查询唯一年龄
对 student 表的 age 字段进行去重
mysql> SELECT DISTINCT age FROM student; +------+ | age | +------+ | 18 | | 19 | | 20 | +------+ 3 rows in set (0.00 sec)
查询表中product_category重复的数据
查询语句使用了COUNT函数、GROUP BY语句和HAVING语句对重复数据进行查询,意思是priduct_category字段数据重复大于1的显示出来
SELECT product_category, COUNT(*) as order_count FROM orders GROUP BY product_category HAVING order_count > 1;
通过GRUOP BY语句去除重复数据使用ANY_VALUE函数显示其他字段,再通过查询数据新建表,删除原来的表,把新建的表名改为原来的表名。
mysql>CREATE TABLE tmp SELECT ANY_VALUE(order_id),ANY_VALUE(customer_id),product_category,ANY_VALUE(total_amount) -> from orders GROUP BY product_category; mysql>DROP TABLE orders; mysql>ALTER TABLE tmp RENAME TO orders;
如果是mysql 5.7.5版本,默认的sql配置是:sql_mode=“ONLY_FULL_GROUP_BY”,这个配置严格执行了"SQL92标准"。由于开启了ONLY_FULL_GROUP_BY的设置,如果select 的字段不在 group by 中,并且select 的字段未使用聚合函数(SUM,AVG,MAX,MIN等)的话,那么这条sql查询是被mysql认为非法的,会报错误。可以用ANY_VALUE函数解决。 |