SQL-函数

  • 函数
    • 字符串函数
    • 数值函数
    • 日期函数
    • 流程函数

函数

函数是指一段可以直接被另一段程序调用的程序或代码。

要查看函数操作的结果,可以使用 SELECT 函数(参数);

select代表查询,后面接函数会将结果返回出去,相当于 print 。

字符串函数

常见的字符串函数如下:

==========================================================
函数                           |    功能
----------------------------------------------------------
CONCAT(S1, S2, ..., Sn)       |    字符串拼接,将S1,S2,...,Sn拼接成一个字符串
LOWER(str)                    |    将字符串str全部转为小写
UPPER(str)                    |    将字符串str全部转为大写
LPAD(str, n, pad)             |    左填充,用字符串pad对str的左边进行填充,达到n个字符串长度
RPAD(str, n, pad)             |    右填充,用字符串pad对str的右边进行填充,达到n个字符串长度
TRIM(str)                     |    去掉字符串头部和尾部的空格
SUBSTRING(str, start, len)    |    返回从字符串str从start位置起的len个长度的字符串,start起始为1
==========================================================

示例:

# 字符串拼接
SELECT CONCAT('Hello', ' World');# 全部转大写
SELECT UPPER('Hello');# 去除头部和尾部的空格
SELECT TRIM('  Hello  World! ');# 截取子字符串
SELECT SUBSTRING('Hello MySQL', 1, 5);DROP TABLE IF EXISTS student;CREATE TABLE student(workno VARCHAR(10) COMMENT '工号',name VARCHAR(20),age INT
);INSERT INTO student
VALUES ('1', '周杰轮', 31), ('2', '王力鸿', 33), ('3', '林俊节', 26), ('4', '张学油', 26), ('5', '刘德滑', 40), ('6', '李白', 33), ('7', '张无忌', 31), ('8', '张三丰', 91), ('9', '范凉凉', 45), ('10', '陈友谅', 53), ('11', '李逵', 40);# 由于业务需求变更,工号统一为5位数,目前不足5位数的全部在前面补0。比如: 1号的工号应该为00001。
UPDATE student SET workno = LPAD(workno, 5, '0');

数值函数

常见的数值函数如下:

==========================================================
函数            |    功能
----------------------------------------------------------
CEIL(x)        |    向上取整
FLOOR(x)       |    向下取整
MOD(x, y)      |    返回x/y的模
RAND()         |    返回0~1内的随机数
ROUND(x, y)    |    求参数x的四舍五入的值,保留y位小数
==========================================================

示例:

# 向上取整
SELECT CEIL(1.1);# 取模
SELECT MOD(7, 4);# 获取随机数
SELECT RAND();# 四舍五入
SELECT ROUND(3.334, 2);# 通过数据库的函数,生成一个六位数的随机验证码
SELECT LPAD(ROUND(RAND()*1000000 , 0), 6, '0');

日期函数

常见的日期函数如下:

==========================================================
函数                                   |    功能
----------------------------------------------------------
CURDATE()                             |    返回当前日期,current date
CURTIME()                             |    返回当前时间
NOW()                                 |    返回当前日期和时间
YEAR(date)                            |    获取指定date的年份
MONTH(date)                           |    获取指定date的月份
DAY(date)                             |    获取指定date的日期
DATE_ADD(date, INTERVAL expr type)    |    返回一个日期/时间值加上一个时间间隔expr后的时间值,type为YEAR、MONTH、DAY
DATEDIFF(date1, date2)                |    返回起始时间date1和结束时间date2之间的天数
==========================================================

示例:

# 当前日期和时间
SELECT NOW();# 当前年、月、日
SELECT YEAR(NOW());
SELECT MONTH(NOW());
SELECT DAY(NOW());# 增加指定的时间间隔
SELECT DATE_ADD(NOW(), INTERVAL 70 YEAR);
SELECT DATE_ADD(NOW(), INTERVAL 70 MONTH);
SELECT DATE_ADD(NOW(), INTERVAL 70 DAY);# 获取两个日期相差的天数
SELECT DATEDIFF('2021-10-01', '2021-12-16');DROP TABLE IF EXISTS emp;# 创建员工表(employee)
CREATE TABLE emp(id INT COMMENT '编号',workno VARCHAR(10) COMMENT '工号',name VARCHAR(10) COMMENT '姓名',gender CHAR(1) COMMENT '性别',age TINYINT UNSIGNED COMMENT '年龄',idcard CHAR(18) COMMENT '身份证号',workaddress VARCHAR(50) COMMENT '工作地址',entrydate DATE COMMENT '入职时间'
)COMMENT '员工表';INSERT INTO emp(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES(1, '00001', '柳岩', '女', 20, '123456789012345678', '北京', '2000-01-01'), (2, '00002', '张无忌', '男', 18, '123456789012345670', '北京', '2005-09-01'), (3, '00003', '韦一笑', '男', 38, '123456789712345670', '上海', '2005-08-01'), (4, '00004', '赵敏', '女', 18, '123456757123845670', '北京', '2009-12-01'), (5, '00005', '小昭', '女', 16, '123456769012345678', '上海', '2007-07-01'), (6, '00006', '杨逍', '男', 28, '12345678931234567X', '北京', '2006-01-01'), (7, '00007', '范瑶', '男', 40, '123456789212345670', '北京', '2005-05-01'), (8, '00008', '黛绮丝', '女', 38, '123456157123645670', '天津', '2015-05-01'), (9, '00009', '范凉凉', '女', 45, '123156789012345678', '北京', '2010-04-01'), (10, '00010', '陈友谅', '男', 53, '123456789012345670', '上海', '2011-01-01'), (11, '00011', '张士诚', '男', 55, '123567897123465670', '江苏', '2015-05-01'), (12, '00012', '常遇春', '男', 32, '123446757152345670', '北京', '2004-02-01'), (13, '00013', '张三丰', '男', 88, '123656789012345678', '江苏', '2020-11-01'), (14, '00014', '灭绝', '女', 65, '123456719012345670', '西安', '2019-05-01'), (15, '00015', '胡青牛', '男', 70, '12345674971234567X', '西安', '2018-04-01'), (16, '00016', '周芷若', '女', 18, null, '北京', '2012-06-01');# 查询所有员工的入职天数,并根据入职天数倒序排序。
SELECT name, DATEDIFF(CURDATE(), entrydate) AS 'entrydays' FROM emp ORDER BY entrydays DESC;

流程函数

流程函数可以在SQL语句中实现条件筛选,从而提高语句的效率。

==========================================================
函数                           |    功能
----------------------------------------------------------
IF(value, t, f)               |    如果value为true,则返回t,否则返回f
----------------------------------------------------------
IFNULL(value1, value2)        |    如果value1不为空,返回value1,否则返回value2
----------------------------------------------------------
CASE                          |    如果val_1为true,返回res_1,
WHEN val_1 THEN res_1         |    如果val_2为true,返回res_2,
WHEN val_2 THEN res_2         |    ...
...                           |    如果val_n为true,返回res_n,
WHEN val_n THEN res_n         |    否则返回default默认值
ELSE default                  |
END                           |
----------------------------------------------------------
CASE expr                     |    如果expr的值等于val_1,返回res_1,
WHEN val_1 THEN res_1         |    如果expr的值等于val_2,返回res_2,
WHEN val_2 THEN res_2         |    ...
...                           |    如果expr的值等于val_n,返回res_n,
WHEN val_n THEN res_n         |    否则返回default默认值
ELSE default                  |
END                           |
==========================================================

示例:

# if演示,若为true,则返回ok,否则返回error
SELECT IF(false, 'Ok', 'Error');# ifnull演示
SELECT IFNULL('Ok', 'Default');
SELECT IFNULL('', 'Default');
SELECT IFNULL(null, 'Default');DROP TABLE IF EXISTS score;CREATE TABLE score(id INT COMMENT 'ID',name VARCHAR(20) COMMENT '姓名',math INT COMMENT '数学',english INT COMMENT '英语',chinese INT COMMENT '语文'
) COMMENT '学员成绩表';INSERT INTO score(id, name, math, english, chinese)
VALUES(1, 'Tom', 67, 88, 95), (2, 'Rose', 23, 66, 90), (3, 'Jack', 56, 98, 76);/*
统计班级各个学员的成绩,展示规则如下:>= 85,优秀>= 60,及格否则,不及格
*/
SELECT id, name, (CASE WHEN math >= 85 THEN '优秀' WHEN math >=60 THEN '及格' ELSE '不及格' END) '数学',(CASE WHEN english >= 85 THEN '优秀' WHEN english >=60 THEN '及格' ELSE '不及格' END) '英语',(CASE WHEN chinese >= 85 THEN '优秀' WHEN chinese >=60 THEN '及格' ELSE '不及格' END) '语文'
FROM score;DROP TABLE IF EXISTS emp;CREATE TABLE emp(id INT COMMENT '编号',workno VARCHAR(10) COMMENT '工号',name VARCHAR(10) COMMENT '姓名',gender CHAR(1) COMMENT '性别',age TINYINT UNSIGNED COMMENT '年龄',idcard CHAR(18) COMMENT '身份证号',workaddress VARCHAR(50) COMMENT '工作地址',entrydate DATE COMMENT '入职时间'
)COMMENT '员工表';INSERT INTO emp(id, workno, name, gender, age, idcard, workaddress, entrydate)
VALUES(1, '00001', '柳岩', '女', 20, '123456789012345678', '北京', '2000-01-01'), (2, '00002', '张无忌', '男', 18, '123456789012345670', '北京', '2005-09-01'), (3, '00003', '韦一笑', '男', 38, '123456789712345670', '上海', '2005-08-01'), (4, '00004', '赵敏', '女', 18, '123456757123845670', '北京', '2009-12-01'), (5, '00005', '小昭', '女', 16, '123456769012345678', '上海', '2007-07-01'), (6, '00006', '杨逍', '男', 28, '12345678931234567X', '北京', '2006-01-01'), (7, '00007', '范瑶', '男', 40, '123456789212345670', '北京', '2005-05-01'), (8, '00008', '黛绮丝', '女', 38, '123456157123645670', '天津', '2015-05-01'), (9, '00009', '范凉凉', '女', 45, '123156789012345678', '北京', '2010-04-01'), (10, '00010', '陈友谅', '男', 53, '123456789012345670', '上海', '2011-01-01'), (11, '00011', '张士诚', '男', 55, '123567897123465670', '江苏', '2015-05-01'), (12, '00012', '常遇春', '男', 32, '123446757152345670', '北京', '2004-02-01'), (13, '00013', '张三丰', '男', 88, '123656789012345678', '江苏', '2020-11-01'), (14, '00014', '灭绝', '女', 65, '123456719012345670', '西安', '2019-05-01'), (15, '00015', '胡青牛', '男', 70, '12345674971234567X', '西安', '2018-04-01'), (16, '00016', '周芷若', '女', 18, null, '北京', '2012-06-01');# 查询emp表的员工姓名和工作地址(如果城市为北京/上海,显示为一线城市,其他 ----> 二线城市)
SELECT name, (CASE workaddress WHEN '北京' THEN '一线城市' WHEN '上海' THEN '一线城市' ELSE '二线城市' END) AS '工作地址'
FROM emp;

《SQL基础》06. 函数相关推荐

  1. SQL基础常用函数合集

    AVG avg()函数是一个聚合函数(聚合函数:对一组值执行计算并返回单一的值的函数,常见的有sum.max.min.count等),用于计算从select语句中返回的数值数据集的平均值. 牛客.SQ ...

  2. SQL基础篇---函数及其函数配套使用的关键字

    一.数值函数 知识点1 SUM 求总和 SELECT breakfast,sum(price) FROM my_foods GROUP BY breakfast ORDER BY SUM(price) ...

  3. SQL 基础-- 子查询

    --========================= --SQL 基础--> 子查询 --========================= /* 一.子查询 子查询就是位于SELECT.UP ...

  4. SQL基础--层次化查询(START BY ... CONNECT BY PRIOR)

    为什么80%的码农都做不了架构师?>>>    --====================================================== --SQL基础--& ...

  5. mysql 算子 谓词_[SQL] SQL 基础知识梳理(六)- 函数、谓词、CASE 表达式

    SQL 基础知识梳理(六)-  函数.谓词.CASE 表达式 目录 函数 谓词 CASE 表达式 一.函数 1.函数:输入某一值得到相应输出结果的功能,输入值称为"参数",输出值称 ...

  6. 【SQL基础-3】SQL常用函数

    目录 1 字符串函数 1.1 字符串截取 1.1.1 left() 1.1.2 right() 1.1.3 mid()/substring()/substr() 1.2 字符串连接 1.2.1 con ...

  7. 阿里云AI训练营-SQL基础3:复杂查询方法-视图、子查询、函数等

    3.1 视图 3.1.1 什么是视图 3.1.2 视图与表有什么区别 3.1.3 为什么会存在视图 3.1.4 如何创建视图 3.1.5 如何修改视图结构 3.1.6 如何更新视图内容 3.1.7 如 ...

  8. MySQL学习思维导图(MySQL简介、SQL基础命令、约束、单表查询、多表查询、内置函数、存储过程、视图、事务、索引)

    MySQL学习思维导图 内容包括:MySQL简介.SQL基础命令.约束.单表查询.多表查询.内置函数.存储过程.视图.事务.索引 文章目录 MySQL学习思维导图 一.MySQL简介 二.SQL基础命 ...

  9. sql复习(sql基础、过滤和排序数据、单行函数)

    一.sql基础 日期和字符只能在单引号 中出现 在select子句中使用关键字 distinct 删除重复行 select distinct department_id from employees; ...

  10. SQL基础操作_3_数据字典(涵盖SQL Server、Oracle、Mysql常见系统数据字典)

    目录 数据库元数据查询 7.5.1 列出模式中所有的表 7.5.2 列出所有的数据库 7.5.3 列出给定表的基本信息 7.5.4 列出给定表的索引信息 7.5.5 列出给定表的主键.外键约束 7.5 ...

最新文章

  1. 读取word对应页码_毕业论文怎样自动生成目录及从任意页开始排页码
  2. 深度学习:神经网络,softmax + cross entropy,非tensorflow方式
  3. python绘制折线图怎么样填充空白颜色_Python:填补两幅图之间的空白
  4. OpenCV实现视频人脸检测
  5. [原]一步一步自己制作弹出框
  6. 针对Linux ASP.NET MVC网站中 httpHandlers配置无效的解决方案
  7. C++编译报错:重复定义
  8. 通过哪吒动漫豆瓣影评,带你分析python爬虫与BeautifulSoup快速入门
  9. 查询英语单词 - 有道官方(一)
  10. 有哪些优秀的科学网站和科研软件推荐给研究生?
  11. 网络安全中常见网络命令
  12. 北京十大著名拆迁律师事务所(精品拆迁律师)
  13. 三菱凌云3故障代码_上海三菱凌云2故障代码
  14. Linux 下 setfacl访问控制的使用
  15. Terminator zsh
  16. Botan的部分翻译
  17. 浅谈单调队列优化的DP
  18. oracle comment on用法,《Oracle comment on注释信息方法论》
  19. 机器学习-weka软件偶遇初相识
  20. 在右键中添加CMD快速通道

热门文章

  1. 【优化调度】基于粒子群算法求解水火电调度优化问题含Matlab源码
  2. 从文艺到抠脚-我的程序7年之痒
  3. 【NOI2015】BZOJ4199品酒大会题解(SAM+树形DP)
  4. 秀!如何搭建一个永久运行的个人服务器?
  5. ENVI App Store
  6. 【零基础强化学习】100行代码教你训练——基于SARSA的CliffWalking爬悬崖游戏
  7. 你的新媒体写作工具横向测评,请查收!
  8. MAC OS下免费下载YouTube
  9. Ubuntu18.04安装Nvidia显卡驱动教程
  10. 企业vi标志设计中文字设计的方法