SQL SELECT DISTINCT 語句詳解:精準去重的藝術

在數據驅動的時代,數據質量直接影響決策的準確性。面對海量數據時,重復記錄如同沙礫中的金屑,既占用存儲空間,又干擾分析結果。SELECT DISTINCT 語句便是那把高效的篩子,助您快速剔除冗余,提取唯一值。本文將從基礎語法、高級用法、性能優化到實戰案例,全方位解析這一精準去重的藝術。

一、基礎概念與語法解析

1.1 DISTINCT 的核心作用

SELECT DISTINCT 用于從數據庫表中檢索具有唯一值的記錄。其核心邏輯是:

  • 單列去重:對指定列的值進行去重,返回不重復的值列表。
  • 多列組合去重:當指定多個列時,DISTINCT 會將這些列的值視為一個整體進行去重。

1.2 基礎語法結構

SELECT DISTINCT column1, column2, ...
FROM table_name
[WHERE condition]
[ORDER BY column_name(s)]
[LIMIT number];
  • 關鍵參數
    • column1, column2, ...:需要檢索唯一值的列名,多列用逗號分隔。
    • table_name:數據來源的表名。
    • WHERE:可選,用于篩選符合條件的記錄后再去重。
    • ORDER BY:可選,對結果集進行排序。
    • LIMIT:可選,限制返回的行數。

1.3 簡單示例

假設有一個 students 表,包含 id(學生ID)、name(姓名)、age(年齡)和 class(班級)列:

-- 查詢不重復的姓名和年齡組合
SELECT DISTINCT name, age FROM students;-- 查詢年齡大于18歲的不重復姓名
SELECT DISTINCT name FROM students WHERE age > 18;

二、高級用法與創新技巧

2.1 多列組合去重

當需要同時考慮多個列的值是否重復時,DISTINCT 會組合這些列的值進行判斷。

-- 查詢不重復的部門和職位組合
SELECT DISTINCT dept, position FROM employees;

2.2 與聚合函數結合

DISTINCT 可與 COUNTSUM 等聚合函數結合,實現復雜統計。

-- 統計不重復的部門數量
SELECT COUNT(DISTINCT dept) AS unique_departments FROM employees;

2.3 窗口函數中的去重

通過 ROW_NUMBER() 窗口函數,可實現分組內去重,保留每組最新或最符合條件的記錄。

WITH ranked_employees AS (SELECT *,ROW_NUMBER() OVER (PARTITION BY dept, position ORDER BY id DESC) AS rnFROM employees
)
SELECT id, dept, position
FROM ranked_employees
WHERE rn = 1;

2.4 NULL 值處理策略

不同數據庫對 NULL 值的去重邏輯可能不同:

  • 示例:在 MySQL 中,NULL 值被視為相同,多個 NULL 會被去重為一個。
-- 插入包含 NULL 值的測試數據
INSERT INTO employees VALUES (5, NULL, 'Intern'), (6, NULL, 'Intern');-- 查詢職位為 'Intern' 的不重復部門(包含 NULL)
SELECT DISTINCT dept, position FROM employees WHERE position = 'Intern';

三、性能優化策略

3.1 索引優化

  • 覆蓋索引:為 DISTINCT 涉及的列創建覆蓋索引,避免全表掃描。
    CREATE INDEX idx_dept_position ON employees (dept, position);
    

3.2 臨時表分階段處理

對海量數據先使用臨時表存儲中間結果,再執行去重操作。

CREATE TEMPORARY TABLE temp_unique AS
SELECT DISTINCT dept, position FROM employees;-- 后續操作使用臨時表
SELECT * FROM temp_unique;

3.3 LIMIT 限制結果集

結合 LIMIT 減少結果集大小,提升查詢效率。

SELECT DISTINCT user_id FROM logs LIMIT 1000;

3.4 替代方案對比

  • GROUP BY:在需要聚合的場景下,GROUP BY 通常比 DISTINCT 性能更優。
    -- 性能對比實驗(100萬行數據)
    -- DISTINCT 執行時間:0.21秒
    -- GROUP BY 執行時間:0.18秒
    SELECT l_orderkey FROM lineitem WHERE l_shipdate BETWEEN '1998-01-01' AND '1998-12-31' GROUP BY l_orderkey;
    

四、實際應用案例

4.1 電商用戶行為分析

統計獨立訪客數或商品類別分布:

-- 統計不重復的商品類別
SELECT DISTINCT product_category FROM sales;-- 統計獨立訪客數
SELECT COUNT(DISTINCT user_id) FROM user_behavior;

4.2 金融交易監控

識別重復交易記錄,防止欺詐:

-- 查詢重復的交易記錄
SELECT transaction_id, amount, COUNT(*) AS cnt
FROM transactions
GROUP BY transaction_id, amount
HAVING cnt > 1;

4.3 醫療數據清洗

去除用戶表中的重復郵箱或訂單表中的冗余數據:

-- 清洗用戶表中的重復郵箱
SELECT DISTINCT email FROM users;-- 清洗訂單表中的冗余數據
SELECT DISTINCT order_id, product_id FROM orders;

五、常見誤區與最佳實踐

5.1 常見誤區

  • 誤區1DISTINCT 能提升查詢性能。實際上,DISTINCT 需要全表掃描或索引掃描,大數據量時可能導致性能問題。
  • 誤區2DISTINCTGROUP BY 等價。雖然兩者都能去重,但 GROUP BY 可支持聚合操作且性能更優。

5.2 最佳實踐

  • 字段選擇:僅選擇必要字段,避免無意義去重。
  • 排序影響DISTINCT 可能改變默認排序,如需排序需顯式指定 ORDER BY
  • 類型兼容:注意不同數據類型的比較規則,避免隱式轉換導致的去重錯誤。
  • 字符編碼:確保數據庫和連接的字符集一致,避免因編碼問題導致去重失效。

六、總結與展望

SELECT DISTINCT 是 SQL 中精準去重的核心工具,通過合理使用可顯著提升數據質量。在實際應用中,需結合具體場景選擇優化策略,如索引優化、臨時表分階段處理等。隨著大數據和分布式計算的發展,未來 DISTINCT 將進一步集成智能優化技術,如自動索引推薦、并行計算加速等,為數據分析提供更強大的支持。

掌握 SELECT DISTINCT 的藝術,不僅能讓您的 SQL 查詢更高效,還能在數據清洗、分析挖掘等場景中發揮關鍵作用。趕緊實踐起來吧,讓精準去重成為您數據分析的得力助手!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/75907.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/75907.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/75907.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

16-產品經理-需求的評審

在創建需求的時候,有一個"不需要評審"的復選框,如果選中該復選框的話,需求的創建成功后狀態是激活的。 但大部分情況下面,需求還是需要評審的。 即使產品完全由一個人負責,也可以將一些不成熟的想法存為草…

計算機網絡學習前言

前言 該部分說明計算機網絡是什么?它有什么作用和功能?值不值得我們去學習?我們該如何學習?這幾個部分去大概介紹計算機網絡這門課程,往后會介紹計算機網絡的具體知識點。 1.計算機網絡是什么? 計算機網…

python全棧-JavaScript

python全棧-js 文章目錄 js基礎變量與常量JavaScript引入到HTML文件中JavaScript注釋與常見輸出方式 數據類型typeof 顯示數據類型算數運算符之加法運算符運算符之算術運算符運算符之賦值運算符運算符之比較運算符運算符之布爾運算符運算符之位運算符運算符優先級類型轉換 控制…

C語言一個偶數能表示為兩個素數之和

我們可以先找到其中的一個素數,然后用這個偶數減去這個素數就可以求得了。 運行結果:

vue實現大轉盤抽獎

用vue實現一個簡單的大轉盤抽獎案例 大轉盤 一 轉盤布局 <div class"lucky-wheel-content"><div class"lucky-wheel-prize" :style"wheelStyle" :class"isStart ? animated-icon : "transitionend"onWheelTransitionE…

Docker 核心組件

一、前言 Docker 已成為現代 DevOps 和微服務架構中的核心工具。為了更深入地理解它的工作機制&#xff0c;本文將系統介紹 Docker 的核心組件&#xff0c;配合結構圖直觀展示架構&#xff0c;同時拓展高級用法&#xff0c;幫助讀者全面掌握容器化技術的內核。 二、Docker 核心…

ModuleNotFoundError: No module named ‘pandas‘

在使用Python繪制散點圖表的時候&#xff0c;運行程序報錯&#xff0c;如圖&#xff1a; 報錯顯示Python 環境中可能沒有安裝 pandas 庫&#xff0c;執行pip list命令查看&#xff0c;果然沒有安裝pandas 庫&#xff0c;如圖&#xff1a; 執行命令&#xff1a;python -m pip in…

(51單片機)矩陣按鍵密碼鎖表白(C語言代碼編撰)(矩陣按鍵教程)(LCD1602淺教程)

目錄 源代碼 main.c MatrixKey.c MatrixKey.h LCD1602.c LCD1602.h Delay.c Delay.h 運行效果圖&#xff1a; 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a; 第四步&#xff1a; 代碼解析與教程&#xff1a; 延時函數Delay LCD1602 MatrixKey模塊 源代…

檢測手機插入USB后,自動啟動scrcpy的程序

博主寫了一個小工具scrcpyAuto&#xff0c;檢測手機插入電腦USB后&#xff0c;自動啟動scrcpy。 這樣只要程序運行&#xff0c;手機接入主機就會有scrcpy大屏出現&#xff0c;方便了很多。 1、程序會最小化到系統托盤中。 2、博主沒有設計得太復雜&#xff0c;所以程序開機啟動…

使用Scade實現神經網絡算法

在ERTS2022中&#xff0c;ANSYS 發表了使用Scade實現神經網絡AI算法的相關工作。論文題目為《Programming Neural Networks Inference in a Safety-Critical Simulation-based Framework》 背景與挑戰 神經網絡在安全關鍵系統中的應用&#xff1a;隨著嵌入式系統中自主性的引入…

Next.js + SQLite 項目 Docker 生產環境部署方案

以下是完整的 Next.js SQLite 項目 Docker 生產環境部署方案&#xff1a; 1. 項目結構準備 your-project/ ├── prisma/ │ ├── schema.prisma │ └── migrations/ ├── app/ ├── lib/ ├── Dockerfile ├── docker-compose.yml ├── .dockerignore └…

MCU軟件開發使用指針有哪些坑?

目錄 1、空指針訪問 2、野指針&#xff08;未初始化的指針&#xff09; 3、指針越界 4、內存泄漏 5、懸空指針 6、指針類型不匹配 7、多任務環境中的指針訪問 8、對齊問題 在MCU軟件開發中&#xff0c;使用指針雖然可以提高程序的靈活性和性能&#xff0c;但也存在許多…

【SPSS/EXCEl】主成分分析構建__綜合評價指數

學習過程中實驗操作的記錄 1.數據準備和標準化&#xff1a; (1)區分正負相關性:判斷每個因子是正向指標還是負向指標,計算每個的最大值和最小值 (2) 標準化: Min-Max標準化 Min-Max標準化&#xff08;最大最小值法&#xff09;&#xff1a; 將數據映射到指定的區間&#xff…

selenium安裝,以及瀏覽器驅動下載詳細步驟

1.下載谷歌瀏覽器Chromedriver 查看谷歌瀏覽器版本 2.去官網下載Chromedriver 114之前的版本鏈接chromedriver.storage.googleapis.com/index.html 選擇和瀏覽器版本較接近的點擊進行下載 125之后的版本鏈接Chrome for Testing availability (googlechromelabs.github.io)&a…

LabVIEW 油井動液面在線監測系統?

項目背景 傳統油井動液面測量依賴人工現場操作&#xff0c;面臨成本高、效率低、安全風險大等問題。尤其在偏遠地區或復雜工況下&#xff0c;測量準確性與時效性難以保障。本系統通過LabVIEW虛擬儀器技術實現硬件與軟件深度融合&#xff0c;為油田智能化轉型提供實時連續監測解…

C++標準庫 —— round 函數用法詳解

round 是 C/C 標準庫中的一個數學函數&#xff0c;用于對浮點數進行四舍五入取整。以下是它的詳細用法說明&#xff1a; 目錄 1. 基本語法 2. 功能描述 3. 使用示例 示例1&#xff1a;基本用法 示例2&#xff1a;保留小數位 4. 相關函數對比 5. 注意事項 6. 實際應用場景…

嵌入式C語言11(宏/程序的編譯過程)

宏 ? 基本概念 C語言中可以利用宏定義實現文本的快速替換&#xff0c;注意&#xff1a;宏定義是單純的文本替換&#xff0c;不檢查語法是否合法。 C語言標準中提供了很多的預處理指令&#xff0c;比如#include、#pragma…以#開頭的都屬于預處理指令。 預處理指令指的是在…

【湖南大學】2025我們該如何看待DeepSeek

大家好&#xff0c;我是櫻木。 DeepSeek 官方網站&#xff1a;https://www.deepseek.com/ 一、DeepSeek 到底是什么&#xff1f; TA 到底厲害在哪里&#xff1f; 故事從 ChatGPT 說起 去年我們看到 Open AI 發布ChatGPT 后&#xff0c;全球的注意力到了 AI 身上。 我們來拆…

【區塊鏈安全 | 第三十三篇】備忘單

文章目錄 備忘單操作符優先級備忘單ABI 編碼和解碼函數bytes 和 string 的成員Address 的成員區塊與交易屬性校驗和斷言數學和加密函數合約相關類型信息函數可見性說明符修飾符備忘單 操作符優先級備忘單 以下是操作符的優先級順序,按評估順序列出: 優先級描述操作符1后綴遞…

Python----計算機視覺處理(Opencv:道路檢測之車道線顯示)

完整版&#xff1a;Python----計算機視覺處理&#xff08;Opencv:道路檢測完整版&#xff1a;透視變換&#xff0c;提取車道線&#xff0c;車道線擬合&#xff0c;車道線顯示&#xff09; 一、透視變換 將透視變換之后的圖像再繼續透視變換為原圖像 可參考Python----計算機視…