sql查询from多表的骚操作


我们在进行多表查询的时候通常用到的方式是inner join内连接或者left join ,right join 左右连接,其实还有一种更简单的方法,但是这个方法呢比较不规范。而且性能略低,不太适用于大量数据的查询场景。我们直接看示例:

运营想要查看参加了答题的山东大学的用户在不同难度下的平均答题题目数,请取出相应数据

user_profile
id device_id gender age university gpa active_days_within_30 question_cnt answer_cnt
1 2138 male 21 北京大学 3.4 7 2 12
2 3214 male NULL 复旦大学 4 15 5 25
3 6543 female 20 北京大学 3.2 12 3 30
4 2315 female 23 浙江大学 3.6 5 1 2
5 5432 male 25 山东大学 3.8 20 15 70
6 2131 male 28 山东大学 3.3 15 7 13
7 4321 male 28 复旦大学 3.6 9 6 52
question_practice_detail
id device_id question_id result
1 2138 111 wrong
2 3214 112 wrong
3 3214 113 wrong
4 6534 111 right
5 2315 115 right
6 2315 116 right
7 2315 117 wrong
8 5432 117 wrong
9 5432 112 wrong
10 2131 113 right
11 5432 113 wrong
12 2315 115 right
13 2315 116 right
14 2315 117 wrong
15 5432 117 wrong
16 5432 112 wrong
17 2131 113 right
18 5432 113 wrong
19 2315 117 wrong
20 5432 117 wrong
21 5432 112 wrong
22 2131 113 right
23 5432 113 wrong
question_detail
id question_id difficult_level
1 111 hard
2 112 medium
3 113 easy
4 115 easy
5 116 medium
6 117 easy

三张表我们要查询出的最终结果为:

university difficult_level avg_answer_cnt
山东大学 easy 4.5000
山东大学 medium 3.0000

一半我们的想法是通过内连接或者左连接进行连表,这里我们还有另外一种方法:

select u.university,qd.difficult_level,
count(qpd.question_id) / count(distinct(qpd.device_id)) as avg_answer_cnt
from user_profile as u,
question_practice_detail as qpd,
question_detail as qd
where u.university = '山东大学'
and u.device_id = qpd.device_id
and qpd.question_id = qd.question_id
group by qd.difficult_level;

其实这种方法也是内连接,只是我们没有通过inner join 。但是呢,这种方式性能上略差于左连接。所以不推荐经常使用这种方法