前言
sql真的非常靈活,一個(gè)題目可能有很多很多種解法,我記錄的只是我自己的一個(gè)解題思路,如果大家有更好的不同解法歡迎在評(píng)論區(qū)一起探討
ps:有些題可能解法會(huì)重復(fù),比如求大于,我們下一個(gè)題可能是求小于,大家如果第一遍沒(méi)有做出來(lái),看了我寫(xiě)的之后有了思路,可以試一下反面的解法。
數(shù)據(jù)庫(kù)表結(jié)構(gòu)介紹
學(xué)生表
課程表
成績(jī)表
教師表
0-6 查詢(xún)"李"姓老師的數(shù)量
首先讀題,關(guān)鍵字 老師,數(shù)量,確定好我們需要的東西
表:teacher
函數(shù)count()
SELECT
count(t.t_name) count_li
FROM
teacher t
WHERE
t.t_name LIKE '李%';
結(jié)果如下:
0-7 查詢(xún)學(xué)過(guò)"李四"老師授課的同學(xué)的信息
首先分析一下,我們需要通過(guò)name去teacher表中查詢(xún)到李四老師的t_id,通過(guò)t_id再去課程表中查到c_id,有了c_id就可以去成績(jī)表中查到s_id,然后再去student里面查學(xué)生信息
表:teacher,course,score,student
SELECT
b.*
from teacher t,course c,score a,student b
where t.t_name='李四'
AND c.t_id=t.t_id
AND a.c_id=c.c_id
AND b.s_id=a.s_id;
結(jié)果如下:
0-8 查詢(xún)沒(méi)學(xué)過(guò)"李四"老師授課的同學(xué)的信息
上個(gè)題,其實(shí)我們是通過(guò)找到score表中的學(xué)過(guò)李四老師課程的學(xué)生的id,然后在student表中利用id找出對(duì)應(yīng)符合要求的學(xué)生,這個(gè)題其實(shí)相反,我們把剩余的id取出來(lái)其實(shí)就是答案
SELECT
b.*
FROM
student b
WHERE
b.s_id NOT IN (
SELECT
a.s_id
FROM
teacher t,
course c,
score a
WHERE
t.t_name = '李四'
AND c.t_id = t.t_id
AND a.c_id = c.c_id
);
結(jié)果如下:
0-9 查詢(xún)學(xué)過(guò)編號(hào)為"01"并且也學(xué)過(guò)編號(hào)為"02"的課程的同學(xué)的信息
分析一下,感覺(jué)題目就很繞,讀著很煩,白話說(shuō)就是:查詢(xún)學(xué)過(guò)語(yǔ)文課也學(xué)過(guò)數(shù)學(xué)課的同學(xué)的信息
表:score ,student
自連接,分別查詢(xún)語(yǔ)文課,數(shù)學(xué)課
select
c.*
from score a,score b,student c
where a.c_id='1'
and b.c_id='2'
and a.s_id=b.s_id
and c.s_id=b.s_id
結(jié)果如下:
0-10 查詢(xún)學(xué)過(guò)編號(hào)為"01"但是沒(méi)有學(xué)過(guò)編號(hào)為"02"的課程的同學(xué)的信息
查詢(xún)學(xué)過(guò)語(yǔ)文課但是沒(méi)有學(xué)過(guò)數(shù)學(xué)課的同學(xué)的信息
將表的長(zhǎng)數(shù)據(jù),轉(zhuǎn)換為寬數(shù)據(jù)
通過(guò)下面的方式,得到結(jié)果可以直觀的看出來(lái)有01課程成績(jī)但是沒(méi)有02課程成績(jī)
select
a.s_id,
max(CASE when a.c_id='1' then a.s_score else null END) sco1 ,
max(CASE when a.c_id='2' then a.s_score else null END) sco2
from score a
GROUP BY a.s_id;
結(jié)果如下:
再用內(nèi)連接將兩張表連起來(lái)
select
s.*
from
(select
a.s_id,
max(CASE when a.c_id='1' then a.s_score else null END) sco1 ,
max(CASE when a.c_id='2' then a.s_score else null END) sco2
from score a
GROUP BY a.s_id) t,student s
where t.s_id=s.s_id
and t.sco1 is not NULL
and t.sco2 is null;
結(jié)果如下:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-714028.html
ps:這里我數(shù)據(jù)庫(kù)中的數(shù)據(jù)有錯(cuò)誤,表中6號(hào)吳蘭,02課程應(yīng)該是沒(méi)有成績(jī)的,我當(dāng)時(shí)設(shè)置錯(cuò)了,但是思路以及步驟都是正確的
如果有同學(xué)用的我提供的表來(lái)練習(xí)這個(gè)題目的話,把題目中的01課程和02課程換一個(gè)位置就可以了,這樣按照解題思路求出來(lái)的是7號(hào),因?yàn)樗挥姓n程02,沒(méi)有課程01文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-714028.html
到了這里,關(guān)于sql-50練習(xí)題6-10的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!