日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL的函数以及相关案例与练习

發布時間:2023/12/20 数据库 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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; -- ceil 向上取證; select ceil(1.1); -- 2 select ceil(1.0); -- 1 -- 向下取整 select floor(1.1); -- 1 select floor(1.9); -- 1 -- 取最大值 select greatest(1,2); -- 2 -- 最小值 select least(1,2,3); -- 1

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;-- 求出每個部門薪資排在前三的員工,-分組求topN 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

-- 如果沒有order by 將分組內的數據全部相加 select dname,ename,hiredate,salary, sum(salary) over (partition by dname ) as c1 from employee


實現區間統計,以sum為例子,數據是上面創建的數據:

-- 指定范圍進行相加 -- 起始行: unbounded preceding 到當前的行 current row 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; selectdname,ename,salary,cume_dist() over(order by salary) as rn1,cume_dist() over(partition by dname order by salary) as rn2 from employee; /* 不加partition by 是全部行數: rn1 表示整個工資比當前數小于等于的數所占比例 3/12 = 0.25 (3000) 5/12 = 0.4166666666666667 (4000)有partition by,看本組: rn2表示含義案例: 1 / 6 = 0.16666666666666666 (3000,在研發組中) */

cume_dist()的結果:

percent_rank的介紹:

percent_rank代碼:

selectdname,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; /* rn2: 第一行:(1-1)/ (6-1) = 0 第二行:(1-1)/ (6-1) = 0 第三行:(3-1)/ (6-1) = 0.4 */

percent_rank()結果:

1.6.4 前后函數 LAG和LEAD

selectdname,ename,salary,hiredate,-- 將上一行的,放在當前的后面,如果沒有默認'2000-01-01'lag(hiredate,1,'2000-01-01') over(partition by dname order by hiredate ) as rn1,-- 將上兩行的值,放在當前的后面,如果沒有默認nulllag(hiredate,2) over(partition by dname order by hiredate ) as rn2 from employee;

1.6.5 頭尾函數first_value和last_value


first_value()和last_value()案例:

selectdname,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)案例:

selectdname,ename,salary,hiredate,-- 到目前為止的排第1行的薪資nth_value(salary,1) over(partition by dname order by hiredate ) as first_salary,-- 到目前為止的排第2行的薪資nth_value(salary,2) over(partition by dname order by hiredate ) as second_salary from employee;



ntile案例:

selectdname,ename,salary,hiredate,-- 分成3組ntile(3) over(partition by dname order by hiredate ) as nt from employee; -- 取出每一個部門第一組員工 select * from ( selectdname,ename,salary,hiredate,-- 分成3組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的函数以及相关案例与练习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。