mysql条件判断函数

建表 sql 如下

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for score
-- ----------------------------
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `sex` tinyint(255) NOT NULL,
  `age` int(11) NOT NULL,
  `score` bigint(255) NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of score
-- ----------------------------
INSERT INTO `score` VALUES (1, '龙傲天', 1, 16, 90);
INSERT INTO `score` VALUES (2, '赵日天', 1, 14, 58);
INSERT INTO `score` VALUES (3, '叶良辰', 1, 17, 54);
INSERT INTO `score` VALUES (4, '武媚娘', 0, 22, 72);
INSERT INTO `score` VALUES (5, '甄姬', 0, 36, 78);
INSERT INTO `score` VALUES (6, '徐胜虎', 1, 20, 98);

SET FOREIGN_KEY_CHECKS = 1;

CASE WHEN 条件判断

CASE WHEN 语句能在 SQL 语句中织入判断逻辑, 类似于 Java 中的 if else 语句。它分为简单函数和条件表达式

简单函数

-- 如果字段值等于预期值,则返回结果 1,否则返回结果 2
CASE 字段 WHEN 预期值 THEN 结果1 ELSE 结果2 END

下面通过一个简单的示例来看一下具体用法,表 score

需求说明:在 score 表中,sex = 1 表示男性,sex = 0 表示女性,查询时转换成汉字显示

SELECT `name`,
	( CASE sex WHEN 0 THEN '女' ELSE '男' END ) AS sex 
FROM
	score

结果如下

在这里插入图片描述

条件表达式

-- 如果该判断结果为 true,那么 CASE 语句将返回 '结果1',否则返回 '结果2',如果没有 ELSE,则返回 null
-- CASE 与 END 之间可以有多个 WHEN… THEN… ELSE 语句。END 表示 CASE 语句结束
CASE 
    WHEN 条件判断 THEN 结果1  ELSE 结果2
END

下面通过一个简单的示例来看一下具体用法,表 score

需求说明:score 大于等于 90 为优秀,80~90 为良好,60~80 为及格,小于 60 为不及格,用 SQL 语句统计出每个学生的成绩级别

SELECT NAME, score,
	( CASE 
			WHEN score >= 90 THEN '优秀' 
			WHEN score >= 80 THEN '良好' 
			WHEN score >= 60 THEN '及格' ELSE '不及格' END 
    ) AS LEVEL 
FROM
    score

结果如下

在这里插入图片描述

结合使用

CASE WHEN 和聚合函数综合使用,能实现更加复杂的统计功能

下面通过一个简单的示例来看一下具体用法,表 score

需求说明:在 score 表中,统计有多少个男生和女生以及男女生及格的各有多少个

SELECT
    SUM( CASE WHEN sex = 0 THEN 1 ELSE 0 END ) AS 女生人数,
    SUM( CASE WHEN sex = 1 THEN 1 ELSE 0 END ) AS 男生人数,
    SUM( CASE WHEN score >= 60 AND sex = 0 THEN 1 ELSE 0 END ) 男生及格人数,
    SUM( CASE WHEN score >= 60 AND sex = 1 THEN 1 ELSE 0 END ) 女生及格人数 
FROM
	score

结果如下

在这里插入图片描述

IF 条件判断

-- expr 是一个条件表达式,如果结果为 true,则返回 result_true,否则返回 result_false
IF(expr, result_true, result_false)

使用示例

SELECT
    `name`,
    IF( sex = 1, '男', '女' ) AS sex 
FROM
    score

结果如下

在这里插入图片描述
可以看出,在一些场景中,IF 函数和 CASE WHEN 是有同样效果的,IF 函数相对简单,CASE WHEN 能应对更复杂的判断。另外,IF 函数还可以和聚合函数结合

例如查询班级男生女生分别有多少人

SELECT
    SUM(IF( sex = 1, 1, NULL )) AS 男生人数,
    SUM(IF( sex = 0, 1, NULL )) AS 女生人数 
FROM
    score

结果如下

在这里插入图片描述

IF NULL 条件判断

我们希望在 SQL 中做一些处理,如果查询结果是 NULL,就转换为特定的值,这就要用到 mysqlIF NULL 函数

SQL一般写法是这样的

SELECT price FROM goods WHERE name = 'light'

使用 IF NULL 函数改写一下

SELECT IFNULL(price, 0) price FROM goods WHERE name = 'light'

但使用 IF NULL 语句,如果 where 条件中的 name 值是不存在的,那么仍将返回 NULL

IF NULL 函数结合聚合函数使用

-- 返回结果:0
SELECT IFNULL(SUM(price), 0) FROM goods WHERE status = 3

其他 AVG、COUNT 等用同样方式处理,而且无论 where 条件存在不存在,结果都是会返回 0

猜你喜欢

转载自blog.csdn.net/weixin_38192427/article/details/115190457