標籤:文法 多個 mysql 笛卡爾 logs 表名 順序 注意 out
串連查詢: 將多張表(可以大於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表形成二維表...
MySQL中使用串連查詢