SQL基础习题

--所有样例均在sql server 2000中测试通过(阿佛原创 来自数据库系统概论第三版 采用T-SQL编写)

--建表语句 一共有三张表,分别是学生表(学号、姓名、性别、年龄、所在系)、课程表(课程号、课程名、先修课号、学分)、学生选课表(学号、课程号、成绩)

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Course]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)

drop table [dbo].[Course]

GO

 

CREATE TABLE [dbo].[Course] (

       [Cno] [char] (3) COLLATE Chinese_PRC_CI_AS NOT NULL ,

       [Cname] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,

       [Cpno] [char] (3) COLLATE Chinese_PRC_CI_AS NULL ,

       [Ccredit] [tinyint] NULL

) ON [PRIMARY]

GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SC]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)

drop table [dbo].[SC]

GO

CREATE TABLE [dbo].[SC] (

       [Sno] [char] (5) COLLATE Chinese_PRC_CI_AS NOT NULL ,

       [Cno] [char] (3) COLLATE Chinese_PRC_CI_AS NOT NULL ,

       [Grade] [tinyint] NULL

) ON [PRIMARY]

GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Student]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)

drop table [dbo].[Student]

GO

 

CREATE TABLE [dbo].[Student] (

       [Sno] [char] (5) COLLATE Chinese_PRC_CI_AS NOT NULL ,

       [Sname] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,

       [Ssex] [char] (2) COLLATE Chinese_PRC_CI_AS NULL ,

       [Sage] [int] NULL ,

       [Sdept] [char] (4) COLLATE Chinese_PRC_CI_AS NULL

) ON [PRIMARY]

GO

--插入数据的语句

Insert  into student   (Sno,Sname,Ssex,Sage,Sdept)      Values   (   '95001','李勇','',20,'CS')

Insert  into student   (Sno,Sname,Ssex,Sage,Sdept)      Values   (   '95002','刘晨','',19,'IS')

Insert  into student   (Sno,Sname,Ssex,Sage,Sdept)      Values   (   '95003','王敏','',18,'MA')

Insert  into student   (Sno,Sname,Ssex,Sage,Sdept)      Values   (   '95004','张立','',21,'IS')

Insert  into student   (Sno,Sname,Ssex,Sage,Sdept)      Values   (   '95005','林燕芳','',18,'IS')

Insert  into student   (Sno,Sname,Ssex,Sage,Sdept)      Values   (   '95006','林燕虹','',17,'IS')

Insert  into student   (Sno,Sname,Ssex,Sage,Sdept)      Values   (   '95007','欧阳锋','',19,'MA')

Insert  into student   (Sno,Sname,Ssex,Sage,Sdept)      Values   (   '95008','欧阳木兰','',18,'CS')

 

 

 

Insert  into course   (Cno,Cname,Cpno,Ccredit)      Values   (   '1','数据库','5',4)

Insert  into course   (Cno,Cname,Cpno,Ccredit)      Values   (   '2','数学',NULL,2)

Insert  into course   (Cno,Cname,Cpno,Ccredit)      Values   (   '3','信息系统','1',4)

Insert  into course   (Cno,Cname,Cpno,Ccredit)      Values   (   '4','操作系统','6',3)

Insert  into course   (Cno,Cname,Cpno,Ccredit)      Values   (   '5','数据结构','6',3)

Insert  into course   (Cno,Cname,Cpno,Ccredit)      Values   (   '6','数据处理', '2' ,2)

Insert  into course   (Cno,Cname,Cpno,Ccredit)      Values   (   '7','PASCAL语言','6',4)

Insert  into course   (Cno,Cname,Cpno,Ccredit)      Values   (   '8','DB_DESIGN','6',3)

 

 

Insert  into sc   (Sno,Cno,Grade)      Values   (   '95001','1',92)

Insert  into sc   (Sno,Cno,Grade)      Values   (   '95001','2',85)

Insert  into sc   (Sno,Cno,Grade)      Values   (   '95001','3',88)

Insert  into sc   (Sno,Cno,Grade)      Values   (   '95001','4',23)

Insert  into sc   (Sno,Cno,Grade)      Values   (   '95001','5',34)

Insert  into sc   (Sno,Cno,Grade)      Values   (   '95001','6',56)

Insert  into sc   (Sno,Cno,Grade)      Values   (   '95001','7',86)

Insert  into sc   (Sno,Cno,Grade)      Values   (   '95001','8',88)

Insert  into sc   (Sno,Cno,Grade)      Values   (   '95002','2',90)

Insert  into sc   (Sno,Cno,Grade)      Values   (   '95002','3',80)

Insert  into sc   (Sno,Cno,Grade)      Values   (   '95003','1',50)

Insert  into sc   (Sno,Cno,Grade)      Values   (   '95003','3',98)

Insert  into sc   (Sno,Cno,Grade)      Values   (   '95005','3',null)

 

题目:(答案在最后)

--1:查询全体学生的学号和姓名

--2:查询全体学生的姓名、学号和所在系

--3:  查询全体学生的详细记录

--4: 查询全体学生的姓名及其出生年份

--5:查询全体学生姓名、出生年份和所在系,要求用小写字母表示所有系名

--6:查询选修了课程的学生学号

 

--7:查询计算机系(IS)所有学生的名单

--8:查询所有年龄在20以下学生的姓名和年龄

--9:  查询考试成绩有不及格的学生的学号

--10: 查询年龄在20-23 (包括2023)之间的学生的姓名、系别和年龄

 

--11: 查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别

--12: 查询学号为95001的学生的详细情况

--13: 查询所有姓林的学生的姓名、学号和性别

--14: 查询姓“欧阳”且全名为三个汉字的学生的姓名

--15:查询名字中第二个字为“燕”字的学生姓名和学号

 

--16:查询所有不姓“刘”的学生的姓名

--17:查询课程名为“DB_DESIGN”的课程号的学分

--18:查询缺少成绩的学生的学号和相应的课程号(成绩字段值为Null

--19: 查询所有有成绩的学生的学号和课程号

--20: 查询所有计算机系年龄在20以下的学生姓名

 

--21: 查询选修了3号课程的学生的学号和成绩,查询结果按分数降序排列

--22: 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列

--23: 查询学生总人数

--24: 查询选修了课程的学生人数

--25: 计算1号课程的学生的平均成绩

 

--26: 计算1号课程的学生的最高成绩分数

--27:求各个课程号及相应的选课人数

--28:  查询选修了三门以上课程的学生学号

--29:查询每个学生及其选修课情况

--30:查询每一门课的间接先行课

 

--31:选修2号课程且成绩在90以上的学生的学号和姓名

--32:查询每个学生的学号、姓名、选修的课程名及成绩

--33:查询与林燕芳在同一个系学习的学生姓名

--34: 查询其他系中比信息系某一学生小的学生姓名和年龄

--35:查询所有选修了1号课程的学生的学生姓名

 

--36:查询选修了全部课程的学生姓名

--37:至少选修了学生95002选修全部课程的学生号码

 

答案:

--1select Sno,Sname from Student

 

--2select Sno,Sname,Sdept from Student

 

--3select * from Student /*也可以逐一列出列名并用逗号分隔*/

 

--其中getdate是获取当前系统时间。这是一个获取到的结果 2008-12-11 16:02:17.967

--datepart从获取到的系统时间中分离出需要的部分,这里是分离出年份,更多信息请查看SQL Server联机帮助

--下面的 出生年 指定了别名来替代原来结果页出现的文字

--4select Sname , (datepart( year,getdate())- Sage) '出生年' from Student

 

--该实例利用了小写转换函数lower() 提示:通过查询分析器的 公用对象 字符串函数中你可以找到这个函数

--5select Sname '姓名' , (datepart( year,getdate())- Sage) '出生年',lower(Sdept) '所在系' from Student

 

--6select Sno  from sc --这里将返回全部结果,有重复的值

--   select distinct Sno from sc--加入关键字distinct就可以去除重复结果,只留1

 

/*--sql 中默认对字符串大小写不敏感的,所以下面的sdept=’IS’你也可以写成sdept=’is’。如果你要启用大小写敏感,可以用下面的方法

if   敏感  

        select   *   from   table   where   field1="AAA"   COLLATE   Chinese_PRC_CS_AS  

  else  

        select   *   from   table   where   field1="AAA"   COLLATE   Chinese_PRC_CI_AS  

  COLLATE   的中文排序规则参数可用下列方式查到  

  SELECT   *   FROM   ::fn_helpcollations()   where   name   like   'Chinese%'

*/

--7:  select Sname from student where sdept='IS'

 

--8:  select Sname,Sage from student where Sage<20

 

--9:  select Sno from sc where grade<60

 

--如果要查询不在这个区间的记录,那只要改成 not between就可以了

--10select Sname,Sdept,Sage from student where Sage between 20 and 23

 

--如果要查询不属于信息系、数学系和计算机科学系的,可以在in前面加上NOT

--也可以这样子写:select Sname,Ssex from student where Sdept='is' or sdept='ma' or sdept='cs'

--11select Sname,Ssex from student where Sdept in('IS','MA','CS')

 

--或者是select * from student where sno = '95001'

--12 select * from student where sno like '95001'--like用于字符串匹配

 

--百分号匹配多个字符,包括0

--13 select Sname,Sno,Sage  from student where sname like '%'

 

-- 一个下划线匹配单个字符

--14select sname from student where sname like '欧阳_'

 

--15select sname,sno from student where sname like '_%'

 

--16select sname from student where sname not like '%'

 

--17select Ccredit from course where cname like 'DB/_DESIGN' escape'/'

 

--注意:这里不用使用 = null

--18select sno,cno  from sc where grade is null

 

--19select sno,cno from sc where grade is not null

 

--20: select sname from student where sdept='CS' and sage<20

 

--21select sno,grade from sc where cno=3 order by grade desc

 

--22select * from student order by sdept,sage desc

 

--23:select count(*) from student

 

--24select count(distinct sno) from sc

 

--25: select avg(grade) from sc where cno='1'

 

--26: select max(grade) from sc where cno='1'

 

--group by 按照它后面的列值进行分组,相同的值被分在一组

--27: select cno,count(sno) from sc group by cno

 

--having后面的条件是根据group by 分组后的结果再进行筛选,最后只给出满足条件的分组

--where筛选的对象是整个表,而having则是分组

--28: select sno from sc group by sno having count(sno)>=3

 

--29select a.sname,b.cno from student a ,sc b

where a.sno=b.sno

或者

select a.sname,b.cno from student a left outer join sc b

on a.sno=b.sno where b.cno is not null

 

--自身连接

--30select a.Cno,b.Cpno from course a,course b where a.Cpno=b.Cno

 

--31

select student.sno,student.sname

from student,sc

where student.sno=sc.sno and

sc.cno='2' and

sc.grade>=90

 

--32

select student.sno,student.sname,course.cname,sc.grade

from (student left join sc on student.sno=sc.sno)

left join course on sc.cno=course.cno

或者:

--忽略cnamegrade都为null的行

Select student.sno,sname,cname,grade

From student,sc,course

Where student.sno=sc.sno and sc.cno=course.cno

 

--33

select sname from student

where sdept=(select sdept from student where sname='林燕芳')

 

--34

select sname,sage

from student

where sage<any(

select sage from student

where sdept='is'

) and sdept<>'IS'

 

--35:利用 exists的查询

--exists根据是否存在行返回true/false

--如果要查询没有选修1号课程的学生姓名,只要使用NOT Exists即可

select *

from student

where exists(

 select 1 from sc

where student.sno=sc.sno and cno='1'

)

或者你可以使用连接查询

select * from student left join sc on student.sno=sc.sno

where sc.cno='1'

 

--36

declare @temp1 int

declare @temp2 int

select @temp1=count(*) from course

select @temp2=sno from sc group by sno

having count(sno)=@temp1

select sname from student where sno in (@temp2)

或者

--就是转换成查询没有一门课程没有选修的学生姓名

--如果把两个not都去掉就是查询所有有选修课程的学生

Select sname from student where not exists(

Select 1 from course where not exists(

              Select 1 from sc where student.sno=sc.sno and course.cno=sc.cno

)

)

 

--37

--同样要进行转换:查询这样的学生,没有95002选修的课程而学生X没有选修的

Select distinct sno

From sc scx

Where not exists

(

       Select 1 from sc scy

       Where scy.sno='95002' and not exists

       (

              Select 1 from sc scz

              Where scz.sno=scx.sno and scz.cno=scy.cno

       )

)

and sno!='95002'

插入语句:

1:对每一个系求平均年龄,并把结果存入数据库

需要创建一个表用来存储结果

Create table Deptage

(

       Sdept char(15),

       Avgage smallint

);

--插入子查询结果

insert into

  Deptage(Sdept,Avgage)

select sdept,avg(sage)

from student

group by sdept

--查看结果

select * from deptage

 

修改语句;

1:将学生95001的年龄改为22

Update student

 Set sage=22

Where sno='95001'--注意如果不带where,则修改全部记录

 

2:将所有的学生年龄加1(修改多个元组的值)

Update student

Set sage=sage+1;

 

3:将计算机系全体同学的成绩置零(带子查询的修改语句)

Update sc

Set grade=0

Where 'cs'=(

Select sdept from student

Where student.sno=sc.sno)

删除语句:

1:删除学号为95009的学生记录(删除后将无法回复)

Delete from student

Where sno='95009'--没有加where的话将删除该表全部记录

 

2:删除计算机科学系所有学生的选课记录

Delete from sc

Where 'cs'=(

Select sdept

 From student

Where student.sno=sc.sno

)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值