?? 多表查詢.txt
字號(hào):
多表查詢(基于兩個(gè)表)
如果一個(gè)查詢需要對(duì)多個(gè)表進(jìn)行操作就稱為連接查詢,連接查詢的結(jié)果集或結(jié)果稱為表之間的連接.
連接查詢實(shí)際上是通過(guò)各個(gè)表之間共同列的關(guān)聯(lián)性來(lái)查詢數(shù)據(jù)的,它是關(guān)系數(shù)據(jù)庫(kù)查詢最主要的特征.
select 表1.字段名1,表2.字段名2,...
from 表1,表2
where 連接條件
SQL-92標(biāo)準(zhǔn)所定義的FROM子句的連接語(yǔ)法格式為:
FROM 表名 join_type 表名 [ON (連接條件)]
連接操作中的ON (連接條件) 子句指出連接條件,它由被連接表中的列和比較運(yùn)算符、邏輯運(yùn)算符等構(gòu)
成。
連接查詢分類:
1.自連接查詢,對(duì)同一個(gè)表進(jìn)行連接操作
2.內(nèi)連接查詢,<又分為:自然連接、等值連接、不等值連接三種>
3.外連接查詢,<又分為:左外連接、右外連接、全外連接三種>
4.交叉連接查詢,也作無(wú)條件查詢。
5.聯(lián)合查詢
----------------------------
一。自連接查詢:
一個(gè)表自己與自己建立連接稱為自連接或自身連接。
進(jìn)行自連接就如同兩個(gè)分開(kāi)的表一樣,可以把一個(gè)表的某一行與同一表中的另一行連接起來(lái)。
例:
查詢選學(xué)“101”課程的成績(jī)高于“9505201”號(hào)學(xué)生成績(jī)的所有學(xué)生記錄,
并按成績(jī)從高到低排列。
select x.* from sclass x,sclass y
where x.cno=''101'' and x.degree>y.degree and y.sno=''9505201'' and y.cno=''101''
order by x.degree desc
----------------------------
二。內(nèi)連接(INNER JOIN):
內(nèi)連接是最常用的一種連接方式,它只返回兩個(gè)數(shù)據(jù)集合之間匹配關(guān)系的那些行.
將位于兩個(gè)互相交叉的數(shù)據(jù)集合中重疊部分以內(nèi)的那些數(shù)據(jù)行連接起來(lái).
內(nèi)連接(INNER JOIN)使用比較運(yùn)算符進(jìn)行表間某(些)列數(shù)據(jù)的比較操作,
并列出這些表中與連接條件相匹配的數(shù)據(jù)行。
根據(jù)所使用的比較方式不同,內(nèi)連接查詢操作列出與連接條件匹配的數(shù)據(jù)行,
它使用比較運(yùn)算符比較被連接列的列值。
語(yǔ)法:
select 字段名列表 from 表名 [inner] join 表名 on 連接條件 [where 條件表達(dá)式]
例:
select 學(xué)生表.學(xué)號(hào),學(xué)生表.姓名,學(xué)生表.班級(jí)代號(hào),成績(jī)表.課程代號(hào),成績(jī)表.課程成績(jī)
from 學(xué)生表 INNER JOIN 成績(jī)表
on 學(xué)生表.學(xué)號(hào)=成績(jī)表.學(xué)號(hào)
where 學(xué)生表.班級(jí)代號(hào)=''200201''
select x.sno,x.sname,y.cno,y.degree from student x
INNER join sclass y on x.sno=y.sno where x.sclass=''95文秘1''
內(nèi)連接分三種:
1、等值連接:
所謂等值連接,是指表之間通過(guò)“等于”關(guān)系連接起來(lái),產(chǎn)生一個(gè)臨時(shí)表,
然后對(duì)該臨時(shí)表進(jìn)行處理后生成最終結(jié)果。其查詢結(jié)果中列出被連接表中的所有列,
包括其中的重復(fù)列。
(1)查詢所有學(xué)生的sno,cname,degree列:
SELECT x.sno,y.cname,x.degree
FROM score x,course y
WHERE x.cno=y.cno
(2)查詢“95033”班所選課程的平均分:
SELECT y.cno,avg(y.degree) as "平均分"
FROM student x,score y
WHERE x.class=''95033'' and x.sno=y.sno group by y.cno
(3)查詢所有學(xué)生的student,score表信息:
select x.*,y.* from student x,score y where x.sno=y.sno
用等值連接列出authors和publishers表中位于同一城市的作者和出版社:
SELECT * FROM authors AS a INNER JOIN publishers AS p ON a.city=p.city
2、不等值連接:
是指表之間的連接關(guān)系不是“等于”,而是其它關(guān)系。
這些運(yùn)算符包括>、>=、<=、<、!>、!<和<>。
(1)查詢所有學(xué)生的sno,cno,rank列:
select sno,cno,rank
from score,grade
where degree between low and upp order by rank
(2)
select x.sno,x.sname,y.cno,y.degree
from student x,score y
where x.sno!=y.sno
3、自然連接:
在等值連接中消除重復(fù)列就是自然連接。
(1)
select x.sno,x.sname,y.cno,y.degree
from student x,score
where x.sno=y.sno
用自然連接,在選擇列表中刪除authors 和publishers 表中重復(fù)列(city和state):
SELECT a.*?p.pub_id?p.pub_name?p.country
FROM authors AS a INNER JOIN publishers AS p ON a.city=p.city
----------------------------
三。外連接(OUTER JOIN):
與內(nèi)連接不同的是,外連接不只列出與連接條件相匹配的行,
而是列出左表(左外連接時(shí))、右表(右外連接時(shí))或兩個(gè)表(全外連接時(shí))
中所有符合搜索條件的數(shù)據(jù)行。
外連接是對(duì)內(nèi)連接的擴(kuò)充,除了將兩個(gè)數(shù)據(jù)集合中重疊部分以內(nèi)的那些數(shù)據(jù)行連接起來(lái)之外,
還可以根據(jù)要求返回左側(cè)或右側(cè)數(shù)據(jù)集合中非匹配的數(shù)據(jù)或全部的數(shù)據(jù).
即 左外連接(LEFT OUTER JOIN);
右外連接(RIGHT OUTER JOIN);
全部連接(FULL OUTER JOIN).
外連接返回的結(jié)果集中的一些數(shù)據(jù)看起來(lái)和內(nèi)連接返回的數(shù)據(jù)完全一樣,
但有一些數(shù)據(jù)也與內(nèi)連接返回的數(shù)據(jù)不同,這些數(shù)據(jù)行的某些部分是來(lái)自于表中的數(shù)據(jù),
另一部分是NULL值,產(chǎn)生這些NULL值的原因是因?yàn)榱硪槐碇胁话c指定表相匹配的數(shù)據(jù)項(xiàng)
內(nèi)連接時(shí),返回查詢結(jié)果集合中的僅是符合查詢條件( WHERE 搜索條件或 HAVING 條件)和
連接條件的行。而采用外連接時(shí),它返回到查詢結(jié)果集合中的不僅包含符合連接條件的行,
而且還包括左表(左外連接時(shí))、右表(右外連接時(shí))或兩個(gè)邊接表(全外連接)中的所有數(shù)據(jù)行。
注: 外連接強(qiáng)以使不滿足條件的記錄也出現(xiàn)在結(jié)果集中。
外連接語(yǔ)法:
Select 字段名列表 from 表名 Left|Right|Full [Outer] join 表名 ON 連接條件
外連接分為:
1。左外連接(LEFT OUTER JOIN或LEFT JOIN):
在結(jié)果表中包含第一個(gè)表中滿足條件的所有記錄。
如果是在連接條件上匹配的記錄,則第二個(gè)表返回相應(yīng)值,否則第二個(gè)表返回空值。
select 學(xué)生表.學(xué)號(hào),學(xué)生表.姓名,成績(jī)表.課程代號(hào),成績(jī)表.課程成績(jī)
from 學(xué)生表 left outer join 成績(jī)表
on 學(xué)生表.學(xué)號(hào)=成績(jī)表.學(xué)號(hào)
2。右外連接(RIGHT OUTER JOIN或RIGHT JOIN):
在結(jié)果表中包含第二個(gè)表中滿足條件的所有記錄。
如果是在連接條件上匹配的記錄,則第一個(gè)表返回相應(yīng)值,否則第一個(gè)表返回空值。
select 學(xué)生表.學(xué)號(hào),學(xué)生表.姓名,成績(jī)表.課程代號(hào),成績(jī)表.課程成績(jī)
from 學(xué)生表 right outer join 成績(jī)表
on 學(xué)生表.學(xué)號(hào)=成績(jī)表.學(xué)號(hào)
3。全外連接(FULL OUTER JOIN或FULL JOIN):
在結(jié)果表中包含兩個(gè)表中滿足條件的所有記錄。
如果是在連接條件上匹配的元組,則另一個(gè)表返回相應(yīng)值,否則另一個(gè)表返回空值。
select 學(xué)生表.學(xué)號(hào),學(xué)生表.姓名,成績(jī)表.課程代號(hào),成績(jī)表.課程成績(jī)
from 學(xué)生表 full outer join 成績(jī)表
on 學(xué)生表.學(xué)號(hào)=成績(jī)表.學(xué)號(hào)
例子:
SELECT a.*,b.* FROM student as a left JOIN sclass as b
ON a.sno=b.sno and a.sno=''9502101''
go
SELECT a.*,b.* FROM student as a right JOIN sclass as b
ON a.sno=b.sno and a.sno=''9502101''
go
SELECT a.*,b.* FROM student as a full JOIN sclass as b
ON a.sno=b.sno
go
----------------------------
四。交叉連接:
交叉連接不使用任何連接條件來(lái)限制結(jié)果集合,將各表的記錄以“笛卡爾”積的方式組合起來(lái),
是分別使用兩個(gè)數(shù)據(jù)源中的行以所有可能的方式進(jìn)行組合,
即數(shù)據(jù)集中的每一行都要與另一表每一行組成一個(gè)新的行.
例如:一表中有三條記錄,另一表有4條記錄,交叉連接后,結(jié)果集合將由12條記錄組成.
交叉連接(CROSS JOIN)沒(méi)有WHERE 子句,它返回被連接的兩個(gè)表所有數(shù)據(jù)行的笛卡爾積,
返回到結(jié)果集合中的數(shù)據(jù)行數(shù)等于第一個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)乘以第二個(gè)表中
符合查詢條件的數(shù)據(jù)行數(shù)。
例,
titles表中有6類圖書(shū),而publishers表中有8家出版社,
則下列交叉連接檢索到的記錄數(shù)將等于6*8=48行。
select * from student,sclass
SELECT * FROM student a CROSS JOIN sclass ORDER BY a.sno
----------------------------
五。聯(lián)合查詢
UNION運(yùn)算符可以將兩個(gè)或兩個(gè)以上上SELECT語(yǔ)句的查詢結(jié)果集合合并成一個(gè)結(jié)果集合顯示,
即執(zhí)行聯(lián)合查詢。
UNION的語(yǔ)法格式為:
select_statement
UNION [ALL] selectstatement
[UNION [ALL] selectstatement][…n]
其中selectstatement為待聯(lián)合的SELECT查詢語(yǔ)句。
ALL選項(xiàng)表示將所有行合并到結(jié)果集合中。不指定該項(xiàng)時(shí),
被聯(lián)合查詢結(jié)果集合中的重復(fù)行將只保留一行。
聯(lián)合查詢時(shí),查詢結(jié)果的列標(biāo)題為第一個(gè)查詢語(yǔ)句的列標(biāo)題。
因此,要定義列標(biāo)題必須在第一個(gè)查詢語(yǔ)句中定義。要對(duì)聯(lián)合查詢結(jié)果排序時(shí),
也必須使用第一查詢語(yǔ)句中的列名、列標(biāo)題或者列序號(hào)。
在使用UNION 運(yùn)算符時(shí),應(yīng)保證每個(gè)聯(lián)合查詢語(yǔ)句的選擇列表中有相同數(shù)量的表達(dá)式,
并且每個(gè)查詢選擇表達(dá)式應(yīng)具有相同的數(shù)據(jù)類型,或是可以自動(dòng)將它們轉(zhuǎn)換為相同的數(shù)據(jù)類型。
在自動(dòng)轉(zhuǎn)換時(shí),對(duì)于數(shù)值類型,系統(tǒng)將低精度的數(shù)據(jù)類型轉(zhuǎn)換為高精度的數(shù)據(jù)類型。
在包括多個(gè)查詢的UNION語(yǔ)句中,其執(zhí)行順序是自左至右,使用括號(hào)可以改變這一執(zhí)行順序。
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -