1. CASE语句语法规范
-- 语法错误修正:case_value应为具体列名
SELECT *,
CASE s_sex
WHEN '男' THEN '强人所难'
WHEN '女' THEN '美女'
ELSE '未知'
END AS '性别'
FROM t_student;
2. 两种CASE写法对比
类型 | 语法 | 适用场景 |
---|---|---|
简单CASE | CASE 列名 WHEN 值1 THEN 结果1... | 等值判断 |
搜索CASE | CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2... | 范围判断或复杂条件 |
常用聚合函数对比表
函数 | 作用 | NULL处理规则 | 典型错误 |
---|---|---|---|
SUM() | 求和 | 忽略NULL | SELECT *, SUM(c_id) FROM t_class ❌ |
AVG() | 平均值 | 忽略NULL | SELECT AVG(c_id) FROM t_class WHERE 1=2 → 返回NULL ✅ |
COUNT() | 计数 | COUNT(*) 统计所有行 | COUNT(s_score) 忽略NULL |
MAX() | 最大值 | 忽略NULL | SELECT MAX(c_id), * FROM t_class ❌ |
聚合函数使用要点
-- 正确写法:聚合列与非聚合列必须明确分离
SELECT
s_sex,
COUNT(*) AS '人数',
AVG(s_score) AS '平均分'
FROM t_student
GROUP BY s_sex;
1. GROUP BY核心规则
场景 | 正确写法 | 错误示例 |
---|---|---|
单列分组 | GROUP BY s_sex | SELECT * GROUP BY s_sex ❌ |
多列分组 | GROUP BY s_sex, s_address | GROUP BY s_sex OR s_address ❌ |
HAVING筛选 | GROUP BY ... HAVING AVG(score) > 60 | WHERE AVG(score) > 60 ❌ |
SQL执行顺序(SFWGHO原则)
1. **S**ELECT → 2. **F**ROM → 3. **W**HERE →
4. **G**ROUP BY → 5. **H**AVING → 6. **O**RDER BY
-- 统计各省份男生人数(过滤空值)
SELECT
s_address AS '省份',
COUNT(*) AS '男生人数'
FROM t_student
WHERE s_sex = '男'
AND s_address IS NOT NULL
GROUP BY s_address
HAVING COUNT(*) > 5
ORDER BY 男生人数 DESC;
NULL判断方法
-- 查找空值(原注释正确)
SELECT * FROM t_student WHERE s_score IS NULL;
-- 统计有效成绩人数
SELECT COUNT(s_score) FROM t_student; -- 忽略NULL