創建兩個新表:
表1:學生截圖如下:
表2:2:課程的截圖如下:
(此時,構建該表只是為了演示連接SQL語句。當然,在實際開發中,我們不會像這樣構建表。在實際開發中,這兩個表將有自己不同的主鍵。)
壹.外部聯系
外接可分為:左接、右接、完全外接。
1,左連接左聯接或左外聯接
SQL語句:select * from student left join course on student . id = course . id
實施結果:
左外部連接包含左連接表中的所有行。如果左表中的行與右表中的行不匹配,則結果中與右表中的行對應的所有部分都為空。
註意:此時,我們不能說結果中的行數等於左表中的行數。當然,這裏的查詢結果行數等於左表的數據行數,因為此時左右表是壹壹對應的關系。
2.右連接右聯接或右外聯接。
SQL語句:select * from student right join course on student . id = course . id
實施結果:
右連接包含右連接表中的所有行。如果左表中的壹行與右表中的不匹配,則結果中對應於左表的所有部分都為空。
註意:同時,我們也不能說結果中的行數等於右表中的行數。當然,這裏的查詢結果行數等於左表的數據行數,因為此時左右表是壹壹對應的關系。
3.完全連接全聯接或全外聯接。
SQL語句:select * from student . id = course . id上的學生完全加入課程。
實施結果:
完整的外部連接包含完全連接的左表和右表中的所有行。如果右表中的壹行與左表中的不匹配,則結果中與右表中的行相對應的所有部分都為空。如果左表中的行與右表中的行不匹配,則結果中與左表中的行相對應的所有部分都為空。
第二,內連接或內連接
SQL語句:select * from student . id = course . id上的學生內部聯接課程。
實施結果:
Inner join是壹個比較運算符,只返回符合條件的行。
此時相當於:select * from student,course where student . id = course . id。
第三,交叉連接交叉連接
1.概念:沒有WHERE子句的交叉連接將產生連接中涉及的表的笛卡爾乘積。第壹個表中的行數乘以第二個表中的行數等於笛卡爾積結果集的大小。
SQL語句:從學生交叉連接課程中選擇*
實施結果:
如果我們此時給這個SQL添加壹個WHERE子句,比如SQL:select * from student cross join course其中student.id = course.id。
此時將返回符合條件的結果集,結果與inner join中顯示的執行結果相同。
四、兩個表之間的關系是壹對多、多對壹或多對多的連接語句。
當然,上面兩個表是壹壹對應的關系,那麽如果表A和表B是壹對多、多對壹或者多對多的關系,如何編寫join SQL語句呢?
其實壹對多SQL語句和壹對壹SQL語句這兩個表的寫法是壹樣的,只是查詢的結果不同。當然,這兩個表應該稍有變動。
例如,表1的列可以更改為:
Sno名稱Cno
表2中的列可以更改為:
Cno CName
這樣,這兩個表可以像上面的壹對壹SQL語句壹樣,編寫壹對多和多對壹的SQL語句。
以下是當兩個表是多對多時,如何構建表和壹些SQL語句。
創建三個新表:
表A:學生截圖如下:
表B:課程截圖如下:
表c:學生_課程截圖如下:
壹個學生可以選擇多門課程,壹門課程可以被多個學生選擇,所以學生表和課程表之間是多對多的關系。
當兩個表是多對多關系時,我們需要建立壹個中間表student_course,它至少要有兩個表的主鍵,當然也可以有其他內容。
SQL語句:select s.name,c.cn name from student _ course as sc left join student as s . SnO = sc . SnO left join course as c on c . cno = sc . cno
實施結果:
這個SQL執行的結果是學生的課程選擇。