函数 | 用法 |
---|---|
AVG() | 取平均值 |
Sum() | 求和 |
Max() | 取最大值 |
Min() | 取最小值 |
COUNT() | 统计数量 |
注:1. count(*)或count(常量值):都是统计实际的行数。
2. count(字段/表达式):只统计“字段/表达式”部分非NULL值的行数。
函数 | 用法 | 举例 |
---|---|---|
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随机数 |
可将表创建出来,自己添加几条数据,眼过千遍不如手敲一遍!
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`
函数 | 用法 |
---|---|
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');
函数 | 用法 |
---|---|
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`
窗口函数语法格式:
<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;