連接配接查詢
按功能分類:内連接配接(等值連接配接,非等值連接配接,自連接配接),外連接配接(左外連接配接,右外連結,全外連接配接),交叉連接配接
按年代分類:sql92标準(僅支援内連接配接),sql99标準(都支援,除了全外連接配接)
現在我們介紹sql99标準
文法:select 查詢清單
from 表1 别名 連接配接類型
join 表2 别名
on 連接配接條件
【where 篩選條件】
【group by 分組】
【having 篩選條件】
【order by 排序清單】
注意:【】中的代表可以省略
連接配接類型關鍵字:
内連接配接 【inner】 ,
外連接配接【left(左外),right(右外),full(全外)】,
交叉連接配接【cross】概念:沒有 WHERE 子句的交叉聯接将産生連接配接所涉及的表的笛卡爾積。第一個表的行數乘以第二個表的行數等于笛卡爾積結果集的大小。
連接配接查詢的特點
特點: 1:外連接配接的查詢結果為主表中的所有記錄,如果從表中有和它比對的,則顯示比對值,如果沒有則顯示null值。
2:外連接配接查詢結果=内連接配接結果+主表中有而從表中沒有的記錄
3:左外連接配接,left,join左邊的是主表
4:右外連接配接,right,join右邊的是主表
5:左外連接配接和右外連接配接交換兩表順序,可以實作同樣效果
6:inner join 是比較運算符,隻傳回符合條件的行。
示範
1;示範左外連接配接和右外連接配接及内連接配接
在Navicat中建立兩個表
表名:student
表名:course
在Navicat中點選New QUERY
輸入: SELECT * FROM student RIGHT JOIN course ON course.id=student.id;
結果:
輸入: SELECT * FROM student LEFT JOIN course ON course.id=student.id;
結果:
輸入:SELECT * FROM student INNER JOIN course ON course.id=student.id;
結果:
以上三個結果滿足連接配接查詢特點的1,2,3,4,6
示範交叉連接配接
依然用到上面的兩個表student ,course
輸入: SELECT * FROM student CROSS JOIN course;
結果:
如果我們在此時給這條SQL加上WHERE子句的時候
比如 SELECT * FROM student CROSS JOIN course WHER course.id=student.id;
此時将傳回符合條件的結果集,結果和inner join所示執行結果一樣。
輸入: SELECT * FROM student CROSS JOIN course WHER course.id=student.id;
結果:
提出問題
上面兩表為一對一關系,那麼如果表A和表B為一對多、多對一或多對多的時候,我們又該如何寫連接配接SQL語句呢?
解決方法:
當兩表為多對多關系的時候,我們需要建立一個中間表student_course,中間表至少要有兩表的主鍵,當然還可以有别的内容。
如下示範
在前面兩表student,course的基礎上
在建立一個student_course表
輸入:SELECT s.name,c.game FROM student_course sc RIGHT JOIN student s ON sc.sid=s.id RIGHT JOIN course c ON sc.cid=c.id;
結果: