日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql查询选课程的学生学号和姓名_数据库SQL语句中查询选修了全部课程的学生的学号和姓名理解...

發(fā)布時(shí)間:2024/3/26 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql查询选课程的学生学号和姓名_数据库SQL语句中查询选修了全部课程的学生的学号和姓名理解... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

首先頭腦中有三點(diǎn)概念:

1。EXISTS子查詢找到的提交

NOTEXISTS子查詢中找不到的提交

說明:不要去翻譯為存在和不存在,把腦袋搞暈。

2。建立程序循環(huán)的概念,這是一個(gè)動(dòng)態(tài)的查詢過程。如FOR循環(huán)。

3。Exists執(zhí)行的流程Exists首先執(zhí)行外層查詢,再執(zhí)行內(nèi)存查詢,與IN相反。流程為首先取出外

層中的第一元組,再執(zhí)行內(nèi)層查詢,將外層表的第一元組代入,若內(nèi)層查詢?yōu)檎?#xff0c;即有結(jié)果

時(shí)。返回外層表中的第一元組,接著取出第二元組,執(zhí)行相同的算法。一直到掃描完外層整表。

for(inti=0;i<>EOFout;i++)

{

for(intj=0;j

}

然后再來看一個(gè)例子:三張表學(xué)生表student(Sno,Sname),課程表course(Cno,Cname)選課表SC

(Sno,Cno)

要求查詢出:選修了全部課程的學(xué)生姓名

我的思路:

首先學(xué)生的選課信息存在于SC表中,要想知道某個(gè)學(xué)生是否選修了全部課程,至少我們需要知道一共有

幾門課程,這是首要的條件。其次,學(xué)生選修了與否,我們又要掃描SC全表,統(tǒng)計(jì)出選修了所有課程的

學(xué)生號(hào),最后在STUDENT表中根據(jù)學(xué)生號(hào)打出姓名。

語句如下:(已測(cè)試)

selectSnamefromstudent

whereSnoIN

(selectSnofromSC

groupbySno//根據(jù)Sno分組,統(tǒng)計(jì)每個(gè)學(xué)生選修了幾門課程。如果等于course的總數(shù),就是我們要找的Sno

havingcount(*)=(selectcount(*)fromcourse))//統(tǒng)計(jì)course中共有幾門課程

另一種思路:

引入:將題目換為查找學(xué)號(hào)為00003沒有選修的科目

思路:我們可以將已知學(xué)號(hào)代入,把每一個(gè)科目代入(循環(huán)),這將形成1*count(*)種組合。

將這組成作為條件,一一與SC表種進(jìn)行比對(duì),找不到匹配的我們提交。

selectCnamefromcoursewhere

notexists//找不到的組合,提交course

(select*fromSCwherecourse.cno=cnoandsno=''00003'')

//在SC中匹配

換個(gè)題目:查找沒有沒有選修科目的學(xué)生姓名

思路:學(xué)號(hào)未知,科目未知,說明有兩個(gè)未知變量。應(yīng)該有兩個(gè)EXISTS。我們可以掃描

student和course共有s*c中組合,將這些組合與SC的每一項(xiàng)進(jìn)行匹配,注意s*c組合已經(jīng)包含所

有可能。如果全部找到,就說明已經(jīng)選修了全部課程。找不到就說明有課程沒選修。再將沒選修的的

提交給上一exists循環(huán)。若上一exists不存在的再提交給外循環(huán)。

最后詳細(xì)回答你的問題:數(shù)據(jù)庫SQL語句中查詢選修了全部課程的學(xué)生的學(xué)號(hào)和姓名

查詢選修了全部課程的學(xué)生姓名。

SELECTSname

FROMStudent

WHERENOTEXISTS

(SELECT*

FROMCourse

WHERENOTEXISTS

(SELECT*

FROMSC

WHERESno=Student.Sno

ANDCno=Course.Cno);

理解如下:查詢選修了全部課程的學(xué)生姓名。

不用管怎么樣,第一個(gè)select必定是在student表里選sname既:

SELECTSname

FROMStudent

加上條件即:where

條件是什么呢?條件就是---------------------》查詢選修了全部課程的

因?yàn)闆]有(任意一個(gè))謂詞,只能用EXISTS或者NOTEXISTS來表示。這點(diǎn)理解吧?

所以要把條件翻譯成-----------------------》不存在一門課程這個(gè)學(xué)生沒有選修

where后面就是不存在(NOTEXISTS)(

一門課程這個(gè)學(xué)生沒有選修

)

接下來就是把Course表中的課程依次拿出來找出沒有選修的

怎么找呢?因?yàn)镹OTEXISTS子查詢中找不到的提交

另外你要明白----------------------------NOTEXISTS查詢都是相關(guān)查詢----------

所以只要把在最后一個(gè)select中

WHERESno=Student.Sno

ANDCno=Course.Cno);

就是將這個(gè)同學(xué)通過SC表和Crouse的課程連接一遍,找到連接不上的,即:沒有選修的,這樣就找到了一門課這個(gè)學(xué)生沒有選修,存在沒有選修的課,那么該學(xué)生被pass掉了,

一次進(jìn)行一個(gè)同學(xué)的判斷。

若你學(xué)過程序編程,可以看下面的內(nèi)容,若沒有則可忽略、。----------

上述是理解是數(shù)據(jù)庫系統(tǒng)內(nèi)部的實(shí)現(xiàn),可以用for循環(huán)表示

for(i=1;i

for(i=j;j

條件就是:

沒有一門課沒有選修

}

}

最后你找記住

1.第一個(gè)select就是你要選的就是學(xué)生

SELECTSname

FROMStudent

2.第二個(gè)select就是課程

3.第三個(gè)select就是學(xué)生和課程發(fā)生關(guān)系的表------------SC選修表

讓他們連接起來

固定的模式1你要的結(jié)果的表學(xué)生

2滿足條件的表課程表

3產(chǎn)生關(guān)系的表選修表

where通過選修表把他們連接起來

總結(jié)

以上是生活随笔為你收集整理的mysql查询选课程的学生学号和姓名_数据库SQL语句中查询选修了全部课程的学生的学号和姓名理解...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。