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