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

数据库:Oracle MySQL 专栏收录该内容
54 篇文章 1 订阅

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

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

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

 

(二)在创建数据库和表的时候

   IF NOT EXISTS是语句的可选部分,允许您检查正在创建的表是否已存在于数据库中。 如果是这种情况,MySQL将忽略整个语句,不会创建任何新的表。 强烈建议在每个CREATE TABLE语句中使用IF NOT EXISTS来防止创建已存在的新表而产生错误。

其中engine子句中的表指定存储引擎。可以使用任何存储引擎, 如:InnoDBMyISAMHEAPEXAMPLECSVARCHIVEMERGE, FEDERATEDNDBCLUSTER。如果不明确声明存储引擎,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;

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

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

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

首先,使用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子句来从表中删除和另一个表中的匹配的行记录。

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


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

SQL

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

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

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

 

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;

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

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

 

 

  • 5
    点赞
  • 2
    评论
  • 17
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 2 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页

打赏作者

一位远方的诗人

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值