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的連接分爲三種:內連接、外連接、交叉連接
數據庫——自然連接、內連接、外連接(左外連接、右外連接、全外連接)、交叉連接