MySQL高級語句深度解析與應用實踐

一、窗口函數:數據分析的利器

1. 窗口函數基礎概念

窗口函數(Window Function)是MySQL 8.0引入的強大特性,它可以在不減少行數的情況下對數據進行聚合計算和分析

SELECT employee_name,department,salary,RANK() OVER (PARTITION BY department ORDER BY salary DESC) as dept_rank
FROM employees;

核心組件:
PARTITION BY:定義窗口分區(類似GROUP BY但不聚合)
ORDER BY:確定窗口內行的排序
frame_clause:定義窗口框架(ROWS/RANGE BETWEEN)

2. 常用窗口函數分類

排名函數

ROW_NUMBER():連續編號(1,2,3…)
RANK():并列排名會跳過后續序號(1,2,2,4…)
DENSE_RANK():并列排名不跳號(1,2,2,3…)

聚合函數

SUM()/AVG()/COUNT()/MIN()/MAX() OVER()

分布函數

PERCENT_RANK():相對排名百分比
CUME_DIST():累積分布值

前后函數

LAG(column, n):訪問前n行數據
LEAD(column, n):訪問后n行數據
FIRST_VALUE()/LAST_VALUE():窗口首尾值

3.高級窗口框架控制

SELECT date,revenue,AVG(revenue) OVER (ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) as moving_avg
FROM sales;

框架類型:
ROWS:物理行偏移
RANGE:邏輯值范圍
GROUPS:MySQL 8.0.2+支持,按組偏移

二、Common Table Expressions (CTE):提升查詢可讀性

基礎CTE語法

WITH department_stats AS (SELECT department,AVG(salary) as avg_salary,COUNT(*) as emp_countFROM employeesGROUP BY department
)
SELECT * FROM department_stats WHERE avg_salary > 5000;

遞歸CTE實現層次查詢

WITH RECURSIVE org_hierarchy AS (-- 基礎查詢(錨成員)SELECT id, name, manager_id, 1 as levelFROM employeesWHERE manager_id IS NULLUNION ALL-- 遞歸查詢(遞歸成員)SELECT e.id, e.name, e.manager_id, h.level + 1FROM employees eJOIN org_hierarchy h ON e.manager_id = h.id
)
SELECT * FROM org_hierarchy;

應用場景:
組織結構圖
產品分類樹
社交網絡關系

CTE優化技巧

MATERIALIZED:強制物化CTE結果
MERGE:將CTE合并到主查詢
限制遞歸深度:SET @@cte_max_recursion_depth = 100;

三、高級JSON處理:應對半結構化數據

JSON創建與修改

-- 創建JSON
SELECT JSON_OBJECT('name', name, 'salary', salary) as emp_json
FROM employees;-- 修改JSON
UPDATE products 
SET attributes = JSON_SET(attributes, '$.color', 'blue')
WHERE id = 1001;

JSON路徑查詢

SELECT product_id,JSON_EXTRACT(attributes, '$.dimensions.width') as width,attributes->>'$.manufacturer' as manufacturer
FROM products
WHERE JSON_CONTAINS(attributes, '"wireless"', '$.features');

JSON聚合函數

SELECT department,JSON_ARRAYAGG(JSON_OBJECT('id', id, 'name', name)) as employees
FROM staff
GROUP BY department;

四、索引優化高級技巧

函數索引(MySQL 8.0+)

-- 創建基于表達式的索引
CREATE INDEX idx_name_lower ON employees ((LOWER(name)));-- 使用時必須完全匹配索引表達式
SELECT * FROM employees WHERE LOWER(name) = 'john';

不可見索引

-- 創建不可見索引(優化器忽略)
CREATE INDEX idx_temp ON orders (customer_id) INVISIBLE;-- 測試后決定是否可見
ALTER TABLE orders ALTER INDEX idx_temp VISIBLE;

降序索引優化

-- 創建降序索引
CREATE INDEX idx_created_desc ON log_entries (created_at DESC);-- 適合ORDER BY ... DESC查詢
SELECT * FROM log_entries ORDER BY created_at DESC LIMIT 100;

五、高級事務處理

保存點(Savepoint)控制

START TRANSACTION;
INSERT INTO orders (...) VALUES (...);
SAVEPOINT order_created;
UPDATE inventory SET quantity = quantity - 1;
-- 發生錯誤時
ROLLBACK TO SAVEPOINT order_created;
COMMIT;

多版本并發控制(MVCC)深度優化

-- 使用特定隔離級別
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;-- 優化長時間事務
SET TRANSACTION READ ONLY;

鎖優化策略

-- 行鎖升級為表鎖(慎用)
LOCK TABLES orders WRITE;-- 使用SKIP LOCKED處理高并發
SELECT * FROM jobs 
WHERE status = 'pending'
ORDER BY priority DESC
LIMIT 1 FOR UPDATE SKIP LOCKED;

六、性能分析高級技術

執行計劃深度解讀

EXPLAIN FORMAT=JSON 
SELECT * FROM orders WHERE customer_id IN (SELECT id FROM customers WHERE region = 'APAC'
);-- 關鍵指標分析
/* 
"cost_info": {"query_cost": "10.25"  -- 總預估成本
},
"table_scan": {"rows_examined_per_scan": 1000,"rows_produced_per_join": 100,"filtered": "10.00"
}
*/

優化器提示(Optimizer Hints)

SELECT /*+ INDEX(orders idx_customer) */ *
FROM orders FORCE INDEX (idx_customer)
WHERE customer_id = 1001;

性能模式(Performance Schema)監控

-- 分析最耗資源的SQL
SELECT * FROM performance_schema.events_statements_summary_by_digest
ORDER BY SUM_TIMER_WAIT DESC LIMIT 10;-- 查看鎖等待
SELECT * FROM performance_schema.events_waits_current
WHERE EVENT_NAME LIKE '%lock%';

七、實戰案例:電商數據分析系統

用戶購買路徑分析

WITH user_journey AS (SELECT user_id,event_time,event_type,LAG(event_type, 1) OVER (PARTITION BY user_id ORDER BY event_time) as prev_event,LEAD(event_type, 1) OVER (PARTITION BY user_id ORDER BY event_time) as next_eventFROM user_eventsWHERE event_date = CURDATE()
)
SELECT prev_event,event_type,next_event,COUNT(*) as transition_count
FROM user_journey
GROUP BY prev_event, event_type, next_event
ORDER BY transition_count DESC;

實時庫存預警

WITH inventory_status AS (SELECT product_id,current_stock,AVG(current_stock) OVER (PARTITION BY category_id) as category_avg,RANK() OVER (PARTITION BY warehouse_id ORDER BY current_stock) as stock_rankFROM inventory
)
SELECT product_id, current_stock
FROM inventory_status
WHERE current_stock < (0.2 * category_avg) ORstock_rank <= 5; -- 每個倉庫庫存最低的5個商品

建議

漸進式優化:先確保SQL正確性,再逐步應用高級優化
測試驗證:所有優化必須通過真實數據驗證
監控迭代:持續監控執行計劃變化
適度使用:避免過度復雜化SQL邏輯
版本特性:充分利用MySQL 8.0+的新特性

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

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

相關文章

【機器學習基礎 4】 Pandas庫

一、Pandas庫簡介 Pandas 是一個開源的 Python 數據分析庫&#xff0c;主要用于數據清洗、處理、探索與分析。其核心數據結構是 Series&#xff08;一維數據&#xff09;和 DataFrame&#xff08;二維表格數據&#xff09;&#xff0c;可以讓我們高效地操作結構化數據。Pandas …

ETCD --- ?租約(Lease)?詳解

一、租約的核心概念 1. ?租約(Lease)? 一個租約是一個有時間限制的“授權”,綁定到鍵值對上。每個租約有一個唯一的ID(64位整數),通過etcdctl或客戶端API創建。創建租約時需指定TTL(Time-To-Live),即租約的有效期(單位:秒)。客戶端需定期向etcd發送續約(KeepAl…

33.[前端開發-JavaScript基礎]Day10-常見事件-鼠標事件-鍵盤事件-定時器-案例

1 window定時器 window定時器方法 setTimeout的使用 setInterval的使用 2 輪播消息提示 案例實戰一 – 輪播消息提示 3 關閉隱藏消息 案例實戰二 – 關閉隱藏消息 4 側邊欄展示 案例實戰三 – 側邊欄展示 5 tab切換實現 案例實戰四 – 登錄框&#xff08;作業&#xff09;…

react ant design樹穿梭框實現搜索并展開到子節點、同級節點選擇及同時選擇數量限制功能

功能點&#xff1a; 點擊節點前的箭頭&#xff0c;可以手動展開或折疊該節點的子節點。在搜索框中輸入關鍵詞&#xff0c;匹配的節點及其父節點會自動展開。清空搜索框后&#xff0c;恢復到用戶手動控制的展開狀態。勾選節點時仍然遵守 "最多勾選 6 個節點" 和 &quo…

阿里云云效 Maven

阿里云云效 Maven 官網&#xff1a;https://developer.aliyun.com/mvn/guide 阿里云Maven中央倉庫為 阿里云云效 提供的公共代理倉庫&#xff0c;幫助研發人員提高研發生產效率&#xff0c;使用阿里云Maven中央倉庫作為下載源&#xff0c;速度更快更穩定。 阿里云云效 是企業…

Go 語言標準庫中Channels,Goroutines詳細功能介紹與示例

在 Go 語言中&#xff0c;Goroutines&#xff08;協程&#xff09;和 Channels&#xff08;通道&#xff09;是并發編程的核心組件。它們共同協作&#xff0c;簡化了并發任務的管理和數據同步。以下通過詳細示例說明它們的用法和常見模式。 1. Goroutines&#xff08;協程&…

如何在 Postman 中正確設置 Session 以維持用戶狀態?

在 Postman 里面設置有 session 的請求。如果你還不知道什么是 session&#xff0c;那么請看這里—— session 是一種記錄客戶端和服務器之間狀態的機制&#xff0c;用于保持用戶的登錄狀態或者其他數據&#xff0c;從而讓用戶在不同頁面之間保持一致的體驗。 Postman 設置帶 …

DQN與PPO在算法層面的核心區別

DQN與PPO在算法層面的核心區別 1. 學習目標不同 DQN(基于價值): 核心:學習動作價值函數 Q ( s , a ) Q(s, a)

Linux: 網絡,arp的數量為什么會對交換機/路由器有性能的影響

這個問題也是非常普遍的問題。比如最近比較火的一個OVS相關的問題: ARP request packets put high pressure on the pinctrl thread in ovn-controller 另一個在工作種也遇到了相似的問題,當一個網絡里發了同時發了小一百個GARP之后,路由器的gateway就會有ARP處理延遲。 A…

解析 HTML 網站架構規范

2025/3/28 向全棧工程師邁進&#xff01; 一、網頁基本的組成部分 網頁的外觀多種多樣&#xff0c;但是除了全屏視頻或游戲&#xff0c;或藝術作品頁面&#xff0c;或只是結構不當的頁面以外&#xff0c;都傾向于使用類似的標準組件。 1.1頁眉 通常橫跨于整個頁面頂部有一…

Golang 當中 byte 和 rune 類型的區別

文章目錄 Golang 當中 byte 和 rune 類型的區別類型定義與用途字符串處理差異內存占用典型引用場景 Golang 當中 byte 和 rune 類型的區別 在 Golang 中&#xff0c;rune 和 byte 類型的區別主要體現在字符處理的方式和編碼支持上。 類型定義與用途 byte 類型 本質是 uint8…

vue將頁面導出成word

方法一&#xff1a;使用 html-docx-js html-docx-js 是一個輕量級的庫&#xff0c;可以將 HTML 轉換為 Word 文檔。 安裝依賴 首先安裝 html-docx-js&#xff1a; Bash深色版本 npm install html-docx-js --save創建導出邏輯 在 Vue 組件中實現導出功能的代碼如下&#xff1…

Three.js 快速入門教程【二十】3D模型加載優化實戰:使用gltf-pipeline與Draco對模型進行壓縮,提高加載速度和流暢性

系列文章目錄 Three.js 快速入門教程【一】開啟你的 3D Web 開發之旅 Three.js 快速入門教程【二】透視投影相機 Three.js 快速入門教程【三】渲染器 Three.js 快速入門教程【四】三維坐標系 Three.js 快速入門教程【五】動畫渲染循環 Three.js 快速入門教程【六】相機控件 Or…

前端框架入門:Angular

Angular 是由 Google 維護的前端框架,適用于構建單頁應用(SPA)。它使用TypeScript 作為主要開發語言,并提供了強大的模塊化、依賴注入(DI)、路由管理等特性。 一、Angular 基礎 1. Angular 介紹 Angular 是一個組件化、模塊化、雙向數據綁定的前端框架,適用于構建復雜…

基于51單片機的速度檢測報警器proteus仿真

地址&#xff1a; https://pan.baidu.com/s/1I7roZEjrk349Is_YdMcsxQ 提取碼&#xff1a;1234 仿真圖&#xff1a; 芯片/模塊的特點&#xff1a; AT89C52/AT89C51簡介&#xff1a; AT89C51 是一款常用的 8 位單片機&#xff0c;由 Atmel 公司&#xff08;現已被 Microchip 收…

具身系列——Diffusion Policy算法實現CartPole游戲

代碼原理分析 1. 核心思想 該代碼實現了一個基于擴散模型&#xff08;Diffusion Model&#xff09;的強化學習策略網絡。擴散模型通過逐步去噪過程生成動作&#xff0c;核心思想是&#xff1a; ? 前向過程&#xff1a;通過T步逐漸將專家動作添加高斯噪聲&#xff0c;最終變成…

DeepSeek 本地化部署教程

1 概述 1.1 配置參考圖 科普&#xff1a; B&#xff0c;Billion&#xff08;十億&#xff09;&#xff0c;是 “參數量” 的單位。 模型量超過 一億&#xff0c;可稱之為 “大模型”。 2 軟件安裝 2.1 下載 Ollama 官方主頁&#xff1a;https://ollama.com/download主頁截圖…

matlab打開兩個工程

1、問題描述 寫代碼時&#xff0c;需要實時參考別人的代碼&#xff0c;需要同時打開2個模型&#xff0c;當模型在同一個工程內時&#xff0c;這是可以直接打開的&#xff0c;如圖所示 2、解決方案 再打開一個MATLAB主窗口 這個時候就可以同時打開多個模型了 3、正確的打開方…

mac 下配置flutter 總是失敗,請參考文章重新配置flutter 環境MacOS Flutter環境配置和安裝

一、安裝和運行Flutter的系統環境要求 想要安裝并運行 Flutter&#xff0c;你的開發環境需要最低滿足以下要求&#xff1a; 操作系統:macOS磁盤空間:2.8 GB(不包括IDE/tools的磁盤空間)。工具:Flutter使用git進行安裝和升級。我們建議安裝Xcode&#xff0c;其中包括git&#x…

第4.1節:使用正則表達式

1 第4.1節&#xff1a;使用正則表達式 將正則表達式用斜杠括起來&#xff0c;就能用作模式。隨后&#xff0c;該正則表達式會與每條輸入記錄的完整文本進行比對。&#xff08;通常情況下&#xff0c;它只需匹配文本的部分內容就能視作匹配成功。&#xff09;例如&#xff0c;以…