數(shù)據(jù)庫筆記3-多表查詢和集合查詢

數(shù)據(jù)庫中表與表相互關(guān)聯(lián)余赢,很多時候要通過查詢多個表才能得到自己想要的數(shù)據(jù)稚叹。

students
courses
reports

在sql server中(不區(qū)分大小寫):

一帐我、連接查詢:通過兩個及以上的表的連接操作來實(shí)現(xiàn)符糊。

1.內(nèi)連接查詢(最常用):只篩選出符合條件的數(shù)據(jù)

from students,reports 
where students.sno=reports.sno ;```

```select * from students,reports
where students.sno=reports.sno 
and ssex='女';```

where后面的語句是連接條件(即連接謂語)叠洗,連接條件要涉及兩個表中相同屬性的列,and后面是其他限制條件甘改。

'='運(yùn)算符可以換成其他比較運(yùn)算符,使用'='的連接稱作等值連接灭抑,使用其他比較運(yùn)算符的連接稱作非等值連接十艾。

```select students.*,cno,grade 
from students,reports 
where students.sno=reports.sno;```

沒有重復(fù)的列出現(xiàn)時稱作自然連接,上面的語句把重復(fù)的兩列學(xué)號刪掉一列名挥,連接方式變?yōu)榱俗匀贿B接疟羹。

```select students.sno,sname,cname 
from students,reports,courses 
where students.sno=reports.sno 
and reports.cno=courses.cno;```

多表連接。

```select *
from students,reports 
where students.sno=reports.sno 
and sdept='自動化'and ssex='女';```

有多個連接條件時稱為復(fù)合條件鏈接禀倔。

```select b.cno,b.cname,a.pre_cno repre 
from courses a,courses b 
where a.cno=b.pre_cno;```

自身連接查詢救湖,將自己定義兩個別名力九,查詢一門課程的前修課的前修課跌前。

###2.外連接查詢:選出指定表中的所有元組。

```select sname,grade 
from  students 
left join reports 
on students.sno=reports.sno;```

左連接:將關(guān)鍵詞left join左邊的表的中的元組全部查詢出來灾炭,即使某些學(xué)生的課程沒有數(shù)據(jù)(填入NULL)

```select sname,grade 
from  reports 
right join students 
on students.sno=reports.sno;```

右連接:將關(guān)鍵詞right join右邊的表的中的元組全部查詢出來,即使沒有數(shù)據(jù)(填入NULL)铡原。(左右連接可以相互替代)

```select sname,grade 
from  reports 
full join students 
on students.sno=reports.sno;```

全連接:將兩個表中所有的元組全部查詢出來,即使沒有數(shù)據(jù)(填入NULL)

>二燕刻、嵌套查詢:講一個查詢塊嵌套進(jìn)另一個查詢塊的where子句或having短語的條件中的查詢沪哺。

###1.不相關(guān)子查詢:由里向外逐層查詢。子查詢在父查詢之前得到結(jié)果并用作父查詢的查找條件酌儒。

```select sno,grade from 
reports 
where cno=(select cno 
from courses
where cname='數(shù)據(jù)庫');```

返回單值的子查詢,子查詢的結(jié)果和父查詢的條件屬性用比較運(yùn)算符(>,<,=,>=,<=,<>)連接.

```select sname 
from students 
where sno 
in(select sno from  reports 
where cno='c02');```

```select sname 
from students 
where sno =any(select sno from  reports 
where cno='c02');```

返回多值的子查詢枯途,子查詢的結(jié)果和父查詢的條件屬性用in謂詞連接或用ANY和ALL謂詞連接或用集函數(shù)(比較次數(shù)少忌怎,效率高)連接酪夷。

![ANY ALL與集函數(shù)的轉(zhuǎn)換](http://upload-images.jianshu.io/upload_images/2670618-72828f0edf861a97.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

###2.相關(guān)子查詢:子查詢依賴于父查詢晚岭,父查詢中的每個元組都帶入到子查詢,符合條件則篩選出來坦报。常用EXISTS與NOT EXISTS謂語库说。

```select sname 
from students 
where NOT EXISTS (select * from reports 
where Sno = Students.Sno AND cno='c01');```

 將父查詢中的元組帶入EXISTS與NOT EXISTS謂語后的條件中潜的,若查詢到數(shù)據(jù)則返回ture亡呵,將此條數(shù)據(jù)放入結(jié)果集歇由,查詢不到則返回false,不放入結(jié)果集释牺。所以這兩個謂語的返回結(jié)果并沒有實(shí)際意義,子查詢中的查詢列名也無意義。

有些EXISTS與NOT EXISTS謂語不能被其他形式的子查詢替代虽风,如上述代碼是查找沒有c01這門課的學(xué)生的姓名无牵,特別容易犯如下錯誤:

```select distinct sname 
from students,reports 
where students.sno=reports.sno 
and cno!='c01';```

這樣一個學(xué)生沒選c01但選了其他課程也會被選出來,一門課都沒選的學(xué)生并不會被選出來内舟,所以有些情況不能用連接查詢代替合敦。

##select語句結(jié)果集是元組的集合,所以多個結(jié)果集可以進(jìn)行集合操作验游。

>并操作(union)

```select * 
from students 
where sdept='計算機(jī)' 
union 
select * from students
where sage<=20;```

找出計算機(jī)系的或年齡不大于20歲的學(xué)生的所有信息,union 和數(shù)學(xué)中的并一樣充岛,會把默認(rèn)把重復(fù)值刪掉,如果想保留重復(fù)值用union all耕蝉。

>交操作(intersect)

```select * 
from students
where sdept='計算機(jī)'
intersect 
select * 
from  students 
where sage<=20;```

找出計算機(jī)系的且年齡不超過20歲的學(xué)生的信息崔梗,interscet相當(dāng)于數(shù)學(xué)中的交集,將相同的值篩選出來垒在。

>差操作(except)

```select *
from students 
where sdept='計算機(jī)' 
except 
select *
from students 
where sage>20;```

找出計算機(jī)系年齡不大于20的學(xué)生的信息蒜魄,except相當(dāng)于數(shù)學(xué)中的差,當(dāng)然A-B也可以寫成A+(-B),差操作可以由并操作代替场躯。

>對集合查詢結(jié)果排序

```select * 
from students 
where sdept='計算機(jī)' 
union select * 
from students 
where sage<=20 
order by 4 desc,1 asc;```

order by 只能對集合操作的結(jié)果集進(jìn)行排序谈为,所以要寫在最后,根據(jù)第一列和第四列降序排列只需寫出列名踢关。                    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伞鲫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子签舞,更是在濱河造成了極大的恐慌秕脓,老刑警劉巖柒瓣,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吠架,居然都是意外死亡芙贫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門傍药,熙熙樓的掌柜王于貴愁眉苦臉地迎上來磺平,“玉大人,你說我怎么就攤上這事拐辽⊥市悖” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵薛训,是天一觀的道長。 經(jīng)常有香客問我仑氛,道長乙埃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任锯岖,我火速辦了婚禮介袜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘出吹。我一直安慰自己遇伞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布捶牢。 她就那樣靜靜地躺著鸠珠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪秋麸。 梳的紋絲不亂的頭發(fā)上渐排,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機(jī)與錄音灸蟆,去河邊找鬼驯耻。 笑死,一個胖子當(dāng)著我的面吹牛炒考,可吹牛的內(nèi)容都是我干的可缚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼斋枢,長吁一口氣:“原來是場噩夢啊……” “哼帘靡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起杏慰,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤测柠,失蹤者是張志新(化名)和其女友劉穎炼鞠,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體轰胁,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谒主,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了赃阀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霎肯。...
    茶點(diǎn)故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖榛斯,靈堂內(nèi)的尸體忽然破棺而出观游,到底是詐尸還是另有隱情,我是刑警寧澤驮俗,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布懂缕,位于F島的核電站,受9級特大地震影響王凑,放射性物質(zhì)發(fā)生泄漏搪柑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一索烹、第九天 我趴在偏房一處隱蔽的房頂上張望工碾。 院中可真熱鬧,春花似錦百姓、人聲如沸渊额。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旬迹。三九已至,卻和暖如春求类,著一層夾襖步出監(jiān)牢的瞬間舱权,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宇色。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像鸵贬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子脖捻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容