记录数据库原理实验所用到的代码。

创建数据库

创建名称为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的格式:

sql server 获取建表语句java sqlserver查询建表语句_SQL


sql server 获取建表语句java sqlserver查询建表语句_升序_02


sql server 获取建表语句java sqlserver查询建表语句_升序_03


sql server 获取建表语句java sqlserver查询建表语句_数据库_04


实验:

/*求学院编号为'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