此博客連接:https://www.cnblogs.com/ping2yingshi/p/13871481.html
數據庫表間關聯
說明
數據庫的表間關聯中,一共有以下四種方法。
1.內連接
定義:內連接使用比較運算符進行表間某(些)列數據的比較操作,並列出這些表中與連接條件相匹配的數據行。
2.外連接
定義:外連接分為左聯和右聯。
左聯:左聯的結果集包括left outer 子句中指定的左表的所有行,如果左表的某行在右表中沒有匹配的行,則在結果集中為右表所有列返回null。
右聯:右聯的結果集包括right outer 子句中指定的右表的所有行,如果右表的某行在左表中沒有匹配的行,則在結果集中為左表所有列返回null。
3.笛卡兒積
笛卡兒積是內聯中沒有where子句,返回所有數據行的笛卡兒積,其結果中的行數等於第一個表中符合查詢條件的行數乘以第二個表中符合查詢條件的的行數(假設只有兩個表)
4.自連接
定義:在一條select語句中不止一次地引用相同的表。
背景
有兩個表,一個學生表,一個成績表。
說明:每個學生在成績表中只有對應一個成績。

表結構如下:
學生表中包括學生姓名,學生ID。

成績表中包括學生ID和學生成績。

表數據如下:
學生表數據如下:

成績表數據如下:

表數據解釋:
一共有5個學生,考試時只有三個學生去考試,有兩個學生棄考了,沒有成績。
問題
1.老師想查看每名學生的成績(要求顯示學生姓名和成績)。
2.老師想知道誰參加了考試(要求顯示學生姓名和成績)。
3.老師緊急安排學生打掃衛生,讓學生ID(stu_ID)小於班長(小紅)的同學去打掃衛生。
實現問題1
方法1左聯實現
左聯使用情況
當有兩張表時,需要先返回左表某個字段的所有行,再加上符合連接條件的匹配行。
分析
老師想獲取所有學生的成績,在成績表中只有部分學生的成績,所以應該先從學生表中把所有學生先查出來,然后再查成績表,這種情況下可以使用左聯,學生表左聯成績表,先查詢所有學生的姓名,然后再查成績表中的學生成績。
代碼
SELECT stu_Name,score FROM student LEFT JOIN score on student.stu_ID=score.stu_ID
查詢結果
顯示所有學生姓名,只顯示成績表中有的學生成績,沒有成績的顯示Null。

方法2 右聯實現
右聯使用情況
當有兩張表時,需要先返回右表某個字段的所有行,再加上符合連接條件的匹配行。
分析
老師想獲取所有學生的成績,在成績表中只有部分學生的成績,所以應該先從學生表中把所有學生先查出來,然后再查成績表,這種情況下可以使用右聯,成績表右聯學生表,右聯中先從學生表中查詢所有學生的姓名,然后再查成績表中的學生成績。
備注
查詢兩張表時,當使用左聯查詢時,兩張表的位置互換一下,就可以使用右聯查詢,查詢結果和左聯查詢結果是一樣的。
代碼
SELECT stu_Name,score FROM score RIGHT JOIN student on student.stu_ID=score.stu_ID
查詢結果
顯示所有學生姓名,只顯示部分學生成績。

實現問題2
內聯實現問題2
內聯使用情況
當有兩張表,只有在兩個表中條件都滿足才返回滿足條件的數據。
分析
老師想查看誰參加了考試,參加考試的學生成績在成績表中,查詢成績表就可以查到誰參加了考試,但是成績表中沒有學生姓名,學生姓名需要到學生表中查詢,使用內聯,查詢參加考試的學生姓名。
代碼
SELECT stu_Name FROM score INNER JOIN student on student.stu_ID=score.stu_ID
查詢結果
小白,小藍和小綠去參加了考試。

笛卡兒積出現情況
說明
當查詢數據,沒有使用限定條件時,會產生笛卡兒積。
分析
在上面查詢誰參加了考試,如果沒有限定學生表中的學生ID等於成績表中的學生ID條件時,會出現笛卡兒積的結果,返回兩個表中符合條件的行數乘積。
代碼
SELECT stu_Name,score FROM score INNER JOIN student
結果
學生表中一共有5名學生,成績表中有三個成績,所以得到15條記錄。

實現問題3
自連接實現問題3
自連接使用情況
在一條sql語句中,一張表自己需要查詢自己。
分析
老師首先需要在學生表中找到班長小紅的學生ID,然后再在學生表中找學生ID小於小紅學號的學生。兩次都需要用到學生表,使用自連接。
代碼
SELECT b.stu_ID,b.stu_Name from student a,student b where a.stu_Name='小紅' and b.stu_ID<a.stu_ID
查詢結果
學生ID小於小紅的是小白和小藍。

