(一)核心:采用分组的概念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;
知识分享不易,望您支持,只为更好!