省去join的查詢

董雷發表於2021-12-23

省去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寫法
    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.學科='英語'
    id | 姓名 | 學科 | 成績 | id | 姓名 | 學科 | 成績 | id | 姓名 | 學科 | 成績 |
  • –|——–|——–|——–|—-|——–|——–|——–|—-|——–|——–|——–|
    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 協議》,轉載必須註明作者和本文連結
good good study day day up

相關文章