1.查詢" 01 "課程比" 02 "課程成績高的學(xué)生的信息及課程分數(shù)
select student.*, r.score1 ,r.score2 from student right join
(select class1.sid, score1, score2
from (select sid, score as score1 from sc where cid = '01') as class1,
(select sid, score as score2 from sc where cid = '02') as class2
where class1.sid = class2.sid and score1 > score2
)r
on student.sid = r.sid
第一步 先在分數(shù)表中把課程1和課程2的數(shù)據(jù)分別篩選出之后對比課程1比課程2高的學(xué)生id蘑拯,
第二步 結(jié)果再與學(xué)生表關(guān)聯(lián)
結(jié)果:
ps:
2.查詢平均成績大于等于 60 分的同學(xué)的學(xué)生編號和學(xué)生姓名和平均成績
'''
select sname, student.sid , r.avg_score from student right join
(select sid, avg(score) as avg_score from sc group by sid having avg(score) > 60) r
on student.sid = r.sid
第一步 在sc表中按學(xué)生id分組計算平均分,取大于60分的學(xué)生id
第二步 將結(jié)果與學(xué)生表關(guān)聯(lián)
結(jié)果:
![image.png](https://upload-images.jianshu.io/upload_images/22857505-e3ab3a67988285fd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
PS:
- 子查詢中聚合函數(shù)要有別名( as avg_score)
- where 后面不能有聚合函數(shù)烤黍,所以這里用having,并且先groupby话侧、后having
- 查詢在 SC 表存在成績的學(xué)生信息
select student.* from
(select distinct sid from sc) r left join student on r.sid = student.sid
第一步 從sc表中將sid去重查出后與student表關(guān)聯(lián)
第二部 將符合第一步結(jié)果的數(shù)據(jù)從student表中展示出來
結(jié)果:
4.查詢所有同學(xué)的學(xué)生編號筹陵、學(xué)生姓名沿后、選課總數(shù)沿彭、所有課程的成績總和
select student.* , r.cnum, r.sum_score from student left join
(
select sid, count(*) as cnum, sum(score) as sum_score from sc group by sid
) r
on student.sid = r.sid
第一步 將sc表中學(xué)生按sid分組,并聚合計算數(shù)量尖滚、總分喉刘。同時注意子查詢中聚合函數(shù)要有別名( as cnum瞧柔、as sum_score)
第二步 將第一步中結(jié)果與student表關(guān)聯(lián)
結(jié)果:
- 查詢「李」姓老師的數(shù)量
select count(*) from teacher where tname like '李%'
- 查詢學(xué)過「張三」老師授課的同學(xué)的信息
select student.* from (
select sc.sid from (
select course.cid from (
select tid from teacher where tname = '張三') t
left join course on t.tid = course.tid) c
left join sc on c.cid = sc.cid) s
left join student on s.sid = student.sid
第一步 從teacher表中找到張三老師tid
第二步 用tid關(guān)聯(lián)course表找到張三老師教授課程的cid
第三步 用cid關(guān)聯(lián)score表找到上過張三老師課程的學(xué)生的sid
第四步 用第三步的sid關(guān)聯(lián)student表查詢出具體符合條件的學(xué)生的詳細信息
太笨了,多表聯(lián)合查詢:
select student.* from student,teacher,course,sc
where
student.sid = sc.sid
and course.cid=sc.cid
and course.tid = teacher.tid
and tname = '張三';
結(jié)果:
- 查詢沒有學(xué)全所有課程的同學(xué)的信息
select student.* from student where sid not in (
select sid from sc group by sid having count(*) = (select count(distinct cid) from course)
)
排除學(xué)全所有課程之外的學(xué)生id(not in語法)睦裳,再與student表關(guān)聯(lián)
結(jié)果:
8.查詢至少有一門課與學(xué)號為" 01 "的同學(xué)所學(xué)相同的同學(xué)的信息
select * from student where sid in(
select distinct sid from sc where cid in (
select cid from sc where sid = '01'
))
第一步 將學(xué)號為01的學(xué)生所學(xué)課程id從sc表中篩選出來
第二步 查詢sc表中所學(xué)課程id在上面得到的結(jié)果中的學(xué)生id(in語法)造锅,去重
第三步 查詢student表中學(xué)生id在上面得到結(jié)果中的學(xué)生信息(in語法)
- 查詢和" 01 "號的同學(xué)學(xué)習(xí)的課程完全相同的其他同學(xué)的信息
select student.* from student,
(
select *
from (
select sid,
array_to_string(ARRAY(SELECT unnest(array_agg(cid)) order by 1), ',') classes
from sc
group by sid) a
right join (
select array_to_string(ARRAY(SELECT unnest(array_agg(cid)) order by 1), ',') classes1
from sc
group by sid
having sid = '01'
) b on a.classes = b.classes1
where a.sid != '01'
) r
where student.sid = r.sid
mysql有g(shù)roup_concat函數(shù) 參考https://blog.csdn.net/qq_35531549/article/details/90383022
postgresql稍微麻煩點。
---ARRAY_AGG()函數(shù)是一個聚合函數(shù)推沸,它接受一組值并返回一個數(shù)組备绽,其中將輸入集中的每個值分配給該數(shù)組的元素。
----unnest(anyarray)
返回值:setof anyelement(可以理解為一個(臨時)表)
說明:unnest函數(shù)將輸入的數(shù)組轉(zhuǎn)換成一個表,這個表的每一列都代表相應(yīng)的一個數(shù)組中的元素鬓催。如果unnest與其他字段一起出現(xiàn)在select中肺素,就相當(dāng)于其他字段進行了一次join。
----array_to_string("數(shù)組",",") 即把數(shù)組轉(zhuǎn)化為字符串宇驾,并用“,”連接(使用提供的分隔符連接數(shù)組元素)
結(jié)果:
- 查詢沒學(xué)過"張三"老師講授的任一門課程的學(xué)生姓名
select sname from student where sid not in (
select sid from sc where cid in (
select course.cid from teacher,course
where course.tid = teacher.tid and teacher.tname = '張三'
)
)
第一步 查出張三老師教授的課程id
第二步 在sc表中查出上過張三老師課程的學(xué)生id
第三步 將結(jié)果的非(not in)去篩選student表