SQL復(fù)雜查詢

PS:本文中數(shù)據(jù)庫表請參考上一篇文章

I.連接查詢

定義
前一篇中提到的查詢都是針對單個(gè)表的。若一個(gè)查詢涉及到兩個(gè)以上的表辩块,則稱之為連接查詢良蛮。連接查詢是關(guān)系型數(shù)據(jù)庫中的主要查詢运提,包括等值連接查詢莫换、自然連接查詢、非等值連接查詢嚣艇、自身連接查詢式廷、外連接查詢和復(fù)合條件連接查詢等咐扭。

1、等值與非等值連接查詢

一般格式
[表名1.]<列名1> <比較運(yùn)算符> [表名2.]<列名2>

其主要運(yùn)算符有:=滑废、>蝗肪、<、>=蠕趁、<=薛闪、!=(或<>)等;

當(dāng)比較運(yùn)算符為=時(shí)俺陋,稱為等值連接豁延,其他的運(yùn)算符稱為非等值連接。


-- 查詢每個(gè)學(xué)生及其選修課程的情況
select student.*, sc.*
from student, sc
where student.Sno=sc.Sno;

上述例子在屬性前面加上了表名腊状,這個(gè)因?yàn)閮蓚€(gè)表都存在Sno這一列诱咏,加上前綴可以避免混淆,當(dāng)參與連接的表的屬性列是唯一的時(shí)候缴挖,此前綴可省略袋狞。

若把等值連接中目標(biāo)列中重復(fù)的屬性列去掉則為自然連接,如:

-- 自然連接
select student.Sno, Sname,Ssex, Sage, Sdept, Cno, Grade
from student, sc
where student.Sno=sc.Sno;

2映屋、自身連接

一個(gè)表與自己連接苟鸯,則稱為表的自身連接。比如在Course表中棚点,我們只能的到直接的先修課早处,如果要得到先修課的先修課,則必須與自身連接瘫析。

-- 查詢課程的先修課的先修課
select c1.Cno, c2.Cpno
from course c1, course c2
where c1.Cpno=c2.Cno;

3砌梆、外連接

在通常的連接中默责,只有滿足的條件的元組才能作為結(jié)果輸出。例如下面這個(gè)例子

-- 查詢每個(gè)學(xué)生及其選修課程的情況
select student.*, sc.*
from student, sc
where student.Sno=sc.Sno;

沒有選課的學(xué)生信息被舍棄了么库。有時(shí)候想以Student表為主體列出每個(gè)學(xué)生的信息和選課信息傻丝,若某個(gè)學(xué)生沒有選課甘有,則在SC表的屬性列填充null值诉儒,這時(shí)候就要使用到外連接。

-- 左外連接查詢
select student.Sno, Sname, Sage, Ssex, Sdept, Cno, Grade
from student
left join sc on (student.Sno=sc.Sno);

左外連接列出左邊關(guān)系的所有元組(例如本例中的Student)亏掀,由外連接列出右邊關(guān)系的所有元組忱反。

4、復(fù)合條件連接
前面所提到的連接查詢滤愕,where子句只有一個(gè)條件温算,當(dāng)where子句中有多個(gè)連接條件時(shí),稱為復(fù)合條件連接间影。

-- 查詢選修了2號可并且成績在90分以上的學(xué)生信息
select student.Sno, Sname
from student,sc
where student.Sno=sc.Sno and sc.Cno=2 and Grade>=90;
-- 查詢選修了2號可并且成績在90分以上的學(xué)生信息
select student.Sno, Sname, Grade
from student,sc
where student.Sno=sc.Sno and sc.Cno=2 and Grade>=90;
-- 查詢每個(gè)學(xué)生的學(xué)號注竿、選修的課程名、成績
select student.Sno, Cname, Grade
from student,course,sc
where student.Sno=sc.Sno and sc.cno=course.cno;

II.嵌套查詢

定義
在SQL語言中魂贬,一個(gè)select-from-where語句稱為一個(gè)查詢塊巩割。將一個(gè)查詢塊嵌套在另一個(gè)查詢塊的where子句或者h(yuǎn)aving短語的條件中的查詢稱為嵌套查詢。
1付燥、在in謂詞的子查詢

-- 使用嵌套查詢查出選修了2號課程的學(xué)生的學(xué)號
select Sno
from student
where Sno in(
    select Sno
    from sc
    where Cno='2'
);

這類查詢外層查詢(父查詢)和內(nèi)層查詢(子查詢)的條件不相關(guān)宣谈,稱為不相關(guān)子查詢。

2键科、帶比較運(yùn)算符的子查詢

-- 查詢每個(gè)學(xué)生成績超過他平均成績的課程號
select Sno, Cno
from sc x
where Grade >(
        select avg(Grade)
        from sc y
        where y.Sno=x.Sno);

子查詢依賴父查詢的Sno闻丑,這類查詢稱為相關(guān)子查詢。

3勋颖、帶有any(some)或all謂詞的子查詢

子查詢返回單值時(shí)可以用比較運(yùn)算符嗦嗡,返回多值要用any(有的系統(tǒng)用some)或者all謂詞來修飾,而使用any或all謂詞修飾是必須同時(shí)使用比較運(yùn)算符饭玲,其語義為:

比較運(yùn)算 語義
> ANY 大于子查詢中的某個(gè)值
> ALL 大于子查詢中的所有值
< ANY 小于子查詢中的某個(gè)值
< ALL 小于子查詢中的所有值
>= ANY 大于等于子查詢中的某個(gè)值
>= ALL 大于等于子查詢中的所有值
<= ANY 小于等于子查詢中的某個(gè)值
<= ALL 小于等于子查詢中的所有值
= ANY 等于子查詢中的某個(gè)值
= ALL 等于子查詢中的所有值(通常沒有意義)
!=(或<>) ANY 不等于子查詢中的某個(gè)值
!=(或<>) ALL 不等于子查詢中的所有值
-- 查詢其他系中比計(jì)算機(jī)系某一個(gè)學(xué)生年齡小的學(xué)生姓名和年齡
select Sname, Sage
from student
where Sage < any(
        select Sage
        from student
        where Sdept='CS'
        )
and Sdept !='CS';
-- 用聚集函數(shù)查詢其他系中比計(jì)算機(jī)系某一個(gè)學(xué)生年齡小的學(xué)生姓名和年齡
select Sname, Sage
from student
where Sage <(
        select max(Sage)
        from student
        where Sdept='CS'
        )
and Sdept !='CS';

事實(shí)上侥祭,用聚集函數(shù)實(shí)現(xiàn)比用any或all謂詞效率要高。

4咱枉、帶有exists卑硫,not exists謂詞的子查詢

帶有exists的子查詢不返回人戶數(shù)據(jù),只返回true 或者false蚕断。

-- 查詢選修了1號課的學(xué)生姓名
select Sname
from student
where exists(
        select * from sc
        where student.Sno=sc.Sno and Cno='1'
);

使用 not exists就是去取其非值欢伏。

-- 查詢沒有選修了1號課的學(xué)生姓名
select Sname
from student
where not exists(
        select * from sc
        where student.Sno=sc.Sno and Cno='1'
);

III. 集合查詢

select 語句一般是返回多個(gè)元組的集合,所以多個(gè)select語句的結(jié)果集合可以進(jìn)行集合操作亿乳。集合操作包括并操作(union)硝拧,交操作(intersect)和差操作(except)径筏。但是需要注意的是參與集合運(yùn)算的集合列數(shù)量必須相等,而且數(shù)據(jù)類型也要相同障陶。

-- 查詢計(jì)算機(jī)系及年齡不大于19歲的學(xué)生 滋恬,不保留重復(fù)的元組
select * from student
where Sdept='CS'
union
select * from student
where Sage<=19;
-- 查詢計(jì)算機(jī)系及年齡不大于19歲的學(xué)生,保留重復(fù)的元組
select * from student
where Sdept='CS'
union all
select * from student
where Sage<=19;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抱究,一起剝皮案震驚了整個(gè)濱河市恢氯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鼓寺,老刑警劉巖勋拟,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異妈候,居然都是意外死亡敢靡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進(jìn)店門苦银,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啸胧,“玉大人,你說我怎么就攤上這事幔虏》哪睿” “怎么了?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵所计,是天一觀的道長柠辞。 經(jīng)常有香客問我,道長主胧,這世上最難降的妖魔是什么叭首? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮踪栋,結(jié)果婚禮上焙格,老公的妹妹穿的比我還像新娘。我一直安慰自己夷都,他們只是感情好眷唉,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著囤官,像睡著了一般冬阳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上党饮,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天肝陪,我揣著相機(jī)與錄音,去河邊找鬼刑顺。 笑死氯窍,一個(gè)胖子當(dāng)著我的面吹牛饲常,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播狼讨,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼贝淤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了政供?” 一聲冷哼從身側(cè)響起播聪,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鲫骗,沒想到半個(gè)月后犬耻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡执泰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了渡蜻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片术吝。...
    茶點(diǎn)故事閱讀 40,567評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖茸苇,靈堂內(nèi)的尸體忽然破棺而出排苍,到底是詐尸還是另有隱情,我是刑警寧澤学密,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布淘衙,位于F島的核電站,受9級特大地震影響腻暮,放射性物質(zhì)發(fā)生泄漏彤守。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一哭靖、第九天 我趴在偏房一處隱蔽的房頂上張望具垫。 院中可真熱鬧,春花似錦试幽、人聲如沸筝蚕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽起宽。三九已至,卻和暖如春济榨,著一層夾襖步出監(jiān)牢的瞬間坯沪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工腿短, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留屏箍,地道東北人绘梦。 一個(gè)月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像赴魁,于是被迫代替她去往敵國和親卸奉。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評論 2 359

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