MySQL中去重處理的方法小結(jié)
在MySQL中,去重通常指的是從查詢結(jié)果中刪除重復(fù)的行。這可以通過(guò)多種方式實(shí)現(xiàn),具體取決于你的需求。以下是一些常見(jiàn)的去重方法:
1. DISTINCT 關(guān)鍵字:
如果你只是想簡(jiǎn)單地去重,不關(guān)心分組,那么使用 DISTINCT 可能更合適:
使用 DISTINCT
關(guān)鍵字可以返回唯一不同的值。
SELECT DISTINCT name FROM employees;
這個(gè)查詢會(huì)返回所有不重復(fù)的員工姓名。
SELECT DISTINCT column_name FROM table_name;
2. GROUP BY 子句:
使用 GROUP BY
子句可以對(duì)結(jié)果集進(jìn)行分組,每個(gè)組只返回一條記錄。
SELECT column_name, COUNT(*) FROM table_name GROUP BY column_name;
SELECT department_id, name FROM employees GROUP BY department_id, name;
這個(gè)查詢會(huì)返回每個(gè)部門的唯一員工姓名,但請(qǐng)注意,如果部門中有多個(gè)人同名,他們都會(huì)被列出。
4. 結(jié)合 GROUP BY 和 DISTINCT
如果你想先對(duì)某個(gè)字段進(jìn)行分組,然后在分組內(nèi)去重,你可以這樣做:
SELECT department_id, DISTINCT name FROM employees GROUP BY department_id;
但是,這個(gè)查詢?cè)诖蠖鄶?shù)SQL數(shù)據(jù)庫(kù)中是無(wú)效的,因?yàn)?DISTINCT 應(yīng)該作用于整個(gè) SELECT 列表,而不是單獨(dú)的列。
3. 聚合函數(shù):
使用聚合函數(shù)(如 MIN()
, MAX()
, SUM()
, AVG()
等)也可以實(shí)現(xiàn)去重的效果,因?yàn)榫酆虾瘮?shù)會(huì)對(duì)每個(gè)組返回一個(gè)值。
SELECT MIN(column_name) AS unique_column FROM table_name GROUP BY another_column;
4. 子查詢:
使用子查詢可以創(chuàng)建一個(gè)臨時(shí)表,其中包含唯一的記錄。
SELECT * FROM ( SELECT DISTINCT column_name FROM table_name ) AS subquery;
如果你需要在分組后去重,可以使用子查詢:
SELECT department_id, MIN(name) AS name FROM employees GROUP BY department_id;
這個(gè)查詢會(huì)返回每個(gè)部門的員工姓名,但每個(gè)部門只返回一個(gè)名字(這里使用了 MIN() 函數(shù),實(shí)際上 MIN() 和 MAX() 在這種用途下效果相同,因?yàn)槊质俏谋?,不是?shù)值)。
5. 臨時(shí)表:
創(chuàng)建一個(gè)臨時(shí)表來(lái)存儲(chǔ)去重后的結(jié)果。
CREATE TEMPORARY TABLE temp_table AS SELECT DISTINCT column_name FROM table_name; SELECT * FROM temp_table; DROP TEMPORARY TABLE temp_table;
6. 窗口函數(shù)(MySQL 8.0+):
使用窗口函數(shù) ROW_NUMBER()
, RANK()
, DENSE_RANK()
等可以為每個(gè)組分配一個(gè)唯一的行號(hào)。
SELECT column_name FROM ( SELECT column_name, ROW_NUMBER() OVER (PARTITION BY column_name ORDER BY another_column) AS rn FROM table_name ) AS subquery WHERE rn = 1;
在支持窗口函數(shù)的數(shù)據(jù)庫(kù)中,你可以使用 ROW_NUMBER() 或 RANK() 來(lái)實(shí)現(xiàn)更復(fù)雜的去重邏輯:
SELECT department_id, name FROM ( SELECT department_id, name, ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY name) AS rn FROM employees ) t WHERE t.rn = 1;
這個(gè)查詢會(huì)為每個(gè)部門的員工按名字排序,并為每個(gè)部門的每個(gè)名字分配一個(gè)行號(hào)。外層查詢?nèi)缓筮x擇每個(gè)部門的第一個(gè)名字,從而實(shí)現(xiàn)去重。
7. 使用 GROUP_CONCAT():
如果你想要將重復(fù)的行合并成一個(gè)字符串,可以使用 GROUP_CONCAT()
。
SELECT column_name, GROUP_CONCAT(another_column SEPARATOR ', ') AS concatenated_values FROM table_name GROUP BY column_name;
8.使用 DISTINCT ON(MySQL不支持,但適用于其他數(shù)據(jù)庫(kù)如PostgreSQL):
在MySQL中沒(méi)有 DISTINCT ON
語(yǔ)法,但這是其他數(shù)據(jù)庫(kù)中去重的一種方法。
選擇哪種方法取決于你的具體需求,比如你想要保留哪些列,是否需要考慮排序等。在實(shí)際應(yīng)用中,可能需要結(jié)合使用多種方法來(lái)達(dá)到預(yù)期的效果。
到此這篇關(guān)于MySQL中去重處理的方法小結(jié)的文章就介紹到這了,更多相關(guān)MySQL 去重處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL 創(chuàng)建三張關(guān)系表實(shí)操
這篇文章主要介紹了MySQL 創(chuàng)建三張關(guān)系表實(shí)操,文章說(shuō)先創(chuàng)建學(xué)生表然后科目表和分?jǐn)?shù)表三張有著密切關(guān)系的表,下文實(shí)操分享需要的小伙伴可以參考一下2022-03-03Mysql 存儲(chǔ)過(guò)程中使用游標(biāo)循環(huán)讀取臨時(shí)表
這篇文章主要介紹了Mysql 存儲(chǔ)過(guò)程中使用游標(biāo)循環(huán)讀取臨時(shí)表的方法,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下2020-12-12mysql數(shù)據(jù)庫(kù)重命名語(yǔ)句分享
這篇文章主要介紹了mysql數(shù)據(jù)庫(kù)重命名語(yǔ)句救命示例,語(yǔ)句中的數(shù)據(jù)庫(kù)表前綴換成自己的就可以了,大家參考使用吧2014-01-01完美解決MySQL數(shù)據(jù)庫(kù)服務(wù)器CPU飆升問(wèn)題
這篇文章主要介紹了解決 MySQL 數(shù)據(jù)庫(kù)服務(wù)器 CPU 飆升的方法,包括定位問(wèn)題(如使用工具監(jiān)控、查看慢查詢?nèi)罩荆?、?yōu)化 SQL 查詢、調(diào)整配置參數(shù)、優(yōu)化數(shù)據(jù)庫(kù)架構(gòu)、檢查硬件資源、處理鎖競(jìng)爭(zhēng)問(wèn)題等,還通過(guò)電商業(yè)務(wù)系統(tǒng)的案例進(jìn)行了詳細(xì)分析及給出解決方法,最終優(yōu)化效果顯著2025-02-02MyBatis動(dòng)態(tài)SQL、模糊查詢與結(jié)果映射操作過(guò)程
本篇所講的動(dòng)態(tài)SQL,是mybatis通過(guò)標(biāo)簽元素的形式,?如if,?choose,?when,?otherwise,?trim,?where,?set,?foreach等標(biāo)簽完成對(duì)sql的拼接功能,使用起來(lái)也非常靈活方便,這篇文章主要介紹了MyBatis動(dòng)態(tài)SQL、模糊查詢與結(jié)果映射,需要的朋友可以參考下2023-08-08mysql 5.7.16 安裝配置方法圖文教程(ubuntu 16.04)
這篇文章主要為大家分享了ubuntu 16.04下mysql 5.7.16 安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01