sql查詢from多表的騷操作
阿新 • • 發佈:2022-05-20
我們在進行多表查詢的時候通常用到的方式是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 。但是呢,這種方式效能上略差於左連線。所以不推薦經常使用這種方法