日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

sql server 连接查询_连表查询语句(SQL数据库)

發(fā)布時(shí)間:2023/12/15 综合教程 19 生活家
生活随笔 收集整理的這篇文章主要介紹了 sql server 连接查询_连表查询语句(SQL数据库) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

SQL的連表查詢(xún)

2017年08月31日 15:58:49

閱讀數(shù):176

SQL的連表查詢(xún)

連接查詢(xún)包括合并、內(nèi)連接、外連接和交叉連接,如果涉及多表查詢(xún),了解這些連接的特點(diǎn)很重要。

只有真正了解它們之間的區(qū)別,才能正確使用。

1、Union

UNION 操作符用于合并兩個(gè)或多個(gè) SELECT 語(yǔ)句的結(jié)果集。

UNION運(yùn)算符通過(guò)組合其他兩個(gè)結(jié)果表(例如TABLE1和TABLE2)并消去表中任何重復(fù)行而派生出一個(gè)結(jié)果表。

當(dāng)ALL隨UNION一起使用時(shí)(即UNION ALL),不消除重復(fù)行。兩種情況下,派生表的每一行不是來(lái)自TABLE1就是來(lái)自TABLE2。

注意:使用UNION時(shí),兩張表查詢(xún)的結(jié)果有相同數(shù)量的列、列類(lèi)型相似。

學(xué)生表信息(Students):

ID Name Age City MajorID
101 Tom 20 BeiJing 10
102 Lucy 18 ShangHai 11

教師表信息(Teachers):

ID Name
101 Mrs Lee
102 Lucy

預(yù)置腳本:

INSERT INTO Students(ID,Name,Age,City,MajorID) VALUES(101,'Tom',20,'BeiJing',10)
INSERT INTO Students(ID,Name,Age,City,MajorID) VALUES(102,'Lucy',18,'ShangHai',11)

INSERT INTO Teachers(ID,Name) VALUES(101,'Mrs Lee')
INSERT INTO Teachers(ID,Name) VALUES(102,'Lucy')

1)基本UNION查詢(xún),查詢(xún)學(xué)校教師、學(xué)生的總的信息表,包括ID和姓名

SELECT ID,Name FROM Students
UNION
SELECT ID,Name FROM Teachers

查詢(xún)結(jié)果:

ID Name
101 Mrs Lee
101 Tom
102 Lucy

2)帶條件的UNION查詢(xún),也可以查詢(xún)同一張表,查詢(xún)年齡為18,23歲的學(xué)生信息

SELECT ID,Name FROM Student WHERE Age=18
UNION
SELECT ID,Name FROM Student WHERE Age=23

當(dāng)然,這可以使用IN或者OR很容易實(shí)現(xiàn),這里只是點(diǎn)到,以后遇到復(fù)雜查詢(xún),相信你會(huì)用到。

3)查詢(xún)教師學(xué)生全部姓名

因?yàn)閁NION只會(huì)選擇不同的值,如果學(xué)生中和教師中有重名的情況,這就需要UNION ALL

SELECT Name FROM Students
UNION ALL
SELECT Name FROM Teachers

查詢(xún)結(jié)果:

ID Name
101 Tom
102 Lucy
101 Mrs Lee
102 Lucy

2、INNER JOIN(內(nèi)連接)

INNER JOIN(內(nèi)連接),也成為自然連接

作用:根據(jù)兩個(gè)或多個(gè)表中的列之間的關(guān)系,從這些表中查詢(xún)數(shù)據(jù)。

注意:內(nèi)連接是從結(jié)果中刪除其他被連接表中沒(méi)有匹配行的所有行,所以?xún)?nèi)連接可能會(huì)丟失信息。

重點(diǎn):內(nèi)連接,只查匹配行。

語(yǔ)法:(INNER可省略)

SELECT fieldlist
FROM table1 [INNER] join table2
ON table1.column=table2.column

學(xué)生表信息(Students):

ID Name Age City MajorID
101 Tom 20 BeiJing 10
102 Lucy 18 ShangHai 11

專(zhuān)業(yè)信息表(Majors):

ID Name
10 English
12 Computer

預(yù)置腳本:

DELETE FROM Students
INSERT INTO Students(ID,Name,Age,City,MajorID) VALUES(101,'Tom',20,'BeiJing',10)
INSERT INTO Students(ID,Name,Age,City,MajorID) VALUES(102,'Lucy',18,'ShangHai',11)

DELETE FROM Majors
INSERT INTO Majors(ID,Name) VALUES(10,'English')
INSERT INTO Majors(ID,Name) VALUES(12,'Computer')

實(shí)例:查詢(xún)學(xué)生信息,包括ID,姓名、專(zhuān)業(yè)名稱(chēng)

SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students INNER JOIN Majors
ON Students.MajorID = Majors.ID

查詢(xún)結(jié)果:

ID Name MajorName
101 Tom English

根據(jù)結(jié)果可以清晰看到,確實(shí)只有匹配的行。學(xué)生Lucy的信息丟失了。

但是,inner join也會(huì)產(chǎn)生重復(fù)數(shù)據(jù)。如果將Majors表的主鍵約束去掉,可以插入重復(fù)的ID,如:

DELETE FROM Majors
INSERT INTO Majors(ID,Name) VALUES(10,'English')
INSERT INTO Majors(ID,Name) VALUES(10,'Computer')

繼續(xù)執(zhí)行上面的關(guān)聯(lián)語(yǔ)句,結(jié)果為:

ID Name MajorName
101 Tom English
101 Tom Computer

如果是LEFT JOIN也會(huì)有重復(fù)記錄,其結(jié)果為:

ID Name MajorName
101 Tom English
101 Tom Computer
102 Lucy NULL

RIGHT JOIN 結(jié)果與INNER JOIN一樣。

后續(xù)我們會(huì)深入研究JOIN的具體原理。

3、外連接

與內(nèi)連接相比,即使沒(méi)有匹配行,也會(huì)返回一個(gè)表的全集。

外連接分為三種:左外連接,右外連接,全外連接。對(duì)應(yīng)SQL:LEFT/RIGHT/FULL OUTER JOIN。通常我們省略outer 這個(gè)關(guān)鍵字。寫(xiě)成:LEFT/RIGHT/FULL JOIN。

重點(diǎn):至少有一方保留全集,沒(méi)有匹配行用NULL代替。

1)LEFT OUTER JOIN,簡(jiǎn)稱(chēng)LEFT JOIN,左外連接(左連接)

結(jié)果集保留左表的所有行,但只包含第二個(gè)表與第一表匹配的行。第二個(gè)表相應(yīng)的空行被放入NULL值。

依然沿用內(nèi)鏈接的例子

(1)使用左連接查詢(xún)學(xué)生的信息,其中包括學(xué)生ID,學(xué)生姓名和專(zhuān)業(yè)名稱(chēng)。

SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students LEFT JOIN Majors
ON Students.MajorID = Majors.ID

結(jié)果:

ID

Name

MajorName

101

Tom

English

102

Lucy

NULL

結(jié)論:

通過(guò)結(jié)果,我們可以看到左連接包含了第一張表的所有信息,在第二張表中如果沒(méi)有匹配項(xiàng),則用NULL代替。

2)RIGHT JOIN(right outer join)右外連接(右連接)

右外連接保留了第二個(gè)表的所有行,但只包含第一個(gè)表與第二個(gè)表匹配的行。第一個(gè)表相應(yīng)空行被入NULL值。

右連接與左連接思想類(lèi)似。只是第二張保留全集,如果第一張表中沒(méi)有匹配項(xiàng),用NULL代替

依然沿用內(nèi)鏈接的例子,只是改為右連接

(1)使用右連接查詢(xún)學(xué)生的信息,其中包括學(xué)生ID,學(xué)生姓名和專(zhuān)業(yè)名稱(chēng)。

SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students RIGHT JOIN Majors
ON Students.MajorID = Majors.ID

查詢(xún)結(jié)果:

ID

Name

MajorName

101

Tom

English

NULL

NULL

Computer

通過(guò)結(jié)果可以看到,包含了第二張表Majors的全集,Computer在Students表中沒(méi)有匹配項(xiàng),就用NULL代替。

3)FULL JOIN (FULL OUTER JOIN,全外連接)

全外連接,簡(jiǎn)稱(chēng):全連接。會(huì)把兩個(gè)表所有的行都顯示在結(jié)果表中

1)使用全連接查詢(xún)學(xué)生的信息,其中包括學(xué)生ID,學(xué)生姓名和專(zhuān)業(yè)名稱(chēng)。

SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students FULL JOIN Majors
ON Students.MajorID = Majors.ID

查詢(xún)結(jié)果:

ID

Name

MajorName

101

Tom

English

102

Lucy

NULL

NULL

NULL

Computer

包含了兩張表的所有記錄,沒(méi)有記錄丟失,沒(méi)有匹配的行用NULL代替。

4、CROSS JOIN(交叉連接)

交叉連接。交叉連接返回左表中的所有行,左表中的每一行與右表中的所有行組合。交叉連接也稱(chēng)作笛卡爾積。

簡(jiǎn)單查詢(xún)兩張表組合,這是求笛卡兒積,效率最低。

笛卡兒積:笛卡爾乘積,也叫直積。假設(shè)集合A={a,b},集合B={0,1,2},則兩個(gè)集合的笛卡爾積為{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}??梢詳U(kuò)展到多個(gè)集合的情況。類(lèi)似的例子有,如果A表示某學(xué)校學(xué)生的集合,B表示該學(xué)校所有課程的集合,則A與B的笛卡爾積表示所有可能的選課情況。

1)交叉連接查詢(xún)學(xué)生的信息,其中包括學(xué)生ID,學(xué)生姓名和專(zhuān)業(yè)名稱(chēng)。

SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students CROSS JOIN Majors

查詢(xún)結(jié)果:

ID

Name

MajorName

101

Tom

English

102

Lucy

English

101

Tom

Computer

102

Lucy

Computer

2)查詢(xún)多表,其實(shí)也是笛卡兒積,與CROSS JOIN等價(jià),以下查詢(xún)同上述結(jié)果一樣。

這個(gè)可能很常見(jiàn),但是大家一定要注意了,這樣就查詢(xún)了兩張表中所有組合的全集。

SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students,Majors

3)加了查詢(xún)條件

注意:在使用CROSS JOIN關(guān)鍵字交叉連接表時(shí),因?yàn)樯傻氖莾蓚€(gè)表的笛卡爾積,因而不能使用ON關(guān)鍵字,只能在WHERE子句中定義搜索條件。

SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students CROSS JOIN Majors
WHERE Students.MajorID = Majors.ID

查詢(xún)結(jié)果:

ID

Name

MajorName

101

Tom

English

查詢(xún)結(jié)果與INNER JOIN一樣,但是其效率就慢很多了

總結(jié)

以上是生活随笔為你收集整理的sql server 连接查询_连表查询语句(SQL数据库)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。