mysql 第四篇
·
多表查询
例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连接(边查边连)
思路:
-
把两个表连接起来
-
按条件筛选
-
选择需要的列
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 |
合并结果不去重 | ✅ 适用(保留重复记录) |
更多推荐




所有评论(0)