基礎資料庫知識分享(3)-多表連線
阿新 • • 發佈:2020-07-30
建立兩張表分別為table1和table2:
id | name |
---|---|
1 | name1 |
2 | name2 |
3 | name3 |
id | age |
---|---|
1 | 18 |
2 | 19 |
4 | 20 |
1. 內連線
用比較運算子比較要連線的列的值的連線,不匹配的行不會被顯示。sql關鍵字JOIN 或者INNER JOIN,通常寫成JOIN。
例:
select * from TableA JOIN TableB on TableA.id=TableB.id;
id | name | id | age |
---|---|---|---|
1 | name1 | 1 | 18 |
2 | name2 | 2 | 19 |
等同於 select * from TableA,TableB where TableA.id=TableB.id
2. 外連線
① 外連線又分為:左外連線、右外連線、全外連線。
② 對應的sql關鍵字:LEFT/RIGHT/FULL OUTER JOIN,通常省略OUTER關鍵字,寫成LEFT/RIGHT/FULL JOIN。
③在左、右外連線中都會以一種表為基表,基表的所有行、列都會顯示,外表如果和條件不匹配則所有的外表列值都為NULL。
全外連線則所有表的行、列都會顯示,條件不匹配的值皆為NULL。
- 左外連線示例:
select * from TableA left join TableB on TableA.id=TableB.id
id | name | id | age |
---|---|---|---|
1 | name1 | 1 | 18 |
2 | name2 | 2 | 19 |
3 | name3 | NULL | NULL |
2. 右外連線示例:
select * from TableA right join TableB onTableA.id=TableB.id
id | name | id | age |
---|---|---|---|
1 | name1 | 1 | 18 |
2 | name2 | 2 | 19 |
NULL | NULL | 4 | 20 |
3. 全連線示例:
select * from TableA full join TableB on TableA.id=TableB.id
id | name | id | age |
---|---|---|---|
1 | name1 | 1 | 18 |
2 | name2 | 2 | 19 |
NULL | NULL | 4 | 20 |
3 | name3 | NULL | NULL |
注:mysql不支援FULL JOIN,解決辦法:right join + union + left join
兩張表時:
select * from A left join B on A.id = B.id (where 條件)
union
select * from A right join B on A.id = B.id (where條件);
3. 交叉連線
沒有where條件的交叉連線將產生連線表所涉及的笛卡爾積,即TableA的行數*TableB的行數的結果集。如果帶where,返回或顯示的是匹配的行數。(cross join後只能用where不能是on)
select * from TableA cross join TableB;
id | name | id | age |
---|---|---|---|
1 | name1 | 1 | 18 |
2 | name2 | 2 | 19 |
3 | name3 | 3 | 20 |
1 | name1 | 1 | 18 |
2 | name2 | 2 | 19 |
3 | name3 | 3 | 20 |
1 | name1 | 1 | 18 |
2 | name2 | 2 | 19 |
3 | name3 | 3 | 20 |
等同於:
select * from TableA,TableB;