连接查询知识点
為什么我們需要學習表連接查詢?
?
首先,仍然對應之前的2張表student和subject
那么,如果我需要顯示科目名稱,分數,以及學生姓名的話,科目名稱和分數屬于表subject,學生姓名屬于表student,在沒有學習表連接查詢之前,我們只能用子查詢來解決這個問題
但是,相關子查詢的性能不高,如果我們類似下面的查詢,很簡單就能達到同樣的效果
我們可以發現現在from后面是2張表,分別取了別名以便后面方便于引用。象這樣一次性查詢不同的表里的不同列稱之為表連接查詢
注意,表的別名是可選的,但是,當2張表的引用條件列名字相同時,必須為2張表取別名并通過別名引用,同時養成一個好的習慣:在多表連接查詢的時候通過表名或者表別名去引用列名,這樣做相當于明確告訴數據庫引擎當前列來自于哪張表,能夠略微提高性能
?
?
表連接主要有3種形式,分別為內連接,外連接以及交叉連接,我們主要應用和學習前2種?
?
?
內連接:?
[inner] join?
Inner可有可無
?
實際上,之前的例子就是用的內連接,也叫相等連接,另外一種內連接的方式自然連接NATURAL JOIN的語法某些DBMS不支持并且使用不靈活因此不需要掌握
?
左外連接:
Left [outer] join
Outer可用可不用
?
?
?
看起來結果和之前的內連接沒有任何區別?,F在讓我們添加2個學生?
?
?
?
即這2個學生沒有參加任何考試,現在我們用student表去左外連接subject表執行同樣的查詢
?
我們發現,將沒有參加考試的學生也查出來了,也就是姓名這列將student表中的數據都查詢出來了,不管有沒有在subject中針對學號匹配的值。即不管有沒有參加考試,只要在student表中存在,都顯示出來。
?
現在讓我們交換連接的位置
?
現在的結果正常了
我們可以總結,左外連接其實就是將查詢列里屬于左表的列的所有值都查詢出來,剩下的查詢列中屬于右表的列的值要顯示哪些取決于2張表的連接條件(join左邊為左表,右邊為右表)
比如我們上面查詢列為科目,分數,姓名
如果現在我們用student表去左連接subject表,那么student表為左表,subject表為右表。
要查詢的姓名屬于左表student,因此不管這個學生姓名的學號在subject表中有沒有對應的值,即不管這個學生有沒有參加考試,最后的結果里都會顯示所有學生的姓名。而科目和分數屬于subject右表,那么顯示哪些數據取決于根據stu.s_id = sub.stu_id這個連接查詢的條件。即科目和成績對應的學號在student左表中是否存在,存在才顯示,否則顯示空值。
相應的右連接也是一樣的道理,只不過換個方向而已
?
右外連接
Right [outer] join
針對之前的student表左外連接subject表,我們換成用右外連接,想要達到同樣的效果,只需要換個方向而已
即student左外連接subject 改為 subject右外連接student
?
?
?
?
全外連接:full [outer] join,不管連接條件,直接將2表的所有數據查詢出來,當查詢的某張表的結果在另外一張表中如果根據連接條件找不到匹配的值時,則返回空值轉載于:https://www.cnblogs.com/jazzka702/archive/2009/07/31/1535803.html
總結
- 上一篇: js表单验证功能
- 下一篇: 可以用javascript实现的10种图