Mysql連接查詢介紹

場景:

從下表中得到一個學生列表。要求是,展示:學生,性別,班級名字

wKiom1Zb972RB7IiAABtL25HyKM619.jpg

wKioL1ZcAhDSKHSmAAAq76U2yhc343.jpg


此查詢需要不單從學生表獲取數據,還需要從班級表獲取數據,此時就需要:


連接查詢: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;

wKiom1ZcAo2C51kOAAB1TPd6uVo770.jpg


    過程是,先執行 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可以省略:相當於連接條件永遠成立!返回值是一個笛卡爾積!

wKioL1ZcCGng2k65AACS-Szy9Oc449.jpg


  • 外連接:left join , right join

    分爲:左外連接,右外連接!


    連接的記錄可能是一方不存在的!(兩條記錄中,可能某條不存在)

wKiom1ZcCKTg4tYyAAB9XAf4zHc746.jpg

注意左外與右外的區別:

    區別在於,哪個表的記錄(指的是連接失敗的記錄),會最終出現在連接結果內!

    什麼是左表和右表? join關鍵字前面的(左邊的)左表,join關鍵字後邊的(右邊的)右表!

    左外:如果出現左表記錄連接不上右表記錄的,左表記錄會出現在最終的連接結果內!而右表記錄相應設置成NULL

    右外:如果出現右表記錄連接不上左表記錄的,右表記錄會出現在最終的連接結果內!而左表記錄相應設置成NULL


wKioL1ZcC3HBgvVAAAC8MAFzLJA151.jpg

因此,可以交換表的位置,達到使用 left 與 right 混用的目的!


問題:

    統計每個班級內,學生的數量!,在班級列表內:班級名,教室號,學生數量

    wKiom1ZcDYfjM-OTAABX55fRmAg693.jpg


總結:內連接,外連接差別不大,只是外連接會將沒有連接成功的記錄,也出現最終的連接的結果內,而內連接,連接結果只有連接成功的(兩條記錄都存在的)


  • 交叉連接:cross join

    結果與內連接一致!有時,在獲得笛卡爾積時,顯示的使用交叉連接

    交叉連接相當於沒有條件的內連接!


  • 自然連接:natural join

    mysql自動判斷連接條件,幫助我們完成連接!

    典型的條件就是表中的同名字段!

wKioL1ZcEReBoDQSAAAXWMEtYak829.jpg

而自然連接也分內連接與外連接

    自然內連接: natural join

    自然左外:natural letf join

    自然右外:natural right join

wKioL1ZcEYWCAtjcAAA23RUhyes077.jpg

總結:

    最終的效果只有:內,左外,右外!

    交叉,特殊的內

    自然,相當於自動判斷連接條件,完成內,左外,右外!


連接條件: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(連接字段),要求使用同名字段進行連接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章