SQL表連接查詢(inner join、full join、left join、right join)【轉載】

多表查詢

多表查詢分爲 內、外連接;

外連接

外連接分爲左連接(left join 或left outer join)、右連接(right join 或者 right outer join)、和完整外部連接 (full join 或者 full outer join)

1:左連接(left join 或left outer join)

左連接(left join 或 left outer join)的結果就是left join子句中的左表的所有行,而不僅僅是鏈接列所匹配的行,如果左表中的某行在右表中沒有匹配,則在相關聯的結果行中右表的所有選擇列均爲空值(NULL);
SQL語法:

select * from  table1 left join table2 on 
    table1.條件列名 = table2.條件列名;

右連接(right join 或 right outer join )

右連接(right join 或 right outer join )在這裏不做多說這左連接很象但是是相反的,只說一下語法
SQL語法:

select *from table1 right join table2 on 
    table1. 條件列= table2.條件列;

完全外部連接(full join 或 full outer join)

顯示左右表中的所有行,當某一個表中沒有匹配的行時,則另一個表的選擇列表列包含空值(NULL)如果有則顯示全部數據;
SQL語法:

select *from table1 full join table2 on  
    table1.條件列名= table2.條件列名;

內連接(join 或者inner join )

概念:內連接就是用比較運算符比較要用連接列的值的連接;
SQL語法:

select *fron table1 join table2  on 
    table1.條件列名 = table2.條件列名;
返回符合匹配條件的兩表列;

等價於:

select A* ,B* from table1 A ,table2 B 
    where A.條件列名 =B.條件列名

select * form table1 cross join table2
    where table1.條件列名 = table2.條件列名
    (注: Cross join 後面不能跟on 只能用where

交叉連接(完全)

概念:沒有用where子句的交叉連接將產生連接所涉及的笛卡爾積第一個表的行數乘以第二個表的行數等於笛卡爾積和結果集的大小

交叉連接: Cross join(不帶條件where,如果帶返回或顯示的是匹配的行數)

SQL語法:

select *from  table1 cross join table2

如果有條件(where)

select * from table1  cross join table2 
    where table1. 條件列名= table2.條件列名

等價於

select *from table1,table2 (不帶where)

示例:

前提條件:假設有兩個表,一個是學生表,一個是學生成績表。
結構

表的數據有:
表數據

一、內連接-inner jion :

最常見的連接查詢可能是這樣,查出學生的名字和成績:

select s.name,m.mark from student s,mark m 
    where s.id=m.studentid;

上面就是我們最常見的inner join,即內連接,把符合student.id=mark.studentid 條件的元組才選出來,也可以寫成:

select s.name,m.mark from student s inner join 
    mark m on s.id=m.studentid;

符合條件的只有兩條結果,查出結果爲:
內連接查詢結果

二、左連接-left join:

左連接是把左邊的表的元組全部選出來:

select s.name,m.mark from student s left join 
    mark m on s.id=m.studentid;

上面語句就是把左邊的表,即student表中的元組全部選出,儘管有些分數表是沒數據的,也選了出來,選出的結果爲:
左連接查詢結果

三、右連接-right join:

右連接就是把右邊表的數據全部取出,不管左邊的表是否有匹配的數據:

select s.name,m.mark from student s right join 
    mark m on s.id=m.studentid;

上面的語句就是把mark分數表的數據全部取出來,不管student表中是否有數據匹配,如下圖所示:
右連接查詢

四、全連接-full join:

把左右兩個表的數據都取出來,不管是否匹配:

select s.name,m.mark from student s full join 
    mark m on s.id=m.studentid;

如下圖所示,學生表和成績表的數據都取了出來:

注意:
比較常用的是第一種,內連接,而且是用這種寫法:

select s.name,m.mark from student s,mark m 
    where s.id=m.studentid;

小結:

關鍵是理解joinouter join

1:join

保留所有符合on條件的行,查詢結果行數量不會大於被join的表;

2:outer join

保留上面join的結果,並根據left, right, 或full,保留其中至少一個表內的不符合on條件的結果行,這種結果行僅有一個表內的結果,另一半數據用null填充;

自己小結:

外關聯與內關聯的語法

1:內關聯

1:內關聯 // 實質上就是有一樣的就形成一條記錄放回,而不會出現有個別字段爲空的情況;

    select  s_emp.id, first_name, name from s_emp,
        inner join s_dept on
        ( 
            s_emp.dept_id = s_dept.id 
        ) // 這種語法比較直觀

實質上這等價於:

    select  s_emp.id, first_name, name from s_emp,
         s_dept where s_emp.dept_id = s_dept.id;

2:左外關聯

select  s_emp.id, first_name, name from s_emp,
    left outer join s_dept on
    (
         s_emp.dept_id = s_dept.id 
    )     

3:右外關聯

    select  s_emp.id, first_name, name from s_emp,
        right outer join s_dept on
        ( 
            s_emp.dept_id = s_dept.id 
        ) 

4:完全關聯(屬於外關聯)

    select  s_emp.id, first_name, name from s_emp,
        full outer join s_dept on
        (
            s_emp.dept_id = s_dept.id 
        ) 

不等關聯

如:

select  s_emp.id, first_name, name from s_emp,
    where upper(name) like 'S\_%' escape '\'    
    // 查詢以S_打頭的記錄
SELECT  e.ename, e.job, e.sal, s.grade
    FROM    emp e, salgrade s
    WHERE   e.sal BETWEEN s.losal AND s.hisal;

自關聯

這個時候用表別名就成爲必須的;

select  e.id, e.first_name, m.first_name from 
    s_emp e, s_emp m 
    where e.manager_id = m.id; 
    // 實質上是同一張表,起了別名進行區分

原創信息:

原創地址(感謝原創博主的總結和分享,謝謝) :
http://www.cnblogs.com/lichen396116416/archive/2011/02/13/1953182.html
http://www.cnblogs.com/still-windows7/archive/2012/10/22/2734613.html

發佈了43 篇原創文章 · 獲贊 30 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章