记录数据库原理实验所用到的代码。
创建数据库
创建名称为XSGL_CP的数据库。
create database XSGL_CP
--设置主文件的逻辑名称、文件名、初始大小、最大文件大小限制、需要增加时的增量
on
(
name=XSGL_MAIN_DATA,
filename='C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\XSGL_CP.mdf',
size=10MB,
filegrowth=5%)--一次增加5%
--设置日志文件的逻辑名称、文件名、初始大小、最大文件大小限制、需要增加时的增量
log on
(name=XSGL_LOG,
filename='C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\XSGL_CP.ldf',
size=2MB,
maxsize=5MB,
filegrowth=1MB--以此增加1MB
)
go
创建表
/*使用SQL语句创建表*/
/*创建学院信息表*/
create table dept(DNO char(4) not null,
DNAME char(30) not null,
DEAN char(10),
primary key(DNO));
/*创建学生信息表*/
create table student(SNO char(8) not null unique, --UNIQUE 约束唯一标识数据库表中的每条记录,表示这个属性不存在重复的元素,一个表中可以出现多个unique属性
SNAME char(10) not null,
AGE smallint,
SEX char(2) ,
check(SEX in ('男','女')),
DNO char(4) not null,
BIRTHDAY datetime,
primary key(SNO), --PRIMARY KEY 拥有自动定义的 UNIQUE 约束
foreign key(DNO) references dept); --使用外键约束,用dept表中的DNO与此表中的DNO进行关联,dept表作为主表,student作为子表
/*创建课程信息表*/
create table course(CNO char(8) not null unique,
CNAME char(30) not null,
TNAME char(10),
CREDIT float,
ROOM char(30),
primary key(CNO));
/*创建学生选课表*/
create table sc(SNO char(8) not null,
CNO char(8) not null,
GRADE float,
check(GRADE between 0 and 100),
primary key(SNO,CNO), --SNO与CNO作为联合主键,一个表中只能有一个主键,不能指定两个主键
foreign key(SNO) references student,
foreign key(CNO) references course);
go
下面这篇文章详细介绍了外键的使用:
【数据库基础】Foreign Key的使用及其优缺点
添加属性
向已经存在的student表中添加新属性ability:
alter table student
add ability char(10) not null
分离数据库
分离数据库是指将数据库从 SQL Server 实例中分离出去,但是数据库的数据文件和事务日志文件保
持不变。分离数据库之后,用户就可以将这些数据库文件附加到任何 SQL Server 实例中,包括分离该数
据库的服务器。数据库的分离和附加在数据库转移中经常用到。
分离数据库步骤:鼠标右键点击想要分离的数据库名称——任务——分离
添加数据库步骤:右击“数据库”——附加——添加
select查询
table的格式:
实验:
/*求学院编号为'0001'的学生的学号、姓名、性别*/
select SNO,SNAME,SEX
from student
where DNO='0001'
/*求学院编号为'0001'的男生的学号、姓名、性别*/
select SNO,SNAME,SEX
from student
where DNO='0001' and SEX='男'
/*求选修授课班号为'327401'且成绩在 80~90 之间的学生学号和成绩,并将成绩乘以系数 0.8 输出,且
将 SNO 列更名为学号,成绩列更名为处理成绩 。*/
select SNO as 学号,GRADE*0.8 as 处理成绩
from sc
where GRADE between 80 and 90 and CNO='327401'
/*求每个学生的年龄,并输出姓名和年龄*/
select SNAME,AGE
from student
--使用YEAR函数以及BIRTHDAY计算年龄
select SNAME as 姓名 ,YEAR(GETDATE())-YEAR(BIRTHDAY) as 年龄
from student
/*寻找数据库中非空的AGE或者BIRTHDAY
select SNAME,AGE,BIRTHDAY
from student
where AGE is not null or BIRTHDAY is not null
*/
/*求选修了课程的学生的学号*/
select distinct SNO --使用distinct去除重复的元素
from sc
where CNO is not null
/*求选修授课班号为’327401’的学生学号和成绩,并要求对查询结果按成绩的降序排列,如果成绩相
同则按学号的升序排列*/
select SNO,GRADE
from sc
where CNO='327401'
order by GRADE desc,SNO asc --使用order by进行排序,DESC表示降序,ASC表示升序
/*求缺少了成绩的学生学号和课程号。*/
select SNO,CNO
from sc
where GRADE is null
/*统计选课学生人数及最高分成绩和最低分成绩*/
select COUNT(distinct SNO) as 总选课人数,MAX(GRADE) as 最高成绩,MIN(GRADE) as 最低成绩
from sc
/*求学院编号为’0001’或‘0002‘中姓张的学生的信息。*/
select *
from student
where (DNO='0001' or DNO='0002') and SNAME like '张%'
/*求姓名中包含’丽’的学生信息*/
select *
from student
where SNAME like '%丽%'
/*求姓名只有两个字,且第二个字为’丽’的学生信息*/
select *
from student
where SNAME like '_丽'
/*求信息学院计算机专业的学生名单*/
select *
from student
where SUBSTRING(SNO,4,2)='10' --SUBSTRING函数用于切割字符串
--第一个参数是被检测的属性(需要是字符串类型),第二个参数是起始位置,第三个参数是从起始位置到目标位置的字符数
/*统计各个学院的人数*/
select DNO as 学院编号,COUNT(SNO) as 学院人数
from student
group by DNO --使用group by来对属性分组,属性中相同的元素放在一组,聚集函数(Aggregate functions)根据分组进行分组计算
/*按授课班号统计选修该课程的人数,并按照人数升序排列。*/
select CNO,COUNT(SNO) as 选修人数
from sc
group by CNO
order by COUNT(SNO) asc
/*统计平均成绩超过 80 分的学生的学号及平均成绩*/
select SNO,AVG(GRADE)
from sc
group by SNO
having AVG(GRADE)>= 80 --使用having来限制group by之后的数据
order by AVG(GRADE) desc
/*求选修课程超过 6 门课的学生学号,并按选修课程数目升序排列。*/
select SNO,COUNT(CNO)
from sc
group by SNO
having COUNT(CNO)>6
order by COUNT(CNO) asc
/*求每个学院学生的平均年龄,并把结果存入当前数据库‘系平均年龄’临时表中。*/
select DNO,AVG(AGE) as 平均 INTO 系平均年龄 --使用INTO语句将select出来的属性作为新表存入
from student
group by DNO
/*分页浏览数据方法:*/
/*(1)查询student表中第1-10名同学的信息*/
select top 10 *
from student
/*(2)查询student表中第11-20名同学的信息*/
select top 10 *
from student
where SNO not in (select top 10 SNO
from student)
/*查询‘1987-1-1’号以后出生的女生的学生信息*/
select *
from student
where BIRTHDAY>'1987-1-1' and SEX='女'
go
/*创建'计算机系学生'视图,用于浏览计算机系学生的学号、姓名和年龄*/
create view 计算机系学生
as select SNO,SNAME,AGE
from student
where SUBSTRING(SNO,4,2)='10'
go
/*查询分数在70和90之间的学生学号*/
select SNO
from sc
group by SNO
having MIN(GRADE)>70 and MAX(GRADE)<90
/*查询少于 10 名同学选修的授课班号*/
select CNO
from sc
group by CNO
having COUNT(SNO)<10
order by CNO
/*查询选课表中的最高分*/
select MAX(GRADE) as 最高分
from sc
/*查询授课编号为‘153701’的课程的平均分*/
select AVG(GRADE) as 课程平均分
from sc
where CNO='153701'
/*查询课程平均分超过 85 的授课班号,输出结果按课程平均分升序排列*/
select CNO,AVG(GRADE)
from sc
group by CNO
having AVG(GRADE)>85
order by AVG(GRADE) asc
/*查询课程名称为’线性代数’的排课情况*/
select *
from course
where CNAME='线性代数'
/*查询授课班号为‘218801’的学生学号*/
select SNO
from sc
where CNO='218801'
order by SNO
/*按授课班号查询课程的平均分,输出授课班号和平均成绩*/
select CNO,AVG(GRADE)
from sc
group by CNO
order by AVG(GRADE)
/*在 sc 中输出成绩在 90-100 之间的学生信息*/
select *
from sc
where GRADE between 90 and 100
--或者使用CONVERT函数将GRADE转化成字符串,然后匹配'9%'\
select *
from sc
where CONVERT(char(20),GRADE) like '9%'
/*查询‘周芬’老师,这个学期的上课安排情况*/
select *
from course
where TNAME='周芬'
/*查询姓‘周’的教师的排课情况*/
select *
from course
where TNAME like '周%'
/*按教室分组统计排课门数情况*/
select ROOM,COUNT(CNO) as 排课门数
from course
group by ROOM
/*查询排课门数超过 8 门的教室名单及其排课门数*/
select ROOM,COUNT(CNO)
from course
group by ROOM
having COUNT(CNO)>8
go
/*创建机电学院女生的视图*/
create view 机电学院女生
as select SNO,SNAME
from student,dept
where student.DNO=dept.DNO
and SEX='女'
and DNAME like '机电%'
go
/*查询学分超过 4 分的课程,输出课程名和学分,并要求按学分升序*/
select CNAME,CREDIT
from course
where CREDIT>4
order by CREDIT asc
/*按教室明细并汇总排课情况*/
select ROOM,COUNT(CNO) as 排课情况
from course
group by ROOM
order by 排课情况 desc
/*查询课程号为“203402”的成绩最高的前 5 名学生的学号及成绩,结果按成绩降序*/
select top 5 SNO,GRADE
from sc
where CNO='203402'
order by GRADE desc
/*查询年龄小于 20 岁的学生学号*/
select SNAME
from student
where AGE<20
--或者使用BIRTHDAY计算年龄
select SNAME
from student
where YEAR(GETDATE())- YEAR(BIRTHDAY)<20
/*查询有 90 人以上选修的课程号*/
select CNO,COUNT(SNO) as 选课人数
from sc
group by CNO
having COUNT(SNO)>90
/*查询全体男生的姓名,要求查询结果按所在系升序排列,对相同系的学生按姓名升序排列*/
select SNAME
from student
order by DNO asc,SNAME asc
/*查询成绩在 70-90 范围内的学生学号*/
select SNO
from sc
where GRADE between 70 and 90