SQL 中的JOIN兩表或者多表連接問題


SQL數據庫中的表連接

含義:連接即是把兩個表或者兩個以上的表信息放置在一個結果集中

分類:

1.內部連接
2.外部連接
3.完全連接
4.交叉連接

內部連接是連接類型中最普通的一種,與大多數連接一樣,內部連接根據一個或幾個相同的字段將記錄匹配在一起,但是內部連接僅僅返回那些存在的字段匹配的記錄。

Use northwind
select products.*,suppliers.supplierid from products inner 
join suppliers on products.supplierid=suppliers.supplierid


use pubs
select a.au_lname+', '+a.au_fname as author,t.title from authors a
join titleauthor ta on a.au_id=ta.au_id join titles t on t.title_id=ta.title_id

外部連接時必需跟上左側連接還是右側連接。

Use pubs
select discounttype,discount,s.stor_name from discounts d 
left outer join stores s on d.stor_id=s.stor_id

select discounttype,discount,s.stor_name from discounts d 
right join stores s on d.stor_id=s.stor_id

完全連接是將join兩側的數據全部匹配,並返回所有記錄。

Use pubs

select discounttype,discount,s.stor_name from discounts d 
full join stores s on d.stor_id=s.stor_id

交叉連接不使用on運算符,而將join左側的所有記錄與另一側的所有記錄連接,返回的是join兩側表記錄的笛卡爾積。(總數據條數為左側表內數據條數乘以右側表數據條數之積)

Use pubs

select discounttype,discount,s.stor_name from discounts d 
cross join stores s

上邊只是把定義和簡單的例子列舉,下邊用一個通俗簡單的例子說明join連接中兩表或者兩表以上的數據連接獲取到的數據集的情況

准備工作,先建立三張數據表,TABLEA,TABLEB,TABLEC,TABLEA表中有B,C表中的ID代碼如下

//TABLEA表有B,C表中的兩個ID,BID,CID





CREATE TABLE [dbo].[TableA]( [id] [
int] IDENTITY(1,1) NOT NULL, [A] [varchar](50) NULL, [Bid] [varchar](50) NULL, [Cid] [int] NULL, CONSTRAINT [PK_TableA_1] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
//TABLEB表




CREATE TABLE [dbo].[TableB]( [id] [
int] IDENTITY(1,1) NOT NULL, [name] [varchar](50) NULL, CONSTRAINT [PK_TableB] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
//TABLEC表



CREATE TABLE [dbo].[TableC]( [id] [
int] IDENTITY(1,1) NOT NULL, [Cname] [varchar](50) NULL, CONSTRAINT [PK_TableC] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
//TABLEA表數據添加后
1    A    1    1
2    A    6    2
//TABLEB表數據添加后
id    name
1    B
2    B
3    B
4    B
5    B
//TABLEC
id    Cname
1    C
2    C
3    C
4    C
5    C

兩表連接時

一、Inner join on 連接
代碼:SELECT * FROM TABLEB B INNER JOIN TABLEA A ON B.ID=A.BID

結果:id name id A Bid Cid
         1   B     1 A  1   1

分析:匹配后的結果只顯示符合ON后條件的結果集,不符合則不顯示

二、Outer join on (外連接)

1、左連接

代碼:SELECT * FROM TABLEB B LEFT OUTER JOIN TABLEA A ON B.ID=A.BID

結果:

id    name    id    A    Bid    Cid
1    B    1    A    1    1
2    B    NULL    NULL    NULL    NULL
3    B    NULL    NULL    NULL    NULL
4    B    NULL    NULL    NULL    NULL
5    B    NULL    NULL    NULL    NULL

分析:外左連接時左側為需要顯示全部信息的表,右側把沒有匹配ON條件的地方全部補為NULL

2、右連接

代碼:(待續)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM