mysql查询选课程的学生学号和姓名_数据库SQL语句中查询选修了全部课程的学生的学号和姓名理解...
首先頭腦中有三點概念:
1。EXISTS子查詢找到的提交
NOTEXISTS子查詢中找不到的提交
說明:不要去翻譯為存在和不存在,把腦袋搞暈。
2。建立程序循環(huán)的概念,這是一個動態(tài)的查詢過程。如FOR循環(huán)。
3。Exists執(zhí)行的流程Exists首先執(zhí)行外層查詢,再執(zhí)行內(nèi)存查詢,與IN相反。流程為首先取出外
層中的第一元組,再執(zhí)行內(nèi)層查詢,將外層表的第一元組代入,若內(nèi)層查詢?yōu)檎?#xff0c;即有結(jié)果
時。返回外層表中的第一元組,接著取出第二元組,執(zhí)行相同的算法。一直到掃描完外層整表。
for(inti=0;i<>EOFout;i++)
{
for(intj=0;j
}
然后再來看一個例子:三張表學(xué)生表student(Sno,Sname),課程表course(Cno,Cname)選課表SC
(Sno,Cno)
要求查詢出:選修了全部課程的學(xué)生姓名
我的思路:
首先學(xué)生的選課信息存在于SC表中,要想知道某個學(xué)生是否選修了全部課程,至少我們需要知道一共有
幾門課程,這是首要的條件。其次,學(xué)生選修了與否,我們又要掃描SC全表,統(tǒng)計出選修了所有課程的
學(xué)生號,最后在STUDENT表中根據(jù)學(xué)生號打出姓名。
語句如下:(已測試)
selectSnamefromstudent
whereSnoIN
(selectSnofromSC
groupbySno//根據(jù)Sno分組,統(tǒng)計每個學(xué)生選修了幾門課程。如果等于course的總數(shù),就是我們要找的Sno
havingcount(*)=(selectcount(*)fromcourse))//統(tǒng)計course中共有幾門課程
另一種思路:
引入:將題目換為查找學(xué)號為00003沒有選修的科目
思路:我們可以將已知學(xué)號代入,把每一個科目代入(循環(huán)),這將形成1*count(*)種組合。
將這組成作為條件,一一與SC表種進行比對,找不到匹配的我們提交。
selectCnamefromcoursewhere
notexists//找不到的組合,提交course
(select*fromSCwherecourse.cno=cnoandsno=''00003'')
//在SC中匹配
換個題目:查找沒有沒有選修科目的學(xué)生姓名
思路:學(xué)號未知,科目未知,說明有兩個未知變量。應(yīng)該有兩個EXISTS。我們可以掃描
student和course共有s*c中組合,將這些組合與SC的每一項進行匹配,注意s*c組合已經(jīng)包含所
有可能。如果全部找到,就說明已經(jīng)選修了全部課程。找不到就說明有課程沒選修。再將沒選修的的
提交給上一exists循環(huán)。若上一exists不存在的再提交給外循環(huán)。
最后詳細回答你的問題:數(shù)據(jù)庫SQL語句中查詢選修了全部課程的學(xué)生的學(xué)號和姓名
查詢選修了全部課程的學(xué)生姓名。
SELECTSname
FROMStudent
WHERENOTEXISTS
(SELECT*
FROMCourse
WHERENOTEXISTS
(SELECT*
FROMSC
WHERESno=Student.Sno
ANDCno=Course.Cno);
理解如下:查詢選修了全部課程的學(xué)生姓名。
不用管怎么樣,第一個select必定是在student表里選sname既:
SELECTSname
FROMStudent
加上條件即:where
條件是什么呢?條件就是---------------------》查詢選修了全部課程的
因為沒有(任意一個)謂詞,只能用EXISTS或者NOTEXISTS來表示。這點理解吧?
所以要把條件翻譯成-----------------------》不存在一門課程這個學(xué)生沒有選修
where后面就是不存在(NOTEXISTS)(
一門課程這個學(xué)生沒有選修
)
接下來就是把Course表中的課程依次拿出來找出沒有選修的
怎么找呢?因為NOTEXISTS子查詢中找不到的提交
另外你要明白----------------------------NOTEXISTS查詢都是相關(guān)查詢----------
所以只要把在最后一個select中
WHERESno=Student.Sno
ANDCno=Course.Cno);
就是將這個同學(xué)通過SC表和Crouse的課程連接一遍,找到連接不上的,即:沒有選修的,這樣就找到了一門課這個學(xué)生沒有選修,存在沒有選修的課,那么該學(xué)生被pass掉了,
一次進行一個同學(xué)的判斷。
若你學(xué)過程序編程,可以看下面的內(nèi)容,若沒有則可忽略、。----------
上述是理解是數(shù)據(jù)庫系統(tǒng)內(nèi)部的實現(xiàn),可以用for循環(huán)表示
for(i=1;i
for(i=j;j
條件就是:
沒有一門課沒有選修
}
}
最后你找記住
1.第一個select就是你要選的就是學(xué)生
SELECTSname
FROMStudent
2.第二個select就是課程
3.第三個select就是學(xué)生和課程發(fā)生關(guān)系的表------------SC選修表
讓他們連接起來
固定的模式1你要的結(jié)果的表學(xué)生
2滿足條件的表課程表
3產(chǎn)生關(guān)系的表選修表
where通過選修表把他們連接起來
總結(jié)
以上是生活随笔為你收集整理的mysql查询选课程的学生学号和姓名_数据库SQL语句中查询选修了全部课程的学生的学号和姓名理解...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 视频捕捉全教程(MFC+vfw)
- 下一篇: 欧姆龙CJ系列PLC五大扩展模块实战演示