sql中的幾種連線型別

2022-07-03 19:39:13 字數 2334 閱讀 1799

一、連線型別簡介

在sql中單錶查詢的機率相對來說比較少,隨著資料庫的日益複雜,多表關聯的情況越來越多,在多表關聯的情況下存在多種關聯的型別,

1、自關聯(join或inner join)

2、左外關聯(left join或left outer join)

3、右外關聯(right join或right outer join)

4、全關聯(full join)

二、各種關聯的使用

為了更形象的說明這幾種連線型別的使用場景及用法,下面以學生表(student)和學生選課表(course)表來演示,其表結構及資料如下圖,

上面是兩張表的結構及資料。

1、自關聯

有時需要得到完整的資料,我們需要關聯兩個或兩個以上的表,這時候便用到了自關聯,其中自關聯可以有下面兩種寫法,其一,

select s.s_id,s_name,c.c_name from student s,course c where s.s_id=c.s_id
執行上面的語句得到的結果如下,

其二的sql語句寫法如下,

select s.s_id,s_name,c.c_name from student s join course c on s.s_id=c.s_id;
執行上面的語句得到的結果如下,

從上面的結果,可以看到兩種寫法的結果是一樣的,同時也可以得出這樣乙個結論:自關聯過濾出的資料必須滿足在左表和右表都符合條件,這裡的條件只的s.s_id=c.s_id,也就是說s_id必須同時存在於兩個表中才會出現在結果中。

那麼針對上面的兩種寫法哪種更好,這裡認為哪種最好,適合的就是最好的。

對於自關聯來說,有個重要的問題需要注意那就是笛卡爾積,自關聯如果忘記寫關聯條件就會出現笛卡爾積的情況 ,關於笛卡爾積的情況,可以自查資料,這裡以第二種sql寫法演示笛卡兒積的出現,

select s.s_id,s_name,c.c_name from student s   join course c ;
結果如下,

寫法即未加過濾條件(未加on或where條件),這樣出來的結果為兩個表中的資料行數的乘積,即4x5=20行,這就是笛卡兒積。

2、左外關聯/右外關聯

左外關聯和右外關聯其實可以看作同一種寫法,在使用上可以相互轉化。左外關聯即以左表為基本表,會展示所有的左表中的資料,如果在右表中沒有匹配的資料便為null,右外關聯剛好相反,

左外關聯,

select s.s_id,s_name,c.c_name from student s left

join

course c

on s.s_id=c.s_id;

執行結果如下,

可以看到結果資料集只有4行即為左表中的資料,但可以看到c_name列為null,這是因為在右表中沒有匹配的s_id為1004的記錄,所以此列為null。

右關聯

select s.s_id,s_name,c.c_name,c.s_id as c_s_id from student s right

join

course c

on s.s_id=c.s_id;

執行的結果如下,

可以看出結果集為5行資料,即為右表中的資料,以右表為基本表。結果中的為null的資料列是因為在左表中沒有匹配的記錄,所以為null。

3、全關聯

全關聯是只要其中某個表存在匹配的記錄,便會返回行。

這裡是mysql的環境,暫無法給出例項。

有不當之處請指正,感謝!

由於這裡的環境是mysql,mysql不支援full join的方式,這裡暫不給出例項。

SQL中的幾種連線

1 內連線inner join select a.name,b.name from table1 a inner join table2 b on a.id b.id 返回table1和table2表的交集部分 2 左連線left join select from table1 a left joi...

sql的幾種連線

最近找工作複習mysql,涉及到sql的幾種join a表id name 1zhang2li 3wang 4zhao b表id name 2zhao 4qian5wu 7zhang 1.inner join 是一種內連線,也是一種普通的連線,只是將a和b中所指定屬性中的相同的元素選擇出來 其中又分為...

SQL的幾種連線

1.內連線 結果 從左表中取出每一條記錄,去右表中與所有的記錄進行匹配 匹配必須是某個條件是左表中與右表中相同,才會保留結果,否則不保留 1.等值連線 在連線條件中使用等於號 運算子比較被連線列的列值,其查詢結果中列出被連線表中的所有列,包括其中的重複列。2.不等值連線 在連線條件使用除等於運算子以...