sql查询from多表的骚操作
我们在进行多表查询的时候通常用到的方式是inner join内连接或者left join ,right join 左右连接,其实还有一种更简单的方法,但是这个方法呢比较不规范。而且性能略低,不太适用于大量数据的查询场景。我们直接看示例:
运营想要查看参加了答题的山东大学的用户在不同难度下的平均答题题目数,请取出相应数据
user_profileid | 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 |
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 |
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 。但是呢,这种方式性能上略差于左连接。所以不推荐经常使用这种方法