SQL去除重复数据(count函数的用法)

您所在的位置:网站首页 使用sql删除重复数据 SQL去除重复数据(count函数的用法)

SQL去除重复数据(count函数的用法)

2023-10-05 21:57| 来源: 网络整理| 查看: 265

(一)核心:采用分组的概念group by,利用count()函数统计每组的行数,如果行数大于1表示有多条重复数据,如果只有一行,则两个表中没有相同数据匹配,为多余的不同数据,就可以通过设置条件having  count(列)>1,来找出不同以及重复。

其中count(列)如果大于1,则表示该组有多行相同数据;如果count(列)=1,则表示该组只有一行数组,即没有重复数据。

由此可知:在两个表中,如果找不同数据,连接两个表,通过设置条件having  count(列)=1,返回的结果就是不同的数据,意思该组没有重复数据,只有自己一条。

 

(二)在创建数据库和表的时候    IF NOT EXISTS是语句的可选部分,允许您检查正在创建的表是否已存在于数据库中。 如果是这种情况,MySQL将忽略整个语句,不会创建任何新的表。 强烈建议在每个CREATE TABLE语句中使用IF NOT EXISTS来防止创建已存在的新表而产生错误。 其中engine子句中的表指定存储引擎。可以使用任何存储引擎, 如:InnoDB,MyISAM,HEAP,EXAMPLE,CSV,ARCHIVE,MERGE, FEDERATED或NDBCLUSTER。如果不明确声明存储引擎,MySQL将默认使用InnoDB。 表定义格式:CREATETABLE[IFNOTEXISTS] table_name(    列定义语句   )engine=table_type  default charset=utf8;

列语句格式:column_name data_type[size][NOTNULL|NULL][DEFAULTvalue][AUTO_INCREMENT]

 

还有就是在创建表时,要慎重使用drop table if exists 表名;因这个会造成数据丢失,除非你对自己数据库里的有用表都比较清楚。

 

示例:

创建数据库:

CREATE DATABASE IF NOT EXISTS yiibaidb DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

其中collate为校验格式

创建表:

CREATE TABLE `yiibai`.`product` ( `PRODUCT_ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `PRODUCT_CODE` varchar(20) NOT NULL, `PRODUCT_DESC` varchar(255) NOT NULL, PRIMARY KEY (`PRODUCT_ID`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

(三)找两个表的不同数据

要检查数据,我们必须比较两个表,一个在新数据库中,一个在旧数据库中,并标识不匹配的记录。

假设有两个表:t1和t2。使用以下步骤比较两个表,并确定不匹配的记录:

首先,使用UNION语句来组合两个表中的行; 仅包含需要比较的列。返回的结果集用于比较。

SELECT t1.pk, t1.c1 FROM t1 UNION ALL SELECT t2.pk, t2.c1 FROM t2

SQL

第二步,根据需要比较的主键和列分组记录。如果需要比较的列中的值相同,则COUNT(*)返回2,否则COUNT(*)返回1。

请参阅以下查询:

SELECT pk, c1 FROM ( SELECT t1.pk, t1.c1 FROM t1 UNION ALL SELECT t2.pk, t2.c1 FROM t2 ) t GROUP BY pk, c1 HAVING COUNT(*) = 1 ORDER BY pk

SQL

其中条件为having count(*)=1 表示找两个表中不同的数据,如果比较中涉及的列中的值相同,则不返回任何行。

 

(四)找重复数据:

 

SELECT col, COUNT(col) FROM table_name GROUP BY col HAVING COUNT(col) > 1;

(五)删除重复数据

MySQL还允许在DELETE语句中使用INNER JOIN子句来从表中删除和另一个表中的匹配的行记录。

例如,要从符合指定条件的T1和T2表中删除行记录,请使用以下语句:

DELETE T1, T2 FROM T1 INNER JOIN T2 ON T1.key = T2.key WHERE condition

SQL

请注意,将T1和T2表放在DELETE和FROM关键字之间。如果省略T1表,DELETE语句仅删除T2表中的行记录。 同样,如果省略了T2表,DELETE语句将只删除T1表中的行记录。

表达式T1.key = T2.key指定了将被删除的T1和T2表之间的匹配行记录的条件。

WHERE子句中的条件确定T1和T2表中要被删除的行记录。

 

2、可以在DELETE语句中使用LEFT JOIN子句删除表(左表)中没有与其他表(右表)中的匹配的行记录。

DELETE T1 FROM T1 LEFT JOIN T2 ON T1.key = T2.key WHERE T2.key IS NULL;

每个客户都有零个或多个订单。 但是,每个订单都属于唯一的一个客户。

可以使用DELETE语句与LEFT JOIN子句来清理客户数据。 以下声明删除未下订单的客户。

 

3、如果要删除重复的行并保留最低的ID,则可以使用以下语句:

DELETE t1 FROM contacts t1 INNER JOIN contacts t2 WHERE t1.id > t2.id AND t1.email = t2.email;

                                                            知识分享不易,望您支持,只为更好!

知识分享不易,望您支持,只为更好 知识分享不易,望您支持,只为更好

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3