9. 数据库的增删改查
增删改查(CRUD):C——Create,R——Read, U——update, D——Delete
9.1 Insert 语句
- 基本语法:
- 案例:
-
使用细节
#说明 insert 语句的细节(`goods`表上面已经创建) SELECT * FROM `goods`; -- 1. 插入的数据应与字段(Feild,也叫做列)的数据类型相同。比如 把 'abc' 添加到 int 类型会错误 INSERT INTO `goods` (id, goods_name, price) VALUES('abc', '小米手机', 2000); #错误,'abc'不是int类型 #注意:上面把 'abc' 换为 '30' 就能执行成功,底层会把 '30' 转化为 int 的 30 -- 2. 数据的长度应在列的规定范围内,例如:不能将一个长度为 80 的字符串加入到长度为 40 的列中。 INSERT INTO `goods` (id, goods_name, price) VALUES(40, 'vivo手机vivo手机vivo手机vivo手机vivo手机', 3000); #错误,goods_name定义大小为10 -- 3. 在 values 中列出的数据位置必须与被加入的列的排列位置相对应。 INSERT INTO `goods` (id, goods_name, price) VALUES('vivo手机', 40, 3000); #错误,但是把上句的id和goods_name交换就是对的了 -- 4. 字符和日期型数据应包含在单引号中。 INSERT INTO `goods` (id, goods_name, price) VALUES(40, vivo手机, 3000); #错误,'vivo手机'就对了 -- 5. 列可以插入空值[前提是该字段允许为空],insert into table value(null) INSERT INTO `goods` (id, goods_name, price) VALUES(40, 'vivo手机', NULL); #正确 #注意:上面这条语句要看定义表`goods`时,第三个字段price定义是不是有 NOT NULL,定义如下 #price DOUBLE 没有 NOT NULL,所以可以赋值为 NULL -- 6. insert into tab_name (列名..) values (),(),() 形式添加多条记录 INSERT INTO `goods` (id, goods_name, price) VALUES(50, '三星手机', 2300), (60, '海尔手机', 1800); #正确,一次添加两条数据 -- 7. 如果是给表中的所有字段添加数据,可以不写前面的字段名称 INSERT INTO `goods` VALUES(40, 'IBM手机', 5000); #正确 #(id, goods_name, price)可以不写(即列名可以不写),因为VALUES有三个数据,已经是给所有字段添加数据了 #但是如果 VALUES(40, 'IBM手机'); 只有两条数据,就不行 -- 8. 默认值的使用,当不给某个字段值时,如果有默认值就会添加默认值,否则报错 -- 如果某个列 没有指定 not null ,那么当添加数据时,没有给定值,则会默认给 null INSERT INTO `goods` (id, goods_name) VALUES(80, '格力手机'); #正确,price为null -- 如果我们希望指定某个列的默认值,可以在创建表时指定 -- 比如创建表时,定义price为:price DOUBLE NOT NULL DEFAULT 100,执行上面语句 price 变为 100
9.2 Update 语句
- 基本语法:
- 注意:如果 WHERE 条件不写,那么就是对表的所有的记录都进行修改
- 案例:
- 使用细节:
- 对第 4 条:
9.3 Delete 语句
- 基本语法:
- 案例:
#演示 delete 语句(employee 表沿用上面创建的)
SELECT * FROM `employee`;
-- 删除表中名称为’老妖怪’的记录。
DELETE FROM employee WHERE user_name = '老妖怪'; #有 WHERE 只删除老妖怪
-- 删除表中所有记录, 老师提醒,一定要小心
INSERT INTO employee
VALUES(200, '老妖怪', '1990-12-12', '2000-12-12 12:12:12',
'捶背的', 5000, '给大王捶背', 'd:\\a.jpg'); #先再把老妖怪加进去
DELETE FROM employee;
- 使用细节:
9.4 Select 语句
这一章主要讲的是单表查询,多表查询放到11章,也就是下一个25 MySQL数据库.md文件
9.4.1 基本用法
- 基本语法:
*|column 这个 | 表示 “或者” 的意思
-
案例:
# select 语句【重点、难点】 CREATE TABLE student( id INT NOT NULL DEFAULT 1, `name` VARCHAR(20) NOT NULL DEFAULT '', chinese FLOAT NOT NULL DEFAULT 0.0, english FLOAT NOT NULL DEFAULT 0.0, math FLOAT NOT NULL DEFAULT 0.0 ); INSERT INTO student (id, `name`, chinese, english, math) VALUES(1, '韩顺平', 89, 78, 90); INSERT INTO student (id, `name`, chinese, english, math) VALUES(2, '张飞', 67, 98, 56); INSERT INTO student (id, `name`, chinese, english, math) VALUES(3, '宋江', 87, 78, 77); INSERT INTO student (id, `name`, chinese, english, math) VALUES(4, '关羽', 88, 98, 90); INSERT INTO student (id, `name`, chinese, english, math) VALUES(5, '赵云', 82, 84, 67); INSERT INTO student (id, `name`, chinese, english, math) VALUES(6, '欧阳锋', 55, 85, 45); INSERT INTO student (id, `name`, chinese, english, math) VALUES(7, '黄蓉', 75, 65, 30); SELECT * FROM student; -- 1.查询表中所有学生的信息。 SELECT * FROM student; -- 2.查询表中所有学生的姓名和对应的英语成绩。 SELECT `name`, english FROM student; -- 3.过滤表中重复数据 distinct SELECT DISTINCT english FROM student; #单独显示英语成绩,有重复的就去重 -- 4.要查询的记录,每个字段都相同,才会去重 SELECT DISTINCT `name`, english FROM student; #显示名字、英语成绩,名字和英语成绩相同的才去重
9.4.2 列的运算与别名
- 查询列的运算的基本语法:
- as 起别名语法:
- 案例:
9.4.3 where 语句
where 是用来过滤的(筛选的)
- 在where 子句中经常使用的运算符:
注意:LIKE 的用法,比如某个 student 表有一个 name 字段(列),要找一个姓丁的同学的所有信息。那么对应的语句就是:
SELECT * FROM student WHERE `name` LIKE '丁%' #要在丁后面加 '%'
- 案例:
-- select 语句(沿用student表)
-- 1.查询姓名为赵云的学生成绩
SELECT * FROM student
WHERE `name` = '赵云';
-- 2.查询英语成绩大于90分的同学
SELECT * FROM student
WHERE english > 90;
-- 3.查询总分大于200分的所有同学
SELECT * FROM student
WHERE (chinese + english + math)>200;
9.4.4 课堂练习
-- select 语句(沿用student表)
SELECT * FROM student;
-- 1.查询英语分数在80 -90之间的同学。
SELECT * FROM student
WHERE 90 >= english AND english >= 80;
SELECT * FROM student
WHERE english BETWEEN 80 AND 90; #between ... and ... 是一个闭区间
-- 2.查询数学分数为89,90,91的同学。
SELECT * FROM student
WHERE math = 89 OR math = 90 OR math = 91;
SELECT * FROM student
WHERE math IN (89, 90, 91);
-- 3.查询所有姓张的学生成绩。
SELECT * FROM student
WHERE `name` LIKE '张%';
-- 4.查询数学分>80,语文分>80的同学。
SELECT * FROM student
WHERE math > 80 AND chinese > 80;
-- select 语句(沿用student表)
SELECT * FROM student;
-- 1.查询语文分数在70 -80之间的同学。
SELECT * FROM student
WHERE chinese > 70 AND chinese < 80;
SELECT * FROM student
WHERE chinese BETWEEN 70 AND 80;
-- 2.查询总分为170,190,191的同学。
SELECT * FROM student
WHERE (chinese + english + math) = 170 OR
(chinese + english + math) = 190 OR
(chinese + english + math) = 191;
SELECT * FROM student
WHERE (chinese + english + math) IN (170, 190, 191);
-- 3.查询所有姓李或者姓宋的学生成绩。
SELECT * FROM student
WHERE `name` LIKE '李%' OR `name` LIKE '宋%';
-- 4.查询数学比语文少45分的同学。
SELECT * FROM student
WHERE math = chinese - 45;
9.4.5 order by 语句
order by 语句用于排序查询结果
- 基本语法:
- 课堂练习:
#演示 order by 语句的使用(沿用student表)
-- 1.对数学成绩排序后输出【默认升序】
SELECT * FROM student
ORDER BY math;
-- 2. 对总分按从高到低的顺序输出(降序)
-- 使用别名排序
SELECT `name`, (chinese + english + math) AS total_score FROM student
ORDER BY total_score DESC;
-- 3. 对姓韩的学生成绩排序输出(升序)
-- where + order by
INSERT INTO student (id, `name`, chinese, english, math) VALUES(8, '韩信', 45, 65, 99);
SELECT `name`, (chinese + english + math) AS total_score FROM student
WHERE `name` LIKE '韩%'
ORDER BY total_score;
SELECT * FROM student
WHERE `name` LIKE '韩%'
ORDER BY (chinese + english + math);
10. 函数
10.1 统计函数
1.count 函数:返回行的总数
- 基本语法:
- 案例:
#演示 mysql 的统计函数的使用(沿用student表)
#演示 count 函数
SELECT * FROM student;
-- 1.统计一个班级共有多少学生?
SELECT COUNT(*) FROM student;
-- 2.统计数学成绩大于90的学生有多少个?
SELECT COUNT(*) FROM student
WHERE math > 90;
-- 3.统计总分大于250的人数有多少?
SELECT COUNT(*) FROM student
WHERE (chinese + english + math) > 250;
-- 4.count(*)和count(列)的区别
-- 解释:count(*):返回满足条件的记录的行数
-- count(列):统计满足条件的某列有多少个,但是会排除为 null 的情况
CREATE TABLE t15(
`name` VARCHAR(20));
INSERT INTO t15 VALUES('tom'), ('jack'), ('mary'), (NULL);
SELECT * FROM t15;
SELECT COUNT(*) FROM t15; #输出4,要计null
SELECT COUNT(`name`) FROM t15; #输出3,不计null
2.sum 函数:返回满足 where 条件的行的和。一般使用在数值列。
- 基本语法:
-
案例:
#演示 mysql 的统计函数的使用(沿用student表) #演示 sum 函数 -- 统计一个班级数学总成绩 SELECT SUM(math) FROM student; -- 统计一个班级语文、英语、数学各科的总成绩 SELECT SUM(chinese) AS math_total_score, SUM(english), SUM(math) FROM student; -- 统计一个班级语文、英语、数学的成绩总和 SELECT SUM(chinese + english + math) FROM student; -- 统计一个班级语文成绩平均分 SELECT SUM(chinese)/COUNT(*) FROM student;
3.avg 函数:返回满足 where 条件的一列的平均值。
- 基本语法:
- 案例:
#演示 mysql 的统计函数的使用(沿用student表)
#演示 avg 函数
-- 求一个班级数学平均分
SELECT AVG(math) FROM student;
-- 求一个班级总分平均分
SELECT AVG(chinese + english + math) FROM student;
4.max/min 函数:返回满足 where 条件的一列的最大/最小值。
- 基本语法:
- 案例:
#演示 mysql 的统计函数的使用(沿用student表)
#演示 max/min 函数
-- 求班级最高分和最低分
SELECT MAX(chinese + english + math) AS max_total_score,
MIN(chinese + english + math) AS min_total_score FROM student;
-- 求出班级数学最高分和最低分
SELECT MAX(math), MIN(math) FROM student;
5.group by 语句:对列进行分组。
- 基本语法:
6.having 语句:对分组后的结果进行过滤。通常跟 group by 结合使用。
- 基本语法:
5和6的案例:
#演示 group by + having 语句(创建的表格见资料“雇员系统表”)
-- group by 用于对查询的结果分组统计,having 子句用于限制分组显示结果.
SELECT * FROM dept;
SELECT * FROM emp;
SELECT * FROM salgrade;
-- 1. 如何显示每个部门的平均工资和最高工资
-- 分析:avg(sal) 和 max(sal)
SELECT AVG(sal), MAX(sal), deptno
FROM emp GROUP BY deptno;
-- 2. 显示每个部门的每种岗位的平均工资和最低工资
-- 分析:a.显示每个部门的平均工资和最低工资
SELECT AVG(sal), MIN(sal), deptno
FROM emp GROUP BY deptno;
-- b.显示每个部门、每种岗位的平均工资和最低工资
SELECT AVG(sal), MIN(sal), deptno, job
FROM emp GROUP BY deptno, job;
-- 3.显示平均工资低于2000的部门号和它的平均工资//别名
-- 分析:a.显示各个部门的平均工资和部门号
SELECT AVG(sal), deptno
FROM emp GROUP BY deptno;
-- b.在a的基础上进行过滤,保留 avg(sal) < 2000的
SELECT AVG(sal), deptno
FROM emp GROUP BY deptno
HAVING AVG(sal) < 2000;
-- c.使用别名进行过滤(效率更高,不用像b一样,再次算一个 AVG(sal))
SELECT AVG(sal) AS avg_sal, deptno
FROM emp GROUP BY deptno
HAVING avg_sal < 2000;
10.2 字符串相关函数
#演示字符串相关函数的使用(使用老韩提供的“雇员系统表emp”)
SELECT * FROM emp;
-- CHARSET(str):返回字串字符集
SELECT CHARSET(ename) FROM emp;
-- CONCAT(string2 [,...]):连接字串。将多个列拼接成一列
SELECT CONCAT (ename, ' 的工作是 ', job) FROM emp;
-- INSTR(string, substring):返回substring在string中出现的位置,没有返回0
-- dual 亚元表,系统表 可以作为测试表使用
SELECT INSTR('hanshunping', 'ping') FROM DUAL; #输出:8
-- UCASE(string2):转换成大写
SELECT UCASE(ename) FROM emp; #将ename列全转为大写显示,但是emp中ename实际没变
-- LCASE(string2):转换成小写
SELECT LCASE(ename) FROM emp;
-- LEFT(string2, length ):从string2中的左边起取length个字符
-- RIGHT(string2, length ):从string2中的右边起取length个字符
SELECT LEFT(ename, 2) FROM emp;
SELECT RIGHT(ename, 2) FROM emp;
-- LENGTH(string):string长度[按照字节]
SELECT LENGTH(ename) FROM emp; #返回ename列每一行的字节数
SELECT LENGTH('丁逍') FROM emp; #utf8 一个字母占一个字节,一个汉字占3个字节
-- REPLACE(str, search_str, replace_str):在str中用replace_str替换search_str
-- 如果是manager就替换成中文“经理”
SELECT ename, REPLACE(job, 'MANAGER', '经理') FROM emp;
-- STRCMP (string1, string2):逐字符比较两字串大小,
SELECT STRCMP('hsp', 'hsp') FROM DUAL; #注意这里要看校验规则是否区分大小写,如果不区分,'Hsp'='hsp'
-- SUBSTRING(str, position [,length]):从str的position开始【从1开始计算】,取length个字符。如果不写length,就是截取后面所有的字符
-- 下面这一句就是从ename列的第一个位置开始取出2个字符
SELECT SUBSTRING(ename, 1, 2) FROM emp;
-- LTRIM(string2) RTRIM(string2) TRIM(string):去除前端空格或后端空格
SELECT LTRIM(' 韩顺平教育') FROM DUAL;
SELECT RTRIM('韩顺平教育 ') FROM DUAL;
SELECT TRIM(' 韩顺平教育 ') FROM DUAL;
-- 练习:以首字母小写的形式显示所有员工emp表的姓名
-- 方式1:先把ename的第一个字符取出并变为小写,再与ename后面的字符进行拼接
SELECT CONCAT(LCASE(LEFT(ename, 1)), RIGHT(ename, LENGTH(ename)-1)) #注意这里length是按照字节的,如果有中文就不好
FROM emp;
-- 方式1 老韩的写法
SELECT CONCAT(LCASE(SUBSTRING(ename, 1, 1)), SUBSTRING(ename, 2)) AS new_name
FROM emp;
-- 方式2:
SELECT ename, REPLACE(ename, LEFT(ename, 1), LCASE(LEFT(ename, 1))) FROM emp;
10.3 数学函数
# 演示 数学相关函数 (DUAL 亚元表,可用于测试)
-- ABS(num) 绝对值
SELECT ABS(-20) FROM DUAL; #20
-- BIN(decimal_number):十进制转二进制
SELECT BIN(10) FROM DUAL; #1010
-- CEILING(number2):向上取整,得到比 num2 大的最小整数
SELECT CEILING(2.1) FROM DUAL; #3
SELECT CEILING(-1.1) FROM DUAL; #-1
-- CONV(number2,from_base,to_base):进制转换
-- 下面就是把十进制的7,转化为2进制的7
SELECT CONV(7, 10, 2) FROM DUAL; #111
-- FLOOR(number2):向下取整,得到比 num2 小的最大整数
SELECT FLOOR(2.9) FROM DUAL; #2
-- FORMAT(number,decimal_places):保留小数位数(四舍五入)
SELECT FORMAT(2.45, 1) FROM DUAL; #2.5
SELECT FORMAT(AVG(sal), 2)
FROM emp GROUP BY deptno;
-- HEX(DecimalNumber):转十六进制
-- LEAST(number, number2[,..]):求最小值
SELECT LEAST(0, 1, -1) FROM DUAL; #-1
-- MOD(numerator,denominator):求余
SELECT MOD(10, 3) FROM DUAL; #1
-- RAND([seed]) RAND([seed]):返回随机数 其范围为 0 ≤ v ≤ 1.0
-- 1. 如果使用 rand() 每次返回不同的随机数 ,在 0 ≤ v ≤ 1.0
SELECT RAND() FROM DUAL; #每次执行返回一个随机数
-- 2. 如果使用 rand(seed) 返回随机数, 范围 0 ≤ v ≤ 1.0, 如果 seed 不变,该随机数也不变了
SELECT RAND(3) FROM DUAL; #有一个种子3,每次执行返回的随机数不变
10.4 时间日期
-- 日期时间 相关函数
-- 1.CURRENT_DATE():当前日期,括号可以带可以不带
SELECT CURRENT_DATE() FROM DUAL;
-- 2.CURRENT_TIME():当前时间
SELECT CURRENT_TIME() FROM DUAL;
-- 3.CURRENT_TIMESTAMP():当前时间戳
SELECT CURRENT_TIMESTAMP() FROM DUAL;
-- 创建测试表
CREATE TABLE mes(
id INT,
content VARCHAR(30),
send_time DATETIME);
SELECT * FROM mes;
-- 添加一条记录
INSERT INTO mes
VALUES(1, '北京新闻', CURRENT_TIMESTAMP());
INSERT INTO mes
VALUES(2, '上海新闻', NOW());
INSERT INTO mes
VALUES(3, '广州新闻', NOW());
-- 举实例
-- 4.显示所有新闻信息,发布日期只显示日期,不用显示时间
SELECT id, content, DATE(send_time)
FROM mes;
-- 5.请查询在10分钟内发布的帖子
SELECT *
FROM mes
WHERE DATE_ADD(send_time, INTERVAL 10 MINUTE) >= NOW();
SELECT *
FROM mes
WHERE DATE_SUB(NOW(), INTERVAL 10 MINUTE) <= send_time;
-- 6.请在mysql 的sql语句中求出2011-11-11和1990-1-1相差多少天
SELECT DATEDIFF('2011-11-11', '1990-01-01') FROM DUAL;
-- 时间差
SELECT TIMEDIFF('10:11:11', '06:10:10') FROM DUAL; #按照 小时:分钟:秒数 返回
-- 请用mysql 的sql语句求出你活了多少天。(练习)
SELECT DATEDIFF(NOW(), '1999-01-25') FROM DUAL;
-- 如果你能活80岁,求出你还能活多少天。(练习)
-- 注意:下面这个 year 可以是年月日,时分秒
-- '1999-01-25' 可以是date,datetime,timestamp
SELECT DATEDIFF(DATE_ADD('1999-01-25', INTERVAL 80 YEAR), NOW())
FROM DUAL;
-- YEAR|MONTH|DAY|DATE(datetime)
SELECT YEAR(NOW()) FROM DUAL; #返回年的部分
SELECT YEAR('2013-11-13') FROM DUAL;
SELECT MONTH(NOW()) FROM DUAL; #返回月的部分
SELECT DAY(NOW()) FROM DUAL; #返回天的部分
-- unix_timestamp():返回的是1970-1-1 到现在的一个秒数
SELECT UNIX_TIMESTAMP() FROM DUAL;
-- from_unixtime():可以把一个unix_timestamp秒数(时间戳),转换成指定格式的一个日期
-- 意义:在开发中,可以存放一个整数,然后表示时间,通过 FROM_UNIXTIME 转换
-- '%Y-%m-%d' 格式是规定好的,表示年月日
-- '%H:%i:%s' 格式表示时分秒
SELECT FROM_UNIXTIME(1642752907, '%Y-%m-%d %H:%i:%s') FROM DUAL;
10.5 加密和系统函数
# 演示加密函数和系统函数
-- 1.USER():查询用户
-- 可以查看登录到 mysql 的有哪些用户,以及登录的 IP
SELECT USER() FROM DUAL; #用户@IP地址
-- 2.DATABASE():查询当前使用的数据库名称
SELECT DATABASE();
-- 3.MD5(str):为字符串算出一个 MD5 的一个32的字符串,常用于(用户密码)加密
-- root 密码是 hsp -> 加密 md5 -> 在数据库中存放的是加密后的密码
SELECT MD5('hsp') FROM DUAL;
SELECT LENGTH(MD5('hsp')) FROM DUAL; #MD5 都是32位
-- 演示用户表,存放密码时,是 md5
CREATE TABLE usrs(
id INT,
`name` VARCHAR(32) NOT NULL DEFAULT '',
pwd CHAR(32) NOT NULL DEFAULT '');
INSERT INTO usrs
VALUES(100, '丁逍', MD5('hsp'));
SELECT * FROM usrs;
-- 查询
SELECT * FROM usrs
WHERE `name`='丁逍' AND pwd = 'hsp'; #这样是查不到的,用pwd = MD5('hsp')就能查到
-- 4.PASSWORD(str):加密函数, MySQL 数据库的用户密码就是 PASSWORD 函数加密。
-- 就是说,我们一开始设置的密码hsp,在MySQL中存放的是 PASSWORD('hsp')
SELECT PASSWORD('hsp') FROM DUAL;
-- select * from mysql.user 从原文密码 str 计算并返回密码字符串
-- mysql.user 表示 数据库.表。这就使得不用在左上方切换数据库了
SELECT * FROM mysql.user
-- 通常用于对 mysql 数据库的用户密码加密
10.6 流程控制
# 演示流程控制语句
# 1.IF(expr1,expr2,expr3):如果 expr1 为 True,则返回 expr2,否则返回 expr3
SELECT IF(TRUE, '北京', '上海') FROM DUAL; #北京
# 2.IFNULL(expr1,expr2):如果 expr1 不为空 NULL,则返回 expr1,否则返回 expr2
SELECT IFNULL(NULL, '韩顺平教育') FROM DUAL; #韩顺平教育
SELECT IFNULL('jack', '韩顺平教育') FROM DUAL; #jack
-- #3.SELECT CASE
-- WHEN expr1 THEN expr2
-- WHEN expr3 THEN expr4
-- ELSE expr5 END; [类似多重分支.]
# 如果 expr1 为 TRUE,则返回 expr2。如果 expr3 为 t,则返回 expr4, 否则返回 expr5
SELECT CASE
WHEN TRUE THEN 'jack'
WHEN FALSE THEN 'tom'
ELSE 'mary' END #返回jack
-- 1. 查询 emp 表(前面创建的), 如果 comm 是 null , 则显示 0.0
-- 老师说明,判断是否为 null 要使用 is null(不是=), 判断不为空 使用 is not
SELECT ename, comm FROM emp;
SELECT ename, IF(comm IS NULL, 0.0, comm) #如果comm为null就返回0.0,否则还是comm
FROM emp;
SELECT ename, IFNULL(comm, 0.0)
FROM emp;
-- 2. 如果 emp 表的 job 是 CLERK 则显示 职员, 如果是 MANAGER 则显示经理
-- 如果是 SALESMAN 则显示 销售人员,其它正常显示
SELECT ename, (SELECT CASE
WHEN job = 'CLERK' THEN '职员'
WHEN job = 'MANAGER' THEN '经理'
WHEN job = 'SALESMAN' THEN '销售人员'
ELSE job END) AS 'job'
FROM emp;
" style=“zoom:80%;” />
# 演示流程控制语句
# 1.IF(expr1,expr2,expr3):如果 expr1 为 True,则返回 expr2,否则返回 expr3
SELECT IF(TRUE, '北京', '上海') FROM DUAL; #北京
# 2.IFNULL(expr1,expr2):如果 expr1 不为空 NULL,则返回 expr1,否则返回 expr2
SELECT IFNULL(NULL, '韩顺平教育') FROM DUAL; #韩顺平教育
SELECT IFNULL('jack', '韩顺平教育') FROM DUAL; #jack
-- #3.SELECT CASE
-- WHEN expr1 THEN expr2
-- WHEN expr3 THEN expr4
-- ELSE expr5 END; [类似多重分支.]
# 如果 expr1 为 TRUE,则返回 expr2。如果 expr3 为 t,则返回 expr4, 否则返回 expr5
SELECT CASE
WHEN TRUE THEN 'jack'
WHEN FALSE THEN 'tom'
ELSE 'mary' END #返回jack
-- 1. 查询 emp 表(前面创建的), 如果 comm 是 null , 则显示 0.0
-- 老师说明,判断是否为 null 要使用 is null(不是=), 判断不为空 使用 is not
SELECT ename, comm FROM emp;
SELECT ename, IF(comm IS NULL, 0.0, comm) #如果comm为null就返回0.0,否则还是comm
FROM emp;
SELECT ename, IFNULL(comm, 0.0)
FROM emp;
-- 2. 如果 emp 表的 job 是 CLERK 则显示 职员, 如果是 MANAGER 则显示经理
-- 如果是 SALESMAN 则显示 销售人员,其它正常显示
SELECT ename, (SELECT CASE
WHEN job = 'CLERK' THEN '职员'
WHEN job = 'MANAGER' THEN '经理'
WHEN job = 'SALESMAN' THEN '销售人员'
ELSE job END) AS 'job'
FROM emp;