最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mysql刪除重復(fù)記錄并且只保留一條的實現(xiàn)方法

 更新時間:2023年01月04日 08:32:32   作者:jerry-89  
本文主要介紹了mysql刪除重復(fù)記錄并且只保留一條的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

準備的測試表結(jié)構(gòu)及數(shù)據(jù)

插入的數(shù)據(jù)中A,B,E存在重復(fù)數(shù)據(jù),C沒有重復(fù)記錄

CREATE TABLE `tab` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;
 
-- ----------------------------
-- Records of tab
-- ----------------------------
INSERT INTO `tab` VALUES ('1', 'A');
INSERT INTO `tab` VALUES ('2', 'A');
INSERT INTO `tab` VALUES ('3', 'A');
INSERT INTO `tab` VALUES ('4', 'B');
INSERT INTO `tab` VALUES ('5', 'B');
INSERT INTO `tab` VALUES ('6', 'C');
INSERT INTO `tab` VALUES ('7', 'B');
INSERT INTO `tab` VALUES ('8', 'B');
INSERT INTO `tab` VALUES ('9', 'B');
INSERT INTO `tab` VALUES ('10', 'E');
INSERT INTO `tab` VALUES ('11', 'E');
INSERT INTO `tab` VALUES ('12', 'E');

使用HAVING關(guān)鍵字篩選出表中重復(fù)數(shù)據(jù)

SELECT `name`,COUNT(1) FROM TAB GROUP BY `name` HAVING COUNT(1) >1

可以通過分組語句從每種重復(fù)數(shù)據(jù)中都拿出一條標(biāo)識

SELECT `name`,id  FROM TAB GROUP BY `name`  HAVING COUNT(1) >1

刪除重復(fù)記錄并且只保留一條 [留意SQL注釋] 

DELETE from tab where
-- 刪除所有的重復(fù)時間 Begin --
`name` in (
    SELECT * from (SELECT `name`FROM TAB GROUP BY `name`  HAVING COUNT(1) >1) tmp2
)
-- 刪除所有的重復(fù)時間 END --
-- 但一些特定ID的記錄不進行刪除  Begin --
AND
id NOT in(
    select id from (
        SELECT `name`,id  FROM TAB GROUP BY `name` HAVING COUNT(1) >1
    ) tmp1
)
-- 但一些特定ID的記錄不進行刪除  END --

執(zhí)行后最終結(jié)果

方法二

MySql如何刪除所有多余的重復(fù)數(shù)據(jù)

方法一查詢出的所有多余的重復(fù)記錄:

方法二查詢出的所有多余的重復(fù)記錄(與方法一的結(jié)果相同):

方法三查詢出的所有多余的重復(fù)記錄:這里方法三因為用了MAX()方法(也可改用MIN()),查詢結(jié)果記錄的id不太一樣,但也可以被視為重復(fù)多余的數(shù)據(jù),關(guān)鍵是你希望選擇保留哪一條記錄而已。

MySql如何刪除所有多余的重復(fù)數(shù)據(jù) 需要處理的數(shù)據(jù),如:

在這里插入圖片描述

出現(xiàn)重復(fù)的數(shù)據(jù),如:

在這里插入圖片描述

先用SELECT查詢看看結(jié)果:

-- 方法一
SELECT * FROM t_user WHERE user_name IN (
	SELECT user_name FROM t_user GROUP BY user_name HAVING COUNT(1)>1
) 
AND id NOT IN (
	SELECT MIN(id) FROM t_user GROUP BY user_name HAVING COUNT(1)>1
)

方法一查詢出的所有多余的重復(fù)記錄:

在這里插入圖片描述

-- 方法二
SELECT * FROM t_user WHERE id NOT IN (
	SELECT MIN(id) FROM t_user GROUP BY user_name
)

方法二查詢出的所有多余的重復(fù)記錄(與方法一的結(jié)果相同):

在這里插入圖片描述

-- 方法三
SELECT * FROM t_user AS t1 WHERE t1.id <> (
	SELECT MAX(t2.id) FROM t_user AS t2 WHERE t1.user_name=t2.user_name
)

方法三查詢出的所有多余的重復(fù)記錄:

在這里插入圖片描述

這里方法三因為用了MAX()方法(也可改用MIN()),查詢結(jié)果記錄的id不太一樣,但也可以被視為重復(fù)多余的數(shù)據(jù),關(guān)鍵是你希望選擇保留哪一條記錄而已。

下面是對上面的SELECT語句稍作修改并加入了DELETE

-- 方法一(笨方法但容易理解)
DELETE FROM t_user WHERE user_name IN (
	SELECT t1.user_name FROM (
		-- 查詢出所有重復(fù)的user_name
		SELECT user_name FROM t_user GROUP BY user_name HAVING COUNT(1)>1
	) t1
) 
AND id NOT IN (
	SELECT t2.min_id FROM (
		-- 查詢出所有重復(fù)的記錄并各自只取其中一條(MIN(id)或MAX(id)都可以)
		SELECT MIN(id) AS min_id FROM t_user GROUP BY user_name HAVING COUNT(1)>1
	) t2
)
-- 方法二(推薦方法也容易理解)
DELETE FROM t_user WHERE id NOT IN (
	SELECT t.min_id FROM (
		-- 過濾出重復(fù)多余的數(shù)據(jù),比如,如果所有記錄中存在1條記錄是user_name=zhangsan的,那么就取出它;
    	-- 如果所有記錄中存在多條記錄是user_name=lisi的,那么只取其中1條,其他的不查詢出來
		SELECT MIN(id) AS min_id FROM t_user GROUP BY user_name
  ) t
)
-- 方法三(推薦方法但不太容易理解)
DELETE FROM t_user WHERE id IN (
	SELECT t.id FROM (
		-- 1. 關(guān)于所有存在相同user_name的記錄,只查詢出(保留)重復(fù)記錄中的1條,假設(shè)這樣查詢出來的集合為A集合。
		-- 2. 在所有記錄中,只要id不在A集合中的,都把它們查詢出來
		SELECT t1.id FROM t_user AS t1 WHERE t1.id <> (SELECT MAX(t2.id) FROM t_user AS t2 WHERE t1.user_name=t2.user_name)
	) t
)
-- 或
DELETE FROM t_user t1
WHERE t1.id <> (
	SELECT t2.max_id FROM (
		SELECT MAX(t3.id) AS max_id FROM t_user t3 WHERE t1.user_name=t3.user_name
	) t2
)

最后刪除成功之后,顯示數(shù)據(jù)已經(jīng)沒有重復(fù)的了

參考:

如何實現(xiàn) MySQL 中通過SQL語句刪除重復(fù)記錄并且只保留一條記錄

到此這篇關(guān)于mysql刪除重復(fù)記錄并且只保留一條的實現(xiàn)方法的文章就介紹到這了,更多相關(guān)mysql刪除重復(fù)記錄 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL利用profile分析慢sql詳解(group left join效率高于子查詢)

    MySQL利用profile分析慢sql詳解(group left join效率高于子查詢)

    最近因為一個用了子查詢的sql語句查詢很慢,嚴重影響了性能,所以需要進行優(yōu)化,下面這篇文章主要跟大家介紹了關(guān)于MySQL利用profile分析慢sql的相關(guān)資料,文中介紹的非常詳細,需要的朋友們可以參考借鑒,下面來一起看看吧。
    2017-03-03
  • MYSQL定時清除備份數(shù)據(jù)的具體操作

    MYSQL定時清除備份數(shù)據(jù)的具體操作

    這篇文章主要給大家介紹了關(guān)于MYSQL定時清除備份數(shù)據(jù)的具體操作,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用MYSQL具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • MySQL中數(shù)據(jù)導(dǎo)入恢復(fù)的簡單教程

    MySQL中數(shù)據(jù)導(dǎo)入恢復(fù)的簡單教程

    這篇文章主要介紹了MySQL中數(shù)據(jù)導(dǎo)入恢復(fù)的簡單教程,主要用到了LOAD DATA語句,需要的朋友可以參考下
    2015-05-05
  • MYsql庫與表的管理及視圖介紹

    MYsql庫與表的管理及視圖介紹

    這篇文章主要介紹了MYsql庫與表的管理及視圖介紹,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • MySQL Truncate用法詳解

    MySQL Truncate用法詳解

    這篇文章主要介紹了MySQL Truncate用法的相關(guān)資料,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下
    2020-08-08
  • mysql8.0 JSON_CONTAINS的使用說明

    mysql8.0 JSON_CONTAINS的使用說明

    這篇文章主要介紹了mysql8.0 JSON_CONTAINS的使用說明,具有很好的參考價值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 老生常談MYSQL模式匹配 REGEXP和like的用法

    老生常談MYSQL模式匹配 REGEXP和like的用法

    下面小編就為大家?guī)硪黄仙U凪YSQL模式匹配 REGEXP和like的用法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • Windows下MySQL日志基本的查看以及導(dǎo)入導(dǎo)出用法教程

    Windows下MySQL日志基本的查看以及導(dǎo)入導(dǎo)出用法教程

    這篇文章主要介紹了Windows下MySQL日志基本的查看以及導(dǎo)入導(dǎo)出用法教程,需要的朋友可以參考下
    2015-11-11
  • mysql split函數(shù)用逗號分隔的實現(xiàn)

    mysql split函數(shù)用逗號分隔的實現(xiàn)

    這篇文章主要介紹了mysql split函數(shù)用逗號分隔的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 刪除MySQL表中重復(fù)數(shù)據(jù)詳解

    刪除MySQL表中重復(fù)數(shù)據(jù)詳解

    這篇文章主要為大家介紹了刪除MySQL表中重復(fù)數(shù)據(jù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06

最新評論

民和| 商水县| 沧州市| 南皮县| 谷城县| 台江县| 长宁县| 翁源县| 锦屏县| 南和县| 屯门区| 武隆县| 内乡县| 富顺县| 塘沽区| 陆良县| 思茅市| 临夏县| 中阳县| 商水县| 无为县| 湖州市| 浑源县| 九龙城区| 赞皇县| 高平市| 栾城县| 乌什县| 万宁市| 乐昌市| 平定县| 会同县| 郓城县| 长阳| 镇沅| 文昌市| 南开区| 洪湖市| 牙克石市| 大方县| 土默特右旗|