省去join的多次查詢
先看錶結構
CREATE TABLE `eb_test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`姓名` varchar(50) NOT NULL DEFAULT '',
`學科` varchar(50) NOT NULL DEFAULT '',
`成績` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='測試表';
資料如下
id | 姓名 | 學科 | 成績 |
---|---|---|---|
1 | 張三 | 語文 | 20 |
2 | 張三 | 數學 | 30 |
3 | 張三 | 英語 | 50 |
4 | 李四 | 語文 | 60 |
5 | 李四 | 數學 | 70 |
6 | 李四 | 英語 | 90 |
執行連表sql
- 不帶join寫法
select A.*,B.*,C.* from eb_test A,eb_test B,eb_test C
- 帶join 寫法
select A.*,B.*,C.* from eb_test as A join eb_test as B join eb_test as C
查詢的結果如下
本質上就是笛卡爾積 資料集就是 6 * 6 * 6 = 216 條
id | 姓名 | 學科 | 成績 | id | 姓名 | 學科 | 成績 | id | 姓名 | 學科 | 成績 |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 張三 | 語文 | 20 | 1 | 張三 | 語文 | 20 | 1 | 張三 | 語文 | 20 |
2 | 張三 | 數學 | 30 | 1 | 張三 | 語文 | 20 | 1 | 張三 | 語文 | 20 |
3 | 張三 | 英語 | 50 | 1 | 張三 | 語文 | 20 | 1 | 張三 | 語文 | 20 |
4 | 李四 | 語文 | 60 | 1 | 張三 | 語文 | 20 | 1 | 張三 | 語文 | 20 |
5 | 李四 | 數學 | 70 | 1 | 張三 | 語文 | 20 | 1 | 張三 | 語文 | 20 |
6 | 李四 | 英語 | 90 | 1 | 張三 | 語文 | 20 | 1 | 張三 | 語文 | 20 |
1 | 張三 | 語文 | 20 | 2 | 張三 | 數學 | 30 | 1 | 張三 | 語文 | 20 |
2 | 張三 | 數學 | 30 | 2 | 張三 | 數學 | 30 | 1 | 張三 | 語文 | 20 |
3 | 張三 | 英語 | 50 | 2 | 張三 | 數學 | 30 | 1 | 張三 | 語文 | 20 |
4 | 李四 | 語文 | 60 | 2 | 張三 | 數學 | 30 | 1 | 張三 | 語文 | 20 |
5 | 李四 | 數學 | 70 | 2 | 張三 | 數學 | 30 | 1 | 張三 | 語文 | 20 |
6 | 李四 | 英語 | 90 | 2 | 張三 | 數學 | 30 | 1 | 張三 | 語文 | 20 |
1 | 張三 | 語文 | 20 | 3 | 張三 | 英語 | 50 | 1 | 張三 | 語文 | 20 |
2 | 張三 | 數學 | 30 | 3 | 張三 | 英語 | 50 | 1 | 張三 | 語文 | 20 |
3 | 張三 | 英語 | 50 | 3 | 張三 | 英語 | 50 | 1 | 張三 | 語文 | 20 |
4 | 李四 | 語文 | 60 | 3 | 張三 | 英語 | 50 | 1 | 張三 | 語文 | 20 |
5 | 李四 | 數學 | 70 | 3 | 張三 | 英語 | 50 | 1 | 張三 | 語文 | 20 |
6 | 李四 | 英語 | 90 | 3 | 張三 | 英語 | 50 | 1 | 張三 | 語文 | 20 |
1 | 張三 | 語文 | 20 | 4 | 李四 | 語文 | 60 | 1 | 張三 | 語文 | 20 |
2 | 張三 | 數學 | 30 | 4 | 李四 | 語文 | 60 | 1 | 張三 | 語文 | 20 |
3 | 張三 | 英語 | 50 | 4 | 李四 | 語文 | 60 | 1 | 張三 | 語文 | 20 |
4 | 李四 | 語文 | 60 | 4 | 李四 | 語文 | 60 | 1 | 張三 | 語文 | 20 |
資料分析
使用場景
我想檢視每個學生的 不同學科的成績,這個時候可以使用條件去重新組織
1.新增條件
- 不帶join寫法
select A.*,B.*,C.* from eb_test A,eb_test B,eb_test C where A.姓名=B.姓名 and B.姓名=C.姓名
- 帶 join寫法
select A.*,B.*,C.* from eb_test as A join eb_test as B on A.姓名 = B.姓名 join eb_test as C on B.姓名 = C.姓名
結果如下
因為新增了姓名相等的,這個時候結果是 54 條資料
對連線表記錄進行篩選;得到(333)+(333)=27+27=54條記錄
id | 姓名 | 學科 | 成績 | id | 姓名 | 學科 | 成績 | id | 姓名 | 學科 | 成績 |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 張三 | 語文 | 20 | 1 | 張三 | 語文 | 20 | 1 | 張三 | 語文 | 20 |
2 | 張三 | 數學 | 30 | 1 | 張三 | 語文 | 20 | 1 | 張三 | 語文 | 20 |
3 | 張三 | 英語 | 50 | 1 | 張三 | 語文 | 20 | 1 | 張三 | 語文 | 20 |
1 | 張三 | 語文 | 20 | 2 | 張三 | 數學 | 30 | 1 | 張三 | 語文 | 20 |
2 | 張三 | 數學 | 30 | 2 | 張三 | 數學 | 30 | 1 | 張三 | 語文 | 20 |
3 | 張三 | 英語 | 50 | 2 | 張三 | 數學 | 30 | 1 | 張三 | 語文 | 20 |
1 | 張三 | 語文 | 20 | 3 | 張三 | 英語 | 50 | 1 | 張三 | 語文 | 20 |
2 | 張三 | 數學 | 30 | 3 | 張三 | 英語 | 50 | 1 | 張三 | 語文 | 20 |
3 | 張三 | 英語 | 50 | 3 | 張三 | 英語 | 50 | 1 | 張三 | 語文 | 20 |
1 | 張三 | 語文 | 20 | 1 | 張三 | 語文 | 20 | 2 | 張三 | 數學 | 30 |
2 | 張三 | 數學 | 30 | 1 | 張三 | 語文 | 20 | 2 | 張三 | 數學 | 30 |
3 | 張三 | 英語 | 50 | 1 | 張三 | 語文 | 20 | 2 | 張三 | 數學 | 30 |
1 | 張三 | 語文 | 20 | 2 | 張三 | 數學 | 30 | 2 | 張三 | 數學 | 30 |
2 | 張三 | 數學 | 30 | 2 | 張三 | 數學 | 30 | 2 | 張三 | 數學 | 30 |
3 | 張三 | 英語 | 50 | 2 | 張三 | 數學 | 30 | 2 | 張三 | 數學 | 30 |
1 | 張三 | 語文 | 20 | 3 | 張三 | 英語 | 50 | 2 | 張三 | 數學 | 30 |
2 | 張三 | 數學 | 30 | 3 | 張三 | 英語 | 50 | 2 | 張三 | 數學 | 30 |
3 | 張三 | 英語 | 50 | 3 | 張三 | 英語 | 50 | 2 | 張三 | 數學 | 30 |
1 | 張三 | 語文 | 20 | 1 | 張三 | 語文 | 20 | 3 | 張三 | 英語 | 50 |
2 | 張三 | 數學 | 30 | 1 | 張三 | 語文 | 20 | 3 | 張三 | 英語 | 50 |
3 | 張三 | 英語 | 50 | 1 | 張三 | 語文 | 20 | 3 | 張三 | 英語 | 50 |
1 | 張三 | 語文 | 20 | 2 | 張三 | 數學 | 30 | 3 | 張三 | 英語 | 50 |
2 | 張三 | 數學 | 30 | 2 | 張三 | 數學 | 30 | 3 | 張三 | 英語 | 50 |
3 | 張三 | 英語 | 50 | 2 | 張三 | 數學 | 30 | 3 | 張三 | 英語 | 50 |
1 | 張三 | 語文 | 20 | 3 | 張三 | 英語 | 50 | 3 | 張三 | 英語 | 50 |
2 | 張三 | 數學 | 30 | 3 | 張三 | 英語 | 50 | 3 | 張三 | 英語 | 50 |
3 | 張三 | 英語 | 50 | 3 | 張三 | 英語 | 50 | 3 | 張三 | 英語 | 50 |
4 | 李四 | 語文 | 60 | 4 | 李四 | 語文 | 60 | 4 | 李四 | 語文 | 60 |
5 | 李四 | 數學 | 70 | 4 | 李四 | 語文 | 60 | 4 | 李四 | 語文 | 60 |
6 | 李四 | 英語 | 90 | 4 | 李四 | 語文 | 60 | 4 | 李四 | 語文 | 60 |
4 | 李四 | 語文 | 60 | 5 | 李四 | 數學 | 70 | 4 | 李四 | 語文 | 60 |
5 | 李四 | 數學 | 70 | 5 | 李四 | 數學 | 70 | 4 | 李四 | 語文 | 60 |
6 | 李四 | 英語 | 90 | 5 | 李四 | 數學 | 70 | 4 | 李四 | 語文 | 60 |
4 | 李四 | 語文 | 60 | 6 | 李四 | 英語 | 90 | 4 | 李四 | 語文 | 60 |
5 | 李四 | 數學 | 70 | 6 | 李四 | 英語 | 90 | 4 | 李四 | 語文 | 60 |
6 | 李四 | 英語 | 90 | 6 | 李四 | 英語 | 90 | 4 | 李四 | 語文 | 60 |
4 | 李四 | 語文 | 60 | 4 | 李四 | 語文 | 60 | 5 | 李四 | 數學 | 70 |
5 | 李四 | 數學 | 70 | 4 | 李四 | 語文 | 60 | 5 | 李四 | 數學 | 70 |
6 | 李四 | 英語 | 90 | 4 | 李四 | 語文 | 60 | 5 | 李四 | 數學 | 70 |
4 | 李四 | 語文 | 60 | 5 | 李四 | 數學 | 70 | 5 | 李四 | 數學 | 70 |
5 | 李四 | 數學 | 70 | 5 | 李四 | 數學 | 70 | 5 | 李四 | 數學 | 70 |
6 | 李四 | 英語 | 90 | 5 | 李四 | 數學 | 70 | 5 | 李四 | 數學 | 70 |
4 | 李四 | 語文 | 60 | 6 | 李四 | 英語 | 90 | 5 | 李四 | 數學 | 70 |
5 | 李四 | 數學 | 70 | 6 | 李四 | 英語 | 90 | 5 | 李四 | 數學 | 70 |
6 | 李四 | 英語 | 90 | 6 | 李四 | 英語 | 90 | 5 | 李四 | 數學 | 70 |
4 | 李四 | 語文 | 60 | 4 | 李四 | 語文 | 60 | 6 | 李四 | 英語 | 90 |
5 | 李四 | 數學 | 70 | 4 | 李四 | 語文 | 60 | 6 | 李四 | 英語 | 90 |
6 | 李四 | 英語 | 90 | 4 | 李四 | 語文 | 60 | 6 | 李四 | 英語 | 90 |
4 | 李四 | 語文 | 60 | 5 | 李四 | 數學 | 70 | 6 | 李四 | 英語 | 90 |
5 | 李四 | 數學 | 70 | 5 | 李四 | 數學 | 70 | 6 | 李四 | 英語 | 90 |
6 | 李四 | 英語 | 90 | 5 | 李四 | 數學 | 70 | 6 | 李四 | 英語 | 90 |
4 | 李四 | 語文 | 60 | 6 | 李四 | 英語 | 90 | 6 | 李四 | 英語 | 90 |
5 | 李四 | 數學 | 70 | 6 | 李四 | 英語 | 90 | 6 | 李四 | 英語 | 90 |
6 | 李四 | 英語 | 90 | 6 | 李四 | 英語 | 90 | 6 | 李四 | 英語 | 90 |
再次加條件
- 不帶join寫法
select A.*,B.*,C.* from eb_test A,eb_test B,eb_test C where A.姓名=B.姓名 and B.姓名 = C.姓名 and A.學科 = '語文' and B.學科='數學' and C.學科='英語'
- 帶join寫法
id | 姓名 | 學科 | 成績 | id | 姓名 | 學科 | 成績 | id | 姓名 | 學科 | 成績 |select A.*,B.*,C.* from eb_test as A join eb_test as B on A.姓名 = B.姓名 join eb_test as C on B.姓名 = C.姓名 where A.學科 = '語文' and B.學科='數學' and C.學科='英語'
- –|——–|——–|——–|—-|——–|——–|——–|—-|——–|——–|——–|
1 | 張三 | 語文 | 20 | 2 | 張三 | 數學 | 30 | 3 | 張三 | 英語 | 50 |
4 | 李四 | 語文 | 60 | 5 | 李四 | 數學 | 70 | 6 | 李四 | 英語 | 90 |
優化下
select A.姓名,A.成績 as 語文成績,B.成績 as 數學成績,C.成績 as 英語成績
from eb_test A,eb_test B,eb_test C where A.姓名=B.姓名 and B.姓名 = C.姓名 and A.學科 = '語文' and B.學科='數學' and C.學科='英語'
結果如下
姓名 | 語文成績 | 數學成績 | 英語成績 |
---|---|---|---|
張三 | 20 | 30 | 50 |
李四 | 60 | 70 | 90 |
本作品採用《CC 協議》,轉載必須註明作者和本文連結