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

(一)核心:采用分组的概念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;

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

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

 

 

  • 11
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
SQL查询中,可以使用以下几种方法去除重复数据: 1. DISTINCT关键字:在SELECT语句中使用DISTINCT关键字可以去除重复的行。例如,使用SELECT DISTINCT column_name FROM table_name可以返回指定列的唯一值。这种方法适用于需要查询某列的唯一值的情况。 2. GROUP BY子句:使用GROUP BY子句可以按照指定的列对结果进行分组,并且只返回每个组的一个代表性行。例如,使用SELECT column_name FROM table_name GROUP BY column_name可以返回每个列值的一个代表性行。这种方法适用于需要按照某列进行分组并返回唯一行的情况。 3. 使用聚合函数:在SELECT语句中使用聚合函数,如COUNT、SUM、AVG等,可以对结果进行汇总,并且自动去除重复数据。例如,使用SELECT COUNT(DISTINCT column_name) FROM table_name可以返回某列的唯一值的数量。这种方法适用于需要对某列进行聚合操作并去除重复值的情况。 4. 使用子查询:使用子查询可以将重复数据先查询出来,然后在外层查询中进行过滤。例如,使用SELECT column_name FROM table_name WHERE column_name NOT IN (SELECT column_name FROM table_name WHERE condition)可以排除满足条件的重复数据。这种方法适用于需要根据某个条件排除重复数据的情况。 以上方法可以根据具体的查询需求和数据模型的设计选择使用。根据具体情况选择最适合的去重方法可以提高查询效率并得到准确的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一位远方的诗人

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值