MySQL学习要点(10/10)

  • 第九节.流程控制
    • 0) CASE WHEN概述
      • ● 简单 CASE 函数
      • ● CASE 搜索函数
    • 1) CASE结构作为表达式
    • 2) CASE结构作为独立的语句
    • 3) 循环结构
      • ● WHILE
      • ● REPEAT
      • ● LOOP
      • ● LEAVE语句
      • ● ITERATE语句
    • 4) IF...THEN...语句

第九节.流程控制

0) CASE WHEN概述

CASE WHEN语句,用于计算条件列表并返回多个可能结果表达式之一。
CASE 具有两种格式:
简单 CASE 函数将某个表达式与一组简单表达式进行比较以确定结果。
CASE 搜索函数计算一组布尔表达式以确定结果。
两种格式都支持可选的 ELSE 参数。
语法如下:

● 简单 CASE 函数

CASE input_expression
WHEN when_expression THENresult_expression [...n ] [
ELSEelse_result_expression
END

参数介绍:
input_expression是使用简单 CASE 格式时所计算的表达式。Input_expression 是任何有效的 Microsoft SQL Server 表达式。
WHEN when_expression使用简单 CASE 格式时 input_expression 所比较的简单表达式。When_expression 是任意有效的 SQL Server 表达式。Input_expression 和每个 when_expression 的数据类型必须相同,或者是隐性转换。
占位符,表明可以使用多个 WHEN when_expression THEN result_expression 子句或 WHEN Boolean_expression THEN result_expression 子句。
THEN result_expression 当 input_expression = when_expression 取值为 TRUE,或者 Boolean_expression 取值 TRUE 时返回的表达式。
result expression 是任意有效的 SQL Server 表达式。
ELSE else_result_expression当比较运算取值不为 TRUE 时返回的表达式。如果省略此参数并且比较运算取值不为 TRUE,CASE 将返回 NULL 值。else_result_expression 是任意有效的 SQL Server 表达式。else_result_expression 和所有 result_expression 的数据类型必须相同,或者必须是隐性转换。

返回值介绍:

计算 input_expression,然后按指定顺序对每个 WHEN 子句的 input_expression = when_expression 进行计算。
返回第一个取值为 TRUE 的 (input_expression = when_expression) 的 result_expression。如果没有取值为 TRUE 的 input_expression = when_expression,则当指定 ELSE 子句时 SQL Server 将返回 else_result_expression;若没有指定 ELSE 子句,则返回 NULL 值。

#案例1: 在 SELECT 语句中,简单 CASE 函数仅检查是否相等,而不进行其它比较。

SELECTCASE parent_idWHEN 0 THEN '00'WHEN 1 THEN '11'ELSE 'OTHERS'END AS parent_id_new ,parent_id ,type_id ,type_name
FROM tdb_goods_types#另外一个例子
SELECTNAME '英雄',CASE NAMEWHEN '德莱文' THEN '斧子'WHEN '德玛西亚-盖伦' THEN '大宝剑'WHEN '暗夜猎手-VN' THEN '弩'ELSE '无'END '装备'
FROMuser_info;'result:
+---------------------------+
|英雄         |    装备     |
+---------------------------+
|德莱文            |    斧子     |
|德玛西亚-盖伦    |    大宝剑    |
|暗夜猎手-VN    |    弩  |
+---------------------------+'

● CASE 搜索函数

CASE
WHEN Boolean_expression THENresult_expression [...n ] [
ELSEelse_result_expression
END

参数介绍:
WHEN Boolean_expression 使用 CASE 搜索格式时所计算的布尔表达式。Boolean_expression 是任意有效的布尔表达式。结果类型从 result_expressions 和可选 else_result_expression 的类型集合中返回最高的优先规则类型。有关更多信息,请参见数据类型的优先顺序。

返回值介绍:
按指定顺序为每个 WHEN 子句的 Boolean_expression 求值。返回第一个取值为 TRUE 的 Boolean_expression 的 result_expression。
如果没有取值为 TRUE 的 Boolean_expression,则当指定 ELSE 子句时 SQL Server 将返回 else_result_expression;若没有指定 ELSE 子句,则返回 NULL 值。

#案例2 在 SELECT 语句中,CASE 搜索函数允许根据比较值在结果集内对值进行替换。

SELECTCASEWHEN parent_id < 3 THEN '<3'WHEN parent_id >= 3 AND parent_id < 5 THEN '>=3 && <5'ELSE '>=5'END AS parent_id_new ,
parent_id ,type_id ,type_name
FROM tdb_goods_types#另外一个例子
# when 表达式中可以使用 and 连接条件
SELECTNAME '英雄',age '年龄',CASEWHEN age < 18 THEN '少年'WHEN age < 30 THEN '青年'WHEN age >= 30 AND age < 50 THEN '中年'ELSE '老年'END '状态'
FROM user_info;'result:
+-----------------------------------+
|英雄         |    年龄     |状态     |
+-----------------------------------+
|德莱文            |    33     |中年     |
|德玛西亚-盖伦    |    17     |青年 |
|暗夜猎手-VN    |    19     |少年 |
+-----------------------------------+'

原文链接:https://blog.csdn.net/helloxiaozhe/article/details/78124138

#案例3 可以在WHERE 子句中使用 CASE。或者在 GROUP BY 子句中使用 CASE。使用CASE WHEN进行字符串替换处理。

SELECTCASEWHEN parent_id < 3 THEN '<3'WHEN parent_id >= 3 AND parent_id < 5 THEN '>=3 && <5'ELSE '>=5'END AS parent_id_new ,
count(*) AS num_count ,
parent_id ,type_id ,type_name
FROM tdb_goods_types
GROUP BY parent_id_new
ORDER BY num_count

#案例4 聚合函数 sum 配合 case when 的简单函数实现多表 left join 的行转列。学生表/课程表/成绩表 ,三个表left join查询每个学生所有科目的成绩,使每个学生及其各科成绩一行展示。

SELECTst.stu_id '学号',st.stu_name '姓名',sum(CASE co.course_nameWHEN '大学语文' THEN sc.scoresELSE 0END) '大学语文',sum(CASE co.course_nameWHEN '新视野英语' THEN sc.scoresELSE 0END) '新视野英语',sum(CASE co.course_nameWHEN '离散数学' THEN sc.scoresELSE 0END) '离散数学',sum(CASE co.course_nameWHEN '概率论与数理统计' THEN sc.scoresELSE 0END) '概率论与数理统计',sum(CASE co.course_nameWHEN '线性代数' THEN sc.scoresELSE 0END) '线性代数',sum(CASE co.course_nameWHEN '高等数学' THEN sc.scoresELSE 0END) '高等数学'
FROM edu_student st
LEFT JOIN edu_score sc ON st.stu_id = sc.stu_id
LEFT JOIN edu_courses co ON co.course_no = sc.course_no
GROUP BY st.stu_id
ORDER BY NULL;#是一种优化,是强制对查询结果禁用排序#注释:如果不做判断,则无法区分课程对应的分数,结果是所有课程分数是一样的。例如
SELECTst.stu_id '学号',st.stu_name '姓名',sc.scores as '大学语文',sc.scores  as '新视野英语'
FROMedu_student st
LEFT JOIN edu_score sc ON st.stu_id = sc.stu_id
LEFT JOIN edu_courses co ON co.course_no = sc.course_no
GROUP BYst.stu_id
#group by如果不加,则只能查询到1001这个人,而且课程对应的分数完全不对,为一列的和,有的课程出现0的情况。
ORDER BYNULL;

附录:

#行转列测试数据
-- 创建表  学生表
CREATE TABLE `edu_student` (`stu_id` VARCHAR (16) NOT NULL COMMENT '学号',`stu_name` VARCHAR (20) NOT NULL COMMENT '学生姓名',PRIMARY KEY (`stu_id`)
) COMMENT = '学生表' ENGINE = INNODB;-- 课程表
CREATE TABLE `edu_courses` (`course_no` VARCHAR (20) NOT NULL COMMENT '课程编号',`course_name` VARCHAR (100) NOT NULL COMMENT '课程名称',PRIMARY KEY (`course_no`)
) COMMENT = '课程表' ENGINE = INNODB;-- 成绩表
CREATE TABLE `edu_score` (`stu_id` VARCHAR (16) NOT NULL COMMENT '学号',`course_no` VARCHAR (20) NOT NULL COMMENT '课程编号',`scores` FLOAT NULL DEFAULT NULL COMMENT '得分',PRIMARY KEY (`stu_id`, `course_no`)
) COMMENT = '成绩表' ENGINE = INNODB;-- 插入数据-- 学生表数据INSERT INTO edu_student (stu_id, stu_name)
VALUES('1001', '盲僧'),('1002', '赵信'),('1003', '皇子'),('1004', '寒冰'),('1005', '蛮王'),('1006', '狐狸');-- 课程表数据
INSERT INTO edu_courses (course_no, course_name)
VALUES('C001', '大学语文'),('C002', '新视野英语'),('C003', '离散数学'),('C004','概率论与数理统计'),('C005', '线性代数'),('C006', '高等数学');-- 成绩表数据
INSERT INTO edu_score (stu_id, course_no, scores)
VALUES('1001', 'C001', 67), ('1002', 'C001', 68),   ('1003', 'C001', 69),   ('1004', 'C001', 70),   ('1005', 'C001', 71),('1006', 'C001', 72),  ('1001', 'C002', 87),   ('1002', 'C002', 88),   ('1003', 'C002', 89),   ('1004', 'C002', 90),('1005', 'C002', 91),  ('1006', 'C002', 92),   ('1001', 'C003', 83),   ('1002', 'C003', 84),   ('1003', 'C003', 85),('1004', 'C003', 86),  ('1005', 'C003', 87),   ('1006', 'C003', 88),   ('1001', 'C004', 88),   ('1002', 'C004', 89),('1003', 'C004', 90),  ('1004', 'C004', 91),   ('1005', 'C004', 92),   ('1006', 'C004', 93),   ('1001', 'C005', 77),('1002', 'C005', 78),  ('1003', 'C005', 79);

1) CASE结构作为表达式

情况1 位于Begin end中

case 表达式
when 值1 then 值1
when 值2 then 值2
…
else 值n
end ;

#案例1:根据英雄名字返回使用的武器

SELECTNAME '英雄',CASE NAMEWHEN '德莱文' THEN '斧子'WHEN '德玛西亚-盖伦' THEN '大宝剑'WHEN '暗夜猎手-VN' THEN '弩'ELSE '无'END '装备'
FROMuser_info;

情况2 位于Begin end外面

case
when 条件1 then 值1
when 条件2 then 值2
…
else 值n
end ;

#案例2:创建函数,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D

DELIMITER $
CREATE FUNCTION test_case(score FLOAT) RETURNS CHAR
BEGINDECLARE ch CHAR DEFAULT 'A';CASEWHEN score>90 THEN SET ch='A';WHEN score>80 THEN SET ch='B';WHEN score>60 THEN SET ch='C';ELSE SET ch='D';END CASE; RETURN ch;
END$#调用举例
SELECT test_case(87)$

2) CASE结构作为独立的语句

情况1 位于Begin end中

case 表达式
when 值1 then 语句1;
when 值2 then 语句2;
…
else 语句n;
end case;

情况2 位于Begin end中

case
when 条件1 then 语句1;
when 条件2 then 语句2;
…
else 语句n;
end case;

3) 循环结构

以下语句均位于Begin end中。

● WHILE

先判断后执行

Label:while loop_condition
do
loop_list
End while label;
#案例:批量插入,根据次数插入到admin表中多条记录(要求的表没有创建,需要重新建表,懒得整了--,)
DELIMITER $
DROP PROCEDURE pro_while1$
CREATE PROCEDURE pro_while1(IN insertCount INT)
BEGINDECLARE i INT DEFAULT 1;WHILE i<=insertCount DOINSERT INTO admin(username,`password`) VALUES(CONCAT('Rose',i),'666');SET i=i+1;END WHILE;END $CALL pro_while1(5);

● REPEAT

先执行后判断

Label:repeat
loop_list
Until end_condition
end repeat label;

● LOOP

没有条件的死循环

Label:loop
loop_list
End loop label;

● LEAVE语句

leave 类似于 break,跳出,结束当前所在的循环

#案例:批量插入,根据次数插入到admin表中多条记录,如果次数>20则停止
TRUNCATE TABLE admin;
DROP PROCEDURE test_while1;
CREATE PROCEDURE test_while1(IN insertCount INT)
BEGINDECLARE i INT DEFAULT 1;a:WHILE i<=insertCount DOINSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');IF i>=20 THEN LEAVE a;END IF;SET i=i+1;END WHILE a;
END $CALL test_while1(100);

● ITERATE语句

iterate类似于 continue,继续,结束本次循环,继续下一次

#案例:批量插入,根据次数插入到admin表中多条记录,只插入偶数次
TRUNCATE TABLE admin$
DROP PROCEDURE test_while1$
CREATE PROCEDURE test_while1(IN insertCount INT)
BEGINDECLARE i INT DEFAULT 0;a:WHILE i<=insertCount DOSET i=i+1;IF MOD(i,2)!=0 THEN ITERATE a;END IF;INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');END WHILE a;
END $CALL test_while1(100)$

4) IF…THEN…语句

#案例1:创建函数,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D

DELIMITER $
CREATE FUNCTION test_if(score FLOAT) RETURNS CHAR
BEGINDECLARE ch CHAR DEFAULT 'A';IF score>90 THEN SET ch='A';ELSEIF score>80 THEN SET ch='B';ELSEIF score>60 THEN SET ch='C';ELSE SET ch='D';END IF;RETURN ch;
END$SELECT test_if(87)$

#案例2:创建存储过程,如果工资<2000,则删除,如果5000>工资>2000,则涨工资1000,否则涨工资500

DELIMITER $
CREATE PROCEDURE test_if_pro(IN sal DOUBLE)
BEGINIF sal<2000 THEN DELETE FROM employees WHERE employees.salary=sal;ELSEIF sal>=2000 AND sal<5000 THEN UPDATE employees SET salary=salary+1000 WHERE employees.`salary`=sal;ELSE UPDATE employees SET salary=salary+500 WHERE employees.`salary`=sal;END IF;
END $CALL test_if_pro(2100);

MySQL学习要点(10/10)相关推荐

  1. mysql学习【第10篇】:数据库之索引与慢查询优化

    mysql之索引原理与慢查询优化 一.介绍 1.什么是索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还 ...

  2. Mysql学习总结(10)——MySql触发器使用讲解

    2019独角兽企业重金招聘Python工程师标准>>> 触发器(TRIGGER)是由事件来触发某个操作.这些事件包括INSERT语句.UPDATE语句和DELETE语句.当数据库系统 ...

  3. MySQL 学习笔记(10)—— 联结表

    1. 联结表

  4. 小白终是踏上了这条不归路----小文的mysql学习笔记目录

    ** 小文的学习笔记正在每日连载当中 为了方便观察,小文在练习的时候用的是图形化工具SQLyog然后用共用到两张表,employees表和girls表. 如果有需要该软件和上述两张表的兄弟可以 关注 ...

  5. SpringCloud Alibaba 学习圣经,10万字实现 SpringCloud 自由

    40岁老架构师尼恩的掏心窝: 现在拿到offer超级难,甚至连面试电话,一个都搞不到. 尼恩的技术社群中(50+),很多小伙伴凭借 "左手云原生+右手大数据 +SpringCloud Ali ...

  6. launchctl mysql_Mac Yosemite 10.10 下利用 Launchctl 自启动 mysql

    由于目前MYSQL官方dmg安装包,只有10.9系统的安装包.如下图: 在10.10安装MYSQL的话,如果在dmg安装页面选择了"开机启动"则会,安装出错,只有取消勾选,才可安装 ...

  7. 免费学习编程的10个好工具

    互联网时代的快速发展,很多人都在学习编程技术,小编今天为大家推荐的就是学习编程技术会用到的一些编程工具,免费学习编程的10个好工具!希望能够帮助到正在学习的小伙伴们. 免费学习编程的10个好工具: 1 ...

  8. 2019学习Python的10个原因

    如果你经常关注我,那你可能想知道为什么我要写一篇文章来告诉你们学习Python?但是几年前我曾向你们说过Java比Python更具有优势,哦,这就尴尬了,但确实,这几年情况有所改变,在2016年,Py ...

  9. 学习新技术的10个建议

    学习新技术的10个建议 作者: Pavan Podila  来源: 伯乐在线  发布时间: 2013-07-21 12:09  阅读: 3050 次  推荐: 44   原文链接   [收藏]   英 ...

最新文章

  1. python绘制条形图-python matplotlib库绘制条形图练习题
  2. 成为一名JAVA高级工程师你需要学什么
  3. mysql在linux只有用空密码_在Linux服务器上配置phpMyAdmin--允许空密码
  4. 如何在VMware Player中设置和安装Windows Home Server“ Vail”
  5. 【POJ - 2398】Toy Storage (计算几何,二分找位置,叉积,点和直线的位置关系)
  6. 牛津、剑桥、OpenAI联合发出AI预警《人工智能的恶意使用》
  7. 【Paper-Attack】MGA:Momentum Gradient Attack on Network
  8. 计算机网络八校联考试题,2019届高三信息技术3月联考试卷有解析与答案
  9. 字节跳动Java面试题、笔试题(含答案)
  10. 固态硬盘开盘数据恢复的方法
  11. 常见的HTPP状态码
  12. Rust-WebAssembly 开发者布道师招聘
  13. WPF框架剖析(从头开始自己写WPF框架)
  14. AutomationAnywhere(AA)实现读取Excel文件
  15. 新版DedeCMS采集发布插件教程工具
  16. N多计算机精品免费视频下载
  17. iphone怎在计算机硬盘打开,如何将数据从iPhone备份到计算机硬盘驱动器的详细方法...
  18. Windows 主机连接校园网时,VMware 虚拟机使用 NAT 模式
  19. ubuntu mini2440 usb
  20. windows远程连接redis

热门文章

  1. 物料搬运装置及控制系统设计(CAD+PLC)
  2. 漫步英伦14:雾里看花都柏林
  3. G4Studio开源平台简介
  4. 微信不是万能的,流量也不是O2O的核心
  5. RabbitMQ:MessageConverter消息转换器
  6. Cisco IP Phone XML Object Definitions
  7. JAVA--word等文件转PDF工具类
  8. ZZULIOJ:1049: 平方和与立方和
  9. 二元函数对xy同时求导_复变函数学习笔记(5)
  10. CDH gateway 不适用