SQL函数

表: people

ID name age sex dname
1 小明 20 研发部
2 小红 17 研发部
3 小李 18 销售部
4 小南 16 销售部
5 小门 18 人事部
6 小彦 21 人事部

一、聚合函数,字符串拼接

1、sql语句

SELECT
    GROUP_CONCAT(p.name ORDER BY p.age DESC SEPARATOR ',') AS names
FROM
    `people` p
GROUP BY
    p.sex


// 截取前三个
substring_index(GROUP_CONCAT(p.name ORDER BY p.age DESC SEPARATOR ','), ',', 3)

2、查询结果

names
小红,小南
小彦,小明,小门,小李

二、字符串函数

关键字 说明
LENGTH(s) 返回字符串s的字节数
CHAR_LENGTH(s) 返回字符串s的字符数
CHARACTER_LENGTH(s) 返回字符串s的字符数
CONCAT(s1,s2,sn) 多个字符串拼接
CONCAT_WS(x,s1,s2,sn) 多个字符串拼接, x为分隔符
FIELD(s,s1,s2,sn) 返回字符串s,在字符串列表中的位置
TRIM(s), LTRIM, RTRIM 字符串s中的空格
MID(s,n,len) 从字符串s的n位置,截取len长度。
同SUBSTRING(s,n,len)
POSITION(s1 IN s) 返回字符串s1在s中的位置
REPLACE(s,s1,s2) 将字符串s中的 s2替换成s1
REVERSE(s) 字符串反转
RIGHT(s,n) 返回字符串s的后n个字符
STRCMP(s1,s2) s1和s2进行比较,
相等返回0
s1>s2返回1
s1<s2返回-1
SUBSTR(s,start,length) 从字符串的start位置,截取lenth长度
SUBSTRING(s,start,length) 从字符串的start位置,截取lenth长度

三、日期函数

关键字 说明
UNIX_TIMESTAMP() 返回从1970-01-01 00:00:00到当前的毫秒值
UNIX_TIMESTAMP(date_str) 将指定日期转为毫秒值的时间戳
FROM_UNIXTIME(timestamp, date_format) 将时间戳转为指定的日期格式,%Y-%m-%d %H:%i:%s
CURDATE() \ CURRENT_DATE() 返回当前日期
CURTIME() \ CURRENT_TIME() 返回当前时间
CURRENT_TIMESTAMP() 返回当前日期和时间
DATE() 日期字符串中获取年月日
DATEDIFF(d1, d2) 计算日期d1和d2之间相隔的天数
TIMEDIFF(t1, t2) 计算两个时间之间,相差多少秒
DATE_FORMAT(d, f) 按表达式f要求显示日期,返回字符串
STR_TO_DATE(s, f) 将字符串转为日期
DATE_SUB(date, INTERVAL expr type) 从date减去指定的时间
从日期中减去两天,例如:DATE_SUB(date_field, INTERVAL 2 DAY)
DATE_ADD(date, INTERVAL expr type) 从date增加指定的时间
SECOND:秒
MINUTE:分
HOUR:时
DAY:天
WEEK:周
MONTH:月
YEAR:年
EXTRACT(type FROM d) 从日期d中获取指定的type值,
例如:EXTRACT(YEAR FROM '2022-03-09 12:30:49') -> 2022
LAST_DAY(d) 返回指定日期当前月份的最后一天
MAKEDATE(year, n) 返回指定year,第n天的日期
例如: MAKEDATE(2022, 3) -> 2022-01-03

四、控制流函数

关键字 说明
IF(expr, v1, v2) 如果表达式expr成立,则返回结果v1,否则返回v2。
IFNULL(v1, v2) 如果v1的结果为NULL,则返回v2。
ISNULL(v1) 字段是否为NULL
NULLIF(v1, v2) 比较两个字符串,如果字符串v1和v2相等,返回NULL。否则返回v1。
CASE field
 WHEN 1 THEN '结果是1'
 WHEN 5 THEN '结果是5'
 WHEN 10 THEN '结果是10'
 ELSE '其他'
END;
条件判断,类似IF(field==1, 1)
CASE
 WHEN field=1 THEN '结果是1'
 WHEN field=5 THEN '结果是5'
 WHEN field=10 THEN '结果是10'
 ELSE '其他'
END;
条件判断,类似IF(field==1, 1)

五、窗口函数(mysql8.0支持)

/*用法示例*/
SELECT
  `name`,
  `age`,
  ROW_NUMBER() OVER(PARTITION BY `dname` ORDER BY `age`) AS age_rank1,
  RANK() OVER(PARTITION BY `dname` ORDER BY `age`) AS age_rank2,
  DENSE_RANK() OVER(PARTITION BY `dname` ORDER BY `age`) AS age_rank3,


  LAG(age, 1, 18) OVER(PARTITION BY `dname` ORDER BY `age`) AS age2,
  LEAD(age, 1, 18) OVER(PARTITION BY `dname` ORDER BY `age`) AS age3,

FROM
  `people`



关键字 说明
ROW_NUMBER() 排序后的序列号, 数值相同时,没有并列名次
RANK() 排序后的序列号, 数值相同时,有并列名次
DENSE_RANK() 排序后的序列号, 数值相同时,有并列名次,之后会跳名次
LAG(field, n, default) 返回当前行的上n行数据的field字段,没有上n行,则返回default值。
LEAD(field, n, default) 返回当前行的下n行数据的field字段,没有下n行,则返回default值。

六、存储过程(函数)

-- 创建
DELIMITER $$(自定义结束符号)
CREATE PROCEDURE 函数名()
BEGIN
  -- 定义局部变量
  DECLARE val_01 varchar(20) DEFAULT '李四';
  -- 定义用户变量(当前会话,全局访问)
  SET @val_02 = '张三'
  -- 变量赋值
  SET val_01 = '张三'

  -- SQL结果,赋值给 val_01
  SELECT `name` INTO val_01 FROM `people` WHERE `ID` = 1

  -- 输出变量值
  SELECT val_01;
END $$(自定义结束符号)
DELIMITER;

-- 调用
call 函数名();


posted @ 2022-03-07 16:41  做个笔记  阅读(46)  评论(0编辑  收藏  举报