Mysql基础刷题-cnblog
Mysql刷题
MySQL刷题核心知识点总结
一、查询去重
两种方式,按需选择
DISTINCT:单纯去重,仅过滤重复行,无法统计
SELECT DISTINCT university FROM user_profile;
GROUP BY:分组去重,可搭配聚合函数统计,刷题更常用
-- 只去重
SELECT university FROM user_profile GROUP BY university;
-- 分组+统计数量
SELECT university, COUNT(*) AS user_count FROM user_profile GROUP BY university;
二、空值判断(重点易错)
- 判断字段为null:
IS NULL - 判断字段不为null:
IS NOT NULL - ❌ 禁止使用
= NULL / != NULL,null不能用等号匹配 - 同时排除null和空字符串:
WHERE name IS NOT NULL AND name != '' - 剔除全空格数据:
WHERE TRIM(name) != ''
三、IN 查询与优化
- 基础用法:匹配多个值
SELECT * FROM user WHERE id IN (1,2,3);
- 优化方案
- 少量常量值:给IN条件字段建索引
- 大量常量(几百上千):改用临时表JOIN
IN (子查询):优先替换EXISTS或INNER JOIN + DISTINCTNOT IN有NULL会失效,强制替换NOT EXISTS
四、SELECT 字段起别名
- 两种写法,AS可省略
-- AS规范写法
SELECT ROUND(avg(gpa),1) AS avg_gpa FROM user_profile;
-- 简写空格
SELECT ROUND(avg(gpa),1) avg_gpa FROM user_profile;
- 别名带空格/中文:用反引号
`别名` - 执行顺序规则:
- WHERE 不能使用SELECT别名
- GROUP BY、ORDER BY 可以直接使用别名
五、聚合函数 & 控制小数位数
常用聚合:COUNT、AVG、MAX、MIN、SUM
AVG平均值保留1位小数(四舍五入,刷题首选)
ROUND(AVG(active_days_within_30), 1) AS avg_active_day
- 其他小数函数
TRUNCATE(值,1):直接截断,不四舍五入FORMAT(值,1):格式化带千分位,返回字符串,不适合计算
示例:
SELECT COUNT(gender) male_num, ROUND(AVG(gpa),1) avg_gpa
FROM user_profile WHERE gender='male';
六、排序 ORDER BY
ASC:升序(从小到大),默认省略不写也是升序DESC:降序(从大到小)- 多字段排序:依次指定排序规则
GROUP BY university,gender
ORDER BY gender ASC, university ASC;
七、模糊查询 LIKE
_:匹配单个任意字符%:匹配任意长度任意字符(贪心匹配)
八、多表联合查询(等值连接)
隐式连接写法(逗号分隔表 + WHERE关联条件)
SELECT u.device_id, q.question_id, q.result
FROM user_profile u, question_practice_detail q
WHERE u.device_id = q.device_id AND u.university='浙江大学';
规范显式写法:INNER JOIN ... ON
SELECT u.device_id, q.question_id, q.result
FROM user_profile u
INNER JOIN question_practice_detail q
ON u.device_id = q.device_id
WHERE u.university='浙江大学';
九、综合刷题完整示例(分组+聚合+小数+排序+别名)
需求:统计每个学校、每种性别的用户数、平均活跃天数、平均发帖数,小数保留1位,升序排序
SELECT
university,
gender,
COUNT(*) AS user_num,
ROUND(AVG(active_days_within_30),1) AS avg_active_day,
ROUND(AVG(question_cnt),1) AS avg_question_cnt
FROM user_profile
GROUP BY university, gender
ORDER BY gender ASC, university ASC;
十、补充小考点
- 限制返回行数:
LIMIT n,放在SQL最后
SELECT * FROM user LIMIT 10;
- 去重+非空结合使用
SELECT DISTINCT address AS user_addr
FROM user
WHERE address IS NOT NULL AND TRIM(address) != '';
执行顺序
SELECT DISTINCT 字段/表达式 AS 别名
FROM 表1 表别名
[INNER/LEFT/RIGHT JOIN 表2 ON 关联条件]
WHERE 行过滤条件
GROUP BY 分组字段
HAVING 分组后聚合过滤
ORDER BY 排序字段 ASC/DESC
LIMIT 偏移量, 条数;
各分句作用
SELECT DISTINCT:指定要查询的列、计算表达式、去重、起别名FROM ... JOIN ... ON:确定数据源、多表关联WHERE:原始数据行过滤(不能用聚合函数、不能用 select 别名)GROUP BY:按照字段分组,配合聚合函数HAVING:分组后的聚合结果过滤(可以用聚合函数、可以用 select 别名)ORDER BY:对最终结果排序,支持别名LIMIT:限制返回行数,永远写最后
书写顺序:SELECT → FROM → JOIN → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT
执行顺序:FROM/JOIN → WHERE → GROUP BY → 聚合计算 → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT

浙公网安备 33010602011771号