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
)
解释说明:
<expression>:要计算窗口函数的列或表达式。<expression1>,<expression2>:分区列,用于将数据分为不同的分区。可以指定多个列,用逗号隔开。<expression3>,<expression4>:排序列,用于对每个分区内的数据进行排序。必须指定至少一个列。
| 函数格式 | 用法 |
|---|---|
| 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常用函数学习,涵盖聚合、数值、字符串、日期、条件和窗口函数。介绍了聚合函数不同统计方式,强调字符串函数学习可通过创建表添加数据实践,还给出窗口函数语法格式及相关解释。
3090

被折叠的 条评论
为什么被折叠?



