sql連接類型

sql連接類型

sql連接類型有:內連接,外連接(左外,右外),全連接(交集),交叉連接(笛卡爾積)和自然連接

內連接(INNER JOIN)

內連接:內連接也叫連接,是最早的一種連接。還可以被稱爲普通連接或者自然連接,內連接是從結果表中刪除與其他被連接表中沒有匹配行的所有行,所以內連接可能會丟失信息。

內連接你可以看做是取兩個表的交集 其中只有兩條互相對應着的數據才能被存入結果表中

SELECT * FROM test1 a INNER JOIN test2 b ON a.id = b.id;

在這裏插入圖片描述
內連接(INNER JOIN):有兩種,顯式的和隱式的,返回連接表中符合連接條件和查詢條件的數據行。(所謂的鏈接表就是數據庫在做查詢形成的中間表)。

1、等值連接
概念:在連接條件中使用等於號(=)運算符,其查詢結果中列出被連接表中的所有列,包括其中的重複列。

例子:

select * from T_student s,T_class c where s.classId = c.classId

等價於

select  *  from T_student s inner join T_class c on s.classId = c.classId

2、不等連接
概念:在連接條件中使用除等於號之外運算符(>、<、<>、>=、<=、!>和!<)

select * from T_student s inner join T_class c on s.classId <> c.classId

外連接

外連接可以看做是取兩個表的並集 ,和內連接是相反的,如果一張表的數據在另一張表中沒有找到,但是並不影響他在結果集出現。

外連接包括左外連接和右外連接

左外連接(LEFT JOIN)
將返回右表的所有行。如果左表的某行在右表中沒有匹配行,則將爲右表返回空值左連接;以左表爲主表,右表沒數據爲null。

select * from Student  LEFT JOIN Score ON Student.s_id=Score.s_id;

在這裏插入圖片描述
右外連接(RIGHT JOIN)
將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將爲左表返回空值;以右表爲主表,左表中沒數據的爲null。

select *from Student right JOIN Score ON Student.s_id=Score.s_id

在這裏插入圖片描述

全外連接(FULL JOIN 或 FULL OUTER JOIN)

MySQL目前不支持此種方式,可以用其他方式替代解決。

完整外部聯接返回左表和右表中的所有行。當某行在另一個表中沒有匹配行時,則另一個表的選擇列表列包含空值。如果表之間有匹配行,則整個結果集行包含基表的數據值。

select *from Student full JOIN Score ON Student.s_id=Score.s_id

select *from Student full outer JOIN Score ON Student.s_id=Score.s_id

在這裏插入圖片描述

交叉連接(笛卡爾積,CROSS JOIN)

交叉連接返回左表中的所有行,左表中的每一行與右表中的所有行組合。交叉連接也稱作笛卡爾積。

交叉連接即笛卡爾積,結果爲A×B
在這裏插入圖片描述
不帶WHERE條件子句,它將會返回被連接的兩個表的笛卡爾積,返回結果的行數等於兩個錶行數的乘積(例如:T_student和T_class,返回4*4=16條記錄),如果帶where,返回或顯示的是匹配的行數。

1、不帶where

   select *from T_student cross join T_class    //cross join 可以省略不寫
  等於
   select *from T_student, T_class

在這裏插入圖片描述
總結:相當與笛卡爾積,左表和右表組合。

2、有where子句
往往會先生成兩個錶行數乘積的數據表,然後才根據where條件從中選擇。

select * from T_student s cross join T_class c where s.classId = c.classId   
   (:cross join後加條件只能用where,不能用on)  

查詢結果跟等值連接的查詢結果是一樣。

自然連接(NATURAL JOIN)

自然連接是一種特殊的等值連接,要求兩個關係表中進行比較的必須是相同的屬性列,無須添加連接條件,並且在結果中消除重複的屬性列。要求是兩個這兩個關係中參與比較的屬性列必須是同名、同屬性。如果兩個關係中有多組這樣的屬性,默認是全部比較的。
在這裏插入圖片描述在這裏插入圖片描述
自然連接不用指定連接列,也不能使用ON語句,它默認比較兩張表裏相同的列

 `SELECT * FROM student NATURAL JOIN score;`

顯示結果如下:
在這裏插入圖片描述

MySQL如何執行關聯查詢

MySQL認爲任何一個查詢都是一次“關聯”,並不僅僅是一個查詢需要到兩個表匹配才叫關聯,所以在MySQL中,每一個查詢,每一個片段(包括子查詢,甚至基於單表查詢)都可以是一次關聯。
當前MySQL關聯執行的策略很簡單:MySQL對任何關聯都執行嵌套循環關聯操作,即MySQL先在一個表中循環取出單條數據,然後在嵌套循環到下一個表中尋找匹配的行,依次下去,直到找到所有表中匹配的行爲止。然後根據各個表匹配的行,返回查詢中需要的各個列。請看下面的例子中的簡單的查詢:

查詢語句:select tbl1.col1, tbl2.col2 from tbl1 inner join tbl2 using(col3) where tbl1.col1 in (5, 6);
假設MySQL按照查詢中的表順序進行關聯操作,我們則可以用下面的僞代碼表示MySQL將如何完成這個查詢:

outer_iter = iterator over tbl1 where col1 in (5, 6)
outer_row = outer_iter.next
while outer_row
    inner_iter = iterator over tbl2 where col3 = outer_row.col3
    inner_row = inner_iter.next
    while inner_row
        output [ outer_row.col1, inner_row.col2]
        inner_row = inner_iter.next
    end
    outer_row = outer_iter.next
end

上面的執行計劃對於單表查詢和多表關聯查詢都適用,如果是一個單表查詢,那麼只需要上面外層的基本操作。對於外連接,上面的執行過程仍然適用。例如,我們將上面的查詢語句修改如下:
select tbl1.col1, tbl2.col2 from tbl1 left outer join tbl2 using(col3) where tbl1.col1 in (5, 6);
那麼,對應的僞代碼如下:

outer_iter = iterator over tbl1 where col1 in (5, 6)
outer_row = outer_iter.next
while outer_row
    inner_iter = iterator over tbl2 where col3 = outer_row.col3
    inner_row = inner_iter.next
    if inner_row
        while inner_row
            output [ outer_row.col1, inner_row.col2]
            inner_row = inner_iter.next
        end
    else
        output [ outer_row.col1, null]
    end
        outer_row = outer_iter.next
end

參考文章:
數據庫內連接 外連接左右連接
圖解MySQL 內連接、外連接、左連接、右連接、全連接
數據庫左連接,右連接,內連接,外連接
sql中的左右關聯、全關聯、自關聯
SQL的連接分爲三種:內連接、外連接、交叉連接
數據庫——自然連接、內連接、外連接(左外連接、右外連接、全外連接)、交叉連接

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