引言
在上一篇中我们介绍了MySQL ALTER命令及序列使用;在开发中,对MySQL重复数据的处理是十分重要的。这一篇我们使用命令行方式来帮助读者掌握MySQL中重复数据的操作。
上一篇链接:【MySQL进阶之路丨第十三篇】一文带你精通MySQL之ALTER命令及序列使用
MySQL重复数据
MySQL 数据表中可能存在重复的记录,有些情况我们允许重复数据的存在并进行处理,有时候我们也需要删除这些重复的数据。
防止重复数据的出现
1.使用主键或唯一约束:在创建表时,为某个列或多个列设置主键或唯一约束。这样,在插入数据时,如果存在重复的值,将会引发错误,从而阻止插入。
2.使用INSERT IGNORE语句:使用INSERT IGNORE语句插入数据时,如果有重复的值出现,在插入时会被忽略,不会引发错误,从而避免重复数据的插入。
过滤重复数据
我们可以使用DISTINCT关键字来查询表中的唯一记录。例如,SELECT DISTINCT * FROM 表名;
将会返回表中的唯一记录,去除了重复数据。
假设我们有一个名为"1—tbl"的表,包含id(主键),title等列。
过滤语句如下:
SELECT DISTINCT title,author FROM 1—tbl;
结果如下所示:
删除重复数据
我们可以先创建一个新表,将旧表中的重复数据删除后复制给新表,再将新表命名为旧表名称。
模板如下:
CREATE TABLE 新表 SELECT 列1,列2 FROM 旧表 GROUP BY (列1, 列2);
DROP TABLE 旧表;
ALTER TABLE 新表 RENAME TO 旧表名;
假设我们有一个名为"1—tbl"的表,包含id(主键),title等列。
现在我们想要删除author列中的重复值,只保留一条记录,语句如下:
CREATE TABLE qiu SELECT author From 1—tbl GROUP BY (author);
DROP TABLE 1—tbl;
ALTER TABLE qiu RENAME TO 1—tbl;
结果如下所示:
统计重复数据
使用GROUP BY子句与聚合函数(如COUNT)可以对表中的重复数据进行统计。例如,SELECT 列名, COUNT(*) FROM 表名 GROUP BY 列名 HAVING COUNT(*) > 1;
可以获取重复出现的数据和出现次数。
假设我们有一个名为"1—tbl"的表,包含id(主键),title等列。
现在我们想要统计author列中重复出现的数据以及其出现次数。
SELECT author, COUNT(*) AS count FROM 1—tbl GROUP BY author HAVING COUNT(*) > 1;
结果如下:
MySQL中SQL注入
SQL注入是一种常见的安全漏洞,它发生在应用程序将用户提供的数据直接拼接到SQL查询中,导致攻击者可以执行恶意的SQL语句。
例如,后端SQL查询语句如下:
SELECT * FROM USERS WHERE ID='输入';
当攻击者输入:
1' or 1=1#
后端语句变为:
SELECT * FROM USERS WHERE ID='1' or 1=1#';
而在MySQL中,#后的内容均会被省略
故语句等价于
SELECT * FROM USERS WHERE ID='1' or 1=1
由于1=1恒成立,且条件用or连接,这导致后端返回所有user表的内容。
要防范此类攻击,需要对用户输入的数据进行转义,如# – / or ’ 等等。
读者可通过以下专栏从攻击者的视角学习MySQL的数据安全防护:
1、【Sqli-Labs靶场攻防实战】
2、【sq注入攻击专栏】
总结
以上为 【MySQL进阶之路丨第十四篇】,带领读者掌握 MySQL 重复数据及SQL注入,通过具体实操实现对MySQL数据库的深度理解。
MySQL系列将持续更新,欢迎订阅收藏。