- 1、mysql怎麼去除重複數據
- 2、Mysql去掉重複數據的做法:distinct , group by。以及數據庫的拓展
- 3、mysql查詢時如何去除重複數據
- 4、Mysql數據庫中多條重複數據,如何只刪除一條?
- 5、mysql怎麼刪除表中的重複的數據
- 6、mysql連表查詢出現重複的數據怎麼辦
MySQL 刪除重複數據
有些 MySQL 數據表中可能存在重複的記錄,有些情況我們允許重複數據的存在,但有時候我們也需要刪除這些重複的數據。
本章節我們將為大家介紹如何防止數據表出現重複數據及如何刪除數據表中的重複數據。
刪除重複數據
如果你想刪除數據表中的重複數據,你可以使用以下的SQL語句:
from 樹懶學堂 – 一站式數據知識平台
當然你也可以在數據表中添加 INDEX(索引) 和 PRIMAY KEY(主鍵)這種簡單的方法來刪除表中的重複記錄。方法如下:
一張user表 中的name字段,裡面有10個張三。我要只查詢出一個張三。
SQL: select distinct name from user
如果還要查詢出id
SQL: select distinct name,id from user
SQL :select name from user group by name
group by理解:表裡的某一個字段(比如:name) 當出現相同的數據時,group by就將這2條數據合二為一。name就顯示一條 數據了。 但是name達到合二為一了,這2條數據的其他數據怎麼辦呢? 這時候需要配合聚合函數的使用。
where條件:分組前的條件,配合任何關鍵字使用
Having 條件:分組後的條件 (事後條件) ,只配合group by使用。having條件通常使用聚合函數
SQL :select deptno,sum(sal) from emp group by deptno having sum(sal) 9000;
SQL: select deptno,count(*) from emp where sal 1000 group by deptno haing sum(sal) 8000
拓展:
聚合函數定義:聚合函數對一組值進行計算並返回單一的值。(以下都屬於聚合函數)
count(*) : 不包括空值。返回對行數目的計數。計算出有多少行,多少條數據。
count() : 包含空值。返回對數目的計數。計算表裡有多少行,相當於多少條數據。
sum() : 求和運算
max(); 最大值
min(): 最小值
avg(): 平均值
MySQL 過濾重複數據
有些 MySQL 數據表中可能存在重複的記錄,有些情況我們允許重複數據的存在,但有時候我們也需要刪除這些重複的數據。
如果你需要讀取不重複的數據可以在 SELECT 語句中使用 DISTINCT 關鍵字來過濾重複數據。
from 樹懶學堂- 一站式數據知識學習平台
你也可以使用 GROUP BY 來讀取數據表中不重複的數據:
這個需要分情況。
1,你的數據庫表中有主鍵,且主鍵上面的數據為唯一值。也就是沒有重複值。
那麼你在刪除的時候,將這個唯一值作為條件進行刪除。
如:
delete
from
[表名]
where
id=1
2.所有的數據相同,那麼你只能打開數據表,手工選定其中某一條,進行刪除。
通常情況下,一個我們在做一個產品的時候,一開始可能由於設計考慮不周或者程序寫的不夠嚴謹,某個字段上的值產生重複了,但是又必須去掉,這個時候就稍微麻煩了一點,直接加一個 UNIQUE KEY 肯定是不行了,因為會報錯。
現在,我們來採用一種變通的辦法,不過可能會丟失一些數據 :)
在這裡,我們設定一個表,其結構如下:
mysql desc `user`;
+——-+——————+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+——-+——————+——+—–+———+—————-+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | char(10) | NO | | | |
| extra | char(10) | NO | | | |
+——-+——————+——+—–+———+—————-+
原來表中的數據假定有以下幾條:
mysql SELECT * FROM `user`;
+—-+——-+——–+
| id | name | extra |
+—-+——-+——–+
| 1 | user1 | user1 |
| 2 | user2 | user2 |
| 3 | user3 | user3 |
| 4 | user4 | user4 |
| 5 | user5 | user5 |
| 6 | user3 | user6 |
| 7 | user6 | user7 |
| 8 | user2 | user8 |
| 9 | USER2 | user9 |
| 10 | USER6 | user10 |
+—-+——-+——–+
1、將原來的數據導出
mysqlSELECT * INTO OUTFILE ‘/tmp/user.txt’ FROM `user`;
2、清空數據表
mysqlTRUNCATE TABLE `user`;
3、創建唯一索引,並且修改 `name` 字段的類型為 BINARY CHAR 區分大小寫
mysql ALTER TABLE `user` MODIFY `name` CHAR(10) BINARY NOT NULL DEFAULT ”;
mysql ALTER TABLE `user` ADD UNIQUE KEY ( `name` );
現在來看看新的表結構:
mysql desc user;
+——-+——————+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+——-+——————+——+—–+———+—————-+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | char(10) | NO | UNI | | |
| extra | char(10) | NO | | | |
+——-+——————+——+—–+———+—————-+
4、把數據導回去,在這裡,有兩種選擇:新的重複記錄替換舊的記錄,只保留最新的記錄 或者是 新的記錄略過,只保留最舊的記錄
mysql LOAD DATA INFILE ‘/tmp/user.txt’ REPLACE INTO TABLE `user`;
Query OK, 10 rows affected (0.00 sec)
Records: 8 Deleted: 2 Skipped: 0 Warnings: 0
mysql SELECT * FROM USER;
+—-+——-+——–+
| id | name | extra |
+—-+——-+——–+
| 1 | user1 | user1 |
| 8 | user2 | user8 |
| 6 | user3 | user6 |
| 4 | user4 | user4 |
| 5 | user5 | user5 |
| 7 | user6 | user7 |
| 9 | USER2 | user9 |
| 10 | USER6 | user10 |
+—-+——-+——–+
上面是採用 REPLACE 的方式,可以看到,導入過程中刪掉了兩條數據,結果驗證確實是 新的重複記錄替換舊的記錄,只保留最新的記錄。
現在,來看看用 IGNORE 的方式:
mysql LOAD DATA INFILE ‘/tmp/user.txt’ IGNORE INTO TABLE `user`;
Query OK, 6 rows affected (0.01 sec)
Records: 8 Deleted: 0 Skipped: 2 Warnings: 0
mysql SELECT * FROM USER;
+—-+——-+——–+
| id | name | extra |
+—-+——-+——–+
| 1 | user1 | user1 |
| 2 | user2 | user2 |
| 3 | user3 | user3 |
| 4 | user4 | user4 |
| 5 | user5 | user5 |
| 7 | user6 | user7 |
| 9 | USER2 | user9 |
| 10 | USER6 | user10 |
+—-+——-+——–+
看到了吧,確實是 新的記錄略過,只保留最舊的記錄。
重複來自關聯 條件了。 如果你用 A left join B on A.t1=B.t2 在B表中t2 有多條,那麼你的結果 就會 變成多條了
和你 用 form A,B where A.t1=B.t2 是一樣的道理
如A t1 字段
1 2 3 4
B t2 字段
1 ,1,2,2,3
你如果全連接 A.t1=B.t2 就是 A.t1 只要和 B.t2 字段相等,滿足這個條件的就連接了。
所以重複了就說明你的連接條件 下 有字段 不是唯一的值
原創文章,作者:E0OHB,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/126353.html