首页 > 数据库 >《SQL基础》06. 函数

《SQL基础》06. 函数

时间:2023-01-17 14:00:56浏览次数:48  
标签:COMMENT 返回 01 06 函数 WHEN SQL SELECT

目录


函数

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

要查看函数操作的结果,可以使用 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;

标签:COMMENT,返回,01,06,函数,WHEN,SQL,SELECT
From: https://www.cnblogs.com/GCom/p/17057651.html

相关文章

  • [SUCTF 2019]EasySQL
    原文链接:https://blog.csdn.net/m0_55771794/article/details/118709290这道题目需要我们去对后端语句进行猜解1、输入非零数字得到的回显1和输入其余字符得不到回显=>来......
  • socket编程相似对象、函数、概念的区别于联系
    socketaddr、sockaddr_in与addr_insocketaddr与socketaddr_in的关系类似于基类和派生类的关系。addr_in是socketaddr_in中一个成员变量。structso......
  • 图神经网络 —— 排列不变函数
    简单的排列不变函数:定义:参数的输入顺序不会影响输出的值,如果f(a......
  • MySQL 的 事务和隔离级别
    事务是一组原子性的SQL查询,事务内的SQL语句,要么全部执行成功,要么全部执行失败。本节重点介绍事务的ACID和隔离级别。1.ACID提到事务,大家肯定都不陌生,和数据库打交道,我们......
  • mySql,Pgsql,kingbase连表更新
    原文链接:https://www.jianshu.com/p/0df5797f7b73Tablea:id|主键code|编码Tableb:id|主键aId|关联a表idcode|编码......
  • MySQL查询精度丢失、varchar与bigint之间隐式类型转换的问题
    数据库查询过滤失效。今天在测试库上做一个关联查询时出现了捞出多余的值的情况,现在换个表名重现一下再解释。做项目时遇到一个奇怪的问题,关于mysql查询精度会有所丢失的......
  • mysql主从复制延迟问题
    背景线上mysql主从复制一直处于延迟状态,查看主从状态显示如下:...Slave_IO_Running:YesSlave_SQL_Running:YesSeconds_Behind_Mast......
  • Mysql:分页查询优化
    分页查询优化最简单的select分页是这样的:select*fromuserlimit2000,10mysql实际上会默认orderbyidasc,然后再进行limit。这个有个问题是先对user表的所有数据......
  • MySQL安装-Linux版
    MySQL8.0.26-Linux版安装1.准备一台Linux服务器云服务器或者虚拟机都可以;Linux的版本为CentOS7;2.下载Linux版MySQL安装包https://downloads.mysql.com/archives/......
  • MySQL卸载-Linux版
    MySQL卸载-Linux版停止MySQL服务systemctlstopmysqld查询MySQL的安装文件rpm-qa|grep-imysql卸载上述查询出来的所有的MySQL安装包rpm-emysql-community......