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⼦句中的表指定。可以使⽤任何存储引
擎,如: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][NOT NULL|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。使⽤以下步骤⽐较两个表,并确定不匹配的记录:
⾸先,使⽤来组合两个表中的⾏; 仅包含需要⽐较的列。返回的结果集⽤于⽐较。
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
mysql中delete语句t1.id > t2.id ail = t2.email;
知识分享不易,望您⽀持,只为更好!
知识分享不易,望您⽀持,只为更好

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。