SQL學習之高階聯結 自聯結 自然聯結 外聯接

2021-09-09 02:12:40 字數 3975 閱讀 2607

這是講解所需要的sql指令碼

一、自聯結       **如下:

select

*from customers

現在有個需求,需要給tom同一公司的所有會員傳送一條郵件。

分析下基本思路,首先根據tom找到其所在的公司名,在根據公司名找到其公司民下的所有會員。下面是解決**:

select

*from

customers

where company in(select company from customers where name=

'tom

')

ok,通過子查詢輕鬆的完成需求!

但是這邊有乙個重點,你必須要知道,子查詢雖然方便,但是大多數dbms的處理子查詢的速度比處理聯結要慢的多,如果資料量少的話,幾乎沒什麼影響,但是如果後期資料會很大的話,就應該使用自聯結!

下面是使用自聯結的解決**:

select

*from

customers c1,customers c2

where c1.company=c2.company

這是自聯結之後的效果!

select

*from

customers c1,customers c2

where c1.company=

c2.company

and c2.name=

'tom

'

這個是兩張表(實際是一張表)聯結之後的結果圖,ok完成需求!

自聯結通過聯結的機制,將所有公司名相同的記錄聯結到一起,即每乙個公司的會員,都會和同一公司的其他會員聯結一次,因為他們的公司名相同,這是時候指定c2.name='tom',就能拿到tom和其公司所有會員的資料,這個時候就可以發郵件了!

二、自然聯結

無論何時對錶進行聯結,應該至少有一列不止出現在乙個表中(被聯結的列)。標準的聯結返回所有的資料,相同的列甚至出現多次。而自然聯結就是排除多次出現,是每一列只出現一次。

但是sql不提供這項功能,自然聯結的功能是需要你自己去完成的,自然聯結要求你只能選擇哪些唯一的列,一般通過對乙個表使用萬用字元(select *),而對其他表的列使用明確的子集來完成。

注意:我們迄今為止建立的每個內聯結都是自然聯結,很可能永遠都不會用到不是自然聯結的內聯結。

三、外聯結(左外聯結(left outer join)和右外聯結(right outer join))

許多聯結將乙個表中的行與另乙個表中的行相關聯,但有時候需要需要包含哪些沒有關聯的行。例如,有如下需求

(1)對每個顧客下的訂單書進行計數,包括那些至今尚未下訂單的顧客;

(2)列出所有產品以及訂購數量,包括沒有人訂購的產皮

(3)計算平均銷售規模,包括那些至今尚未下訂單的顧客;

內聯結**如下:

select

*from

customers

select

*from

orders

select

*from customers a inner

join

orders b

on a.id=b.customerid

這邊我們使用了內聯結檢索出所有使用者的訂單,通過內聯結的檢索結果和外聯結的檢索結果比較,來更好的理解外聯結!

通過結果圖,發現內聯結確實把所有使用者的訂單都檢索出來了,但是這裡內聯結似乎把沒有訂單的使用者給過濾掉了,所以我們分析得出內聯結只把有訂單的所有使用者資訊包括訂單資訊檢索出來,但是如果使用者沒有訂單,則該使用者資訊會被過濾!

下面再來看外聯結**:

select

*from

customers

select

*from

orders

select

*from customers a left

outer

join

orders b

on a.id=b.customerid

這邊我們使用了左外聯結檢索出所有使用者的訂單

通過結果圖,發現外聯結也把所有使用者的訂單都檢索出來了,但是這裡外聯結把沒有訂單的使用者也檢索出來了(即外聯結能檢索出沒有關聯行的行,對應的用null來填充其關聯行),只是它的訂單資訊沒有,所以對應的用null來替換,這就是外聯結和內聯結的最主要的差別,我們可以根據不同的業務需求,來選擇性的使用它們!

四、全外連線(full outer join)

select

*from

customers

select

*from

orders

select

*from customers a full

outer

join

orders b

on a.id=b.customerid

分析orders和customers表結果圖發現:趙六和馮七沒有下訂單,而訂單表中的第四單沒有與之對應的顧客,再看全連線之後的結果圖,發現全聯結把所有沒有沒有與之對應關聯行的行全部用null填充,這就是全聯結的作用!

五、使用帶聚集函式的聯結

聚集函式是用來彙總資料,在我前面的隨筆中所用的聚集函式的例子都是從乙個表中彙總資料,其實聚集函式也可以和聯結一起使用,其實聯結是多個小表組裝而成的乙個大表(你可以這樣理解).

下面通過例子來了解其用法,**如下:

select

*from

customers

select

*from orders

現在有個需求,需要檢索出所有顧客的訂單數量(沒有則為0),下面是解決**:

select a.id,a.name,count

(b.customerid)

from customers a left

join

orders b

on a.id=

b.customerid

group

by a.name,a.id

ok,完成需求!

六、使用聯結和聯結條件(使用聯結主要注意的要點)

(1)注意所使用的聯結型別。一般我們使用內聯結(inner join)使用外聯結同樣有效!   ---這一點上面'三'已論述

(2)保證使用正確的聯結條件(不管採用哪種語法、那種聯結),否則會返回不正確的資料。

(3)所有的聯結都需要提供聯結條件,否則會得出笛卡爾積。

(4)在乙個聯結中可以包含多個表,甚至可以對每個聯結採用不同的聯結型別。這樣做是合法的,也是有用的,但是在一起測試它們前分別測試每個聯結。這樣會使排除故障更簡單。

SQL使用子查詢 聯結表 建立高階聯結

利用子查詢進行過濾select cust name,cust contact from customers where cust id in select cust id from orders where order num in select order num from orderitems ...

SQL學習筆記之建立高階聯結

列別名使用方法 列的表示式 對列聚集函式 對列使用其他函式 as 列別名 表別名使用方法 在from子句中,表名 as 表別名 給表起別名有兩個優點 縮短sql語句,使得語法更簡潔 可以在select語句中多次使用相同的表 select cust name,cust contact from cus...

SQL學習之 聯結表

sql最強大的功能之一就是能在資料查詢的執行中聯結 join 表。關係表 理解關係表,可以來看乙個例子。有乙個包含產品目錄的資料庫表,其中每類物品佔一行。對於每一種物品,要儲存的資訊包括產品描述,以及生產該產品的 商。把它們放在一張表中必然會有重複的資訊,乙個 商的資訊將重複在他生產的產品後出現,相...