一. 需求分析
我們?cè)趯W(xué)習(xí)數(shù)據(jù)庫(kù)查詢時(shí),經(jīng)常會(huì)遇到關(guān)于分組和聚合函數(shù)的查詢,比如查詢每門(mén)課程的最高分,每位同學(xué)的平均分,其實(shí)這些都是比較一般的問(wèn)題。但如果遇到查詢每門(mén)課程成績(jī)的前幾名問(wèn)題,就會(huì)變的很棘手,今天小編給你嘮嘮這方面的問(wèn)題。
比如我們現(xiàn)在有如下三個(gè)表:學(xué)生表、科目表、成績(jī)表,分別如下:
1. 學(xué)生表(student):
2. 科目表(subject):
3. 成績(jī)表(score):
現(xiàn)在如果我們需要獲取每門(mén)科目前三名同學(xué)的姓名、學(xué)號(hào)、科目、成績(jī)等信息,這該如何查詢實(shí)現(xiàn)呢?
二. 具體實(shí)現(xiàn)
其實(shí)遇到這種問(wèn)題,并不單純是在考察我們的SQL水平,同時(shí)也是在考察我們的思考能力,我們得學(xué)會(huì)思考如何進(jìn)行查詢,如何進(jìn)行分組,如何進(jìn)行條件過(guò)濾。
1. 先連接查詢
首先我們可以根據(jù)科目和成績(jī),來(lái)查詢同一科目中分?jǐn)?shù)較高的數(shù)據(jù)。
這樣查詢到的就是一個(gè)成績(jī)記錄,同一個(gè)科目全部比他分?jǐn)?shù)高的成績(jī)記錄就是被關(guān)聯(lián)查詢出來(lái)。這里為了讓第一名也查詢出來(lái),我們可以使用外連接進(jìn)行查詢。
2. 再分組過(guò)濾
然后我們可以根據(jù)學(xué)生和科目再進(jìn)行分組,查詢出比這個(gè)學(xué)生該門(mén)科目高的學(xué)生成績(jī)條數(shù)是多少,如果條數(shù)小于3,這樣就得到了前三名。
如果出現(xiàn)了并列的情況,也會(huì)被查詢出來(lái)。
現(xiàn)在你可以思考一個(gè)問(wèn)題,如果是讓你查詢第2到第5名同學(xué)呢?