生活随笔
收集整理的這篇文章主要介紹了
MySQL的函数以及相关案例与练习
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.MySQL的主要函數
1.1 聚合函數
group_concat()函數的使用
CREATE DATABASE bianbian4
;
USE bianbian4
;
CREATE TABLE emp
( emp_id
INT PRIMARY KEY auto_increment COMMENT '編號' , emp_name
VARCHAR ( 20 ) NOT NULL DEFAULT '' COMMENT '姓名' , salary
DECIMAL ( 10 , 2 ) NOT NULL DEFAULT 0 COMMENT '工資' , department
VARCHAR ( 20 ) NOT NULL DEFAULT '' COMMENT '部門'
) ;
INSERT INTO emp
( emp_name
, salary
, department
)
VALUES ( '張晶晶' , 5000 , '財務部' ) , ( '王飛飛' , 5800 , '財務部' ) , ( '趙剛' , 6200 , '財務部' ) , ( '劉小貝' , 5700 , '人事部' ) , ( '王大鵬' , 6700 , '人事部' ) , ( '張小裴' , 5200 , '人事部' ) , ( '劉云云' , 7500 , '銷售部' ) , ( '劉云鵬' , 7200 , '銷售部' ) , ( '劉云鵬' , 7800 , '銷售部' ) ;
SELECT GROUP_CONCAT
( emp_name
) FROM emp
;
SELECT GROUP_CONCAT
( emp_name SEPARATOR
';' ) FROM emp
;
SELECT department
, GROUP_CONCAT
( emp_name
ORDER BY salary
desc SEPARATOR
';' ) FROM emp
GROUP BY department
;
1.2 數學函數
SELECT abs
( - 10 ) ;
SELECT abs
( 10 ) ;
SELECT abs
( 表達式或者字段)
FROM 表
;
select ceil
( 1.1 ) ;
select ceil
( 1.0 ) ;
select floor
( 1.1 ) ;
select floor
( 1.9 ) ;
select greatest
( 1 , 2 ) ;
select least
( 1 , 2 , 3 ) ;
1.3 字符串函數
1.4 日期函數
1.5 控制流函數
1.5.1 if邏輯判斷語句
判斷狀態時,可以使用IF函數進行判斷:
1.5.2 case when函數
case when 相當于 C語言的switch()語句
1.6 窗口函數
窗口函數分類: 窗口函數語法結構:
1.6.1 序號函數
序號函數:row_number()、rank()、dense_rank(),可以用來實現分組排序,并添加序號。
use bianbian4
;
create table employee
(
dname
varchar ( 20 ) ,
eid
varchar ( 20 ) ,
ename
varchar ( 20 ) ,
hiredate
date ,
salary
double
) ;
insert into
employee
values
( '研發部' , '1001' , '劉備' , '2021-11-01' , 3000 ) ,
( '研發部' , '1002' , '關羽' , '2021-11-02' , 5000 ) ,
( '研發部' , '1003' , '張飛' , '2021-11-03' , 7000 ) ,
( '研發部' , '1004' , '趙云' , '2021-11-04' , 7000 ) ,
( '研發部' , '1005' , '馬超' , '2021-11-05' , 4000 ) ,
( '研發部' , '1006' , '黃忠' , '2021-11-06' , 4000 ) , ( '銷售部' , '1001' , '曹操' , '2021-11-01' , 2000 ) ,
( '銷售部' , '1002' , '許褚' , '2021-11-02' , 3000 ) ,
( '銷售部' , '1003' , '典韋' , '2021-11-03' , 5000 ) ,
( '銷售部' , '1004' , '張遼' , '2021-11-04' , 6000 ) ,
( '銷售部' , '1005' , '徐晃' , '2021-11-05' , 9000 ) ,
( '銷售部' , '1006' , '曹洪' , '2021-11-06' , 6000 ) ;
select dname
, ename
, salary
,
row_number
( ) over ( partition by dname
order by salary
desc ) as row_rank
,
rank
( ) over ( partition by dname
order by salary
desc ) as rk
,
dense_rank
( ) over ( partition by dname
order by salary
desc ) as dense_rk
from employee
;
select *
from
(
select dname
, ename
, salary
,
dense_rank
( ) over ( partition by dname
order by salary
desc ) as dense_rk
from employee
) as t
where t
. dense_rk
<= 3 ;
select dname
, ename
, salary
,
dense_rank
( ) over ( order by salary
desc ) as dense_rk
from employee
row_number():不考慮相不相同,順序的數字不變,1,2,3 rank():考慮相同的情況,跳數字 dense_rank():考慮相同情況, 不跳數字 如下圖:
1.6.2 開窗聚合函數
select dname
, ename
, hiredate
, salary
, sum ( salary
) over ( partition by dname
order by hiredate
) as c1
from employee
select dname
, ename
, hiredate
, salary
, sum ( salary
) over ( partition by dname
) as c1
from employee
實現區間統計,以sum為例子 ,數據是上面創建的數據:
select dname
, ename
, hiredate
, salary
, sum ( salary
) over ( partition by dname
order by hiredate
rows between unbounded preceding and current row ) as c1
from employee
select dname
, ename
, hiredate
, salary
, sum ( salary
) over ( partition by dname
order by hiredate
rows between 3 preceding and current row ) as c1
from employee
select dname
, ename
, hiredate
, salary
, sum ( salary
) over ( partition by dname
order by hiredate
rows between 3 preceding and 1 following ) as c1
from employee
select dname
, ename
, hiredate
, salary
, sum ( salary
) over ( partition by dname
order by hiredate
rows between current row and unbounded following ) as c1
from employee
1.6.3 分布函數
cume_dist()的介紹: 用途:分組內小于、等于當前rank值的行數/分組內總行數 應用場景:查詢小于等于當前薪資的比列 cume_dist()的實例:
use bianbian4
;
select dname
, ename
, salary
, cume_dist
( ) over ( order by salary
) as rn1
, cume_dist
( ) over ( partition by dname
order by salary
) as rn2
from employee
;
cume_dist()的結果: percent_rank的介紹: percent_rank代碼:
select dname
, ename
, salary
, rank
( ) over ( partition by dname
order by salary
desc ) as rn1
, percent_rank
( ) over ( partition by dname
order by salary
desc ) as rn2
from employee
;
percent_rank()結果:
1.6.4 前后函數 LAG和LEAD
select dname
, ename
, salary
, hiredate
, lag
( hiredate
, 1 , '2000-01-01' ) over ( partition by dname
order by hiredate
) as rn1
, lag
( hiredate
, 2 ) over ( partition by dname
order by hiredate
) as rn2
from employee
;
1.6.5 頭尾函數first_value和last_value
first_value()和last_value()案例:
select dname
, ename
, salary
, hiredate
, first_value
( salary
) over ( partition by dname
order by hiredate
) as first_
, last_value
( salary
) over ( partition by dname
order by hiredate
) as last_
from employee
;
1.6.6 其他函數nth_value(expr,n)、ntile(n)
nth_value(expr,n)案例:
select dname
, ename
, salary
, hiredate
, nth_value
( salary
, 1 ) over ( partition by dname
order by hiredate
) as first_salary
, nth_value
( salary
, 2 ) over ( partition by dname
order by hiredate
) as second_salary
from employee
;
ntile案例:
select dname
, ename
, salary
, hiredate
, ntile
( 3 ) over ( partition by dname
order by hiredate
) as nt
from employee
;
select *
from
(
select dname
, ename
, salary
, hiredate
, ntile
( 3 ) over ( partition by dname
order by hiredate
) as nt
from employee
) t
where t
. nt
= 1 ;
參考
https://www.bilibili.com/video/BV1iF411z7Pu?p=99&spm_id_from=pageDriver
總結
以上是生活随笔 為你收集整理的MySQL的函数以及相关案例与练习 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。