多表查询

例1:

SELECT q.device_id, q.question_id, q.result
FROM question_practice_detail q
JOIN user_profile u ON q.device_id = u.device_id
WHERE u.university = '浙江大学'
ORDER BY q.question_id ASC;

JOIN连接(边查边连)

思路:

  1. 把两个表连接起来

  2. 按条件筛选

  3. 选择需要的列

FROM question_practice_detail q  -- 给表起别名q
JOIN user_profile u              -- 连接user_profile表,别名u
ON q.device_id = u.device_id     -- 连接条件:设备ID相同

表别名:

  • q:question_practice_detail表的简称

  • u:user_profile表的简称

  • 方便引用,避免写长表名

例er

SELECT 
    u.university,
    ROUND(
        COUNT(q.question_id) * 1.0 / COUNT(DISTINCT q.device_id), 
        4
    ) AS avg_answer_cnt
FROM user_profile u
JOIN question_practice_detail q ON u.device_id = q.device_id
GROUP BY u.university
ORDER BY u.university;

SQL的实际执行顺序(不是书写顺序)

虽然我们写SQL时是这样的顺序:

SELECT ... FROM ... JOIN ... WHERE ... GROUP BY ... ORDER BY ...

但数据库实际执行的顺序是:

FROM → JOIN → WHERE → GROUP BY → SELECT → ORDER BY

例三

SELECT u.university,
qd.difficult_level,
ROUND(COUNT(*)*1.0/COUNT(DISTINCT q.device_id),4) AS avg_answer_cnt
FROM user_profile u
JOIN  question_practice_detail q ON u.device_id = q.device_id
JOIN  question_detail qd ON q.question_id=qd.question_id
GROUP BY u.university,qd.difficult_level;

先连接三张表,然后进行分组,分组级别是学校和困难度,然后count算的是这个组的所有行,最后再除以去除那个设备的数量,也就是用户的个数,就是平均的

UNION:

操作 作用 本题是否适用
UNION 合并结果并去重 ❌ 不适用(题目要求不去重)
UNION ALL 合并结果不去重 ✅ 适用(保留重复记录)
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐