SQL语句复习笔记

Posted by MinnanH on November 20, 2024

复习链接

SQL 综合语句示例

以下 SQL 语句综合了几乎所有基础知识点,包含多表连接、条件筛选、分组、排序、聚合函数、嵌套查询、别名等内容。帮助全面复习 SQL 的语法和功能。

-- 两个表,分别是 students 表和 groups 表
-- 查询每个班级中平均成绩大于等于80分的学生信息,包含学生姓名、班级、成绩、社团名称
-- 以及学校的总成绩统计信息,按成绩从高到低排序,仅显示前10条结果。

SELECT
    s.name AS student_name,          -- 学生姓名
    s.class AS class_name,           -- 班级名称
    s.score AS student_score,        -- 学生成绩
    g.group_name AS club_name,       -- 社团名称
    AVG(s.score) OVER(PARTITION BY s.class) AS avg_score, -- 每个班级的平均分
    (SELECT SUM(score) FROM students) AS total_score,     -- 全校总成绩
    RANK() OVER(PARTITION BY s.class ORDER BY s.score DESC) AS rank_in_class -- 班级内成绩排名
FROM
    students s                       -- 主表:学生表
LEFT JOIN
    groups g                         -- 左连接:社团表
ON
    s.group_id = g.group_id          -- 关联条件:社团编号
WHERE
    s.class IN ('Class 1', 'Class 2') -- 筛选条件:只查询特定班级
    AND s.score >= 80                -- 成绩必须大于等于80分
    AND g.group_name IS NOT NULL     -- 社团名称不能为空
GROUP BY
    s.name, s.class, s.score, g.group_name -- 按字段分组
HAVING
    AVG(s.score) >= 80               -- 分组条件:班级平均分大于等于80
ORDER BY
    s.score DESC,                    -- 按成绩降序
    s.name ASC                       -- 如果成绩相同,则按姓名升序(默认)
LIMIT
    10;                              -- 仅返回前10条记录

语法要点解析

  1. SELECT 查询字段包括 name, class, score 等。 使用窗口函数(AVG() OVER())计算每个班级的平均分。 使用子查询计算全校的总成绩。 使用窗口函数(RANK())计算班级内成绩排名。
  2. FROM 和 JOIN 主表为 students 表。 通过 LEFT JOIN 将社团表 groups 连接进来。
  3. ON 关联条件是学生表的 group_id 和社团表的 group_id。
  4. WHERE 筛选特定班级(Class 1 和 Class 2)。 筛选成绩大于等于 80。 排除社团名称为空的记录。
  5. GROUP BY 对学生姓名、班级、成绩、社团名称进行分组。
  6. HAVING 筛选分组结果,仅显示班级平均分大于等于 80 的记录。
  7. ORDER BY 按成绩从高到低排序;如果成绩相同,则按学生姓名从 A 到 Z 排序。
  8. LIMIT 限制返回结果仅显示前 10 条。
  9. 嵌套查询 使用子查询计算全校总成绩。
  10. 别名 为字段和函数结果起易于阅读的名字,如 AS student_name, AS total_score

几种JOIN

| 类型 | 描述 | 记录匹配情况 | |—————–|———————————————–|——————————-| | INNER JOIN | 仅返回两个表中匹配的记录 | 仅交集 | | LEFT JOIN | 返回左表所有记录,右表匹配则填充,否则为 NULL | 左表为主,右表补充信息 | | RIGHT JOIN | 返回右表所有记录,左表匹配则填充,否则为 NULL | 右表为主,左表补充信息 | | FULL JOIN | 返回两表所有记录,不匹配用 NULL 填充 | 两表的并集 | | CROSS JOIN | 返回笛卡尔积 | 每条左表记录与右表每条组合 | | SELF JOIN | 表与自身进行连接 | 通常用于层级或自定义匹配关系 |