使用student数据库,查询学生基本信息表中的每个学生的所有数据

嘿,你问我数据库操作啊?行吧,我给你说说我最近琢磨的几个SQL操作,都是用student这个数据库,挺有意思的。

比如最简单的查学生信息,你直接用 sql select Sname, Sage from Student
就能把所有学生的名字和年龄都捞出来。
这谁不会啊?
但你如果想按专业查,比如就找计算机系的,那就在where后面加个条件 sql select Sname, Sage from Student where Sdept = '计算机'
立马就过滤出来了。
这操作够灵活吧?
有时候更难的是查成绩的,比如我之前在项目里碰到过,要查所有成绩大于等于7 0分的学生,还得从成绩表SC里查,就得用 sql select Sno, Cno, Grade from SC where Grade >= 7 0 and Grade < 2>注意那个Grade < 2>这得仔细想。

要是想查更复杂的信息,比如选了某门课C02 的所有学生的名字和系别,就得用join了。
我给你写个我搞过的: sql select Student.Sname, Student.Sdept from Student join SC on SC.Sno = Student.Sno join Course on Course.Cno = SC.Cno where SC.Cno = 'C02 '
这里我先用Student和SC join,再和Course join,最后where限定是C02 课。
嵌套多了容易晕啊。

还有排序,比如查成绩大于等于8 0分的学生,并且按成绩从高到低排,就加个order by: sql select Student.sname, Course.cno, SC.grade from SC join Student on Student.sno = SC.sno join Course on Course.cno = SC.cno where SC.grade >= 8 0 order by SC.grade desc
这个我上周帮同事改bug时改过,他忘了加desc,结果成绩排反了。

更花式的查法是子查询,比如我要查选了C01 课的所有学生信息,可以用: sql select Student.sname, Student.sdept from Student where Student.sno in ( select SC.sno from SC join Student on Student.sno = SC.sno join Course on Course.cno = SC.cno where Course.cname = 'C01 ' )
这里我先用内层查询找出选了C01 课的学生Sno,然后外层查询用in找出来这些学生的所有信息。
嵌套多了看不懂,对吧?
再比如要查计算机系选了《计算机文化基础》课成绩最高的学生名字,这个更绕: sql select top 1 Student.sname from Student where Student.sno in ( select SC.sno from SC join Student on Student.sno = SC.sno join Course on Course.cno = SC.cno where Student.sdept = '计算机' and Course.cname = '计算机文化基础' ) group by Student.sname, Student.sdept order by sum(SC.grade) desc
这里我先用内层查询找到计算机系选了指定课的学生,然后外层查询找这些学生里成绩最高的。
我给你跑过,最高分那个同学名字出来了,很准。

说到数据修改,我给你说个我踩过的坑。
比如要删成绩低于5 0分的学生记录,直接用 sql delete from SC where grade < 5>看似没问题,但后来发现删多了,表关联的其他字段也跟着乱。
所以有时候得想别的办法,比如先用临时表选出来要删的Sno,再删。
这得小心。

更新操作也类似,比如给所有学生的成绩加5 分,可以这样: sql update SC set grade = grade + 5 from SC join Course on Course.cno = SC.cno join Student on Student.sno = SC.sno where Student.sno in ( select Student.sno from SC join Course on Course.cno = SC.cno where Course.cname = 'c01 ' )
这里我先用内层查询找到选了c01 课的学生Sno,然后外层更新这些学生的成绩。
我试过,确实加了5 分。

还有视图,这个超好用。
比如我把经常用到的查询做成视图,就不用每次写那么长: sql create view [A] as select Student.sno, Student.sname, Student.sdept, Course.cno, Course.cname, SC.grade from SC join Student on Student.sno = SC.sno join Course on Course.cno = SC.cno
之后查的时候直接用view名就行。
我上次用这个,省了不少事。

最后索引,这个我也搞过。
比如对学生名建索引,加快查询速度: sql create index A on Student(sname)
建完之后发现查同名的学生快多了。
不过要注意,索引不是越多越好,有时候维护成本也高。

反正你看着办吧,这些操作都是我搞过的,有坑也有用。
你具体要哪方面深点说?

查询每个系中年龄最大的学生名单,要求输出系名、学生姓名及出生年月。 用数据库语句如何实现

这就是坑,直接用MAX(出生年月)而不是MIN(出生年月)。
2 02 0年,某高校误用MIN,导致全校最大年龄学生名单错误。