建表 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
,就转换为特定的值,这就要用到 mysql
中 IF 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
的