目录
流程函数
流程函数也是很常用的一类函数,可以在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默认值 |
演示如下:
A. if
# 返回error
select if(false, 'Ok', 'Error');
B. ifNull
# 返回为ok
SELECT IFNULL('ok','default');
# 返回为''
SELECT IFNULL('','Default');
# 返回为default
SELECT IFNULL(NULL,'Default');
C. case when then else end
需求: 查询emp表的员工姓名和工作地址 (北京/上海 ----> 一线城市 , 其他 ----> 二线城市)
case [字段]
when xxx then ' '
when xxx then ' '
else ' '
end
SELECT
NAME,
(CASE workaddress
WHEN '北京' THEN '一线城市'
WHEN '上海' THEN '一线城市'
ELSE '二项城市'
END) AS '工作地点'
FROM emp;
## 相当于 Java 中switch了
case
when 条件 then xxx
when 条件 then xxx
else xxx
end
SELECT NAME,
age,
(CASE
WHEN age > 60 THEN '老年人'
WHEN age BETWEEN 40 AND 60 THEN '中年人'
ELSE '年轻人'
END) AS '年龄'
FROM emp;
MySQL的常见函数我们学习完了,那接下来,我们就来分析一下,在前面讲到的两个函数的案例场景, 思考一下需要用到什么样的函数来实现?
1). 数据库中,存储的是入职日期,如 2000-01-01,如何快速计算出入职天数呢? --------> 答案: datediff
2). 数据库中,存储的是学生的分数值,如98、75,如何快速判定分数的等级呢? ----------> 答案: case ... when ...
约束
概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。
目的:保证数据库中数据的正确、有效性和完整性。
约束 | 关键字 | 描述 |
非空 | NOT NULL | 限制该字符不为NULL |
唯一约束 | UNIQUE | 保证该字段数据唯一,不可重复 |
默认约束 | DEFAULT | 保证数据在未填充时有默认值 |
主键约束 | PRIMARY KEY | 主键是一行数据的唯一标识 |
检查约束 | CHECK | 保证字段值满足某一个条件 |
外键约束 | FOREIGN KEY | 用来让两张表的数据之间建立连接,保证数据的一致 性和完整性 |
注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。
对应的建表语句
CREATE TABLE tb_user(
id INT AUTO_INCREMENT PRIMARY KEY COMMENT 'ID唯一标识',
NAME VARCHAR(20) NOT NULL UNIQUE COMMENT '名字',
age INT COMMENT '年龄',
STATUS CHAR(1) DEFAULT '1' COMMENT '状态',
gender CHAR(1) COMMENT '性别'
);
外键约束
外键:用来让两张表的数据建立连接,从而保证数据的一致性和完整性
添加外键
alter table 表名 add constraint 外键名称 foreign key (外键字段) reference 表名(字段)
删除外键
alter table 表名 drop foreign key 外键名称
删除/更新行为
具体语法为:
设置更新和删除都是级联(cascade)
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES
主表名 (主表字段名) ON UPDATE CASCADE ON DELETE 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