SQL的各種連接
1 create table students (c_id int, c_name varchar(20)); 2 create table subjects (c_id int, c_subject varchar(20)); 3 4 insert into students values (1,'張三'),(2,'李四'),(3,'王五'); -- orcle不支持這種批量插入的寫法 5 insert into subjects values (1,'語文'),(2,'數學'),(null,'英語');
| c_id | c_name |
| 1 | 張三 |
| 2 | 李四 |
| 3 | 王五 |
| c_id | c_subject |
| 1 | 語文 |
| 2 | 數學 |
| null | 英語 |
內連接(inner join):返回兩表中on條件共同匹配的行
1 select * from students s join subjects t on s.c_id = t.c_id;
| c_id | c_name | c_id | c_subject |
| 1 | 張三 | 1 | 語文 |
| 2 | 李四 | 2 | 數學 |
左鏈接(left join 或 left outer join):返回左表的所有行以及右表在on條件匹配到的數據,匹配不上時右表顯示空值
1 select * from students s left join subjects t on s.c_id = t.c_id;
| c_id | c_name | c_id | c_subject |
| 1 | 張三 | 1 | 語文 |
| 2 | 李四 | 2 | 數學 |
| 3 | 王五 | null | null |
右鏈接(right join 或 right outer join):返回右表中所有行以及左表在on條件下匹配到的數據,匹配不上時左表顯示空值
1 select * from students s right join subjects t on s.c_id = t.c_id;
| c_id | c_name | c_id | c_subject |
| 1 | 張三 | 1 | 語文 |
| 2 | 李四 | 2 | 數學 |
| null | null | null | 英語 |
全連接(full join 或 full outer join):完整外部連接左表和右表中的所有行,匹配不上時另一表顯示空值
1 -- oracle 2 select * from students s full join subjects t on s.c_id = t.c_id;
1 -- mysql,因myql不支持完全連接,直接使用full join會報語法錯誤,可以通過union將左鏈接查詢和右鏈接查詢的結果合并起來從而得到全連接的效果 2 select * from students s left join subjects t on s.c_id = t.c_id 3 union 4 select * from students s right join subjects t on s.c_id = t.c_id;
| c_id | c_name | c_id | c_subject |
| 1 | 張三 | 1 | 語文 |
| 2 | 李四 | 2 | 數學 |
| null | null | null | 英語 |
| 3 | 王五 | null | null |
交叉連接(cross join):左表的每一行分別和右表中的每一行組合,也叫做笛卡爾積
1 select * from students s cross join subjects t;
| c_id | c_name | c_id | c_subject |
| 1 | 張三 | 1 | 語文 |
| 2 | 李四 | 1 | 語文 |
| 3 | 王五 | 1 | 語文 |
| 1 | 張三 | 2 | 數學 |
| 2 | 李四 | 2 | 數學 |
| 3 | 王五 | 2 | 數學 |
| 1 | 張三 | null | 英語 |
| 2 | 李四 | null | 英語 |
| 3 | 王五 | null | 英語 |
浙公網安備 33010602011771號