MySQL数据库3

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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值