1. 程式人生 > >SQL語句使用03------連線

SQL語句使用03------連線

這一章主要是連線查詢,重點!!!

先上菜:

(表的基本結構:
        Student(Sid,Sname,Sage,Ssex) 學生表 
        Course(Cid,Cname,Tid) 課程表 
        SC(Sid,Cid,score) 成績表 
        Teacher(Tid,Tname) 教師表
        )

下面是理論知識:

連線查詢的基本形式:
    select  XX1,  XX2,  ....  from   表1  【連線方式】 join2  【連線條件】  where ........;

1.交叉連線cross join

形式:
        from1  cross  join2  
含義:
    將兩個表的每一行都進行兩兩對接之後的所有資料行所構成的結果資料;
    通常,此時,結果資料中的行數,就是兩個表的原先行數的乘積;
    這種連線,又稱為“笛卡爾積”;

案例:

select * from teacher cross join Course;
//資料很多,就是相乘,實用性不大,一般不用

這裡寫圖片描述

內連線inner join

    形式:
        from1  inner  join 表2  on1.欄位1 = 表2.欄位2
含義:
    將兩個表的每一行進行兩兩對接之後的所有資料中,取出滿足所給定的條件那些資料所得到的結果;
    通常,此時,結果資料中的行數,不一定是多少,而是完全看具體條件的設定;

案例:
select * from student inner join sc on student.sid=sc.sid;
//內連線的特點是可以新增約束條件 on
//可以理解為只顯示滿足on的結果    

這裡寫圖片描述

那麼問題來了:內連線後的結果能操縱嗎?
例如:我要對score排序

     select * from student inner join sc on student.sid=sc.sid where sage>30 group by Cid  ;

這裡寫圖片描述

 select * from student inner join sc on student.sid=sc.sid where
sage>30 group by Cid having score >60 order by score asc ;

這裡寫圖片描述

//這裡可以看到確實對查詢的結果集進行了操縱,說明是可以的

//此外,這裡稍加題一點,我們通常可以看到這樣的語句:

 select distinct SC.S#,Sname 
    from Student,SC //注意這裡
    where Student.S#=SC.S# and C# in (select C# from SC where S#='001'); 

這涉及到Sql語句的對映連線,在我看來,這個就是inner join.
  SQL 定義了兩種不同語法方式去表示”連線”。首先是”顯式連線符號”,它顯式地使用關鍵字 JOIN,其次是”隱式連線符號”,它使用所謂的”隱式連線符號”。
  隱式連線符號把需要連線的表放到 SELECT 語句的 FROM 部分,並用逗號隔開。這樣就構成了一個”交叉連線”,WHERE 語句可能放置一些過濾謂詞(過濾條件)。 
  那些過濾謂詞在功能上等價於顯式連線符號. SQL 89標準只支援內部連線與交叉連線,因此只有隱式連線這種表達方式;SQL 92標準增加了對外部連線的支援,這才有了JOIN表示式。

左(外)連線left (outer) join

   形式:
    from1  left  【outer】  join 表2  on1.欄位1 = 表2.欄位2
含義:
    將兩個表的內連線所得到的結果資料,再加上左邊表中,那些不能滿足連線條件的資料行所得到的結果。
    其中,後一部分資料的“右邊部分”,填充空值(null)

案例:
    select * from student left join sc on student.sid=sc.sid where sc.sid<1011 and sc.sid >1005;  
    select * from sc left join student on student.sid=sc.sid where sc.sid<1011 and sc.sid >1005; 

這裡寫圖片描述

//仔細比對這兩個結果我們可以得到很多資訊:
1.我在where中使用欄位的時候用了字首:sc.sid——這說明當有多個同名欄位時要標明使用哪個,不然會報錯:

select * from student left join sc on student.sid=sc.sid where sid<1011;
    1052 - Column 'sid' in where clause is ambiguous

2.左連線是以左邊為基準,這裡面我特意刪去了1008號同學,但是他有成績,所以並不是所有有成績的同學都存在。

    在查詢的時候當以student為基準時,所有的同學都有成績,所以全部顯示。
    在以SC為基準時並不是所有成績都有人對應,所以右側顯示NULL;

右(外)連線right (outer) join

形式:
from  表1  right  【outer】  join 表2  on 表1.欄位1 = 表2.欄位2


含義:
    將兩個表的內連線所得到的結果資料,再加上右邊表中,那些不能滿足連線條件的資料行所得到的結果。
    其中,後一部分資料的“左邊部分”,填充空值(null);
//原理一樣,右側基準,就不過多講解了

全外連線 full 【outer】 join(存在於傳說中的方法,至少mysql並沒有~~~)

含義:
將兩個表的內連線所得到的結果資料,
再加上左邊表中,那些不能滿足連線條件的資料行所得到的結果。其中“右邊部分”,填充空值(null);
再加上右邊表中,那些不能滿足連線條件的資料行所得到的結果。其中“左邊部分”,填充空值(null);

4、查詢所有同學的學號、姓名、選課數、總成績;

select Student.Sid,Student.Sname,count(SC.Cid),sum(score) from Student left Outer join SC on Student.Sid=SC.Sid group by Student.Sid;
//先左連線,再按id(或者name均可),便可以得到總成績,選課數

這裡寫圖片描述

總結:

連線查詢在SQL及其重要,重在理解
如果感覺可以請點贊