2022-01-07 SQL語句多表查詢

單表查詢

多表查詢

第1章 多表查詢套路

1.多表查詢的套路

第一步: 先分析題意 找出需要哪些表

第二步: 找出這些表之間的關(guān)聯(lián)關(guān)系

第三步: 將這些表聯(lián)合成一張大表

第四步: 對這個大表在做查詢

2.多表關(guān)聯(lián)技巧

兩張表有直接關(guān)系:

select *

from a

join b

on a.num1 = b.num1

兩張表沒有直接關(guān)系,通過第三張表關(guān)聯(lián):

select *

from a

join b

on a.num1 = b.num1

join c

on b.num2 = c.num2

第2章 練習(xí)題

0.關(guān)聯(lián)模板

SELECT *

FROM 第一張表

JOIN 第二張表

ON 第一張表.字段 = 第二張表.字段

1.顯示老師名字和他教的課程名稱

第一步: 先分析題意 找出需要哪些表

teacher

course

第二步: 找出這些表之間的關(guān)聯(lián)關(guān)系

teacher.tno = course.tno

第三步: 將這些表聯(lián)合成一張大表

select *

from teacher

join course

on teacher.tno = course.tno

第四步: 對這個大表在做查詢

SELECT teacher.tname,course.cname

FROM teacher

JOIN course

ON teacher.tno = course.tno

SELECT tname,cname FROM course

JOIN teacher

ON course.tno = teacher.tno



2.統(tǒng)計每個學(xué)員的姓名及其學(xué)習(xí)課程的門數(shù),并且打印出學(xué)的課程名稱

第一步: 先分析題意 找出需要哪些表

student sc course

第二步: 找出這些表之間的關(guān)聯(lián)關(guān)系

student.sno = sc.sno

sc.cno = course.cno

第三步: 將這些表聯(lián)合成一張大表

SELECT *

FROM student

JOIN sc

ON student.sno = sc.sno

JOIN course

ON sc.cno = course.cno

第四步: 對這個大表在做查詢

SELECT student.sno'學(xué)號',student.sname'學(xué)生姓名',COUNT(sc.cno)'課程門數(shù)',GROUP_CONCAT(course.cname)'課程名稱'

FROM student

JOIN sc

ON student.sno = sc.sno

JOIN course

ON sc.cno = course.cno

GROUP BY student.sno

SELECT sc.sno'學(xué)號',student.sname'學(xué)生姓名',COUNT(course.cname)'課程門數(shù)',GROUP_CONCAT(course.cname)'課程名稱' FROM

course

JOIN sc

ON course.cno=sc.cno

JOIN student

ON sc.sno=student.sno

GROUP BY sc.sno



3.每位老師姓名及其教的學(xué)生數(shù)量和學(xué)生名列表

select *

from teacher

join course

on teacher.tno = course.tno

join sc

on course.cno = sc.cno

join student

on sc.sno = student.sno


3.每位老師姓名及其教的學(xué)生數(shù)量和學(xué)生名列表

SELECT course.cname'課程名稱',teacher.tname'老師姓名',COUNT(student.sno)'學(xué)生數(shù)量',GROUP_CONCAT(student.sname)'學(xué)生名單'

FROM teacher

JOIN course

ON teacher.tno = course.tno

JOIN sc

ON course.cno = sc.cno

JOIN student

ON sc.sno = student.sno

GROUP BY teacher.tno,course.cname


SELECT teacher.tno'教師號碼',teacher.tname'教師姓名',COUNT(student.sname)'學(xué)生數(shù)量',GROUP_CONCAT(student.sname)'學(xué)生名列表' FROM

course

JOIN sc

ON course.cno=sc.cno

JOIN student

ON sc.sno=student.sno

JOIN teacher

ON course.tno=teacher.tno

GROUP BY teacher.tno


4.每位老師教所教課程的平均分.最高分以及最低分

SELECT teacher.tname'老師姓名',course.cname'課程名稱',AVG(sc.score)'平均分',MAX(sc.score)'最高分',MIN(sc.score)'最低分'

FROM teacher

JOIN course

ON teacher.tno = course.tno

JOIN sc

ON course.cno = sc.cno

GROUP BY teacher.tno,course.cname


SELECT teacher.tno'教師編號',teacher.tname'教師姓名',course.cname'課程名稱',AVG(sc.score)'課程平均分',MAX(sc.score)'課程最高分',MIN(sc.score)'課程最低分' FROM

course

JOIN sc

ON course.cno=sc.cno

JOIN teacher

ON course.tno=teacher.tno

GROUP BY teacher.tno,teacher.tname,course.cname


5.查找學(xué)習(xí)了hesw但沒學(xué)習(xí)oldguo課程的學(xué)生名

方法1:

SELECT student.sname,GROUP_CONCAT(teacher.tname)

FROM teacher

JOIN course

ON teacher.tno = course.tno

JOIN sc

ON course.cno = sc.cno

JOIN student

ON sc.sno = student.sno

GROUP BY student.sno

HAVING GROUP_CONCAT(teacher.tname) LIKE '%hesw%'

AND

GROUP_CONCAT(teacher.tname) NOT LIKE '%oldguo%'


SELECT student.sname'學(xué)生姓名',GROUP_CONCAT(teacher.tname)'老師姓名' FROM

course

JOIN sc

ON course.cno=sc.cno

JOIN student

ON sc.sno=student.sno

JOIN teacher

ON course.tno=teacher.tno

GROUP BY student.sname

HAVING GROUP_CONCAT(teacher.tname) LIKE '%hesw%'

AND

GROUP_CONCAT(teacher.tname) NOT LIKE '%oldguo%'



方法2:

6.查詢出只選修了一門課程的全部學(xué)生的學(xué)號和姓名

SELECT student.sno'學(xué)號',student.sname'學(xué)生姓名',COUNT(sc.cno)'課程門數(shù)',GROUP_CONCAT(course.cname)'課程名稱'

FROM student

JOIN sc

ON student.sno = sc.sno

JOIN course

ON sc.cno = course.cno

GROUP BY student.sno

HAVING COUNT(sc.cno) = 1


SELECT sc.sno'學(xué)號',student.sname'學(xué)生姓名',COUNT(course.cname)'課程數(shù)',GROUP_CONCAT(course.cname)'課程名稱' FROM

course

JOIN sc

ON course.cno=sc.cno

JOIN student

ON sc.sno=student.sno

GROUP BY sc.sno,student.sname

HAVING COUNT(course.cname)=1


7.查詢平均成績大于85的所有學(xué)生的學(xué)號输涕、姓名和平均成績

SELECT student.sno,student.sname,AVG(sc.score)

FROM student

JOIN sc

ON student.sno = sc.sno

GROUP BY student.sno

HAVING AVG(sc.score) > 85


SELECT sc.sno,student.sname,AVG(sc.score) FROM

sc

JOIN student

ON sc.sno=student.sno

GROUP BY sc.sno,student.sname

HAVING AVG(sc.score) >85


8.統(tǒng)計每門課程: 優(yōu)秀(85分以上),良好(70-85),一般(60-70),不及格(小于60)的學(xué)生列表

SELECT

course.cname'課程名稱',

GROUP_CONCAT(CASE WHEN sc.score >85 THEN CONCAT(student.sname,':',sc.score) END)'優(yōu)秀',

GROUP_CONCAT(CASE WHEN sc.score > 70 AND sc.score < 85 THEN CONCAT(student.sname,':',sc.score) END)'良好',

GROUP_CONCAT(CASE WHEN sc.score > 60 AND sc.score < 70 THEN CONCAT(student.sname,':',sc.score) END)'及格',

GROUP_CONCAT(CASE WHEN sc.score < 60 THEN CONCAT(student.sname,':',sc.score) END)'不及格'

FROM student

JOIN sc

ON student.sno = sc.sno

JOIN course

ON course.cno = sc.cno

GROUP BY course.cname

SELECT

course.cname'課程名稱',

GROUP_CONCAT(CASE WHEN sc.score >85 THEN CONCAT(student.sname,':',sc.score) END)'優(yōu)秀',

GROUP_CONCAT(CASE WHEN sc.score > 70 AND sc.score < 85 THEN CONCAT(student.sname,':',sc.score) END)'良好',

GROUP_CONCAT(CASE WHEN sc.score > 60 AND sc.score < 70 THEN CONCAT(student.sname,':',sc.score) END)'及格',

GROUP_CONCAT(CASE WHEN sc.score < 60 THEN CONCAT(student.sname,':',sc.score) END)'不及格'

FROM student as s

JOIN sc as b

ON s.sno = b.sno

JOIN course as c

ON c.cno = b.cno

GROUP BY c.cname




SELECT course.cname'課程名稱',

GROUP_CONCAT(CASE WHEN sc.score >85 THEN student.sname END)'優(yōu)秀',

GROUP_CONCAT(CASE WHEN? sc.score >=70 AND sc.score <=85? THEN student.sname END)'良好',

GROUP_CONCAT(CASE WHEN? sc.score >=60 AND sc.score < 70? THEN student.sname END)'一般',

GROUP_CONCAT(CASE WHEN? sc.score < 60? THEN student.sname END)'不及格'

FROM

course

JOIN sc

ON course.cno=sc.cno

JOIN student

ON sc.sno=student.sno

GROUP BY course.cname



設(shè)置成名字加分?jǐn)?shù)顯示

使用concat

MySQL中concat函數(shù)

MySQL的concat函數(shù)可以連接一個或者多個字符串

CONCAT(student.sname,':',sc.score)


SELECT course.cname'課程名稱',

GROUP_CONCAT(CASE WHEN sc.score >85 THEN CONCAT(student.sname,':',sc.score) END)'優(yōu)秀',

GROUP_CONCAT(CASE WHEN? sc.score >=70 AND sc.score <=85? THEN CONCAT(student.sname,':',sc.score) END)'良好',

GROUP_CONCAT(CASE WHEN? sc.score >=60 AND sc.score < 70? THEN CONCAT(student.sname,':',sc.score) END)'一般',

GROUP_CONCAT(CASE WHEN? sc.score < 60? THEN CONCAT(student.sname,':',sc.score) END)'不及格'

FROM

course

JOIN sc

ON course.cno=sc.cno

JOIN student

ON sc.sno=student.sno

GROUP BY course.cname


MySQL 數(shù)據(jù)的表設(shè)置別名

AS

SELECT * FROM

course

JOIN sc

ON course.cno=sc.cno

JOIN student

ON sc.sno=student.sno



改寫

SELECT * FROM

course AS c

JOIN sc AS s

ON c.cno=s.cno

JOIN student AS st

ON s.sno=st.sno


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末放航,一起剝皮案震驚了整個濱河市蜕青,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異傍药,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)魂仍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進(jìn)店門拐辽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人擦酌,你說我怎么就攤上這事俱诸。” “怎么了赊舶?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵睁搭,是天一觀的道長。 經(jīng)常有香客問我笼平,道長园骆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任寓调,我火速辦了婚禮锌唾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘夺英。我一直安慰自己晌涕,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布秋麸。 她就那樣靜靜地躺著,像睡著了一般炬太。 火紅的嫁衣襯著肌膚如雪灸蟆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天,我揣著相機(jī)與錄音炒考,去河邊找鬼可缚。 笑死,一個胖子當(dāng)著我的面吹牛斋枢,可吹牛的內(nèi)容都是我干的帘靡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瓤帚,長吁一口氣:“原來是場噩夢啊……” “哼描姚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起戈次,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤轩勘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后怯邪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绊寻,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年悬秉,在試婚紗的時候發(fā)現(xiàn)自己被綠了澄步。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡和泌,死狀恐怖村缸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情允跑,我是刑警寧澤王凑,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站聋丝,受9級特大地震影響索烹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弱睦,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一百姓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧况木,春花似錦垒拢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至屹耐,卻和暖如春尸疆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工寿弱, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留犯眠,地道東北人。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓症革,卻偏偏與公主長得像筐咧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子噪矛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,654評論 2 354

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