SQL server 2008 全代码

SQL server 2008 上机实验测试

1.为xxgl数据库创建学生表、课程表和选课表。表结构如下:
Student(sno char(12),sname char(10),ssex char(2),sage tinyint,snat char(8),sdept nchar(20)),设置学号为主键
Course(cno char(3),cname nchar(20),credit tinyint) 设置课程号为主键
Sc(sno char(12),cno char(3),grade tinyint)(sno,cno)为主键,并且设置外键(认真分析)
|sno sname ssex sage snat sdept
S1 赵无言 男 18 汉族 计算机系
S2 蒋洪 男 19 回族 通信系
S3 汪艳 女 18 汉族 自动化
S4 张拟 女 18 汉族 通信系
S5 孙瑶 男 19 汉族 电子系
S6 张军军 男 20 回族 计算机系
cno cname credit
001 C语言程序设计 2
002 高数 3
003 大学英语 2
004 计算机网络 3
005 数据库原理 2
sno cno grade
S1 001 80
S1 003 75

--创建数据库
create database xxgl
on 
(name=xxgl,
filename='D:\sql\xxgl.mdf',
size=10MB,
maxsize=30MB,
filegrowth=5MB)
log on
(name=xxgl_log,
filename='D:\sql\xxgl_log.ldf',
size=4MB,
maxsize=10MB,
filegrowth=2MB)
--创建表
use xxgl
go
create table Student(sno char(12)primary key,
sname char(10),
ssex char(2),
sage tinyint,
snat char(8),
sdept nchar(20)
)
create table Course
(cno char(3)primary key,
   cname nchar(20),
   credit tinyint
   )
create table  Sc
(sno char(12)references Student(sno),
cno char(3)references Course(cno),
primary key(sno,cno),
grade tinyint)

--插入数据

insert into Student values
('S1','赵无言','男',18,'汉族','计算机系'),
('S2','蒋洪','男',19,'回族','通信系'),
('S3','汪艳','女',18,'汉族','自动化'),
('S4','张拟','女',18,'汉族','通讯系'),
('S5','孙瑶','男',19,'汉族','电子系'),
('S6','张军军','男',20,'回族','计算机系')

insert into course values
('001','C语言程序设计',2),
('002','高数',3),
('003','大学英语',2),
('004','计算机网络',3),
('005','数据库原理',2)

insert into SC values
('S1','001',80),
('S1','003',75),
('S2','002',54),
('S3','002',70),
('S3','003','30')

use xxgl
alter table Student 
add constraint D_ssex default '男' for ssex --添加默认约束

alter table Student
add constraint age_check check  (17<sage and sage<30) --添加检查约束

alter table Student
add constraint U_sname unique (sname) --添加唯一约束

alter table Sc
add constraint CK_grade check (0<grade and grade<100) --添加检查约束

alter table Student
alter column sdept nchar(50) null --修改列属性

alter table Course
add cdept char(20) null    --新建列

alter table Course
drop column cdept        --删除列

alter table Student
add spol varchar(20) null  --增加新列

use xxgl
drop table Course   --删除表
use xxgl
drop table Sc       --删除表
use xxgl
drop table Student   --删除表

--1
select sno,sname from Student  -- 查询全体学生
use xxgl
--2
select sname,year(GETDATE())-sage 出生年份 from Student  --查询
--3
select * from Student  --查询全体学生
--4
select cname 学分为2的课程名 from Course
where credit=2
--5
select sname,sage from Student
where snat='汉族'
--6
select sno from Sc
where grade<60
--7
select sname ,sage from Student
where sage between 18 and 20
--8
select sname ,YEAR(GETDATE())-sage 出生年份 from Student
where ssex='女'
--9
select sname ,ssex from Student
where sdept='通信系' or sdept='计算机系'
--10
select sname ,ssex from Student
where not sdept in('计算机系','通信系')
--11
select sname ,sno,ssex from Student
where sname like ('张%')
--12
select sname from Student
where sname like ('__')
--13
select sname from Student
where sname not like ('张%')
--14
select sname ,sno from Student
where sname like ('_无%')
--15
select sno cno from Sc
where grade is null
--16
select sno,cno from Sc
where grade is not null
--17
select distinct sno from Sc

select count(*) 学生人数 from Student –统计学生人数

select COUNT(*) 选修课程数 from Course  -- 统计选修课门数

select COUNT(distinct(sno)) 选课人数  from Sc  --统计选课人数

select MAX(grade) 最高成绩, MIN(grade)最低成绩 ,AVG(grade) 平均成绩 from Sc
where cno=003   --统计学号003最高成绩,最低成绩,平均成绩

select cno,COUNT(*) 每门课程选课门数 from Sc
group by cno  --统计每门课程的选课门数

select cno 课程号,COUNT(*) 选课人数 from Sc
group by cno
having COUNT(*)>5   --统计选课大于5个的课程号

select ssex,COUNT(*) 人数 from Student
group by ssex   --按性别统计人数

select ssex,COUNT(*) 人数 from Student  
group by ssex
having COUNT(*)>3  --性别多于3人的是男

select distinct sno,COUNT(*) 选课门数 from Sc
group by sno   --显示学号 和选课门数

select distinct sno,COUNT(*) 选课门数 from Sc
group by sno
having COUNT(*)>=2    --统计选课门数大于2的学号

select sno, AVG(grade) from Sc
group by sno  -- 统计平均成绩

select sno, AVG(grade) from Sc
group by sno
having AVG(grade)>70   --统计平均成绩大于70的学号

select sname from Student
where sage<20
order by sno desc  --显示年龄小于20的学号

select * from Student
order by sage asc ,ssex desc  


--(1)查询学生的学号、姓名、课程名和成绩。
select Student.sno,Student.sname,Course.cname,Sc.grade 
from Student join Sc 
on Student.sno=Sc.sno
join Course
on Course.cno=Sc.cno

--(2)查询选修号课程且成绩在分以上的所有学生的学号和姓名。
select sno,sname from Student
where  sno in( select sno from Sc where cno='003' and grade>60)
--(3)查询选修了课程名为“高数”的学生的学号和姓名。
select Student.sno ,Student.sname from Student join Sc
on Student.sno=Sc.sno
join Course
on Course.cno=Sc.cno
where cname='高数' 
--(4)查询与“高数”学分相同的课程的课程名和学分,用自身连接查询完成。
select a.cname,a.credit from Course a join Course b
on a.cno=b.cno and  a.credit<>3 
--(5)查询与孙瑶年龄相同的学生的信息,用自身连接查询完成。
select a.* from Student a join Student b
on a.sno=b.sno and  a.sname<>'孙瑶' and a.sage=19 
--(6)查询与“蒋洪”在同一个系学习的学生的学号、姓名和系别。要求分别用自身连接查询和嵌套查询完成。
select a.sno,a.sname ,a.sdept from Student as a 
where sdept in (select sdept from Student as b where b.sname='蒋洪' and a.sno=b.sno and a.sname<>'蒋洪')
--(7)查询选课成绩大于分以上的学生的学号和姓名。
select sno,sname from Student
where sno in (select sno from Sc where grade>60 )
--(8)查询成绩至少比学号为S3的学生选修的某一门课成绩要高的学生的学号、课程号和成绩。
select Student.sno,cno,grade from Student join Sc
on Student.sno=Sc.sno
where grade>any(select grade from Sc where sno='S3')
--(9)查询成绩比学号为S3的学生选修的任一门课成绩都要高的学生的学号、课程号和成绩。
select Student.sno,cno,grade from Student join Sc
on Student.sno=Sc.sno
where grade>(select max(grade) from Sc where sno='S3')
--(10)找出超过所有学生选修课程平均成绩的学号、课程号和成绩。
select Student.sno,cno,grade from Student join Sc
on Student.sno=Sc.sno
where grade>(select AVG(grade) from Sc) 

--(1)建立计算机系学生的视图jsj_student,列出学号、姓名和年龄。
use xxgl
go
create view jsj_student
as select sno,sname,sage from Student
where sdept='计算机系'
with check option
--(2)建立选修了003号课程的学生的视图s_sc_003,列出学号、姓名、年龄和系别。
create view s_sc_003 
as select student.sno,sname,sage,sdept
from Student join Sc
on student.sno=Sc.sno
where Sc.cno=003
with check option
--(3)定义一个查询学生学号、姓名、出生年份的视图s_birthday。
create view s_birthday(sno,sname, 出生年份)
as select sno,sname,YEAR(GETDATE())-sage from Student
drop view s_birthday
--(4)按民族统计学生人数定义为一个视图s_p。
create view s_p(snat,student_number)
as select snat,COUNT(*) from Student
group by snat
--(5)在s_p视图中找出民族是汉族的学生人数。
select * from s_p
select * from s_p
where snat='汉族'
--(6)将计算机系学生视图jsj_student中学号为S1的学生年龄改为19。
update jsj_student
set sage=19
where sno='s1'
--(7)创建查询每个学生的选课门数,要求列出学生的学号和选课门数的视图s_m。
create view s_m(sno,cno_number)
as select sno,COUNT(*) from Sc
group by sno
--(8)删除jsj_student视图。
drop view jsj_student
--(9)将所有学生的年龄增加1岁。
update Student
set sage=sage+1
select * from Student
--(10)删除学号为S4的学生的记录。
delete from Student where sno='s4'
--(11)删除所有学生的选课记录。
delete from Sc




--(1)创建整型局部变量@myint1和@myint2,然后分别为其赋值10和20,并在计算机屏幕上显示出来。
declare @myint1 int
declare @myint2 int
set @myint1=10
set @myint2=20
print  @myint1
print @myint2

--(2)定义两个局部变量,分别存放常量16和student表中蒋洪的学号,并在计算机屏幕上显示出来。
declare @int_1 int
declare @char_Sno char(10)
select @char_Sno=sno,@int_1=16 from Student
where sname='蒋洪'
print @char_sno
print @int_1
--(3)统计并显示“C语言程序设计”课程的平均成绩,如果在80分以上,则显示“成绩优秀”,否则显示“成绩一般”。
if(select grade from Sc join Course on Sc.cno=Course.cno and cname='C语言程序设计')>80
print '成绩优秀'
else 
print '成绩一般'
--(4)统计并显示“C语言程序设计”课程的平均成绩,如果在80分以上,则显示“成绩优秀”,如果在60—79之间,则显示“成绩一般”否则显示“成绩不理想”。
declare @avg_grade int
select @avg_grade=avg(grade) from Sc join Course on Sc.cno=Course.cno and cname='C语言程序设计'
if(@avg_grade)>80
print '成绩优秀'
else if(@avg_grade)>60 
 print '成绩一般'
 else print '成绩不理想'
--(5)将“C语言程序设计”课程的成绩,按A、B、C、D、E五个等级显示成绩。A级:90分以上;B级:80-89分;C级:70-79分D级:60-69分;E级:60分以下
select grade,
case 
 when grade>=90 then 'A'
  when grade>=80 then 'B'
   when grade>=70 then 'C'
    when grade>=60 then 'D'
     when grade<60 then 'E'
     end as '成绩等级'
     from Sc join Course on Sc.cno=Course.cno and cname='C语言程序设计'
--(6)求1~100之间的所有数之和,并输出结果。
declare @i int,@sum int
set @i=1
set @sum=0
while(@i<=100)
begin
set @sum=@sum+@i
set @i=@i+1
end
print @sum
--(7)为确保选修002号课程的学生都能通过考试,制定了如下加分规则:每人都加5分,看是否都通过,如果没有,则每人再加5分,再看是否都能通过,如此反复加分,直到所有人都能通过为止(超过100,设置100)。
declare @n int 
while(1>0)
begin
 select @n=COUNT(*) from Sc where grade<60 and cno='002'
 if(@n>0)
 update Sc set grade=grade+5 where cno='002'
 else break
 end
 update Sc set grade=100 where grade>100 and cno='002'
 select * from Sc where cno='002' 

你可能感兴趣的:(SQL,server数据库,sql)