我在b站学数据库 (九):函数
上一篇:我在b站學數據庫 (八):多表操作練習
函數分類
聚合函數、數學函數、字符串函數、日期函數、控制流函數、窗口函數
一、聚合函數
1、介紹
聚合函數主要由:count,sum,min,max,avg,這些聚合函數(之前有),不再重復。另外一個函數:group_concat(),該函數用戶實現行的合并
2、格式
group_concat([distinct] 字段名 [order by 排序字段 asc/desc] [separator ‘分隔符’])
說明:
(1)distinct可以排除重復值。
(2)如果需要對結果中的值進行排序,可以使用order by子句。
(3)separator是一個字符串值,默認為逗號。
3、例
(1)數據準備
(2)操作
-- 將所有員工的名字合并成一行 select group_concat(emp_name) from emp; -- 指定分隔符合并 select department,group_concat(emp_name separator ';' ) from emp group by department; -- 指定排序方式和分隔符 select department,group_concat(emp_name order by salary desc separator ';' ) from emp group by department;
二、數學函數
1、abs():返回絕對值
2、ceil():返回大于或等于的最小整數(向上取整)
select ceil(1.1); #2 select ceil(1.0); #13、floor():返回小于或等于的最大整數(向下取整)
select floor(1.1); #1 select floor(1.9); #14、greatest(expr1,expr2…):取列表最大值
select greatest(1,2,3); #35、least(expr1,expr2…):取列表最小值
select least(1,2,3); #16、mod(x,y):返回x除以y以后的余數(取模)
select mod(5,2); #17、pow(x,y):返回x的y次方
select pow(2,3) #88、rand():返回0到1的隨機數
select rand() #0.930999、round(x):返回離x最近的整數(遵循四舍五入)
select round(1.23456) #110、round(x,y):返回指定位數的小數(遵循四舍五入)
select round(1.23456,3) #1.23511、truncate(x,y):返回數值x保留到小數點后y位的值
select truncate(1.23456,3) #1.234注意:與round最大的區別是不會進行四舍五入
三、字符串函數
1、char_length(s):返回字符串s的字符數
2、character——length(s):返回字符串s的字符數
同上
3、concat(s1,s2…sn):字符串s1,s2等多個字符串合并為一個字符串
4、concat_ws(x,s1,s2…sn):同上函數,但是每個字符串之間要加上x,x可以是分隔符
5、field(s,s1,s2…):返回第一個字符串s
在字符串列表(s1,s2…)中的第一次位置
6、ltrim(s):去掉字符串s開始處的空格
select ltrim(' aaaa'); #去除左邊空格 select rtrim(' aaaa '); #去除右邊空格 select trim(' aaaa '); #去除兩邊空格
7、mid(s,n,len):從字符串s的n位置截取長度為len的子字符串,同substring(s,n,len)
select mid("helloworld",2,3); #從第二個字符開始截取,截取長度為3
8、position(s1 in s):從字符串s中獲取s1的開始位置
9、replace(s,s1,s2):將字符串s2代替字符串s中的字符串s1
select replace('helloaaaworld','aaa','bbb');10、reverse(s):將字符串s的順序反過來
select reverse('hello');
11、right(s,n):返回字符串s的后n個字符
12、strcmp(s1,s2):比較字符串s1和s2,如果s1
與s2相等返回0,如果s1>s2返回1,如果s1<s2返回-1。
13、substr(s,start,length):從字符串s的start位置截取長度為length的子字符串
select substr('hello',2,3); # 從第二個字符開始截取,截取三個字符14、substring(s,start,length):從字符串s的start位置截取長度為length的子字符串
同上
15、ucase(s):將字符串轉換為大寫
16、upper(s):將字符串轉換為大寫
17、lcase(s):將字符串s的所有字母變成小寫字母
18、lower(s):將字符串s的所有字母變成小寫字母
四、日期函數
1、unix_timestamp():返回從1970-01-01-00:00:00到當前的毫秒值
2、unix_timestamp(DATE):將指定日期轉換為毫秒值時間
select unix_timestamp('2022-01-01 08:08:08');3、from_unixtime(bigint unixtime[,stringformat]):將毫秒值時間轉為指定格式日期
select from_unixtime(88888888,'%Y-%m-%d %H:%i:%s');4、curdate():返回當前日期
select curdate();`5、current_date():返回當前日期```python select current_date();6、current_time():返回當前時間
select current_time();7、curtime():返回當前時間
select curtime();8、current_timestamp():返回當前日期和時間
select current_timestamp();9、date():從日期或日期時間表達式中提取日期值(年月日)
select date('2022-01-01 08:08:08');10、datediff(d1,d2):計算日期d1到d2之間相隔的天數
select datediff('2022-01-01','2000-08-08');11、timediff(time1,time2):計算時間差值(秒級)
select timediff('08:08:08','06:06:06');12、date_format(d,f):按表達式f的要求顯示日期d
select date_format('2022-1-1 1:1:1','%Y-%m-%d %H:%i:%s');13、str_to_date(string,format_mask):將字符串轉變為日期
select str_to_date('2022-1-1 1:1:1','%Y-%m-%d %H:%i:%s');14、date_sub(date,interval expr type):函數從日期減去指定的時間間隔
select date_sub('2022-01-01',interval 2 day); #將日期進行加法 select date_add('2022-01-01',interval 2 day); #將日期進行加法15、從日期中獲取
select extract(hour from '2021-12-12 08:08:08'); #獲取小時 select extract(year from '2021-12-12 08:08:08'); #獲取年 select extract(month from '2021-12-12 08:08:08'); #獲取月16、獲取指定日期的最后一天
select last_day('2022-01-01');17、獲取指定年份和天數的日期
select makedate('2022',88);18、根據日期獲取信息
select monthname('2020-02-02 08:08:08'); #獲取月份的英文 select dayname(''2020-02-02 08:08:08'') #獲取周幾 select dayofmonth(''2020-02-02 08:08:08'') #獲取當月的第幾天五、控制流函數
1、if(expr,v1,v2):如果表達式expr成立,返回結果v1,否則返回結果v2。
2、ifnull(v1,v2):如果v1的值不為null,則返回v1,否則返回v2。
select ifnull(5,0); #5 select ifnull(null,0); #03、isnull(expression):判斷表達式是否為null。
select isnull(5); #0 select isnull(null); #14、nullif(expr1,expr2):比較兩個字符串,如果字符串expr1與expr2相等,返回null,否則返回expr1。
select nullif(12,12) #null select nullif(12,13) #125、case when語句
格式:
case expression
when condition 1 then result 1
when condition 2 then result 2
…
else result
end
解釋:case表示函數開始,end表示函數結束。如果condition1成立,則返回result1,如果condition2成立則返回result2,當全部不成立,則返回result,而當有一個成立之后,后面的就不執行了。
例:
六、窗口函數(8.0新增)
1、概念
非聚合窗口函數是相對于聚函數來說的。聚合函數是對一組數據計算后返回單個值(即分組),非聚合函數一次只會處理一行數據。窗口聚合函數在行記錄上計算某個字段的結果時,可將窗口范圍內的數據輸入到聚合函數中,并不改變行數。
2、序號函數
(1)序號函數有三個:row_number()、rank()、dense_rank()
(2)格式:
row_number()|rank()|dense_rank() over (
partition by …
order by …
)
(3)例
注意:仔細觀察三個結果的序號,進行區分
3、開窗聚合函數
(1)概念
在窗口中每條記錄動態地應用聚合函數(SUM()、AVG()、MAX()、MIN()、COUNT()),可以動態計算在指定的窗口內的各種聚合函數值。
(2)例(以sum為例)
注意:結果為第一行salary加到當前行
4、分布函數(CUME_DIST)
(1)用途:分組內小于、等于當前rank值的行數 / 分組內總行數
(2)應用場景:查詢小于等于當前薪資(salary)的比例
(3)例
解釋:
rn1 以第一行0.25為例,因為沒有分組,所以在所有數據中小于等于3000的行數除以總行數。即3/12=0.25。
rn2以第一行0.166666666…為例,因為以dname分組的,所以在一組數據中小于等于3000的行數除以總行數。即1/6=0.1666…
5、分布函數(PERCENT_RANK)
(1)用途:每行按照公式(rank-1) / (rows-1)進行計算。其中,rank為RANK()函數產生的序號,rows為當前窗口的記錄總行數
(2)應用場景:不常用
(3)例
解釋:
rn2:
第一行: (1 - 1) / (6 - 1) = 0
第二行: (1 - 1) / (6 - 1) = 0
第三行: (3 - 1) / (6 - 1) = 0.4
6、前后函數(LAG和LEAD)
(1)用途:返回位于當前行的前n行(LAG(expr,n))或后n行(LEAD(expr,n))的expr的值
(2)應用場景:查詢前1名同學的成績和當前同學成績的差值
(3)例
解釋:
last_1_time: 指定了往上第1行的值,default為’2000-01-01’ 。第一行,往上1行為null,因此取默認值 ‘2000-01-01’
last_2_time: 指定了往上第2行的值,為指定默認值
第一行,往上2行為null
解釋:lead同作用lag,只是lead是向下。
7、頭尾函數
(1)用途:返回第一個(FIRST_VALUE(expr))或最后一個(LAST_VALUE(expr))expr的值
(2)應用場景:截止到當前,按照日期排序查詢第1個入職和最后1個入職員工的薪資
(3)例
解釋:
first1:返回截至到當前,按照日期排序查詢第一個入職的員工薪資
last1:返回截至到當前,按照日期排序查詢第一個入職的員工薪資
8、其他函數(nth_value(expr,n))
(1)用途:返回窗口中第n個expr的值。expr可以是表達式,也可以是列名
(2)應用場景:截止到當前薪資,顯示每個員工的薪資中排名第2或者第3的薪資
(3)例
解釋:
返回截至當前,按入職日期排第二和第三的員工薪資
9、其他函數(ntile)
(1)用途:將分區中的有序數據分為n個等級,記錄等級數
(2)應用場景:將每個部門員工按照入職日期分成3組
(3)例
下一篇:我在b站學數據庫 (十):視圖
總結
以上是生活随笔為你收集整理的我在b站学数据库 (九):函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js 时分秒比较大小
- 下一篇: 根据题目完成以下50道SQL语句