場景:
從下表中得到一個學生列表。要求是,展示:學生,性別,班級名字
此查詢需要不單從學生表獲取數據,還需要從班級表獲取數據,此時就需要:
連接查詢:join
連接:多個表記錄之間的連接~!
語法: from 表名1 join 表名2 on 連接條件
select stu_name,gender,class_id,class_name from select_student join select_class on select_student.class_id=select_class.id;
過程是,先執行 from 子句,需要連接join
兩個特殊的地方:
join,連接
on,連接條件
join連接:
除了默認的連接外,有其他形式的連接方式:
內連接
外連接,左外連接,右外連接,[全外連接,也是外連接,但不是mysql所支持的]
交叉連接
自然連接
內連接:inner join
記錄與真實的記錄連接,稱之爲內連接!(兩條真實存在的記錄的連接)
mysql默認的連接就是 inner join
select stu_name,gender,class_id,class_name from select_student join select_class on select_student.class_id=select_class.id;
select stu_name,gender,class_id,class_name from select_student inner join select_class on select_student.class_id=select_class.id;
上面兩條語法執行結果完成一樣!
內連接可以省略條件:
on可以省略:相當於連接條件永遠成立!返回值是一個笛卡爾積!
外連接:left join , right join
分爲:左外連接,右外連接!
連接的記錄可能是一方不存在的!(兩條記錄中,可能某條不存在)
注意左外與右外的區別:
區別在於,哪個表的記錄(指的是連接失敗的記錄),會最終出現在連接結果內!
什麼是左表和右表? join關鍵字前面的(左邊的)左表,join關鍵字後邊的(右邊的)右表!
左外:如果出現左表記錄連接不上右表記錄的,左表記錄會出現在最終的連接結果內!而右表記錄相應設置成NULL
右外:如果出現右表記錄連接不上左表記錄的,右表記錄會出現在最終的連接結果內!而左表記錄相應設置成NULL
因此,可以交換表的位置,達到使用 left 與 right 混用的目的!
問題:
統計每個班級內,學生的數量!,在班級列表內:班級名,教室號,學生數量
總結:內連接,外連接差別不大,只是外連接會將沒有連接成功的記錄,也出現最終的連接的結果內,而內連接,連接結果只有連接成功的(兩條記錄都存在的)
交叉連接:cross join
結果與內連接一致!有時,在獲得笛卡爾積時,顯示的使用交叉連接
交叉連接相當於沒有條件的內連接!
自然連接:natural join
mysql自動判斷連接條件,幫助我們完成連接!
典型的條件就是表中的同名字段!
而自然連接也分內連接與外連接
自然內連接: natural join
自然左外:natural letf join
自然右外:natural right join
總結:
最終的效果只有:內,左外,右外!
交叉,特殊的內
自然,相當於自動判斷連接條件,完成內,左外,右外!
連接條件:on , using
select class_name,stu_name from select_class inner join select_student on select_class.class_id=select_student.class_id;
select class_name,stu_name from select_class inner join select_student where select_class.class_id=select_student.class_id;
select class_name,stu_name from select_class inner join select_student using(class_id);
on後面使用一個連接條件表達式
using(連接字段),要求使用同名字段進行連接