简简单单学会使用数据库SQL Server2008《总结练习题》

 1.用T.SQL创建数据库表

1.给出一个名为xxgl的数据库,并将其附加到当前实例中。

2.为xxgl数据库创建学生表、课程表和选课表。

3.分别为student表、course表和sc表输入数据。

1首先创建一个XXGL的数据库

create database XXGL

on

(

  name=XXGL,

  filename='F:\sql\XXGL.mdf',

  size=6,

  maxsize=20,

  filegrowth=1

 )

2创建一个student表。

use XXGL

go

create table student

(

  sno char(12),

  sname char(10),

  ssex char(2),

  sage tinyint,

  snat char(8),

  sdept nchar(20)

 )

 Go

3创建一个course表

use XXGL

go

create table course

(

 cno char(3),

 cname nchar(20),

 credit tinyint

 )

 Go

4创建一个选课表 sc。

use XXGL

go

create table sc

(

  sno char(12),

  cno char(3),

  grade tinyint

)

Go

1 course表的结果

2  student表的结果

3选课表sc的结果

 

2.为数据库表添加约束

1.使用表设计器为student表、course表和sc表添加主键约束。

2.使用“数据库关系图”为sc表添加外键约束。

1给student表添加主键约束

go

alter table student

alter column sno varchar(12) not null

go

alter table student

add constraint pk_sno primary key(sno)

Go

给course添加主键约束

alter table course

alter column cno varchar(3) not null

go

alter table course

add constraint pk_cno primary key(cno)

Go

2为选课表sc添加外键约束

alter table             

alter column sno varchar(12)

alter table sc

add constraint fk_son foreign key(sno) references student(sno)

go

go

alter table sc

alter column cno varchar(3)

alter table sc

add constraint fk_cno foreign key(cno) references course(cno)

Go

1课程表course的主键

2 学生表student的主键

3选课表sc的外键

 3.简单查询

1.学生表、课程表和选课表表结构如下:

student(sno char(10),sname char(10),ssex char(4),sage tinyint, spol char(8),snat char(12), sdept char(10))

course(cno char(6),cname char(20),credit tinyint)

sc(sno char(10),cno char(6),grade tinyint)

2.根据表结构完成简单查询。

1创建一个student表。

use XXGL

go

create table student

(

  sno char10),

  sname char(10),

  ssex char(4),

  sage tinyint,

  snat char(12),

  sdept char(10)

 )

 Go

创建一个course表

use XXGL

go

create table course

(

 cno char(6),

 cname nchar(20),

 credit tinyint

 )

 Go

 创建一个选课表 sc。

use XXGL

go

create table sc

(

  sno char(10),

  cno char(6),

  grade tinyint

)

Go

2.根据表结构完成简单查询。

  1. 查询政治面貌为团员的学生姓名和年龄,并加入一个新表t1中

use XXGL

go

alter table student

add pc nchar(10)

go

select sname,sage

into t1

from student

where pc='团员'

Go

    2.查询年龄在18.20岁(包括18岁和20岁)之间的学生的姓名和年龄,便加入新表t2中

select sname,sage

into t2

from student

where sage between 18 and 20

Go

     3.查询通信系和计算机系学生的姓名和性别,并加入新表t3中

select sname,ssex

into t3

from student

where sdept in('通信系','计算机系')

Go

4.查询所有姓张的学生的姓名、学号和性别,并加入新表t4中

select sname,sno,ssex

into t4

from student

where sname like '张%'

Go

  5.查询选修了课程的学生的学号并去除重复行,并加入新表t5中

go

select distinct sno

into t5

from sc

go

1 简单查询的结果

2 简单查询二的结果

3 简单查询三的结果

4 简单查询四的结果

5 简单查询五的结果

4.聚集函数及其应用

1.学生表、课程表和选课表表结构如下:

student(sno char(10),sname char(10),ssex char(4),sage tinyint, spol char(8),snat char(12), sdept char(10))

course(cno char(6),cname char(20),credit tinyint)

sc(sno char(10),cno char(6),grade tinyint)

2.根据表结构使用聚集函数完成相关查询。

(1)统计学生人数;查询开设的课程数。

(2)查询选修了课程的学生人数;查询003号课程的最高分,最低分和平均成绩。

(3)统计每门课程的选课人数,列出课程号和选课人数。

(4)统计每门课程的选课人数,列出选课人数大于5人的课程号和选课人数。

(5)分别统计男女生人数;分别统计男女生人数,且只显示人数超过3人的一组。

(6)按学号查询学生选修课程门数;查询选修了2门以上课程的学生的学号和课程门数。

(7)统计每个学生选修课程的平均分,列出学号和平均分。

(8)统计每个学生选修课程的平均分,列出平均分大于70分的学号和平均分。

(9)查询20岁以下学生的姓名,查询结果按学号降序排列。

(10)查询全体学生信息,查询结果按年龄升序排列,相同年龄按性别降序排列。

新建查询,在查询页面中输入查询语句。

语句如下:

(1)统计学生人数

     go

select COUNT(*)

from student

go

查询开设的课程数。

go

select COUNT(*)

from course

go

(2)查询选修了课程的学生人数。

      go

select count(distinct sno) as '人数'

from sc

go

查询003号课程的最高分,最低分和平均成绩。

go

select MAX(grade) as '最高分' ,MIN(grade) as '最低分',AVG(grade) as '平均分'

from sc

where  cno='003'

go

(3)统计每门课程的选课人数,列出课程号和选课人数。

     go

select cno,count(sno) as '人数'

from sc

group by cno

go

(4)统计每门课程的选课人数,列出选课人数大于5人的课程号和选课人数。

go

select cno,count(sno) as '人数'

from sc

group by cno

having COUNT(sno)>5

go

(5)分别统计男女生人数

go

select ssex as '性别' , count(*) as '人数'

from student

group by ssex

go

分别统计男女生人数,且只显示人数超过3人的一组。

    go

select ssex as '性别' , count(*) as '人数'

from student

group by ssex

having COUNT(*)>3

go

(6)按学号查询学生选修课程门数。

    go

select sno, COUNT (cno) as '课程人数'

from sc

group by sno

go

查询选修了2门以上课程的学生的学号和课程门数。

   go

select sno, COUNT(cno) as '门数'

from sc

group by sno

having COUNT(cno)>2

go

(7)统计每个学生选修课程的平均分,列出学号和平均分。

    go

select sno,AVG(grade) as '平均分'

from sc

group by  sno

go

(8)统计每个学生选修课程的平均分,列出平均分大于70分的学号和平均分。

go

select sno,AVG(grade) as '平均分'

from sc

group by  sno

having AVG(grade)>70

go

(9)查询20岁以下学生的姓名,查询结果按学号降序排列。

    go

select sno,sname

from student

where sage<20

order by sno desc

go

(10)查询全体学生信息,查询结果按年龄升序排列,相同年龄按性别降序排列。

go

select *

from student

order by sage , ssex desc

go

结果

5高级查询 

1.学生表、课程表和选课表表结构如下:

Student(sno char(10),sname char(10),ssex char(4),sage tinyint,snat char(8),spol char(8),sdept char(10))

Course(cno char(6),cname char(20),credit tinyint)

Sc(sno char(10),cno char(6),grade tinyint)

2.根据表结构完成以下查询。

(1)查询学生的学号、姓名、课程号和成绩;

(2)查询选修003号课程且成绩在60分以上的所有学生的学号和姓名。

(3)查询选修了课程名为“高数”的学生的学号和姓名。

(4)查询与“高数”学分相同的课程的课程名和学分,用自身连接查询完成。

(5)查询与孙瑶年龄相同的学生的信息,用自身连接查询完成。

(6)查询与“蒋路”在同一个系学习的学生的学号、姓名和系别。

(7)查询选课成绩大于60分以上的学生的学号和姓名。

(8)查询成绩至少比学号为09110101的学生选修的某一门课成绩要高的学生的学号、课程号和成绩。

(9)查询成绩比学号为09110101的学生选修的任一门课成绩都要高的学生的学号、课程号和成绩。

(10)找出超过所有学生选修课程平均成绩的学号、课程号和成绩。

(11)查询已修课程门数高于09110101号的所有学生的学号和已修门数。

(1)查询学生的学号、姓名、课程号和成绩

use XXGL

 go

 select student.sno,student.sname,sc.cno,sc.grade

 from student join sc

 on sc.sno=sc.sno

 Go

(2)查询选修003号课程且成绩在60分以上的所有学生的学号和姓名

 go

 select student.sno,student.sname

 from student join sc

 on student.sno=sc.sno and grade>60

 where cno='003'

 Go

(3)查询选修了课程名为“高数”的学生的学号和姓名

 go

 select student.sno,student.sname

 from student inner join sc

on student.sno=sc.sno join course

 on cname='高数'

Go

(4)查询与“高数”学分相同的课程的课程名和学分,用自身连接查询完成

go

 select a.cname,a.credit

 from course a inner join course b

 on a.credit=b.credit and b.cname='高数'

 Go

(5)查询与孙瑶年龄相同的学生的信息,用自身连接查询完成

go

 select a.*

 from student a inner join student b

 on a.sage=b.sage and b.sname='孙瑶'

 Go

(6)查询与“蒋路”在同一个系学习的学生的学号、姓名和系别

 go

 select a.sno,a.sname,a.sdept

 from student a inner join student b

 on a.sdept=b.sdept and b.sname='蒋路'

 Go

(7)查询选课成绩大于60分以上的学生的学号和姓名

 go

 select student.sno,student.sname

 from student inner join sc

 on student.sno=sc.sno and grade>60

 Go

(8)查询成绩至少比学号为09110101的学生选修的某一门课成绩要高的学生的学号、课程号和成绩

 go

 select sno,cno,grade

 from sc

 where grade>any(select grade

 from sc

 where sno='09110101'

 )

 Go

(9)查询成绩比学号为09110101的学生选修的任一门课成绩都要高的学生的学号、课程号和成绩

go

 select sno,cno,grade

 from sc

 where grade>all(select grade

 from sc

 where sno='09110101'

 )

 Go

(10)找出超过所有学生选修课程平均成绩的学号、课程号和成绩

go

 select sno,cno,grade

 from sc

 where grade>all(select AVG(grade)

 from sc

 )

 Go

(11)查询已修课程门数高于09110101号的所有学生的学号和已修门数

go

select sno,COUNT(cno)as'门数'

from sc

group by sno

having COUNT(cno)>=

(select COUNT(cno)

from sc

where sno='09110101')

go

 

 

6.视图操作 

1.学生表、课程表和选课表表结构如下:

Student(sno char(10),sname char(10),ssex char(4),sage tinyint,snat char(8),spol char(8),sdept char(10))

Course(cno char(6),cname char(20),credit tinyint)

Sc(sno char(10),cno char(6),grade tinyint)

2.根据表结构,完成下面的操作。

(1)建立计算机系学生的视图jsj_student,列出学号、姓名和年龄。

(2)建立选修了003号课程的学生的视图s_sc_003,列出学号、姓名、年龄和系别。

(3)定义一个查询学生学号、姓名、出生年份的视图s_birthday。

(4)按政治面貌统计学生人数定义为一个视图s_p。

(5)在s_p视图中找出政治面貌是团员的学生人数。

(6)将计算机系学生视图jsj_student中学号为09110106的学生年龄改为19。

(7)创建查询每个学生的选课门数,要求列出学生的学号和选课门数的视图s_m。

(8)删除jsj_student视图。

(9)将学生09110101的政治面貌改为群众。

(10)将所有学生的年龄增加1岁。

(11)删除学号为09110104的学生的记录。

(12)删除所有学生的选课记录。

(13)将计算机系学生的“高数”成绩加10分。

(1)建立计算机系学生的视图jsj_student,列出学号、姓名和年龄

use xxgl

create view jsj_student

as

select sno,sname,sage

from s

where sdept='计算机系'

Go

查询视图

go

select *

from jsj_student

go

(2)建立选修了003号课程的学生的视图s_sc_003,列出学号、姓名、年龄和系别

go

create view s_sc_003

as

select s.sno,sname,sage,sdept

from s inner join sc

on s.sno=sc.sno

where cno='003'

Go

查询视图

go

select *

from s_sc_003

go

(3)定义一个查询学生学号、姓名、出生年份的视图s_birthday

go

create view s_birthday

as

select s.sno,sname,year(GETDATE())-sage as '出生年月'

from s

Go

查询视图

go

select *

from s_birthday

Go

(4)按政治面貌统计学生人数定义为一个视图s_p

go

create view s_p

as

select pc,count(sno) as '人数'

from s

group by pc

Go

查询视图

go

select *

from s_p

Go

(5)在s_p视图中找出政治面貌是团员的学生人数

go

select pc,人数

from s_p

where pc='团员'

Go

(6)将计算机系学生视图jsj_student中学号为09110106的学生年龄改为19

go

update jsj_student

set sage='19'

where sno='09110106'

go

(7)创建查询每个学生的选课门数,要求列出学生的学号和选课门数的视图s_m

go

create view s_m(sno,c_num)

as

select sno,COUNT(cno)

from sc

group by sno

Go

查询视图

go

select *

from s_m

Go

(8)删除jsj_student视图

go

drop view jsj_student

go

(9)将学生09110101的政治面貌改为群众

go

update s

set pc='群众'

where sno='09110101'

go

(10)将所有学生的年龄增加1岁

go

update s

set sage=sage+1

go

(11)删除学号为09110104的学生的记录

go

delete s

where sno='09110104'

go

(12)删除所有学生的选课记录

go

delete

from sc

go

(13)将计算机系学生的“高数”成绩加10分

go

update sc

set grade=grade+10

where '计算机系'=

(select sdept

from s

where s.sno=sc.sno

) and cno='002'

Go

 

7.流程控制语句的应用 

1.学生表、课程表和选课表表结构如下:

Student(sno char(10),sname char(10),ssex char(4),sage tinyint,snat char(8),spol char(8),sdept char(10))

Course(cno char(6),cname char(20),credit tinyint)

Sc(sno char(10),cno char(6),grade tinyint)

2.根据表结构完成以下编程。

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

(2)定义两个局部变量,分别存放常量16和student表中蒋路的学号,并在计算机屏幕上显示出来。

(3)统计并显示“C语言程序设计”课程的平均成绩,如果在80分以上,则显示“成绩优秀”,否则显示“成绩一般”。

(4)统计并显示“C语言程序设计”课程的平均成绩,如果在80分以上,则显示“成绩优秀”,如果在60—79之间,则显示“成绩一般”否则显示“成绩不理想”。

(5)将“C语言程序设计”课程的成绩,按A、B、C、D、E五个等级显示成绩。

A级:90分以上;B级:80.89分;C级:70.79分

D级:60.69分;E级:60分以下

(6)求1~100之间的所有数之和,并输出结果。

(7)为确保选修002号课程的学生都能通过考试,制定了如下加分规则:

每人都加5分,看是否都通过,如果没有,则每人再加5分,再看是否都能通过,如此反复加分,直到所有人都能通过为止。

语句如下:

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

use xxgl

go

declare @myint1 int,@myint2 int

set  @myint1=10

set  @myint2=20

print @myint1

print @myint2

Go

(2)定义两个局部变量,分别存放常量16和student表中蒋路的学号,并在计算机屏幕上显示出来

go

declare @num int,@sid char(9)

set @num='16'

select @sid=sno

from s

where sname='蒋璐'

print @num

print @sid

go

(3)统计并显示“C语言程序设计”课程的平均成绩,如果在80分以上,则显示“成绩优秀”,否则显示“成绩一般”

go

select avg(grade)

from sc

where cno='001'

go

if(select avg(grade) from sc where cno='001')>80

  print 'c语言程序设计成绩优秀'

  else

  print 'c语言程序设计成绩一般'

go

(4)统计并显示“C语言程序设计”课程的平均成绩,如果在80分以上,则显示“成绩优秀”,如果在60—79之间,则显示“成绩一般”否则显示“成绩不理想”

go

 select AVG(grade) as '平均成绩',

 case

 when AVG(grade)>=80 then '成绩优秀'

 when AVG(grade)between 60 and 79 then '成绩一般'

 when AVG(grade)<60 then '成绩不理想'

 end as '成绩等级'

 from sc

 where cno='001'

 go

(5)将“C语言程序设计”课程的成绩,按A、B、C、D、E五个等级显示成绩。

A级:90分以上;B级:80.89分;C级:70.79分

D级:60.69分;E级:60分以下

 go

 select sname as '姓名',grade,

 case

 when grade>=90 then 'A级'

 when grade between 80 and 89 then 'B级'

when grade between 70 and 79 then 'C级'

 when grade between 60 and 69 then 'D级'

 else 'E级'

 end as '成绩等级'

 from s join sc on s.sno=sc.sno and cno='001'

 go

(6)求1~100之间的所有数之和,并输出结果

go

 declare @s int,@i int

 set @s=0

 set @i=1

 while (@i<=100)

 begin

 set @s=@s+@i

 set @i=@i+1

 end

 print @s

 go

 

(7)为确保选修002号课程的学生都能通过考试,制定了如下加分规则:

每人都加5分,看是否都通过,如果没有,则每人再加5分,再看是否都能通过,如此反复加分,直到所有人都能通过为止

go

 select * from sc where cno='002'

 declare @n int

 while(1=1)

 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 '加分后课程号为的成绩如下:'

 select * from sc where cno='002'

 go

猜你喜欢

转载自blog.csdn.net/dengfengling999/article/details/124214073
今日推荐