文章目录
- 1. 函数
- 1.1 字符串函数
- 1.2 数值函数
- 1.3 日期函数
- 1.4 流程函数
- 2. 约束
- 2.1 概述
- 2.2 外键约束
- 2.2.1 外键使用
- 2.2.2 删除/更新行为
1. 函数
和其他编程语言一样,MySQL也有函数的定义。函数 是指一段可以直接被另一段程序调用的程序或代码。 也就意味着,这一段程序或代码在MySQL中已经给我们提供了,我们要做的就是在合适的业务场景调用对应的函数完成对应的业务需求即可。这里的函数既指MySQL中内置的函数,也指自己定义的函数。
MySQL中的函数主要分为以下四类: 字符串函数、数值函数、日期函数、流程函数。
1.1 字符串函数
MySQL中内置了很多字符串函数,常用的几个如下:
函数 | 功能 |
---|---|
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 个长度的字符串,MySQL中索引从1 开始 |
演示如下:
# concat : 字符串拼接
select concat('Hello', ' MySQL');
# lower : 全部转小写
select lower('Hello');
# lpad : 左填充
select lpad('01', 5, '-');
# trim : 去除空格
select trim(' Hello MySQL ');
# substring : 截取子字符串
select substring('Hello MySQL',1,5);
1.2 数值函数
常见的数值函数如下:
函数 | 功能 |
---|---|
CEIL(x) | 向上取整 |
FLOOR(x) | 向下取整 |
MOD(x,y) | 返回x/y 的模 |
RAND() | 返回0~1 内的随机数 |
ROUND(x,y) | 求参数x的四舍五入的值,保留y位小数 |
演示如下:
# ceil:向上取整
select ceil(1.1);
# mod:取模
select mod(7,4);
# rand:获取随机数
select rand();
# round:四舍五入
select round(2.344,2);
1.3 日期函数
常见的日期函数如下:
函数 | 功能 |
---|---|
CURDATE() | 返回当前日期 |
CURTIME() | 返回当前时间 |
NOW() | 返回当前日期和时间 |
YEAR(date) | 获取指定date的年份 |
MONTH(date) | 获取指定date的月份 |
DAY(date) | 获取指定date的日期 |
DATE_ADD(date, INTERVAL expr type) | 返回一个日期/时间值加上一个时间间隔expr 后的时间值 |
DATEDIFF(date1,date2) | 返回起始时间date1 和 结束时间date2 之间的天数 |
演示如下:
# curdate:当前日期
select curdate();
# curtime:当前时间
select curtime();
# YEAR , MONTH , DAY:当前年、月、日
select YEAR(now());
select MONTH(now());
select DAY(now());
# now:当前日期和时间
select now();
# date_add:增加指定的时间间隔
select date_add(now(), INTERVAL 70 YEAR );
# datediff:获取两个日期相差的天数
select datediff('2021-10-01', '2021-12-01');
1.4 流程函数
流程函数也是很常用的一类函数,可以在SQL语句中实现条件筛选,从而提高语句的效率。
函数 | 功能 |
---|---|
IF(value , t , f) | 如果value 为true ,则返回t,否则返回f |
IFNULL(value1 , value2) | 如果value1 不为空,返回value1 ,否则返回value2 |
CASE WHEN [ val1 ] THEN [res1] ... ELSE [ default ] END | 如果val1 为true ,返回res1 ,… 否则返回default 默认值 |
CASE [ expr ] WHEN [ val1 ] THEN [res1] ... ELSE [ default ] END | 如果expr 的值等于val1 ,返回res1 ,… 否则返回default 默认值 |
演示如下:
# if
select if(false, 'Ok', 'Error');
# ifnull
select ifnull('Ok','Default');
select ifnull('','Default');
select ifnull(null,'Default');
# case when then else end
# 需求: 查询emp表的员工姓名和工作地址 (北京/上海 ----> 一线城市 , 其他 ----> 二线城市)
select
name,
( case workaddress when '北京' then '一线城市' when '上海' then '一线城市' else
'二线城市' end ) as '工作地址'
from emp;
2. 约束
2.1 概述
约束是作用于表中字段上的规则,用于限制存储在表中的数据。目的是为了保证数据库中数据的正确、有效性和完整性。约束的分类如下:
约束 | 描述 | 关键字 |
---|---|---|
非空约束 | 限制该字段的数据不能为null | NOT NULL |
唯一约束 | 保证该字段的所有数据都是唯一、不重复的 | UNIQUE |
主键约束 | 主键是一行数据的唯一标识,要求非空且唯一 | PRIMARY KEY |
默认约束 | 保存数据时,如果未指定该字段的值,则采用默认值 | DEFAULT |
检查约束 | 保证字段值满足某一个条件 | CHECK |
外键约束 | 用来让两张表的数据之间建立连接,保证数据的一致性和完整性 | FOREIGN KEY |
**注意:**约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。
2.2 外键约束
2.2.1 外键使用
外键:用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。
外键约束示例如下,加入我们有两张表,员工表和部门表。左侧的emp表是员工表,里面存储员工的基本信息,包含员工的ID、姓名、年龄、职位、薪资、入职日期、上级主管ID、部门ID,在员工的信息中存储的是部门的ID dept_id,而这个部门的ID是关联的部门表dept的主键id,那emp表的dept_id就是外键,关联的是另一张表的主键。
对外键操作的语法如下。
-
创建表时添加
CREATE TABLE 表名( 字段名 数据类型, ... [CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名) );
-
创建表后添加
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名) ;
-
删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
代码演示如下:
# 为emp表的dept_id字段添加外键约束,关联dept表的主键id
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id);
# 删除emp表的外键fk_emp_dept_id
alter table emp drop foreign key fk_emp_dept_id;
2.2.2 删除/更新行为
添加了外键之后,再删除父表数据时产生的约束行为,我们就称为删除/更新行为。具体的删除/更新行为有以下几种:
行为 | 说明 |
---|---|
NO ACTION | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。 (与 RESTRICT 一致) 默认行为 |
RESTRICT | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。 (与 NO ACTION 一致) 默认行为 |
CASCADE | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录 |
SET NULL | 当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(这就要求该外键允许取null) |
SET DEFAULT | 父表有变更时,子表将外键列设置成一个默认的值 (Innodb引擎不支持) |
默认的外键删除/更新行为是 NO ACTION
,如果想要有其他的行为,那么其语法为:
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES
主表名 (主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;
语法演示如下:
# CASCADE
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references
dept(id) on update cascade on delete cascade ;
# SET NULL
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references
dept(id) on update set null on delete set null ;