連接查詢: 將多張表(可以大於2張)進行記錄的連接(按照某個指定的條件進行數據拼接); 最終結果是: 記錄數有可能變化, 欄位數一定會增加(至少兩張表的合併)! 連接查詢的意義: 在用戶查看數據的時候,需要顯示的數據來自多張表. SQL中將連接查詢分成四類:交叉連接,內連接,外連接和自然連接。 在介 ...
連接查詢: 將多張表(可以大於2張)進行記錄的連接(按照某個指定的條件進行數據拼接);
最終結果是: 記錄數有可能變化, 欄位數一定會增加(至少兩張表的合併)!
連接查詢的意義: 在用戶查看數據的時候,需要顯示的數據來自多張表.
SQL中將連接查詢分成四類:交叉連接,內連接,外連接和自然連接。
在介紹之前先創建兩張表作為聯繫(my_stu,my_class)
1.交叉連接
cross join, 從一張表中迴圈取出每一條記錄, 每條記錄都去另外一張表進行匹配: 匹配一定保留(沒有條件匹配), 而連接本身欄位就會增加(保留),最終形成的結果叫做: 笛卡爾積.
select * from my_stu cross join my_class;
註意:
笛卡爾積沒有意義: 應該儘量避免(交叉連接沒用)。交叉連接存在的價值: 保證連接這種結構的完整性
2.內連接
[inner] join, 從左表中取出每一條記錄,去右表中與所有的記錄進行匹配: 匹配必須是某個條件在左表中與右表中相同最終才會保留結果,否則不保留!
基本語法
左表 [inner] join 右表 on 左表.欄位 = 右表.欄位; on表示連接條件: 條件欄位就是代表相同的業務含義(如my_stu.c_id和my_class.id)。
select * from my_stu inner join my_class on c_id = my_class.id;
註意:
內連接可以沒有連接條件: 沒有on之後的內容,這個時候系統會保留所有結果(笛卡爾積)!
內連接還可以使用where代替on關鍵字(where沒有on效率高)!
3.外連接
outer join, 以某張表為主,取出裡面的所有記錄, 然後每條與另外一張表進行連接: 不管能不能匹配上條件,最終都會保留:能匹配正確保留; 不能匹配,其他表的欄位都置空NULL.
外連接分為兩種: 是以某張表為主: 有主表
Left join: 左外連接(左連接), 以左表為主表
Right join: 右外連接(右連接), 以右表為主表
基本語法:
左表 left/right join 右表 on 左表.欄位 = 右表.欄位;
3.1左連接
select *, my_class.c_name, my_class.room from my_stu left join my_class on my_stu.c_id=my_class.id;
3.2右連接
select s.*, c.c_name as c_name, c.room from my_stu as s right join my_class as c on s.c_id = c.id;
註意:
雖然左連接和右連接有主表差異, 但是顯示的結果: 左表的數據在左邊,右表數據在右邊.
欄位別名以及表別名的使用: 在查詢數據的時候,不同表有同名欄位,這個時候需要加上表名才能區分, 而表名太長, 通常可以使用別名.
4.自然連接
自然連接: natural join, 自然連接, 就是自動匹配連接條件: 系統以欄位名字作為匹配模式(同名欄位就作為條件, 多個同名欄位都作為條件,連接之後會合併同名欄位).
自然連接: 可以分為自然內連接和自然外連接.
4.1自然內連接:
左表 natural join 右表;
select * from my_stu natural join my_class;
4.2自然外連接
左表 natural left/right join 右表
select * from my_stu natural left join my_class;
多表連接: A表 inner join B表 on 條件 left join C表 on條件 ...
執行順序: A表內連接B表,得到一個二維表, 左連接C表形成二維表...