mysql數據庫表重複數據(一個表中的重複數據)

  • 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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
E0OHB的頭像E0OHB
上一篇 2024-10-03 23:07
下一篇 2024-10-03 23:07

相關推薦

  • 如何修改mysql的端口號

    本文將介紹如何修改mysql的端口號,方便開發者根據實際需求配置對應端口號。 一、為什麼需要修改mysql端口號 默認情況下,mysql使用的端口號是3306。在某些情況下,我們需…

    編程 2025-04-29
  • Python讀取CSV數據畫散點圖

    本文將從以下方面詳細闡述Python讀取CSV文件並畫出散點圖的方法: 一、CSV文件介紹 CSV(Comma-Separated Values)即逗號分隔值,是一種存儲表格數據的…

    編程 2025-04-29
  • Python 常用數據庫有哪些?

    在Python編程中,數據庫是不可或缺的一部分。隨着互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的數據庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • Python中讀入csv文件數據的方法用法介紹

    csv是一種常見的數據格式,通常用於存儲小型數據集。Python作為一種廣泛流行的編程語言,內置了許多操作csv文件的庫。本文將從多個方面詳細介紹Python讀入csv文件的方法。…

    編程 2025-04-29
  • openeuler安裝數據庫方案

    本文將介紹在openeuler操作系統中安裝數據庫的方案,並提供代碼示例。 一、安裝MariaDB 下面介紹如何在openeuler中安裝MariaDB。 1、更新軟件源 sudo…

    編程 2025-04-29
  • 如何用Python統計列表中各數據的方差和標準差

    本文將從多個方面闡述如何使用Python統計列表中各數據的方差和標準差, 並給出詳細的代碼示例。 一、什麼是方差和標準差 方差是衡量數據變異程度的統計指標,它是每個數據值和該數據值…

    編程 2025-04-29
  • Python多線程讀取數據

    本文將詳細介紹多線程讀取數據在Python中的實現方法以及相關知識點。 一、線程和多線程 線程是操作系統調度的最小單位。單線程程序只有一個線程,按照程序從上到下的順序逐行執行。而多…

    編程 2025-04-29
  • Python爬取公交數據

    本文將從以下幾個方面詳細闡述python爬取公交數據的方法: 一、準備工作 1、安裝相關庫 import requests from bs4 import BeautifulSou…

    編程 2025-04-29
  • Python兩張表數據匹配

    本篇文章將詳細闡述如何使用Python將兩張表格中的數據匹配。以下是具體的解決方法。 一、數據匹配的概念 在生活和工作中,我們常常需要對多組數據進行比對和匹配。在數據量較小的情況下…

    編程 2025-04-29
  • Python數據標準差標準化

    本文將為大家詳細講述Python中的數據標準差標準化,以及涉及到的相關知識。 一、什麼是數據標準差標準化 數據標準差標準化是數據處理中的一種方法,通過對數據進行標準差標準化可以將不…

    編程 2025-04-29

發表回復

登錄後才能評論