創建一個學生表和一個課程表。先放出實驗的表結構:
create table student(
id int,
name varchar(15),
gender varchar(15),
cid int
);
create table class(
cid int,
cname varchar(15)
);
插入數據:
insert into student values(1,"lilei","male",1),(2,"hanmeimei","male",2),(3,"jack","male",1),(4,"alice","female",4),(5,"lili","female",NULL);
--這裏特意創建了一個class中沒有的4,以及一條cid爲NULL值的記錄。
insert into class values(1,"linux"),(2,"python"),(3,"java"),(5,"html5");
--這裏特意創建了一個student中沒有的5
查看數據:
1.交叉連接 cross join
不需要連接條件的連接。
交叉連接產生的結果就是笛卡兒積,左表的每一條記錄都會與右表的所有記錄連接並保留。
產生記錄數 = A表記錄數 × B表記錄數
例如:
select * from student cross join class;
或者: select * from student,class;
產生20條記錄。(截圖不完整
總結:交叉連接沒有實際數據價值,應儘量避免。
2.內連接 [inner] join
將兩張表根據指定的條件連接起來,嚴格連接。
內連接是將一張表中的每一條記錄去另外一張表中根據條件匹配:匹配成功,保留連接數據;匹配失敗,都不保留。
語法:左表 join 右表 on 連接條件
(不用on條件的時間,結果與交叉連接相同。)
例如:
SELECT * FROM student JOIN class ON student.cid = class.cid;
3.外連接 outer join
是一種不嚴格的連接方式。
分爲兩種:左外連接(左連接)left join,右外連接(右連接)right join
外連接有主表和從表之分。左外連接左表爲主表;右外連接右表爲主表。
外連接是將主表的記錄去匹配從表的記錄:匹配成功,記錄保留;匹配失敗,也保留,只是從表字段置空。
例如:
select * from student left join class on student.cid = class.cid;
select * from student right join class on student.cid = class.cid;
總結:外連接與內連接區別在於數據匹配失敗的時候,外連接會保留一條記錄(主表數據保留,從表數據置空)。
4.自然連接 natural join
是一種自動尋找連接條件的連接查詢。
- 自然內連接:類似內連接,但不提供連接條件。
- 自然外連接:類似外連接,但不提供連接條件。
例如:
select * from student natural join class;
select * from student natural left join class;
總結:自然連接根據相同的列名來匹配連接條件,並且會將兩個表中列名相同的列合併爲一個列。