一、natural join(自然連線)
兩張表通過natural join連線的時候,相當於有個隱含的where子句,對兩張表中同名的對應列相比較看是否相等。
二、cross join(建立笛卡爾積)
對兩張表通過交叉聯合產生第三張返回結果集的表。相當於普通的連線。
三、inner join(內連線)
內連線就相當於普通的cross join,只是格式不一樣,inner join在後面有乙個on子句(相當於where)的搜尋條件,用於過濾返回的行。
四、outer join (外連線)
select * from ta outer join tb on (ta.c1=tb.c1)
outer join告訴dbms生成結果表,在此表中不僅帶有相關(ta.c1=tb.c1)行對,而且還有來自兩個源表中任一表的不匹配的行。
五、left outer join(左連線) right outer join(右連線)
select * from ta left outer join tb on (ta.c1=tb.c1)
select * from ta right outer join tb on (ta.c1=tb.c1)
right outer join(right join)與left outer join(left join)剛好相反。
六、full outer join(全連線)
full outer join 返回組合了left outer join 和right outer join結果的表。
以下是inner join及outer join的具體介紹:
在乙個正規化的資料庫環境中, 我們常會碰到這款情形: 所需的資料並不是放在同乙個資料表中, 在這個時候, 你就要用到 join。
當然 join 如何將不同的資料庫的資料結合, 還要看你如何使用它, 一共有四種不同的 join 的方式, 在這篇文章中我們將為你介紹 inner join 及 outer join 以及其應用。
inner join
inner join 應該是最常用的 join 方式, 它只會傳回符合 join 規則的紀錄, 還是先來看看語法:
select 《要選擇的字段》 from 《主要資料表》 [outer] join 語法中的 outer 是可以省略的, 例如你可以用 left join 或是 right join, 在本質上, outer join 是 inclusive, 叫它做包容性吧! 不同於 inner join 的排他性, 因此在 left outer join 的查詢結果會包含所有 left 資料表的資料, 顛倒過來講, right outer join 的查詢就會包含所有 right 資料表的資料, 接下來我們還是來做些實際操作, 仍然是使用北風資料庫, 但要先做一些小小的修改, 才能達到我們要的結果。
首先要拿掉 products 資料表的 foreign key, 否則沒有法度在 products 資料表新增一筆 supplierid 沒有對映到 suppliers 資料表的紀錄, 要知影乙個資料表的 constraint 你可以執行 sql 內建的 sp_helpconstraint , 在 qa 執行
sp_helpconstraint products
接下來刪除 fk_products_suppliers 這個 foreign key
alter table products
drop constraint fk_products_suppliers
再來新增一筆紀錄於 products 資料表, supplierid 使用 50 是因為它並沒有對映到 suppliers 資料表中的記錄
insert into products (productname,supplierid,categoryid)
values ('test product','50','1')
現在我們再執行頭前的查詢, 只是將 inner join 改為 left outer join
select productid, productname, suppliers.supplierid
from products
left outer join suppliers
products.suppliers = suppliers.supplierid
比較一下兩種 join 方式的查詢結果, 你應該就會知影其中的差別!
再來看看 right outer join, 請新增下底這筆記錄
insert into suppliers (companyname)
values ('learnasp')
現在請使用 right out join 來作查詢, 比較看看查詢的結果和 inner join 有什麼不同!
尋找不相符紀錄
這裡我們來看看如何使用 out join 來找不相符紀錄, 可能是有子紀錄卻沒有父紀錄或是顛倒過來
select suppliers.companyname from products
right join suppliers
on products.supplierid = suppliers.supplierid
where products.supplierid is null
執行結果你會找到一筆資料為 learnasp, 該筆供貨商資料存在, 但基本上已經沒有產品是來自這個供貨商, 想象一下如果不用 outer join 你要怎麼以乙個 sql 指令完成同一查詢結果! 知道 outer join 的好用了吧! 再執行
select products.productname
from products
left join suppliers
on products.supplierid = suppliers.supplierid
where suppliers.supplierid is null
sql聯表查詢
比如 all list 這個表,是包含所有資料的,我們要把整個資料的某些字段查詢出來顯示在列表上 select from all list select 現在我要檢視一條資料,需要根據表 user list 的乙個字段內容,去檢視另外乙個表 info list 的內容 select dept nam...
sql 語句 聯表查詢
1 replace into 用replace into 替代insert into 根據唯一主鍵判斷 無則插入,有則刪除重新插入 覆蓋 不適用自增id做主鍵。因為會刪除id.2.同表 分銷查詢下級每代的人數 內聯查詢 獲取第二代的人 select a.user name,a.reg time,a....
sql 單錶與聯表查詢
二 左連線 三 右連線 四 內連線 五 三表內連線查詢 六 交叉查詢 一般來說我們開始學習接觸資料庫的查詢的時候,我們都會先學習乙個簡單的查詢語句 查詢在userinfo表裡學校是hnu的學生的名字 select userinfo.user name from userinfo where user...