1. 程式人生 > 其它 >MySQL8.0其他新特性

MySQL8.0其他新特性

MySQL8.0其他新特性

MySQL8.0新特性概述

MySQL8.0新增特性

MySQL8.0移除的舊特性

新特性1:視窗函式

視窗函式的分類

MySQL8.0版本開始支援視窗函式,視窗函式的作用類似於在查詢過程中對資料進行分組,不同的是,分組操作會把分組的結果聚合成一條記錄,而視窗函式是將結果置於每一條記錄中

視窗函式分為靜態和動態

  • 靜態視窗函式:視窗大小是固定的,不會因記錄的不同而不同
  • 動態視窗函式:視窗大小會隨著記錄的不同而變化

語法格式

函式 OVER (| PARTITION BY 欄位名 ORDER BY 欄位名 ASC | DESC);

或是

函式 OVER 視窗名 _WINDOW 視窗名 AS (| PARTITION BY 欄位名 ORDER BY 欄位名 ASC | DESC);

舉例說明

序號函式

  1. ROW_NUMBER()函式

能夠對資料的序號進行順序排序,在表中第一行新增一列欄位(從1—n)

#查詢每個商品分類下價格從高到低的商品資訊
SELECT ROW_NUMBER() OVER(PARTITION BY category_id ORDER BY price DESC) AS ROW_NUM,
       #  序號函式           分類                     排序                 新增欄位的別名
要查詢的欄位
from goods;#要查詢的表

#結果:將category_id相同的放在一起,並編號到1—n(每一類重新排序)
  1. RANK()函式
#查詢每個商品分類下價格從高到低的商品資訊
SELECT RANK() OVER(PARTITION BY category_id ORDER BY price DESC) AS ROW_NUM,
要查詢的欄位
from goods;

#結果:將category_id相同的放在一起,並編號到1—n(每一類重新排序)
#但是當價格一樣時,序號會是一樣的,eg:1、2、2、4
  1. DENSE_RANK()函式
#查詢每個商品分類下價格從高到低的商品資訊
SELECT DENSE_RANK() OVER(PARTITION BY category_id ORDER BY price DESC) AS ROW_NUM,
要查詢的欄位
from goods;

#結果:將category_id相同的放在一起,並編號到1—n(每一類重新排序)
#但是當價格一樣時,序號會是一樣的,eg:1、2、2、3

分佈函式

  1. PERCENT_RANK()函式

計算方式:(rank-1) / (rows-1)

#查詢表中category_id = 1的商品類別下的PERCENT_RANK的值
SELECT RANK() OVER w AS r,
PERCENT_RANK() OVER w AS pr,
要查詢的欄位
WHERE category_id = 1 WINDOW w AS (PARTITION BY category_id ORDER BY price DESC) AS pr;

#此題的比率是序號-1 / 總數-1;
  1. CUME_DIST()函式

主要是查詢小於或是等於某個數的值

#查詢goods資料表下小於或是等於當前價格的比例
SELECT CUME_DIST() OVER (PARTITION BY category_id ORDER BY price ASC) AS cd,
要查詢的欄位
FROM goods;

#當前資料小於、等於全部資料的的概率

前後函式

  1. LAG(expr,n)函式(前)
#查詢前一個商品的價格於當前價格的查值

SELECT 基本資訊,price - pre_price AS diff_price
FROM (SELECT 基本資訊,LAG(expr,1) OVER w AS pre_price#子查詢:多出一列是上一行的價格
      FROM goods
      WINDOW w AS (PARTITION BY category_id ORDER BY price ASC))t;    
  1. LEAD(expr,n)函式(後)

和前面的幾乎一樣

首位函式

  1. FIRST_VALUE(expr)函式

FIRST_VALUE(expr)函式返回第一個expr的值

#按照價格排序,查詢第一個商品的價格資訊
SELECT 基本資訊,FIRST_VALUE(price) OVER w AS first_price
FROM goods WINDOW w AS (ARTITION BY category_id ORDER BY price ASC)

#新增加的列是資料是該分類下的第一行價格資料
  1. LAST_VALUE(expr)函式

LAST_VALUE(expr)函式返回最後一個expr的值

其他函式

  1. WTH_VALUE(expr,n)函式

WTH_VALUE(expr,n)返回函式第n個expr的值

  1. NTILE(n)函式

NTILE(n)將每一類平均進行n組

小結

視窗函式可以對資料進行分組、排序,並且不會減少由表中的行數,對統計和排序非常有用

公用表表達式

普通公用表表達式

  • 語法結果
WITH CTE名稱
AS(子查詢)
SELECT | DELETE | UPDATE 語句;
  • 舉個例子
#查詢員工所在部門的詳細資訊
方式一:子查詢實現
SELECT *
FROM departments
WHERE department_id IN (SELECT DISTINCT department_id
                        FROM departments
                       );
方式二:CTE實現
WITH CIE_emp t2
AS (SELECT DISTINCT department_id FROM departments)#我感覺是建立了一個臨時的新表

SELECT *
FROM departments t1 JOIN CIE_emp t2#多表連線了
WHERE t1.department_id = t2.department_id;

遞迴公用表表達式

遞迴;自己呼叫自己

  • 語法格式:
WITH RECURSIVE
CTE名稱 AS(子查詢)
SELECT | DELETE | UPDATE 語句;
  • 舉個例子
#查詢所有的下下屬
WITH PECURSIVE cte 
AS
(
 SELECT 基本資訊,1 AS n FROM employees WHERE id = 100 #初始值
 UNION ALL
 SELECT 基本資訊,n+1 FROM employees AS a JOIN cte 
 ON a.id = cte.id#遞迴呼叫
)
SELECT 基本資訊 
FROM cte 
WHERE n > 3;