目录
一,创建与管理数据库及SQL基础
1.分别用图形化方法和CREATE DATABASE语句创建符合如下条件的数据库。
数据库的名字为students,包含的数据文件的逻辑文件名为 students_dat,物理文件名为 students.mdf,存放在D:\Test文件夹中(若D:中无此子文件夹,可先建立此文件夹,然后再创建数据库),初始大小为6MB,自动增长,每次增加1MB。日志文件的逻辑文件名为students_log,物理文件名为students.ldf,也存放在D:\Test文件夹中,初始大小为2MB,自动增长,每次增加10%。
CREATE DATABASE [students] CONTAINMENT = NONE ON PRIMARY ( NAME = N'students_data', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS01\MSSQL\DATA\students.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ) LOG ON ( NAME = N'students_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS01\MSSQL\DATA\students.ldf' , SIZE = 2048KB , MAXSIZE = 2048GB , FILEGROWTH = 10%) WITH CATALOG_COLLATION = DATABASE_DEFAULT GO
2.分别用图形化方法和 CREATE DATABASE语句创建符合如下条件的数据库。
数据库包含两个数据文件和两个日志文件。数据库的名称为:财务信息数据库,该数据库包含两个数据文件和两个日志文件。数据文件1的逻辑文件名为财务数据1,物理文件名为财务数据1.mdf,存放在“D:\财务数据”目录下(若D:中无此文件夹,可先建立此文件夹,然后再创建数据库,初始大小为4MB,自动增长,每次增加IMB;数据文件2的逻辑文件名为财务数据2,物理文件名为财务数据2.ndf,与主要数据文件存放在相同的文件夹中,初始大小为3MB,自动增长,每次增加10%。日志文件1的逻辑文件名为财务日志1,物理文件名为财务日志1.ldf,存放在“D:\财务日志”文件夹中,初始大小为2MB,自动增长,每次增加10%;日志文件2的逻辑文件名为财务日志2,物理文件名为财务日志2ldf,存放在“D:\财务日志”文件夹中,初始大小为2MB,不自动增长。
CREATE DATABASE [财务信息数据库] CONTAINMENT = NONE ON PRIMARY ( NAME = N'财务数据1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS01\MSSQL\DATA\财务数据1.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), ( NAME = N'财务数据2', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS01\MSSQL\DATA\财务数据2.ndf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 10%) LOG ON ( NAME = N'日志文件1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS01\MSSQL\DATA\财务日志1.ldf' , SIZE = 2048KB , MAXSIZE = 2048GB , FILEGROWTH = 10%), ( NAME = N'日志文件2', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS01\MSSQL\DATA\财务日志2.ldf' , SIZE = 2048KB , MAXSIZE = 2048GB , FILEGROWTH = 0) WITH CATALOG_COLLATION = DATABASE_DEFAULT GO IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) begin EXEC [财务信息数据库].[dbo].[sp_fulltext_database] @action = 'enable' end GO
3.分别用图形化方法和 Transact-SQL语句对上机练习中第1题所建立的“students”数据库空间进行如下扩展:增加一个新的数据文件,文件的逻辑名为“students_dat2”,存放在新文件组Group1中,物理文件名为 students2.ndf,存放在“D:\Test”文件夹中,文件的初始大小为2MB,不自动增长。
CREATE DATABASE [students] CONTAINMENT = NONE ON PRIMARY ( NAME = N'students_data', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS01\MSSQL\DATA\students.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), FILEGROUP [Group1] ( NAME = N'student_2', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS01\MSSQL\DATA\students1.ndf' , SIZE = 2048KB , MAXSIZE = UNLIMITED, FILEGROWTH = 0) LOG ON ( NAME = N'students_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS01\MSSQL\DATA\students.ldf' , SIZE = 2048KB , MAXSIZE = 2048GB , FILEGROWTH = 10%) WITH CATALOG_COLLATION = DATABASE_DEFAULT GO IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) begin EXEC [students].[dbo].[sp_fulltext_database] @action = 'enable' end GO
4.将上机练习中第4题新添加的“students_dat2”文件的初始大小改为6MB。
CREATE DATABASE [students] CONTAINMENT = NONE ON PRIMARY ( NAME = N'students_data', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS01\MSSQL\DATA\students.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), FILEGROUP [Group1] ( NAME = N'student_2', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS01\MSSQL\DATA\students1.ndf' , SIZE = 2048KB , MAXSIZE = UNLIMITED, FILEGROWTH = 0) LOG ON ( NAME = N'students_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS01\MSSQL\DATA\students.ldf' , SIZE = 6144KB , MAXSIZE = 2048GB , FILEGROWTH = 10%) WITH CATALOG_COLLATION = DATABASE_DEFAULT GO IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) begin EXEC [students].[dbo].[sp_fulltext_database] @action = 'enable' end GO
5.定义一个int的整形变量,并分别给其赋值67、123067。
declare @a int = 67; declare @b int = 123067 print @a print @b
6.定义一个长度为11的可变长形字符变量,并分别给其赋值“Hello World!”和“How are you?”。
declare @a char(11) = 'Hello World' declare @b char(11) = 'How are you?' print @a print @b
7.分别将字符串“WELCOME”和“student”转换成小写、大写字母。
declare @a varchar(10) ='WELCOME' declare @b varchar(10) ='student' SELECT LOWER(@a) SELECT UPPER(@b) print @a print @b
8.使用RTRIM和LTRIM函数分别去掉字符串“ 信电分院 ”右边和左边的空格,再与“学生选课”连接起来。
select rtrim(' 信电分院 ') + ltrim(' 学生选课 ')
9.使用SUBSTRING将字符串“ABCDEFG”中的“CDE”显示出来。
select SUBSTRING ('ABCDEFG',3,3)
10.使用GETDATE( )函数返回系统当前日期。
select getdate() as sysdate
11.使用DAY( )函数提取当前日期的日期部分的整数。
SELECT DAY('2021-10-16') [DAY]
12.使用T-SQL流程控制语句求两个数的最大公约数和最小公倍数。
1,最大公约数
create function GetGys(@num1 int,@num2 int) returns int --返回值 as begin declare @times int --计数器 declare @min int --存储两个数的较小者 declare @result int --保存结果 if(@num1>=@num2) set @min=@num2 else set @min=@num1 set @times=@min while(@times<=@min) --循环 begin if(@num1%@times=0 and @num2%@times=0) begin set @result=@times break end set @times=@times-1 end return @result end
2,最小公倍数
create function GetGbs(@num1 int,@num2 int) returns int as begin declare @result int --结果 declare @max int --保存两个数的大者 declare @times int if @num1<=@num2 set @max=@num2 else set @max=@num1 set @times=@max while(@times>=@max) begin if(@times%@num1=0 and @times%@num2=0) begin set @result=@times break end set @times=@times+1 end return @result end
14.使用T-SQL流程控制语句求斐波那契数列中小于100的所有数。
/*求小于100的斐波那契数列*/ declare @i int declare @j int declare @t int declare @s varchar(2000) set @i=1 set @j=2 set @s='' set @s=cast(@i as varchar(10))+','+cast(@j as varchar(10)) while (@j<100) begin set @t=@j set @j=@j+@i set @i=@t if(@j<100) set @s=@s+','+cast(@j as varchar(10)) end print @s
二,创建与管理架构和基本表及数据操作
1,依据数据表的结构创建相对应的数据表,表结构如下所示;
三张表的代码分别如下。
/*学生表*/ CREATE TABLE student ( Sno Char(9) /*学生信息*/ PRIMARY KEY, Sname Char(6) /*学生姓名*/ NOT NULL, Ssex Char(2), /*学生性别*/ Sage Int, /*学生年龄*/ Sdept VarChar(8), /*学生所在院系*/ ) /*课程信息表*/ CREATE TABLE course ( Cno Char(4) /*课程编号*/ PRIMARY KEY, Cname VarChar(20) /*课程名称*/ NOT NULL, Cpno Char(4), /*先行课*/ Ccredit Int, /*学分*/ ) /*选课信息表*/ CREATE TABLE sc ( Sno Char(9) /*学生学号*/, Cno Char(4) /*课程编号*/, Grade Int /*成绩*/, primary key(Sno,Cno) )
2.在表student中增加新字段 “班级名称(sclass)“;
ALTER TABLE student ADD sclass NCHAR(5)
3.在表student中删除字段“班级名称(sclass)”;
ALTER TABLE student DROP COLUMN Sclass
4.修改表student中字段名为“sname”的字段长度由原来的6改为8;
ALTER TABLE student ALTER COLUMN Sname char(8)
5.修改表student中字段“sdept”名称为“dept”,长度为20;
exec sp_rename '[student]. sdept ',' dept ' ALTER TABLE student ALTER COLUMN Sdept varchar(20)
6.修改表student中sage字段名称为sbirth,类型为smalldatetime
7. 修改表student新名称为stu_info;exec sp_rename '[student].Sage','sbirth' alter table student alter column Sbirth smalldatetime
exec sp_rename @objname='student',@newname='stu_info'
8.删除数据表student。
DROP TABLE stu_info
1,创建教师授课管理数据库JSSK,并完成以下内容;
创建JSSK数据库,在数据库JSSK中创建下列三张表;
CREATE DATABASE JSSK; /*创建数据库*/ /*创建教师表*/ CREATE TABLE teachers( Tno varchar(7) primary key , Tname varchar(10) NOT NULL, Tsex varchar(2) default '男', Birthday smalldatetime NULL, Dept varchar(20) NULL, Sid varchar(18), ); /*创建课程表*/ CREATE TABLE lessons( Cno varchar(10) primary key, Cname varchar(20) NOT NULL, Credit smallint, property varchar(10), ); /*授课表*/ CREATE TABLE shouke( Tno varchar(7), Cno varchar(10), primary key(Tno,Cno), Hours int,)
2,在shouke表里添加一个授课类别字段,列名为Type,类型为Char,长度为4;
ALTER TABLE shouke ADD Type Char(4)
3,将shouke表的Hours的类型改为smallint;
ALTER TABLE shouke ALTER COLUMN Hours smllint
4,删除lessons表中的property列。
ALTER TABLE lessons DROP COLUMN property
1,创建产品销售数据库CPXS,数据文件的逻辑文件名为cpxs_data,物理文件名为D:\sql\cpxs.mdf;文件初始大小为2MB,自动增长,每次增长1MB;日志文件逻辑文件名为cpxs_log,物理文件为D:\sql\cpxs.ldf;文件初始大小2MB,自动增长,每次增长15%;
在数据库CPXS中创建下列三张表;
CREATE DATABASE CPXS /*创建数据库*/ ON ( NAME =cpxs_data, FILENAME = 'D:\sql\cpxs_data.mdf', SIZE = 2, FILEGROWTH = 1 ) /*创建产品表*/ CREATE TABLE cp( Cpbh varchar(6) primary key, Cpmc varchar(30) NOT NULL, Jg float(8) NULL, Kcl int NULL ); /销售商表*/ CREATE TABLE xss( Xsbh varchar(6) primary key, Xsmc varchar(30) NOT NULL, Dq varchar(10) NULL, Fzr varchar(8) NULL, Dh varchar(12) NULL, Bz ntext NULL ); /产品销售表*/ CREATE TABLR cpxs( Cpbh varchar(6), Xsbh varchar(6), primary key(Cpbh,Xsbh), Xssj DATETIME NOT NULL, Sl int NOT NULL, Je float(8) NOT NULL );
三,数据查询
- 列出所有不姓张的所有学生;
SELECT sname FROM student WHERE sname NOT LIKE '刘%'
- 列出姓“张”且全名为3个汉字的学生;
SELECT sname FROM student WHERE sname LIKE '[张]%' AND LEN(sname)=3
- 显示在2002年以后出生的学生的基本信息;
SELECT * FROM student WHERE sage>19
- 按照“性别、学号、姓名、年龄、院系”的顺序列出学生信息,其中性别按以下规定显示:性别为男显示为男 生,性别为女显示为女 生,其他显示为“条件不明”
SELECT CASE ssex WHEN '男' THEN '男生' WHEN '女' THEN '女生' ELSE '条件不明' END , sno,sname,sage,sdept FROM student
- 查询出课程名含有“数据”字串的所有课程基本信息;
SELECT cname,cno,cpno,ccredit FROM course WHERE cname LIKE '数据%'
- 显示学号第八位或者第九位是1、2、3、4或者9的学生的学号、姓名、性别、年龄及院系;
SELECT sno,sname,ssex,sage,sdept FROM student WHERE sno LIKE '________[12349]' or sno LIKE'________[12349]'
- 列出选修了‘1’课程的学生,按成绩的降序排列;
SELECT sno,grade FROM sc WHERE cno='1' ORDER BY grade DESC
- 列出同时选修“1”号课程和“2”号课程的所有学生的学号;
SELECT sno FROM sc WHERE cno='1' AND sno IN (SELECT sno FROM sc WHERE cno='2')
- 列出课程表中全部信息,按先修课的升序排列;
SELECT * FROM course ORDER BY cpno ASC
- 列出年龄超过平均值的所有学生名单,按年龄的降序显示;
SELECT * FROM student WHERE sage>(SELECT AVG(sage) FROM student) ORDER BY sage DESC
- 按照出生年份升序显示所有学生的学号、姓名、性别、出生年份及院系,在结果集中列标题分别指定为“学号,姓名,性别,出生年份,院系”;
SELECT sno,sname,ssex,YEAR(GETDATE()) -sage,sdept from student ORDER BY YEAR(GETDATE()) -sage asc
- 按照院系降序显示所有学生的 “院系,学号、姓名、性别、年龄”等信息,其中院系按照以下规定显示:院系为CS显示为计算机系,院系为IS显示为信息系,院系为MA显示为数学系,院系为EN显示为外语系,院系为CM显示为中医系,院系为WM显示为西医系,其他显示为院系不明;
SELECT CASE sdept WHEN 'CS' THEN '计算机系' WHEN 'IS' THEN '信息系' WHEN 'MA' THEN '数学系' WHEN 'EN' THEN '外语系' WHEN 'CM' THEN '中医系' WHEN 'WM' THEN '西医系' ELSE '院系不明' END as sdept,sno,sname,ssex,sage FROM student
- 显示所有院系(要求不能重复,不包括空值),并在结果集中增加一列字段“院系规模”,其中若该院系人数>=5则该字段值为“规模很大”,若该院系人数大于等于4小于5则该字段值为“规模一般”, 若该院系人数大于等于2小于4则该字段值为“规模稍小”,否则显示“规模很小”;
SELECT sdept,sdept= CASE WHEN COUNT(DISTINCT sno)>=5 THEN '规模很大' WHEN COUNT(DISTINCT sno)>=4 AND COUNT(DISTINCT sno)<5 THEN '规模一般' WHEN COUNT(DISTINCT sno)>=2 AND COUNT(DISTINCT sno)<4 THEN '规模稍小' ELSE '规模很小' END FROM student GROUP BY sdept
- 按照课程号、成绩降序显示课程成绩在70-80之间的学生的学号、课程号及成绩;
SELECT sno,cno,grade FROM sc WHERE grade>=70 AND grade<=80 ORDER BY cno DESC,grade DESC
- 显示学生信息表中的学生总人数及平均年龄,在结果集中列标题分别指定为“学生总人数,平均年龄”;
SELECT '学生人数'=COUNT(distinct sno),'平均年龄'=AVG(sage) FROM student
- 显示选修的课程数大于3的各个学生的选修课程数;
SELECT sno, COUNT(*) AS '选修课程大于3' FROM sc GROUP BY sno having count(*)>3
- 按课程号降序显示选修各个课程的总人数、最高成绩、最低成绩及平均成绩;
SELECT cno,'总人数'=COUNT(distinct sno), '最高成绩'=MAX(grade), '最低成绩'=MIN(grade), '平均成绩'=AVG(grade) FROM sc GROUP BY cno ORDER BY cno DESC
- 显示平均成绩大于“200515001”学生平均成绩的各个学生的学号、平均成绩;
SELECT sno,'平均成绩'=AVG(grade) FROM sc GROUP BY sno HAVING AVG(grade)>(SELECT AVG(grade) FROM sc WHERE sno='200515001')
- 显示选修各个课程的及格的人数、及格比率;
SELECT Cno,SUM(CASE WHEN Grade>=60 THEN 1 ELSE 0 END) AS '及格人数', COUNT(*) AS '总人数', CONVERT(nvarchar, SUM(CASE WHEN grade>=60 THEN 1 ELSE 0 END)*100/COUNT(*))+'%' AS '及格率' FROM sc GROUP BY Cno
- 显示选修课程数最多的学号及选修课程数最少的学号;
SELECT sno,'选课数'=CASE WHEN MAX(cno)=COUNT(cno) THEN '课程数最多' WHEN MIN(cno)=COUNT(cno) THEN '课程数最少' end FROM sc GROUP BY SNO HAVING MAX(cno)=COUNT(cno) OR MIN(cno)=COUNT(cno)
- 显示各个院系男女生人数,其中在结果集中列标题分别指定为“院系名称、男生人数、女生人数”;
SELECT sdept AS '院系名称', '男生人数'=SUM(CASE WHEN ssex='男' THEN 1 ELSE 0 END), '女生人数'=SUM(CASE WHEN ssex='女' THEN 1 ELSE 0 END) FROM student GROUP BY sdept
- 列出有二门以上课程(含两门)不及格的学生的学号及该学生的平均成绩;
SELECT sno,AVG(GRADE) AS'平时成绩' FROM sc group by sno having SUM( CASE WHEN grade<60 then 1 END)>=2
- 查询与“张立“(假设姓名唯一) 年龄不同的所有的学生的信息;
ELECT * FROM student WHERE sage NOT IN(SELECT sage FROM student WHERE sname='张力')
四、创建与管理其他数据库对象、数据库保护与数据传输
1.在student表的sno列上创建唯一性聚集索引index_sno
use stu go create unique clustered index index_sno on student(sno)
2.在student表的sname列上创建唯一性非聚集索引index_sname
use stu go create unique nonclustered index index_sname on student(sno)
3.在student表的sage列上创建非聚集索引index_sage
use stu go create nonclustered index index_sage on student(sage)
4.在sc表的sno列和cno列上创建复合非聚集索引index_sno_cno
use stu go create index index_sno_cno on sc(sno,cno)
5.将索引index_sno_cno更名为index_snocno
exec sp_rename 'sc.[index_sno_cno]','index_snocno','index'
6.删除上面的索引index_snocno
use stu go drop index index_snocno on sc
7.查看student表的索引基本信息
exec sp_helpindex student
8.创建一个只选修8号课程的学生情况的视图信息
use stu go create view xuanxiu_8 as select student.sno, sname,sage,sdept,ssex from student,sc where student.sno=sc.sno and cno='8' group by student.sno,sname,sage,sdept having count(cno)=1
9.创建一个视图view_stu,只包含学生的学号,姓名,年龄信息
create view view_stu as select sno as 学生学号, sname as 姓名, sage as 年龄 from student
10.在上一题视图的基础上创建年龄在20岁以上的的学生的视图
create view view_stu1 as select sno as 学生学号, sname as 姓名, sage as 年龄, from student where sage>20
11.创建一个包含不及格同学及90分以上同学的学号、姓名、课程名称及成绩的视图
create view view_stu2 as select student.sno as 学生学号, sname as 姓名, cname as 课程名, grade as 成绩 from student,sc,course where student.sno=sc.sno and sc.cno=course.cno and grade<60 and grade>90
12.选择一个上面创建的视图,查看视图的信息
select * from view_stu1 go
13.选择一个上面创建的视图,修改删除其中的一列
delete view_stu1 where 学生学号='200515015' select * from view_stu1
14. 选择一个上面创建的视图进行删除操作
drop view view_stu1
15.从视图view_stu中查询19岁的男生记录
select * from view_stu where 年龄=19
16.通过视图view_stu中插入一行数据。学号:2006010010,姓名:赵青,年龄:
insert into view_stu values('200610010','赵青','20') select * from view_stu
17.将视图view_stu中姓名为“李蕾”的年龄改为“22”
update view_stu set 年龄='22' where 姓名='李蕾’
18.通过视图 view_stu将姓名为“李贵”的记录删除
delete view_stu where 姓名='李贵’
19.自行选择上面创建的一个视图插入一个记录。
insert into view_stu values('200515029','王振','29') select * from view_stu
20.自行选择一个视图根据一定的条件进行查询。
select * from view_stu where 年龄>20
21.自行选择联合一张表和某个视图进行复合查询。
select distinct 学生学号,姓名,年龄 from view_stu,sc where view_stu.学生学号=sc.sno and grade>80
22.创建存储过程返回全部男生选课及成绩等相关信息
create procedure stu_info as select distinct a.sno,sname,ssex from student a,sc where a.sno=sc.sno and ssex='男' use stu exec stu_info
23.创建一个带输入参数的存储过程,能够根据参数向学生表中插入一条记录
create procedure student_insert (@sno char(9),@sname char(8),@ssex char(2),@sage int,@sdept char(4)) as insert into student (sno,sname,ssex,sage,sdept) values(@sno,@sname,@ssex,@sage,@sdept) EXEC student_insert '200515002','汪汪','女',20,'it'
24.创建一个带输入参数的存储过程,根据不同的学生名参数,返回该学生的所有课程成绩。
USE stu GO CREATE PROCEDURE stu_sc2(@yx char(6)) AS SELECT DISTINCT a.sno,sname,cno,grade FROM student a,sc WHERE a.sno=sc.sno and sname =@yx GO exec stu_sc2'张力'
25.创建一个带输入输出参数的存储过程,根据输入的系部名,统计该系学生的平均成绩并输出。
USE stu GO CREATE PROCEDURE PINGJUN @stu_sdept varchar(8), @average int OUTPUT AS SELECT @average=avg(grade) FROM student,sc WHERE student.sno=sc.sno AND sdept=@stu_sdept GO DECLARE @G int EXEC PINGJUN'CS',@G OUTPUT SELECT @G
26.查看第22和23题的存储过程的有关信息,并查看它们的定义。修改第22题的存储过程,改为查询全部女生的资料。删除第23题的存储过程。
alter procedure stu_info as select distinct a.sno,sname,ssex from student a,sc where a.sno=sc.sno and ssex='女' use stu exec stu_info drop procedure student_insert
27.创建student表的DELETE触发器,当一个学生退学后,信息从student表中删除,触发在sc表中删除该生选课情况。
create trigger deleteestu1 on student after delete as select sname,ssex,sgae,sdept from deleted delete from student where sname='张三' select * from student where sname='张三
28.创建一个触发器,检查在sc表中输入一门课程成绩,必须符合在0到100分范围内。
reate trigger insertsc_grade on sc after insert as if exists(select * from inserted where(grade>100 or grade<0)) begin print'成绩应在100' rollback end go insert sc values(1,2,101)