MySQL之函数学习

MySQL之常用函数学习

1. 聚合函数

函数 用法
AVG() 取平均值
Sum() 求和
Max() 取最大值
Min() 取最小值
COUNT() 统计数量

注:1. count(*)或count(常量值):都是统计实际的行数。

​ 2. count(字段/表达式):只统计“字段/表达式”部分非NULL值的行数。

2. 数值函数

函数 用法 举例
ABS(x) 绝对值 SELECT ABS(-5):5
CEIL(x) 向上取整 SELECT CEIL(4.5):5
FLOOR(x) 向下取整 SELECT FLOOR(4.5):4
MOD(x,y) 取模 SELECT MOD(4,3):1
RAND() 0-1的随机值 SELECT RAND():0.2985220619463567
ROUND(x,y) x四舍五入后保留y位小数 SELECT ROUND(45.9547):46
TRUNCATE(x,y) x截取y位小数 SELECT TRUNCATE(45.9547,1):45.9
SQRT(x) x的平方根 SELECT SQRT(3):1.732…
POW(x,y) x的y次方 SELECT POW(2,3):8
RAND()*(MAX-MIN)+MIN 生成一个范围的随机数 SELECT RAND()*(10-1)+1:1-10随机数

3.字符串函数

可将表创建出来,自己添加几条数据,眼过千遍不如手敲一遍!

CREATE TABLE `student` (
  `id` bigint NOT NULL,
  `student_name` varchar(255) DEFAULT NULL,
  `age` int DEFAULT NULL,
  `score` double DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
函数 用法
CONCAT(S1,S2,…,Sn) 拼接S1,S2…
CONCAT_WS(str, S1,S2,…,Sn) 拼接S1,S2…,并在两个字符间加str
LENGTH(s) 返回字符串str的长度(按字节算)
CHAR_LENGTH(s) 返回字符串str的字符数(按字符算)
INSERT(str, index , len, instr) 将字符串str从第index位置开始,len个字符长的子串替换为字符串instr
UPPER(s) 或 UCASE(s) / LOWER(s) 或LCASE(s) 转换为大写/小写
LEFT(s,n) / RIGHT(s,n) 返回字符串s最左边/最右边的n个字符
LPAD(str, len, pad) / RPAD(str ,len, pad) 用字符串pad对str最左 / 右边进行填充,直到str的长度为len个字符
LTRIM(s) / RTRIM(s) / TRIM(s) 去掉字符串s左侧 / 右侧 / 左侧和右侧的空格
TRIM([ BOTH / LEADING / TRAILING ] delstr FROM str) 去掉字符串str开始与结尾 / 开始 / 结尾处的delstr
REVERSE(str) 字符串反转
REPEAT(str, n) 返回str重复n次的结果
REPLACE(str, find_string, replace_with) 字符串str中出现的find_string都替换为replace_with
POSITION(find_string IN str) 返回字符串str中 第一次 出现find_string字符的位置
SUBSTRING(str,index,len) 截取字符串str从index位置开始的len个字符
# 函数举例:
# CONCAT、CONCAT_WS 函数:
SELECT CONCAT(student_name,age) CONCAT函数,CONCAT_WS('-',student_name,age) CONCAT_WS函数 FROM `student`
# LENGTH、CHAR_LENGTH 函数:
SELECT LENGTH(student_name) LENGTH字节数, CHAR_LENGTH(student_name) CHAR_LENGTH字符数 FROM `student`
# INSERT 函数:
SELECT INSERT(student_name, 1 , 1, '王') FROM `student` WHERE id = 2
# UPPER(s)、LOWER(s) 函数:
SELECT UPPER(student_name) 大写,LOWER(student_name) 小写 FROM `student` WHERE id = 3
# LEFT、RIGHT 函数:
SELECT LEFT(student_name,1),RIGHT(student_name,1) FROM `student`
### LPAD、RPAD可结合LEFT、RIGHT使用,如将姓名改为赵xx:(此句适用于中文名字)
SELECT RPAD(LEFT(student_name,1),CHAR_LENGTH(student_name),IF(CHAR_LENGTH(student_name)=3,'xx','x')) FROM `student`
# TRIM / LTRIM(s) / RTRIM(s) 函数:
SELECT CONCAT('[',TRIM('   hello   world  '),']');  	#默认是去掉前后空白符
SELECT TRIM(BOTH '&' FROM '&&hello   world&&');   	#去掉前后的&符号
SELECT TRIM(LEADING '&' FROM '&&hello   world&&'); 	#去掉开头的&符号
SELECT TRIM(TRAILING '&' FROM '&&hello   world&&'); #去掉结尾的&符号
# REVERSE 函数:
SELECT REVERSE(student_name) FROM `student`
# REPEAT 函数:
SELECT REPEAT(student_name,2) FROM `student` WHERE id = 2
# REPLACE 函数:
SELECT REPLACE(student_name,'思','四')FROM `student` WHERE id = 2
# POSITION / SUBSTRING 函数:
SELECT SUBSTRING(email,1,POSITION('@' IN email)- 1 ) FROM `student`

4.日期函数

函数 用法
NOW()/SYSDATE()/CURRENT_TIMESTAMP()/ LOCALTIME()/LOCALTIMESTAMP() 返回当前日期和时间的日期时间值
CURDATE()或CURRENT_DATE() 返回当前系统日期:(2023-09-05)
CURTIME()或CURRENT_TIME() 返回当前系统时间:(12:28:16)
UTC_DATE()/UTC_TIME() 返回当前UTC日期值/时间值
UNIX_TIMESTAMP(date) 返回一个UNIX时间戳:(1693888493)
YEAR(date)/MONTH(date)/DAY(date)/ HOUR(time)/MINUTE(time)/SECOND(time) 从日期或日期/时间值中提取具体时间信息
WEEK(date) / WEEKOFYEAR(date) 从日期或日期/时间值中提取周数
WEEKDAY() 获取周几,
返回值为0-6的整数,表示星期一到星期日。
DAYOFWEEK() 返回周几,
返回值为1-7的整数,表示星期日到星期六。
EXTRACT(unit FROM date) 从data中提取unit
常用unit :
YEAR:年份(例如:2023)。
QUARTER:季度(范围为 1 到 4)。
MONTH:月份(范围为 1 到 12)。
WEEK:周数(范围为 0 到 53)。
DAY:天数(范围为 1 到 31)。
HOUR:小时数(范围为 0 到 23)。
MINUTE:分钟数(范围为 0 到 59)
SECOND:秒数(范围为 0 到 59)。
DAYNAME(date) / MONTHNAME(date) 星期 / 月份 (英文显示)
DATEDIFF(date1,date2) / TIMEDIFF(time1,time2) 日期间隔时间 / 时间间隔时间
DATE_ADD(date, INTERVAL expr unit) / DATE_SUB(date, INTERVAL expr unit) 将date 加上 / 减去 时间间隔。
expr为时间间隔表达式,unit同上
ADDTIME(time,expr) / SUBTIME(time,expr) 在time基础上加上 / 减去 expr时间
DATE_FORMAT(datetime,fmt) / TIME_FORMAT(time,fmt) 通过fmt格式化给定日期时间
STR_TO_DATE(str,fmt) 将字符串str通过fmt格式解析为日期格式

日期函数格式符号

符号 说明 符号 说明
%Y 4位数的年份(例如:2023) %y 2位数的年份,例如:“07年4月2日”
%m 月份,数值(01……12) %M 月份名字(Jan……Dec)
%d 两位数的日期(01到31) %D 带有英文前缀的月份中的天数(如:1st, 2nd, 3rd, 等等。)
%H 小时(00……23) %h 小时(01……12)
%i 分钟(00……59) %a 缩写的星期名字(Sun……Sat)
%s 秒数(00到59) %b 缩写的月份名字(Jan……Dec)
%c 月份,数值(1……12) %e 月份中的天数,数值(0……31)
%f 微秒 %j 一年中的天数(001……366)
%k 小时(0……23) %l 小时(1……12)
%p AM或PM %r 时间,12小时制(hh:mm:ss AM或PM)
%U 周(00……53),星期日是一周的第一天 %u 周(00……53),星期一是周的第一天
%V 周(01……53),星期日是一周的第一天,与 %X 使用 %v 周(01……53),星期一是一周的第一天,与 %x 使用
%W 星期名字(Sun……Sat) %w 一周中的天数(0=星期日,6=星期六)
%X 年份,4位数字,其中星期日是周的第一天,
例如:“2007年4月2日”
%x 年份,4位数字,其中星期一是周的第一天,
例如:“2007年4月2日”
%T 时间,24小时制(hh:mm:ss) %% 表示%
# 函数举例:
# WEEKDAY / DAYOFWEEK 函数:
SELECT DAYOFWEEK('2023-09-05') 'DAYOFWEEK', WEEKDAY('2023-09-05') 'WEEKDAY';
# EXTRACT 函数:
SELECT EXTRACT(QUARTER FROM '2023-09-05')
# DAYNAME / MONTHNAME 函数:
SELECT DAYNAME('2023-09-05') '星期',MONTHNAME('2023-09-05') '月份';
# DATEDIFF / TIMEDIFF 函数:
SELECT DATEDIFF('2023-07-05','2023-06-05') '日期间隔' , TIMEDIFF('2023-09-05 14:26:55','2023-09-05 13:26:55') '时间间隔'
# DATE_FORMAT / TIME_FORMAT 函数:
SELECT DATE_FORMAT('2023-09-05 15:18:24','%Y-%m-%d %H:%i:%s') '日期格式化',TIME_FORMAT('2023-09-05 15:18:24','%H:%i:%s') '时间格式化'
# STR_TO_DATE 函数:
SELECT STR_TO_DATE('2023-09-05 15:18:24', '%Y-%m-%d %H:%i:%s');

5.条件函数

函数 用法
IF(condition, true_value, false_value) 判断condition,为真返回true_value,为假返回false_value
IFNULL(value1,value2) 如果value1不为空,返回value1,否则返回value2
CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2

ELSE resultN
END
简单CASE:根据expression的值,在后面的参数列表中找到对应的值并返回。
如果没有匹配的值,可以使用ELSE子句返回一个默认值。
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2

ELSE resultN
END
搜索CASE:根据第一个参数的值,在后面的参数列表中找到匹配的值并返回。
如果没有匹配的值,可以继续在后面的参数列表中查找匹配的值,直到没有更多的参数为止。
# 函数举例:
# IF 函数:
SELECT IF(score>60,'及格','不及格') FROM `student`
# IFNULL 函数:
SELECT IFNULL(student_name,'无') FROM `student`
# CASE 函数:
# 简单:
SELECT CASE '周一' WHEN '周一' THEN '星期一' WHEN '周二' THEN '星期二' ELSE '输入有误' END '星期' FROM `student`
# 搜索:
SELECT CASE WHEN score >= 90 THEN '优秀' WHEN  score >= 60 THEN '及格' ELSE '超出范围' END '成绩评级' FROM `student`

6.窗口函数

窗口函数语法格式:

<window function> ::=   
    <expression> OVER (  
        PARTITION BY <expression1> [, <expression2> ...]   -- 此处可以省略PARTITION BY  
        ORDER BY <expression3> [, <expression4> ...]      -- 此处必须要有ORDER BY  
    )

解释说明:

  • :要计算窗口函数的列或表达式。
  • , :分区列,用于将数据分为不同的分区。可以指定多个列,用逗号隔开。
  • , :排序列,用于对每个分区内的数据进行排序。必须指定至少一个列。
函数格式 用法
RANK() OVER (ORDER BY column DESC/ASC) 计算排名,如果有多个相同的值,则它们具有相同的排名,空值不参与排名。(第一、第一、第三)
DENSE_RANK() OVER (ORDER BY column DESC/ASC [PARTITION BY column1 [, column2 …]] ) 计算排名,如果有多个相同的值,则不会跳过下一个排名,而是将并列排名视为下一排名的一部分。(第一、第一、第二)
ROW_NUMBER() OVER (ORDER BY column DESC/ASC [PARTITION BY column1 [, column2 …]] ) 为每一行分配一个唯一的数字,可以按照任何排序顺序分配。
NTILE(number_of_buckets) OVER (ORDER BY expression [ASC | DESC]) 将数据分为指定数量的组,并为每组分配一个标签。
注:该函数只用于SELECT语句中
LAG() / LEAD() 返回当前行的前一行的值和后一行的值
FIRST_VALUE() / LAST_VALUE() 返回结果集中的第一行的值和最后一行的值
# 函数举例:
# RANK() 函数:
SELECT id,student_name, score, RANK() OVER (ORDER BY score DESC) rank_score FROM student;
# DENSE_RANK() 函数:
SELECT id, student_name, score, DENSE_RANK() OVER (ORDER BY score ASC) as rank_score FROM student;
# ROW_NUMBER() 函数:
SELECT id, student_name, class_name, score, ROW_NUMBER() OVER (PARTITION BY class_name ORDER BY score DESC) as row_num FROM student
# NTILE() 函数:
SELECT id,student_name, score, NTILE(2) OVER (ORDER BY score ASC) bucket_number FROM student;
# LAG() / LEAD() 函数:
SELECT id,student_name, score, LAG(student_name,1,'无前一个') OVER (ORDER BY score ASC) '前一个的值',LEAD(student_name,1,'无后一个') OVER (ORDER BY score ASC) '后一个的值' FROM student
# FIRST_VALUE() / LAST_VALUE() 函数:
SELECT id,student_name, score, FIRST_VALUE(score) OVER (ORDER BY score) '第一个值', LAST_VALUE(score) OVER (ORDER BY score) '最后一个值'  FROM student;

你可能感兴趣的:(MySQL,mysql,学习,数据库)