60cj数据库
『壹』 SQL数据库编程
while 平均分<85
begin
update 表 set 平均分=平均分+ (case 变量 when 平均分<90 and 平均分>80 then 1
when 平均分<80 and 平均分>70 then 2
when 平均分<70 and 平均分>60 then 3
when 平均分<60 then 5)
end
『贰』 关于数据库的题目,不会做!急求大师解答!
36、B 日期可以加天来数,结自果为N天后的日期。
37、A 字符连接,
38、C 指标到了表尾,表尾是在记录后一条
39、D soft on 单词错误,排序应用送sort on
40、a
41.b
42.c
43.B
44.b
45.d
46.a
47.d
48.c,
49.a
50.a
51.d
『叁』 数据库SQL查询操作
貌似学校的题目都是这种类型的
中文要切换输入法,转换下表,学生表里面没有姓名?
xs(xh,nl,xb,xim,xm)//最后面分别是 系名 和 姓名
kc(kh,km,xf,xs)
xk(xh,kh,cj)
select count(1),avg(cj) from kc,xk where kc.kh = xk.kh and km = "数据库原理"
select xm from xs where xh in (select xh from xk group by xh having count(1) > 3)
select distinct xim from xs group by xim having count(1) > 1000
select xm from xs where not exists (select 1 from xk where xh = xs.xh and cj < 60)
『肆』 数据库SQL语言
SQL 练习题
一 学生 – 课程数据库
1 查询 7号课程没有考试成绩的学生学号
select sno from sc where cno=’7’ and grade is null
2 查询 7号课程成绩在90分以上或60分以下的学生学号
select sno from sc where grade>90 or grade<60
3 查询课程名以“数据”两个字开头的所有课程的课程号和课程名。
Select cno,cname from c where cname like ‘数据%’
4 查询每个学生所有课程的平均成绩,输出学生学号、平均成绩
select sno,avg(grade) from sc group by sno
5 查询每门课程的选修人数,输出课程号、选修人数。
Select cno,count(*) from sc group by cno
6 查询选修 7号课程的学生的学号、姓名、性别。
Select s.sno, sname,ssex from s , sc where s.sno=sc.sno and cno = ‘7’
7 查询选修7号课程学生的平均年龄。
Select avg(sage) from s , sc where s.sno=sc.sno and cno = ‘7’
8 查询由30名以上学生选修的课程号。
Select sno from sc group by cno having count(*)>30
9 查询至今没有考试不及格的学生学号
a: select sno from s where sno not in ( select sno from sc where grade<60 )
b: select sno from sc group by sno having min(grade)>=60
二
1 找出选修课程号为 C2 的学生学号与成绩。
Select sno,grade from sc where cno=’C2’
2 找出选修课程号为C4 的学生学号与姓名。
Select s.sno , sname from s,sc where s.sno=sc.sno and cno=’C4’
3 找出选修课程名为 Maths 的学生学号与姓名。
Select s.sno ,sname from s,sc,c
where s.sno=sc.sno and c.cno=sc.cno and cname = ‘Maths’
4找出选修课程号为C2或C4 的学生学号。
Select distinct sno from sc where cno in (‘C2’,’C4’)
或: Select distinct sno from sc where cno=’C2’ or cno =’C4’5找出选修课程号为C2和C4 的学生学号。
Select sno from sc where cno =’C2’ and sno in (
select sno from sc 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 exists ( select * from sc where sc.sno=s.sno and cno=’C2’ )
7 找出选修了数据库课程的所有学生姓名。(与3同)
Select s.sno ,sname from s,sc,c
where s.sno=sc.sno and c.cno=sc.cno and cname = ‘数据库’
8 找出数据库课程不及格的女生姓名
嵌套:
select sname from s where ssex = ‘女’ and sno in ( select sno from sc where grade<60 and cno in ( select cno from c where cname=’数据库’) )
连接:
Select sname from s,sc,c
where s.sno=sc.sno and c.cno=sc.cno and ssex=’女’ and cname = ‘数据库’ and grade<609 找出各门课程的平均成绩,输出课程名和平均成绩
select cname , avg(grade) from sc , c where c.cno =sc.cno group by sc.cno10找出各个学生的平均成绩,输出学生姓名和平均成绩
select sname , avg(grade) from s , sc where 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(*)>=30 )
12 找出选修了不少于3门课程的学生姓名。
Select sname from s where sno in ( select sno from sc group by sno having count(*)>=3)
13 找出各门课程的成绩均不低于90分的学生姓名。
Select sname from s where sno not in ( select sno from sc where grade<90)
14* 找出数据库课程成绩不低于该门课程平均分的学生姓名。
Select sname from s where sno in (
Select sno from sc , c where sc.cno=c.cno and cname=’数据库’ and
Grade > (Select avg(grade) from sc , c where sc.cno=c.cno and cname=’数据库’ ) )
15 找出各个系科男女学生的平均年龄和人数。
Select sdept,ssex , avg(sage) , count(*) from s
Group by sdept , ssex
16 找出计算机系(JSJ)课程平均分最高的学生学号和姓名。
Select sc.sno , sname from s, sc where s.sno=sc.sno and sdept=’JSJ’
Group by sc.sno Having avg(grade) =
( Select top 1 avg(grade) from sc, s where s.sno=sc.sno and sdept=’JSJ’
group by sc.sno order by avg(grade) DESC )三 客户 – 商品数据库中包括3按各表:KH,FP,YWY
1 查询工资在 1000 到3000 元之间的男性业务员的姓名和办公室编号。
Select Yname , Ono from YWY where salary between 1000 and 3000 and Ysex=’男’
2 查询各个办公室的业务员人数,输出办公室编号和对应的人数。
Select Ono , count(*) from YWY group by Ono
3 查询每个客户在2002年5月购买的总金额,输出客户号和相应的总金额。
Select Kno,sum(Fmoney) from FP where fdate between ‘2002.5.1’ and ‘2002.5.31’
Group by Kno
4 查询2002年5月购买次数超过5次的所有客户号,且按客户号升序排序。
Select Kno from FP where fdate between ‘2002.5.1’ and ‘2002.5.31’
Group by Kno having count(*)>5
Order by Kno ASC
5 查询各办公室男性和女性业务员的平均工资。
Select Ono,Ysex ,avg(salary) from YWY group by Ono , Ysex
6 查询2002年5月曾经在王海亮业务员手中购买过商品的客户号、客户姓名、联系电话。
Select Kno,Kname,phone from KH where Kno in (
Select kno from FP where fdate between ‘2002.5.1’ and ‘2002.5.31’ and
Yno=(select Yno from YWY where Yname = ‘王海亮’ )7 查询所有工资比1538号业务员高的业务员的编号、姓名、工资。
Select yno ,Yname, salary from YWY where salary >
( Select salary from YWY where Yno=’1538’ )
8 查询所有与1538号业务员在同一个办公室的其他业务员的编号、姓名。
Select Yno , Yname from YWY where Yno<>’1538’ and Ono in (
Select Ono from YWY where Yno=’1538’ )
9 查询销售总金额最高的业务员的编号。
Select Yno from FP Group By Yno Having sum(Fmoney) =
(Select top 1 sum(Fmoney) from FP group by Yno ORDER BY sum(Fmoney) DESC)
10 查询所有业务员的编号、姓名、工资以及工资比他高的其他业务员的平均工资。
利用自身连接
Select y1.Yno ,y1.Yname ,y1.salary , avg( y2. salary) from YWY y1 , YWY y2
Where y1.Yno<>y2.Yno and y1.salary < y2.salary
Group by y1.Yno
Sno salary sno salary
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 找出每个班级的班级代码、学生人数、平均成绩。
Select BJDM,count(*) ,avg(CJ) from SC group by BJDM
2 找出每个学生的班级代码、学生姓名、考试科目数、总成绩。
Select BJDM,XSXM,count(*) , sum(CJ) from SC
Group by BNXH
3 输出一张表格,每位学生对应一条记录,包括:班级代码、姓名、语文成绩、数学成绩、外语成绩。
方法一:利用视图
create view v1 (bjdm,xsxm, yw,sx,wy ) AS
select bjdm , xsxm , cj , 0,0 from sc where km=’语文’
union
select bjdm , xsxm , 0 , cj,0 from sc where km=’数学’
union
select bjdm , xsxm , 0,0,cj from sc where km=’外语’select bjdm, xsxm , sum(yw) as 语文, sum(sx) as 数学, sum(wy) as 外语 from v1 group by bjdm, xsxm
方法二:自身连接
select a.bjdm,a.xsxm , a.km,a.cj , b.km,b.cj , c.km,c.cj from sc a , sc b , sc c
where a.bjdm=b.bjdm and a.bnxh= b.bnxh and b.bjdm=c.bjdm and b.bnxh= c.bnxh
and a.km=’语文’ and b.km=’数学’ and c.km=’外语’方法三:利用存储过程(略)
4 输出一张表格:由成绩低于60分的每位学生对应一条记录,包括字段:班级代码、姓名、最低成绩。Select bjdm,xsxm ,min(CJ) from sc where grade<60 group by bjdm,xsxm5输出一张表格:由成绩低于60分的每位学生对应一条记录,包括字段:班级代码、姓名、最高成绩、平均成绩。
得到平均成绩:create view V1 (bjdm,bnxh ,avg_cj) AS
select bjdm,bnxh ,avg(cj) from sc where bjdm , bnxhselect sc.bjdm,sc.xsxm ,max(cj) , avg_cj from sc , V1
where sc.bjdm=v1.bjdm and sc.bnxh=V1.bnxh and cj<60
group by sc.bjdm,sc.xsxm6输出一张表格:所有成绩不低于60分的每位学生对应一条记录,包括字段:班级代码、姓名、平均成绩。select bjdm, xsxm , avg(cj) from sc
where sno not in ( select sno from sc where grade<60)
group by bjdm, xsxm7输出一张表格:每一位学生对应一条记录,包括字段:班级代码、姓名、去掉一个最低分后的平均成绩。
方法一:
得到每个学生的最低分:
create view V1 (bjdm,bnxh ,min_cj) as
select bjdm,bnxh,min(cj) from sc group by bjdm,bnxhselect sc.bjdm,sc.xsxm , avg(cj) from sc , v1
where sc.bjdm=v1.bjdm and sc.bnxh=v1.bnxh and sc.cj <> v1.min_cj
group by bjdm,bnxh方法二:
select sc.bjdm,sc.xsxm , ( sum(cj) – min(cj) ) / count(*) from sc
group by bjdm , bnxh8输出一张表格:每门科目对应一条记录,包括字段:科目、去掉一个最低分后的平均成绩。
方法一:
得到每门课的最低分:
create view V1 ( km, min_cj) as
select km,min(cj) from sc group by km
select sc.km , avg(cj) from sc , v1
where sc.km=v1.km and sc.cj <> v1.min_cj
group by sc.km
方法二:
select km , (sum( cj) – min(cj) )/count(*) from sc
group by km补充9:输出表格:每门科目对应一条记录,包括字段:科目、去掉一个最低分和最高分后的平均成绩。
select km , (sum( cj) – min(cj) – max(cj) )/count(*) from sc
group by km五 数据库存放着某高校1990年以来英语四、六级的考试情况,且规定:
1 英语四、六级考试每年分别在6月和12月举行二次;
2 四级没有通过的学生不能报考六级;
3 某一级的考试只要没有通过可以反复参加考试;
4 某一级的考试一旦通过就不能再报考同级的考试;
5 允许报了名但不参加考试。
该数据库中有二张表,相应的关系模式如下:
学生表:S(Sno, Sname, Ssex, Sage, Sdept),其中Sno为主码。
考试表:E(Sno, Year, Month, Level, Grade),学号、年、月、级别、成绩。
其中(Sno, Year, Month)为主码。1. 找出各次四级和六级考试的参考人数和平均成绩(报了名但没有参加考试的不作统计)
select year , month,level ,count(*) , avg(grade)
group by year,month , level2. 找出各次四级考试中平均分最高的系科(报了名但没有参加考试的不作统计)。
A: Select sdept from s , e where s.sno=e.sno
Where level=4
Group by sdept
Having avg(grade)>=ALL(
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
Where level=4
Group by sdept
Order by (avg(grade) desc
3. 找出已经通过英语六级考试的学生的学号、姓名和性别(用连接方法做)
select s.sno,sname,ssex from s,e
where s.sno=e.sno and level=6 and grade>=60
4. 找出在同一年中四、六级考试都参加了的学生的学号
1) select sno from E
where (level=4 and grade>=60) or level=6
group by year having count(*)>=22) select sno from E X where level=4 and grade>=60 and exists (
select * from E Y where Y.sno=X.sno and year=X.year and level=6 )5. 找出只参加一次考试就通过了英语六级考试的学生的学号
select sno from E
where level=6
group by sno
having count(*)=1 错,想想为何?1) select sno from E
where level=6
group by sno
having count(*)=1 and max(grade)>=602) select sno from E where level=6 and grade>=60 and sno in (
select sno from E where level=6 group by sno having count(*)=1)
6. 找出至今没有通过英语四级考试的学生的学号(应包括至今还没有参加过考试或者是参加了但还没有通过两种)
select sno from E where level=4
group by sno
having max(grade)<60
Union
Select sno from s where sno not in( select sno from E)
7. 找出英语六级考试中合格人数最少的考试年份和月份(有并列的都要列出,用一句SQL语句)。
Select year , month From E
Where level = 6 and grade>=60
Group by year , month
Having count(*) <=all
(Select count(*) from E where level=6 and grade>=60 group by year , month )
补充:查询每门课程的及格率。
1 得到每门课的选修人数 2 得到每门课及格人数 3每门课的及格人数/每门课选修人数1create view v_all( cno , cnt) as select cno , count(*) from sc group by cno
2create view v_pass( cno , cnt_pass) as select cno , count(*) from sc where grade>=60
group by cno
3 select cno , cnt_pass*1.0 / cnt from v_all , v_pass where v_all.cno = v_pass.cno
『伍』 数据库应用
1、insert JBQK values('0001','小王2',‘男’,19)
insert JBQK values('0002','小王1',‘男’,15)
insert JBQK values('0003','小王3',‘女’,17)
insert JBQK values('0004','小王4',‘男’,15)
insert JBQK values('0005','小王5',‘女’,16)
insert XXCJ values(‘0001’,‘小王2’,65,90,76)
insert XXCJ values(‘0002’,‘小王1’,60,89,76)
insert XXCJ values(‘0003’,‘小王3’,60,45,79)
insert XXCJ values(‘0004’,‘小王4’,67,90,76)
insert XXCJ values(‘0005’,‘小王5’,60,90,67)
insertJTQK values(‘小王2’,‘A’,‘F')
insert JTQK values(‘小王1’,‘B’,‘E)
insert JTQK values(‘小王3’,‘A’,‘F’)
insert JTQK values(‘小王4’,‘C’,‘H’)
insert JTQK values(‘小王5’,‘D’,‘J’)
2、ALTER TABLE JBQK drop column 性别
ALTER TABLE JBQK add 性别 varchar(2) default '女'
3、alter table XXCJ add 总分 as 语文+数学+英语
4、select top 3 * from XXCJ oder by 总分 desc
5、alter table XXCJ add constraint _1 check (语文>=0 and 语文<=100)
alter table XXCJ add constraint _2 check (数学>=0 and 数学<=100)
alter table XXCJ add constraint _3 check (英语>=0 and 英语<=100)
6、 select a.学号,a.姓名,b.家庭住址 from JBQK a,JTQK b where a.姓名=b.姓名
7、检索JBQK表中年龄最大学生的姓名以及学生的平均年龄。
select 姓名 from JBQK where 年龄=(select max(年龄) from JBQK )
select avg(年龄) from JBQK
8、编写程序,当某学生退学删除JBQK表里该生记录时,能自动删除该生的XXCJ表和JTQK表中的相应记录
create trigger ondelete
on JBQK
before delete
as
begin
declare @ 姓名 varchar(20)
select @姓名=姓名 from deleted
delete from XXCJ where 姓名=@姓名
delete from JTQK where 姓名=@姓名
end
『陆』 数据库 SQL应用题
10.题答案
select 课程号,总分,平均分,最高分,最低分(
select 课程号,
总分=sum(成绩),
平均分=sum(成绩)/count(*),
最高分=max(成绩),
最低分=min(成绩)
from 成绩
group by 课程号) as kc order by 平均分 desc
11.题答案
select 课程号,
平均分=sum(成绩)/count(*)
from 成绩
where 课程号='1001' or 课程号='1002'
group by 课程号
12.题答案
select 姓名,xs.学号,kc.平均分
from 学生 as xs
left join (select 学号,
平均分=sum(成绩)/count(*)
from 成绩
group by 学号) as kc on kc.学号=xs.学号
where kc.平均分>80
『柒』 VF6.0 数据库编程填空
1.将D1表中工龄最短得人得记录显示出来
SET TALK OFF
USE D:\D1
MIN=GL
J=RECCOUNT()
FOR I=1 TO J
IF _MIN>GL
MIN=GL
R=RECNO()
ENDIF
SKIP
ENDFOR
LIST FOR RECNO()=R
USE
SET TALK
CANCEL
2.输入学生姓名,显示该学生得记录
SET TALK OFF
USE D:\D1
ACCE "请输入学生得姓名:" TO XMM
LOCA FOR XM=XMM
IF FOUND()
DISP
ELSE
?"查无此人!"
ENDIF
USE
SET TALK ON
RETURN
3.显示所有零件单价在20元以上得记录
SET TALK OFF
USE D:\D1
DO WHILE .NOT. EOF()
IF LJDJ>=20
DISPLAY
ENDIF
SKIP
ENDDO
USE
SET TALK ON
RETURN
4.将D2中商品单价在30元以下(包括30元)得商品数量增加20
SET TALK OFF
USE D:\D2
DO WHILE .NOT. EOF()
IF SPDJ>30
SKIP
LOOP
ENDIF
REPLACE SPSL WITH SPSL+20
SKIP
ENDDO
LIST
USE
SET TALK ON
5.删除所有副教授得记录
SET TALK OFF
USE D:\D1
DO WHILE .NOT. EOF()
IF ZC="副教授"
DELETE
ENDIF
SKIP
ENDDO
PACK
USE
SETTALK
RETURN
6.根据输入决定显示及格或不及格学生得记录(60或60分以上为及格,其余为不及格)
SET TALK OFF
USE D:\D1
?"输入P————显示及格学生得记录"
?"输入F————显示不及格学生记录"
WAIT "请选择:" TO K
IF K="P"
DISP FOR CJ>=60
ELSE
IF K="F"
DISP FOR CJ<60
ELSE
?"输入错误"
ENDIF
ENDIF
USE
SET TALK ON
RETURN
7.将水果为山竹商品单价上涨10%
SET TALK OFF
USE D:\D1
DO WHILE NOT EOF()
IF SGMC="山竹"
REPLACE SGDJ WITH SGDJ*1.1
?"更新成功!"
ENDIF
SKIP
ENDDO
USE
SET TALK ON
RETURN
8.按照出生日期得先后次序建立索引,显示索引后得全部数据,以及出生日期最大(年龄最小)的记录
SET TALK OFF
SET HEANDING OFF
CLEAR
USE D:\D1
INDEX ON CSRQ TO I_CSRQ
LIST
GO BOTTOM
DISPLAY
SET HEARDING ON
USE
SET TALK ON
RETURN
『捌』 数据库高手帮忙
不及格的:select 学号,姓名,专业,班级 from xsqk where 学号 in (select 学号 from xscj where cj<60 group by 学号 having count(*)>=1)
a:select * from xscj
b:select 姓名,性别,班级,学号 from xsqk
c:select year(getdate())-year(出生年月) as 年龄 from xsqk
d:select 学号,课程号,成绩 as 考试成绩 from xscj
e:select * from xscj where cj>=60
f:select 姓名,学号,班级 from xsqk where 总学分>=10
g:select 学分,学时 from xskc where 课程名=‘数据结构’
h:select 姓名,班级 from xsqk where 姓名 like '张%'
i:select * from xsqk where 出生年月>'19800101' and 系别=计算机
『玖』 求做数据库触发器设计题
createorreplacetriggertri_cj
afterinsertonXSCJ
foreachrow
begin
if:new.cj>=60then
Dbms_output.put_line('成绩合格,已完成插入操作');
else
Dbms_output.put_line('成绩不合格,不能计入成绩');
endif;
end;
编译完成后,执行下图的插入语句:
注:把代码中的cj换成XSCJ表中对应的成绩字段。