本文以 MySQL 为例

函数

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

要查看函数操作的结果,可以使用 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 Server数据库基础

    --------------------------------------第一章  Sql Server数据库基础------------------------------------------ ...

  2. C#面试题(转载) SQL Server 数据库基础笔记分享(下) SQL Server 数据库基础笔记分享(上) Asp.Net MVC4中的全局过滤器 C#语法——泛型的多种应用

    C#面试题(转载) 原文地址:100道C#面试题(.net开发人员必备)  https://blog.csdn.net/u013519551/article/details/51220841 1. . ...

  3. SQL Server 数据库基础笔记分享(下)

    前言 本文是个人学习SQL Server 数据库时的以往笔记的整理,内容主要是对数据库的基本增删改查的SQL语句操作和约束,视图,存储过程,触发器的基本了解. 注:内容比较基础,适合入门者对SQL S ...

  4. SQL Server 数据库基础笔记分享(上)

    前言 本文是个人学习SQL Server 数据库时的以往笔记的整理,内容主要是对数据库的基本增删改查的SQL语句操作和约束,视图,存储过程,触发器的基本了解. 注:内容比较基础,适合入门者对SQL S ...

  5. sql Servers数据库基础

    1. 数据库约束包含:     ·非空约束     ·主键约束(PK) primary key constraint 唯一且不为空     ·唯一约束(UQ) unique constraint 唯一 ...

  6. sql server数据库中raiserror函数的用法

    server数据库中raiserror的作用就和asp.NET中的throw new Exception一样,用于抛出一个异常或错误.这个错误可以被程序捕捉到. raiserror的常用格式如下:ra ...

  7. SQL server 数据库基础语句 子查询 基础函数

    上一章 说了下   子查询的意义是 把一条查询语句当做值来使用 select *from car   //查询汽车的信息 假设我知道一个汽车的编号是 c021 但是我要查询 比这个汽车价格高的汽车信息 ...

  8. sql server 数据库基础知识(二)

    CASE函数用法1:单值判断,相当于switch caseCASE expression WHEN value1 THEN returnvalue1 WHEN value2 THEN returnva ...

  9. DBA常用SQL之数据库基础信息

    第一部分: 1. 查看oracle最大连接数 sql>show parameter processes #最大连接数 2. 修改最大连接数 sql>alter system set pro ...

  10. [转]sql server 数据库日期格式化函数

    转至:http://www.cnblogs.com/hantianwei/archive/2009/12/03/1616148.html 0   或   100   (*)     默认值   mon ...

随机推荐

  1. Node.js出现‘Cannot find module init’ 解决方法

    1. 首先查看当前根目录是否有node_module文件夹,如果有,请删除 2. 输入 npm clean cache 3. 再次输入 node init -y 大功告成

  2. 代码随想录算法训练营Day23 二叉树

    代码随想录算法训练营 代码随想录算法训练营Day23 二叉树|669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 总结篇 669. 修剪二叉搜索树 题目链接 ...

  3. shader编程经典:分形--科赫曲线

    序言 科赫(雪花)曲线是一个经典分形图案,来一起领略下分形之美.本篇内容用到一些基础的内容,例如UV的理解和画线技巧,有需要的话可以参考合集的画圆和画线两篇文章. 示例 shadertoy 代码: # ...

  4. Hybrid 实验

    实验拓扑 实验需求 按图示给各 PC 配置 IP 地址 PC1属于 VLAN 10 : PC2 与 PC5 属于 VLAN 20:PC4属于 VLAN 30 实现全网互通 实验步骤 1.配置链路聚合 ...

  5. ChatGPT之问艺道:如何借助神级算法Prompt,让你轻松get到更高质量答案?

    摘要:本文由葡萄城技术团队编写,文章的内容借鉴于Ibrahim John的<The Art of Asking ChatGPT>(向ChatGPT提问的艺术). 前言 当今,ChatGPT ...

  6. CANoe学习笔记(二):创建第一个事件触发帧(基于LIN)

    内容: 创建一个事件触发帧: 包含几个不同无条件帧: 事件触发帧的触发: 事先准备: 创建三个文件夹,用来放不同类型文件: 工程创建 新建一个Lin工程,双击即可,然后命名为LINconf保存. 创建 ...

  7. k8s驱逐篇(6)-kube-controller-manager驱逐-NodeLifecycleController源码分析

    概述 k8s v1.16版本中NodeController已经分为了NodeIpamController与NodeLifecycleController,本文主要介绍NodeLifecycleCont ...

  8. 【linux命令】最强大的编辑器vim用法简介(基础篇)

    vim编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器.它主要分为命令令行模式.插入模式和底行模式这三种,下面主要介绍一下这三种模式最简单常用的用法. 一.命令 ...

  9. Java反射源码学习之旅

    1 背景 前段时间组内针对"拷贝实例属性是应该用BeanUtils.copyProperties()还是MapStruct"这个问题进行了一次激烈的battle.支持MapStru ...

  10. SQL Server 根据一个表数据修改另外一个表数据

    今天在写代码的时候发现一个有趣的问题,同时也暴露了之前写的代码有问题,还好之前没有出现重复的情况,及时发现了这个问题,及时改了回来,不然就GG了 下面先上代码,再给大家解说一下 CREATE TABL ...