Mysql基础刷题-cnblog

Mysql刷题

MySQL刷题核心知识点总结

一、查询去重

两种方式,按需选择

  1. DISTINCT:单纯去重,仅过滤重复行,无法统计
SELECT DISTINCT university FROM user_profile;
  1. GROUP BY:分组去重,可搭配聚合函数统计,刷题更常用
-- 只去重
SELECT university FROM user_profile GROUP BY university;
-- 分组+统计数量
SELECT university, COUNT(*) AS user_count FROM user_profile GROUP BY university;

二、空值判断(重点易错)

  1. 判断字段为null:IS NULL
  2. 判断字段不为null:IS NOT NULL
  3. ❌ 禁止使用 = NULL / != NULL,null不能用等号匹配
  4. 同时排除null和空字符串:WHERE name IS NOT NULL AND name != ''
  5. 剔除全空格数据:WHERE TRIM(name) != ''

三、IN 查询与优化

  1. 基础用法:匹配多个值
SELECT * FROM user WHERE id IN (1,2,3);
  1. 优化方案
  • 少量常量值:给IN条件字段建索引
  • 大量常量(几百上千):改用临时表JOIN
  • IN (子查询):优先替换EXISTSINNER JOIN + DISTINCT
  • NOT IN 有NULL会失效,强制替换NOT EXISTS

四、SELECT 字段起别名

  1. 两种写法,AS可省略
-- AS规范写法
SELECT ROUND(avg(gpa),1) AS avg_gpa FROM user_profile;
-- 简写空格
SELECT ROUND(avg(gpa),1) avg_gpa FROM user_profile;
  1. 别名带空格/中文:用反引号 `别名`
  2. 执行顺序规则:
    • WHERE 不能使用SELECT别名
    • GROUP BY、ORDER BY 可以直接使用别名

五、聚合函数 & 控制小数位数

常用聚合:COUNT、AVG、MAX、MIN、SUM

  1. AVG 平均值保留1位小数(四舍五入,刷题首选)
ROUND(AVG(active_days_within_30), 1) AS avg_active_day
  1. 其他小数函数
  • TRUNCATE(值,1):直接截断,不四舍五入
  • FORMAT(值,1):格式化带千分位,返回字符串,不适合计算

示例:

SELECT COUNT(gender) male_num, ROUND(AVG(gpa),1) avg_gpa
FROM user_profile WHERE gender='male';

六、排序 ORDER BY

  1. ASC:升序(从小到大),默认省略不写也是升序
  2. DESC:降序(从大到小)
  3. 多字段排序:依次指定排序规则
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;

十、补充小考点

  1. 限制返回行数:LIMIT n,放在SQL最后
SELECT * FROM user LIMIT 10;
  1. 去重+非空结合使用
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 偏移量, 条数;

各分句作用

  1. SELECT DISTINCT:指定要查询的列、计算表达式、去重、起别名
  2. FROM ... JOIN ... ON:确定数据源、多表关联
  3. WHERE:原始数据行过滤(不能用聚合函数、不能用 select 别名
  4. GROUP BY:按照字段分组,配合聚合函数
  5. HAVING:分组后的聚合结果过滤(可以用聚合函数、可以用 select 别名
  6. ORDER BY:对最终结果排序,支持别名
  7. LIMIT:限制返回行数,永远写最后

书写顺序:SELECT → FROM → JOIN → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT

执行顺序:FROM/JOIN → WHERE → GROUP BY → 聚合计算 → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT

posted @ 2026-07-26 22:18  alij  阅读(2)  评论(0)    收藏  举报