数据库SQL语言

SQL练习

一个学生课程数据库

1查询无考试成绩的7号课程的学号。

从sc中选择sno,其中cno='7 '且等级为空

2.查询7号课程90分以上或60分以下学生的学号。

从sc中选择sno,其中grade & gt90或年级& lt60

3查询课程名称以“数据”开头的所有课程的课程号和课程名称。

Select cno,cname from c,其中cname like' data% '

4.查询每个学生所有课程的平均分,输出学号和平均分。

按sno从sc组中选择sno,avg(grade)

5.查询每门课程的选修人数,输出课程号和选修人数。

Select cno,count(*) from sc group by cno

6.查询选修课程7的学生的学号、姓名和性别。

Select s.sno,sname,ssex from s,sc其中s.sno=sc.sno,cno = '7 '

7询问选修课程7的学生的平均年龄。

Select avg(sage) from s,sc其中s.sno=sc.sno,cno = '7 '

8.查询30多名学生选择的课程号。

通过具有count(*)& gt;的cno从sc组中选择sno。30

9查询到目前为止没有考砸的学生的学号。

答:从s中选择sno,其中sno不在(从sc中选择sno,其中等级& lt60 )

b:从sc组中选择sno,sno具有min(等级)>=60

1用可选课程号C2查询学生的学号和成绩。

选择sno,从sc分级,其中cno =“C2”

找出学生编号和选修课编号C4的名字。

Select s.sno,sname from s,sc其中s.sno=sc.sno,cno='C4 '

找出名为数学的选修课的学号和名字。

从s,sc,c中选择s.sno,sname

其中s.sno=sc.sno,c.cno=sc.cno,cname = 'Maths '

找出C2或C4的学生编号。

从sc中选择不同的sno,其中cno在(' C2 ',' C4 ')

或者:选择不同的SnO from where cno =' C2 '或cno =' C4' 5找出选修C2和C4课程的学生人数。

从sc中选择sno,其中cno ='C2 '和sno in(

Select SnO from where CNO =' C4') 6找出不选C2课程的学生的姓名和年龄。

select sname,sage from s where SnO not in(select SnO from sc where cno = ' C2 ')

或者:

select sname,sage from s where not exist(select * from sc where sc . SnO = s . SnO and cno = ' C2 ')

找出所有上过数据库课程的学生的名字。(同3)

从s,sc,c中选择s.sno,sname

其中s.sno = sc.sno,c.cno = sc.cno,cname =' database '

8找出数据库课程不及格的女生名字。

嵌套:

选择snake from where ssex =' female '和snoin(选择sno from where grade

连接:

从s、sc、c中选择sname

其中s.sno = sc.sno,c.cno = sc.cno,ssex = '女性', cname = '数据库'和等级

Select cname,avg (grade) from sc,其中c . cno = sc . cno group by sc . cno 10求出每个学生的平均分,输出学生的姓名和平均分。

select sname,avg(grade) from s,sc其中s.sno=sc.sno group by sc.sno

11找出至少有30名学生选修的课程名称。

select cname from c where cno in(select cno from sc group by cno having count(*)& gt;=30 )

12找出至少修过3门课的学生的名字。

select sname from s where SnO in(select SnO from sc group by SnO having count(*)& gt;=3)

13找出所有课程成绩不低于90分的学生姓名。

select sname from s where SnO not in(select SnO from sc where grade & lt;90)

14*找出数据库课程成绩不低于本课程平均分的学生姓名。

Select sname from s where sno in(

Select sno from sc,其中sc.cno = c.cno,cname =' database' and。

年级& gt(select avg (grade) from sc,其中sc.cno = c.cno,cname =' database ')。

15找出各系男女生的平均年龄和人数。

Select sdept,ssex,avg(sage),count(*) from s

按sdept,ssex分组

16找出计算机系(JSJ)课程平均分最高的学生的学号和姓名。

Select sc.sno,sname from s,sc其中s.sno=sc.sno,sdept='JSJ '

按具有平均值(等级)的序号分组

(Select top 1 avg(grade)from sc,s其中s.sno=sc.sno,sdept='JSJ '

按sc分组。sno order by avg (grade) desc)三个客户——商品数据库包括三个表:KH、FP和ywy。

1查询工资在1000-3000元之间的男业务员姓名和办公室号。

从ywy中选择yname,Ono,其中薪金介于1000和3000之间,ysex = '男性'

2查询各办事处业务员人数,输出办事处号及对应号。

Select Ono,count(*) from YWY group by Ono

查询每个客户在2002年5月份购买的总金额,输出客户号和对应的总金额。

Select Kno,sum(Fmoney)from FP where fdate between ' 2002 . 5 . 1 ' and ' 2002 . 5 . 31 '

按Kno分组

4.查询2002年5月购买5次以上的所有客户号,并按客户号升序排序。

select Kno from FP where fdate between ' 2002 . 5 . 1 ' and ' 2002 . 5 . 31 '

Group by有计数的Kno)>五

按Kno ASC排序

查一下各个办公室男女业务员的平均工资。

按Ono,Ysex从YWY组中选择Ono,Ysex,avg(薪金)

6.查询2002年5月从王海亮业务员处购买的商品的客户号、客户名称、联系电话。

选择Kno,Kname,phone from KH where Kno in(

select kno from FP where fdate between ' 2002 . 5 . 1 ' and ' 2002 . 5 . 31 '

YNO = (Select YNO from YWY其中YNAME = '王海亮')7查询所有薪资高于NO的业务员人数、姓名、薪资。1538.

Select yno,Yname,salary from YWY where salary & gt

(从YWY中选择薪金,其中Yno='1538 ')

8.查询与业务员1538同办公室所有其他业务员的电话和姓名。

Select Yno,Yname from YWY where Yno & lt& gt1538 '和小野在(

从YWY中选择Ono,其中Yno='1538 ')

9查询总销售额最高的业务员编号。

通过Yno Having sum(Fmoney) =从FP组中选择Yno

(Select top 1 sum(Fmoney)from FP group BY Yno ORDER BY sum(Fmoney)desc)

10查询所有业务员的人数、姓名、薪资以及其他薪资高于他的业务员的平均薪资。

使用自连接

选择y1。Yno,y1。Yname,y1.salary,avg( y2。工资)从YWY y1,YWY y2

其中y1。Yno & lt& gty2。Yno和y 1 . salary & lt;y2 .工资

按y1分组。Yno

没有薪水没有薪水

1 100 1 100

2 120 2 120

3 90 3 90

4 110 4 110四中的数据库里有一张表:

学生选课表:由五个属性组成:板和代码、班号、姓名、科目、年级,关系模式如下

SC(BJDM,BNXH,XSXM,KM,CJ),其中(BJDM,BNXH)为主代码。

注:每个学生保留一份各科成绩记录,包括“语文”、“数学”、“外语”。1找出每个班级的班级代码,学生人数,平均成绩。

通过BJDM从SC组中选择BJDM,count(*),avg(CJ)

2找出每个学生的班级代码,学生姓名,考试科目数和总成绩。

从SC中选择BJDM,XSXM,count(*),sum(CJ)

按BNXH分组

输出一个表格,每个学生一条记录,包括:班级代码,姓名,语文成绩,数学成绩,外语成绩。

方法1:使用视图

将视图v1 (bjdm,xsxm,yw,sx,wy)创建为

Select bjdm,xsxm,CJ,0,0 from sc其中km =' Chinese '

联盟

Select bjdm,xsxm,0,CJ,0 from sc其中km =' mathematics '

联盟

从sc中选择bjdm,xsxm,0,0,CJ其中km = '外语'从bjdm,xsxm的v1组中选择bjdm,xsxm,sum(yw)作为语言,sum(sx)作为数学,sum(wy)作为外语。

方法2:自连接

从sc a,sc b,sc c中选择a.bjdm,a.xsxm,a.km,a.cj,b.km,b.cj,c.km,c.cj

其中a.bjdm=b.bjdm,a.bnxh= b.bnxh,b.bjdm=c.bjdm,b.bnxh= c.bnxh

A.km = '中文'和b.km= '数学'和c.km= '外语'方法三:使用存储过程(略)

输出一个表格:每一个60分以下的学生对应一条记录,包括字段:班级代码、姓名、最低分。Select bjdm,xsxm,min(CJ)from sc where grade & lt;60分组by bjdm,xsxm5输出一个表格:每一个60分以下的学生对应一条记录,包括字段:班级代码,姓名,最高分,平均分。

获取平均成绩:创建视图v1 (bjdm,bnxh,avg _ CJ)为。

select bjdm,bnxh,avg(CJ from sc其中bjdm,bnxhselect sc.bjdm,sc.xsxm,max(cj),avg_cj from sc,V1

其中sc.bjdm=v1.bjdm和sc.bnxh=V1.bnxh和cj & lt60

Group by sc.bjdm,sc.xsxm6输出一个表:每个成绩不低于60的学生对应一条记录,包括字段:班级代码、姓名、平均成绩。从sc中选择bjdm,xsxm,avg(cj)

其中sno不在(从sc中选择sno,其中等级& lt60)

Group by bjdm,xsxm7输出一个表:每个学生对应一条记录,包括字段:班级编码,姓名,去掉最低分后的平均分。

方法1:

获得每个学生的最低分数:

将视图V1 (bjdm,bnxh,min_cj)创建为

通过bjdm,bnxh从sc组中选择bjdm,bnxh,min(cj)从sc,v1中选择sc.bjdm,sc.xsxm,avg(cj)

其中sc.bjdm=v1.bjdm和sc.bnxh=v1.bnxh和sc.cj & lt& gtv1.min_cj

按bjdm、bnxh方法2分组:

select sc.bjdm,sc.xsxm,(sum(CJ)-min(CJ))/count(*)from sc

Group by bjdm,bnxh8输出一个表:每个科目对应一条记录,包括字段:科目,去掉最低分后的平均分。

方法1:

获得每门课程的最低分:

将视图V1 ( km,min_cj)创建为

按km从sc组中选择km,min(cj)

从sc,v1中选择sc.km,avg(cj)

其中sc.km=v1.km,sc.cj & lt& gtv1.min_cj

按sc.km分组

方法二:

select km,(sum(CJ)–min(CJ))/count(*)from sc

group by km Supplement 9:Output Form:每个科目对应一条记录,包括字段:科目、去除最低分和最高分后的平均分。

从sc中选择km,(sum(CJ)–min(CJ)–max(CJ))/count(*)

group by km five数据库存储了某大学自1990以来的四六级考试情况,并规定:

1英语四六级考试每年两次,分别在6月和65438+2月。

四级没过的同学不能报考六级;

3只要没考到某一级就可以重复考;

4一旦某一等级考试通过,就不能再报考该等级的考试;

你可以报名,但不能参加考试。

数据库中有两个表,对应的关系模式如下:

学生表:S(Sno,Sname,Ssex,Sage,Sdept),其中Sno为主代码。

考试形式:E(Sno,年,月,级,级),学号,年,月,级,级。

其中(Sno,年,月)为主代码。1.找出每一次四六级考试的参考人数和平均分(报名但没参加的不算)。

选择年、月、级别、计数(*)、平均(等级)

按年、月、级别2分组。找出每次四级考试平均分最高的部门(报名但没考的不算)。

A: Select sdept from s,e其中s.sno=e.sno

其中级别=4

按sdept分组

有平均成绩& gt=全部(

Select avg(grade) from s,e where s.sno=e.sno where level = 4 Group by sdept)B:Select top 1 sdept from s,e where s . SnO = e . SnO

其中级别=4

按sdept分组

排序依据(平均(等级)desc

3.找出通过六级考试的学生的学号、姓名、性别(用连线法)。

从s,e中选择s.sno,sname,ssex

其中s.sno=e.sno,level=6,grade & gt=60

4.找出同一年参加大学英语四六级考试的学生的学号。

1)从E中选择sno

其中(级别=4,等级& gt=60)或级别=6

按有计数的年份分组(*)& gt;=22)从E X中选择sno,其中level=4,grade & gt=60并且存在(

Select * from e y其中y.sno = x.sno且year = x.year且level = 6) 5 .找出六级只过一次的学生的学号。

从E中选择sno

其中级别=6

按sno分组

计数(*)=1错误。为什么?1)从E中选择sno

其中级别=6

按sno分组

具有count(*)=1和max(grade)>=602)从E中选择sno,其中level=6,grade & gt=60且sno in(

从E中选择sno,其中level=6由计数(*)=1的sno分组)

6.找出目前为止还没有通过四级考试的学生的学号(包括还没有参加考试的或者参加了考试但是两者都没有通过的)。

从E中选择sno,其中level=4

按sno分组

具有最大值(等级)& lt60

联盟

从s中选择sno,其中sno不在(从E中选择sno)

7.找出六级考试合格人数最少的考试年份和月份(如有并列,用一句SQL句子列出)。

从E中选择年、月

其中level = 6,grade & gt=60

按年、月分组

有计数(*)& lt;=全部

(从E中选择count(*),其中level=6,grade & gt=60组按年、月)

补充:查一下每门课的通过率。

1获取每门课程的选修人数2获取每门课程的合格人数3获取每门课程的合格人数/1创建视图v _ all (cno,CNT) as select cno,count (*) from sc group by cno。

2创建视图v_pass( cno,cnt_pass)作为select cno,count(*)from sc where grade & gt;=60

按cno分组

3 select cno,CNT _ pass * 1.0/CNT from v _ all,v_pass其中v_all.cno = v_pass.cno