本文目錄一覽:
- 1、怎麼刪除重複的Mysql數據?
- 2、mysql刪除重複數據,保留一條
- 3、mysql資料庫中怎麼刪除重複的數據
- 4、mysql中去重 用group by優化distinct 用法
- 5、MySql操作「數據查詢」-20211222
怎麼刪除重複的Mysql數據?
MYSQL里有五百萬數據,但大多是重複的,真實的就180萬,於是想怎樣把這些重複的數據搞出來,在網上找了一圈,好多是用NOT IN這樣的代碼,這樣效率很低,自己琢磨組合了一下,找到一個高效的處理方式,用這個方式,五百萬數據,十來分鐘就全部去除重複了,請各位參考。
第一步:從500萬數據表data_content_152里提取出不重複的欄位SFZHM對應的ID欄位到TMP3表
1 create table tmp3 as select min(id) as col1 from data_content_152 group by SFZHM;
第二步:創建新表RES
1234 CREATE TABLE `res` (`id` int(11),`sfz` char(20)) ENGINE=MyISAM;
第三步:把TMP3表ID對應到data_content_152里需要提取的數據添加到RES表的SFZ欄位
1 INSERT INTO res (sfz) SELECT sfzhm FROM data_content_152,tmp3 where data_content_152.id=tmp3.col1
至此,就在MYSQL里實現了,給數據表data_content_152完全刪除重複數據,把去重複後的數據導入到RES表。
mysql刪除重複數據,保留一條
mysql數據表中有多條重複數據記錄,現在想刪除刪除部分重複數據,保留最後一條更新或者插入的數據。
以學生表為例,我們創建一個簡單的數據表來做實驗:
往表裡面插入一些實驗數據:
我們可以根據分組查詢先將重複數據查詢出來,同時也可以獲取到最後的更新時間,然後再與原表聯表查詢小於最大時間的數據,將查詢出來的數據刪除。
——先來慢慢消化——-
在做刪除前,我們可以先看看有哪些數據是有重複的:
可以看到張三,李四,王五的數據是有重複的,趙六沒有重複,下面我們查找最後更新的記錄。
可以看到,最後更新的數據為15:57:46的記錄沒有在結果中。
可以看到重複記錄已經被清理掉。
假如有兩行記錄是完全一樣的,這個方法就不可行了,往表裡面在跑一次數據插入:
執行刪除計劃:
創建一個臨時表存放最後插入的一條數據(包含重複與沒有重複的),然後清空原表,再將臨時表的數據複製到原表中,最後把臨時表刪除。
這個很好理解,相當於ctrl+c,ctrl+v的操作,數據表如下:
這樣數據去重就完成了,需要注意的是, 如果表數據量很大,注意在group by 裡面的欄位建立索引,同時,生產環境注意好先進行數據備份操作 。
mysql資料庫中怎麼刪除重複的數據
不建議直接刪除,養成良好的習慣(刪除更麻煩),以下是將去重後的數據轉移到另一張表代碼:
Insert into 表名(列名)select distinct 列名 from 表名
你可以按照去重的思路,刪除重複數據
mysql中去重 用group by優化distinct 用法
在使用 MySQL 時,有時需要查詢出某個欄位不重複的記錄,這時可以使用mysql提供的distinct這個關鍵字來過濾重複的記錄,但是實際中我們往往用distinct來返回不重複欄位的條數(count(distinct id)),其原因是distinct只能返回他的目標欄位,而無法返回其他欄位,例如有如下表user:
用distinct來返回不重複的用戶名:select distinct name from user;,結果為:
這樣只把不重複的用戶名查詢出來了,但是用戶的id,並沒有被查詢出來:select distinct name,id from user;,這樣的結果為:
distinct name,id 這樣的mysql 會認為要過濾掉name和id兩個欄位都重複的記錄,如果sql這樣寫:select id,distinct name from user,這樣mysql會報錯,因為distinct必須放在要查詢欄位的開頭。
所以一般distinct用來查詢不重複記錄的條數。
如果要查詢不重複的記錄,有時候可以用group by :
select id,name from user group by name;
MySql操作「數據查詢」-20211222
# SELECT 數據查詢
## 基礎
顯示如何使用簡單的`select`語句查詢單個表中的數據 使用`SELECT`語句從表或視圖獲取數據。
表由行和列組成,如電子表格。 通常,我們只希望看到子集行,列的子集或兩者的組合。
SELECT語句的結果稱為結果集,它是行列表,每行由相同數量的列組成。
select 語法
SELECT語句由以下列表中所述的幾個子句組成:
1. SELECT 之後是逗號分隔列或星號(*)的列表,表示要返回所有列。
2. FROM 指定要查詢數據的表或視圖。
3. JOIN 根據某些連接條件從其他表中獲取數據。
4. WHER E過濾結果集中的行。
5. GROUP BY將一組行組合成小分組,並對每個小分組應用聚合函數。
6. HAVING 過濾器基於GROUP BY子句定義的小分組。
7. ORDER BY 指定用於排序的列的列表。
8. LIMIT 限制返回行的數量。
語句中的`SELECT`和`FROM`語句是必須的,其他部分是可選的。
`SELECT`語句允許通過在`SELECT`子句中指定逗號分隔列的列表來查詢表的部分數據
建議顯式獲取數據的列,原因如下:
1. 使用星號(*)可能會返回不使用的列的數據。 它在MySQL資料庫伺服器和應用程序之間產生不必要的I/O磁碟和網路流量。
2. 如果明確指定列,則結果集更可預測並且更易於管理。 想像一下,當您使用星號(*)並且有人通過添加更多列來更改表格數據時,將會得到一個與預期不同的結果集。
3. 使用星號(*)可能會將敏感信息暴露給未經授權的用戶
格式 `select 列篩選 form table where 行篩選`
還有一些有用的運算符可以在WHERE子句中使用來形成複雜的條件,例如:
BETWEEN 選擇在給定範圍之內的值。
LIKE 匹配基於模式匹配的值。
IN 指定值是否匹配列表中的任何值。
IS NULL 檢查該值是否為NULL。
## SELECT 子查詢
在一個查詢過程中 嵌套另一個查詢,子查詢的結果作為外部查詢的條件或者數據範圍來使用。
分為 3 類:
1. where 型
– `select展示列名 from 表名 where 列名 運算符[in…] (select 對應列名 from …)`
– 這個列名 和 對應列名 應該做到類型相同
– 如果不加入運算符 也可使用IN 這些類似的符號 – `select 展示列名 from 表名 where 列名 in (select 對應列名 from …)`
– ex:
`select 展示列名 from 表名 where 列名 ALL(select 對應列名 from ….)`;
比子查詢的值都大
`select 展示列名 from 表名 where 列名 ANY(select 對應列名 from ….);`
比子查詢的任意一個值大
2. from 型
– `select 展示列名 from 表名 inner join (select 列名 from …) 臨時表名 on 條件;`
– 其中,select的子查詢所得的表 為臨時表,後跟臨時表名,可在條件判斷中指代
3. exist 型
– `select 展示列 from 表名 where exists (select 列名 from 表名 where 條件);`
– 將主查詢的結果帶入子查詢進行條件判斷和匹配,如果查詢出結果即保留。
## 去重 DISTINCT
SELECT 語句執行簡單的數據查詢時,返回的是所有匹配的記錄。`distinct` 實現查詢不重複的數據
**DISTINCT 關鍵字的主要作用就是對數據表中一個或多個欄位重複的數據進行過濾,只返回其中的一條數據給用戶。**
使用 `DISTINCT` 關鍵字時需要注意以下幾點:
– `DISTINCT` 關鍵字只能在 `SELECT` 語句中使用。
– 在對一個或多個欄位去重時,`DISTINCT` 關鍵字必須在所有欄位的最前面。
– 如果 `DISTINCT` 關鍵字後有多個欄位,則會對多個欄位進行組合去重,也就是說,只有多個欄位組合起來完全是一樣的情況下才會被去重。
## 指定別名 AS
### 1. 為表指定別名
1. 當表名很長的時候 或者 執行了一些特殊的查詢的時候,為方便操作,可以為表指定一個別名,用以替代原來的名稱
2. 語法.
3. `表名 as 別名` – 含義: – `表名` : 資料庫中存儲的數據表名稱。
– `別名` : 查詢的時候指定的新的名稱。
– `as` : 此關鍵字 可以 省略,省略之後要將 `表名`與`別名`用 `空格` 分開
** *注意:表的別名不能與該資料庫的其它表同名。欄位的別名不能與該表的其它欄位同名。在條件表達式中不能使用欄位的別名,否則會出現「ERROR 1054 (42S22): Unknown column」這樣的錯誤提示信息。* **
*** ex1:
***
### 2. 為欄位指定別名
1. 在使用 SELECT 語句查詢數據時,MySQL 會顯示每個 SELECT 後面指定輸出的欄位。有時為了顯示結果更加直觀,我們可以為欄位指定一個別名。
2. 語法:
3. `欄位名 [AS] 別名`
– 含義:
– `欄位名`:為數據表中欄位定義的名稱。
– `欄位別名`:欄位新的名稱。
– `AS` 關鍵字可以省略,省略後需要將欄位名和別名用空格隔開
** *注意:表別名只在執行查詢時使用,並不在返回結果中顯示。而欄位定義別名之後,會返回給客戶端顯示,顯示的欄位為欄位的別名* ** ***
ex2:
***
## 限制查詢條數 LIMIT
1. LIMIT 關鍵字有 3 種使用方式,即
– `指定初始位置`、
– `不指定初始位置`
– `OFFSET 組合`使用
(。。。。。 我之前一直不知道, 只會使用 `limit 200`。。。。。)
### 指定初始位置
1. 語法
– `LIMIT 初始位置,記錄數`
– 初始位置」表示從哪條記錄開始顯示;第一條記錄的位置是 0,第二條記錄的位置是 1。後面的記錄依次類推。
– 「記錄數」表示顯示記錄的條數。
– *LIMIT 後的兩個參數必須都是正整數。
* ex:tb_students_info 表中,使用 LIMIT 子句返回從第 4 條記錄開始的行數為 5 的記錄,SQL 語句和運行結果如下。
### 不指定初始位置
記錄從第一條記錄開始顯示。顯示記錄的條數由 LIMIT 關鍵字指定。
1. 語法
– `LIMIT 5`
– `SELECT * FROM tb_students_info LIMIT 15;`
### LIMIT 和 OFFSET 組合使用
1. 語法
– `LIMIT 記錄數 OFFSET 初始位置`
– 參數和 LIMIT 語法中參數含義相同,「初始位置」指定從哪條記錄開始顯示;「記錄數」表示顯示記錄的條數。
該語句返回的是從第 4 條記錄開始的之後的 5 條記錄。即「 LIMIT 5 OFFSET 3 」意思是獲取從第 4 條記錄開始的後面的 5 條記錄,和「 LIMIT 3 , 5 」返回的結果相同。
*** 2021-12-22 今天先學到這裡 明天繼續 MySql 的查詢 學習
原創文章,作者:TAVYO,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/330996.html