性能优化-数据准备:使用存储过程生成百万测试数据

  • 1 概述
  • 2 创建数据库
  • 3 建表
  • 4 创建存储过程
  • 4.1 创建存储过程-学生表
  • 4.1 创建存储过程-班级表
  • 4.1 创建存储过程-课程表
  • 4.1 创建存储过程-成绩表
  • 4.1 创建存储过程-给每个班级分配学生人数
  • 4.1 创建存储过程-给每个学生分配1个课程的默认100次历史成绩
  • 5 生成100万数据
  • 6 查询数据


1 概述

       在这里我们为什么要去生成100万数据呢?因为在很多实际项目上我们可能会接触到需要进行性能调优的问题,比如碰到某个查询接口特别慢,那么老板或者你的领导就需要你去处理了,为啥让你干呢,你不干谁干,像那种小公司的,公司的后端技术除了你还会有谁,难道你要你的领导去干吗?那是不可能,领导要喝茶,哪有闲工夫陪你玩,优哉游哉不香吗?
       在我们做数据库的性能调优之前做一下数据准备,因为数据一旦达到100万级别对查询速度都会产生影响,所以我们就先生成个百万数据玩玩,下面我们开始啦。

基本思路

创建4张表:学生表、班级表、课程表、成绩表,在这里以“学生表”为主表
说明:一个学生只有一个班级,一个学生有多门课的成绩,一个学生在一门课上会有多个成绩(历史成绩,以日期进行历史成绩的区分)
举例:假如在某所高中开设了10门课程,学校共有30个班,每班分配n人,总学生数为30*n人每个学生每个课程考了m次,成绩范围是0~100
课程:语文、数学、英语、政治、历史、地理、生物、化学、物理、体育;
学生:在这里学生的姓名可以按照输入某个“中文”+ 计数 进行生成,比如以“李欣欣”+ n 的方式生成,n为自然数,举例:李欣欣1,…,李欣欣1000
班级:高一(1)班 ~ (10)班,高二(1)班 ~(10)班,高三(1)班 ~(10)
成绩:每天考一次每门课程,连续考试100天,从2020-01-01开始考试,加上100天即可,每门分数按随机数[0,100]分生成。

涉及主要知识点

  1. 如何创建存储过程
  2. if else语句
  3. 数据类型转换
  4. 字符串相加
  5. 临时表创建
  6. while循环以及双循环问题
  7. [1,100]的随机数生成

2 创建数据库

我们在这里使用命令创建一个DataPerformanceTestDB

use master -- 设置当前数据库为master,以便访问sysdatabases表
go
if not exists(select 1 from sysdatabases where name='DataPerformanceTestDB')
	--DataPerformanceTestDB  百万性能测试数据库
	create database DataPerformanceTestDB 
	on  primary  -- 默认就属于primary文件组,可省略
	(
	/*--数据文件的具体描述--*/
		name='DataPerformanceTestDB_data',  -- 主数据文件的逻辑名称
		filename='D:\Data\SQL Server 2014\百万数据性能测试\DataPerformanceTestDB_data.mdf', -- 主数据文件物理存储位置
		size=5mb, --主数据文件的初始大小
		--maxsize=100mb, -- 主数据文件增长的最大值,不要限制数据库大小,数据一旦增加到上限则无法使用
		filegrowth=15%--主数据文件的增长率
	)
	log on
	(
	/*--日志文件的具体描述,各参数含义同上--*/
		name='dataPerformanceTestDB_log',
		filename='D:\Data\SQL Server 2014\百万数据性能测试\DataPerformanceTestDB_log.ldf',-- 日志文件物理存储位置
		size=2mb,
		filegrowth=1mb
	)
go

3 建表

我们开始创建4张表,如下图所示:

use DataPerformanceTestDB 
go
--创建4张表:
--“Student学生表”的ClassId 与 ”Class 班级表“的Id 关联
--"Student 学生表"和"Course 课程表"通过"Score 成绩表"的StudentId和CourseId进行关联
if not exists(select 1 from sysobjects where name='Student')
	--Student 学生表
	create table Student 
	(
		Id uniqueidentifier not null primary key,
		SNo varchar(10), --学号
		SName varchar(20), --学生姓名
		SAge int, --年龄
		SSex bit, --性别:男1,女0
		ClassId uniqueidentifier, --班级Id,关联班级表
	)
go

if not exists(select 1 from sysobjects where name='Class')
	--Class 班级表
	create table Class 
	(
		Id uniqueidentifier not null primary key,
		ClNo varchar(20) not null, --班级编号
		ClName nvarchar(20) not null, --班级名称
		HeadMasterName nvarchar(20) not null, --班主任
		TelPhone varchar(50), --班主任电话号码
		Declaration nvarchar(200) --班级宣言
	)
go

if not exists(select 1 from sysobjects where name='Course')
	--Course 课程表
	create table Course 
	(
		Id uniqueidentifier not null primary key,
		CName nvarchar(100) not null, --课程名称
		CRoom nvarchar(100)  --教室
	)
go

if not exists(select 1 from sysobjects where name='Score')
	--Score 成绩表
	create table Score 
	(
		Id uniqueidentifier not null primary key,
		StudentId uniqueidentifier, --学生Id,关联学生表
		CourseId uniqueidentifier, --课程Id,关联课程表
		GradeDate datetime not null,--历史成绩日期,对一门课的历史成绩以作区分
		Score float --成绩
	)
go

4 创建存储过程

4.1 创建存储过程-学生表

基本思路

根据学生Id判断数据是否存在;若存在,则再次通过学号SNo姓名SName判断数据是否相同,若相同,则返回标识;若不同则更新数据;若不存在,则插入新的数据

use DataPerformanceTestDB 
go
--使用存储过程插入数据
Create proc sp_Insert_Student
  @Id uniqueidentifier,--唯一标识
  @SNo varchar(10),--学号
  @SName varchar(20),--姓名
  @Age int,--年龄
  @Sex bit,--性别
  @ClassId uniqueidentifier,--班级Id
  @rtn int output--输出
as
--定义临时变量
declare
  @tempSNo varchar(10),--学号
  @tempSName varchar(20)--姓名
  if exists(select * from Student where Id=@Id)--如果id存在
     begin
     select @tempSNo=SNo,@tempSName=SName from Student where Id=@Id
     if ((@tempSNo=@SNo) and (@tempSName=@SName))
       begin
         set @rtn=0  --有相同的数据,直接返回值
       end
     else
       begin
         update Student set SNo=@SNo,SName=@SName where Id=@Id
         set @rtn=2  --有主键相同的数据,进行更新处理
       end
   end
   else--如果id不存在
     begin
     insert into Student values(@Id,@SNo,@SName,@Age,@Sex,@ClassId)
     set @rtn=1  --没有相同的数据,进行插入处理
   end

4.1 创建存储过程-班级表

基本思路

根据班级Id判断数据是否存在;若存在,则再次通过班级号ClNo班级名称ClName判断数据是否相同,若相同,则返回标识;若不同则更新数据;若不存在,则插入新的数据

--使用存储过程插入数据
Create proc sp_Insert_Class
  @Id uniqueidentifier,--唯一标识
  @ClNo varchar(20),--班级号
  @ClName nvarchar(20),--班级名称
  @HeadMasterName nvarchar(20),--班主任
  @TelPhone varchar(50),--电话号码
  @Declaration nvarchar(200),--班级宣言
  @cl_rtn int output--输出
as
declare
  @tempClNo varchar(20),--参数:班级号
  @tempClName varchar(20)--参数:班级名称
  if exists(select * from Class where Id=@Id)
     begin
     select @tempClNo=ClNO,@tempClName=ClName from Class where Id=@Id
     if ((@tempClNo=@ClNO) and (@tempClName=@ClName))
       begin
         set @cl_rtn=0  --有相同的数据,直接返回值
       end
     else
       begin
         update Class set ClNo=@ClNo,CLName=@ClName where Id=@Id
         set @cl_rtn=2  --有主键相同的数据,进行更新处理
       end
   end
   else
     begin
     insert into Class values(@Id,@ClNo,@ClName,@HeadMasterName,@TelPhone,@Declaration)
     set @cl_rtn=1  --没有相同的数据,进行插入处理
   end

4.1 创建存储过程-课程表

基本思路

根据课程Id判断数据是否存在;若存在,则再次通过课程名称CName教室CRoom判断数据是否相同,若相同,则返回标识;若不同则更新数据;若不存在,则插入新的数据

use DataPerformanceTestDB 
go
--使用存储过程插入数据
Create proc sp_Insert_Course
  @Id uniqueidentifier,--唯一标识
  @CName varchar(20),--课程名称
  @CRoom nvarchar(20),--教室
  @c_rtn int output--输出
as
--定义临时变量
declare
  @tempCName varchar(10),
  @tempCRoom varchar(20)
  if exists(select * from Course where Id=@Id)--如果id存在
     begin
     select @tempCName=CName,@tempCRoom=CRoom from Course where Id=@Id
     if ((@tempCName=@CName) and (@tempCRoom=@CRoom))
       begin
         set @c_rtn=0  --有相同的数据,直接返回值
       end
     else
       begin
         update Course set CName=@CName,CRoom=@CRoom where Id=@Id
         set @c_rtn=2  --有主键相同的数据,进行更新处理
       end
   end
   else--如果id不存在
     begin
     insert into Course values(@Id,@CName,@CRoom)
     set @c_rtn=1  --没有相同的数据,进行插入处理
   end

4.1 创建存储过程-成绩表

基本思路

根据成绩Id判断数据是否存在;若存在,则再次通过学生Id:StudentId课程Id:CourseId判断数据是否相同,若相同,则返回标识;若不同则更新数据;若不存在,则插入新的数据

use DataPerformanceTestDB 
go
--使用存储过程插入数据
Create proc sp_Insert_Score
  @Id uniqueidentifier,--唯一标识
  @StudentId uniqueidentifier,--班级Id
  @CourseId uniqueidentifier,--课程Id
  @GradeDate datetime,--历史成绩日期,对一门课的历史成绩以作区分
  @Score float,--成绩
  @s_rtn int output--输出
as
--定义临时变量
declare
  @tempStudentId uniqueidentifier,
  @tempCourseId uniqueidentifier
  if exists(select * from Score where Id=@Id)--如果id存在
     begin
     select @StudentId=StudentId,@CourseId=CourseId from Score where Id=@Id
     if ((@tempStudentId=@StudentId) and (@tempCourseId=@CourseId))
       begin
         set @s_rtn=0  --有相同的数据,直接返回值
       end
     else
       begin
         update Score set StudentId=@StudentId,CourseId=@CourseId where Id=@Id
         set @s_rtn=2  --有主键相同的数据,进行更新处理
       end
   end
   else--如果id不存在
     begin
     insert into Score values(@Id,@StudentId,@CourseId,@GradeDate,@Score)
     set @s_rtn=1  --没有相同的数据,进行插入处理
   end

4.1 创建存储过程-给每个班级分配学生人数

基本思路

  1. 班级表的所有数据插入到临时表中;
  2. 外循环 临时表每一条数据,内循环分配到每个班级的数量数据;
  3. 内循环中针对需要的字段进行赋值并插入数据
use DataPerformanceTestDB
go
-- =============================================
-- Author:        love2zq
-- Create date:   2020-09-05
-- Description:   给每个班级分配学生人数
-- =============================================
ALTER procedure [dbo].[sp_Create_AssignStudent]
	@@sName varchar(10),	--学生姓名
	@n int,					--每班人数
	@classNum int = 1      --分配多少个班级,默认只针对一个班级加学生
as
begin
declare
	@i int,						--数据条数
	@j int,						--循环标识
	@stuId uniqueidentifier,	--学生主键Id
	@classId uniqueidentifier,	--班级主键Id
	@sNo varchar(10),			--学号
	@sName varchar(10),			--学生姓名
	@count int,					--学生数量
	@rtn int,					--学生表输出提示
	@msg nvarchar(100)			--输出提示
	
	--把所有班级信息存到临时表
    select * into #temp from (select Id,ROW_NUMBER() over(order by ClNo) as row from Class) a
    select @count = COUNT(1) from #temp;
    --设置分配班级数量
    if @classNum > @count 
		set @classNum = @count
	set @i=1--设置变量i
	--循环临时表
	while @i<=@classNum	--班级循环
    begin
    	set @j = 1		--注意:此@j变量一定要放在外循环begin和内循环外部之间,否则无法产生双循环效果
		while @j<=@n	--学生循环
		begin
			set @stuId = NEWID()
			set @sNo = convert(varchar(10), @i) + convert(varchar(10), @j)
			set @sName = @@sName + convert(varchar(10), @i) + convert(varchar(10), @j)
			select @classId = Id from #temp where row = @i; --获取班级Id
			exec sp_Insert_Student @stuId,@sNo,@sName,18,0,@classId,@rtn output
			set @j=@j+1
		end
		set @i=@i+1
    end
	drop table #temp; --删除临时表
end

4.1 创建存储过程-给每个学生分配1个课程的默认100次历史成绩

基本思路

  1. 学生表的所有数据插入到临时表中;
  2. 外循环``临时表每一条数据,内循环每科成绩的次数;
  3. 内循环中针对需要的字段进行赋值并插入数据
use DataPerformanceTestDB
go
-- =============================================
-- Author:        love2zq
-- Create date:   2020-09-05
-- Description:   给每个学生分配1个课程的默认100次历史成绩
-- =============================================
create procedure sp_Create_StudentScore
	@courseId uniqueidentifier,	--课程id
	@times int = 100			--每个学生每门课程的成绩次数,默认100次
as
begin
    declare @stuId varchar(50);				--学生id
    declare @count int;						 --学生数量
    declare @i int;							--循环标识
    declare @j int;							--循环标识
    declare	@scoreId uniqueidentifier;		--成绩主键Id
	declare @gradeDate datetime;			--历史成绩日期
	declare @score float;				    --成绩
	declare	@c_rtn int;						--课程表输出提示
    --把所有学生信息存到临时表
    select * into #temp from (select Id,ROW_NUMBER() over(order by SNo) as row from Student) a
    select @count = COUNT(1) from #temp;	--查询临时表总记录数
    set @i = 1
    --循环临时表
    while (@i <= @count)
    begin
        set @j = 1			--注意:此@j变量一定要放在外循环begin和内循环外部之间,否则无法产生双循环效果
		while @j<=@times	--考试成绩次数
		begin
			set @scoreId = NEWID()							--自动生成Id
			select @stuId = Id from #temp where row = @i;	--获取学生Id	
			set @score = cast(floor(rand()*100) as float) 				--cast将整型转换为float类型数据
			set @gradeDate = dateadd(DAY,@j,'2020-01-01')	--初始日期为2020-01-01,加上@j天
			exec sp_Insert_Score @scoreId,@stuId,@courseId,@gradeDate,@score,@c_rtn output
			set @j=@j+1
		end
      set @i = @i + 1
    end
    drop table #temp;	--删除临时表
end
go

5 生成100万数据

由于数据量生成过多,下面的代码执行时间可能过长,需要耐心等待,大概会执行1个小时20分钟左右

declare	@cl_rtn int,@c_rtn int,@msg nvarchar(100)--输出提示;
--------------------------------------------------------------------------------------------------------------------
---------------------------------------------*******插入班级数据*******---------------------------------------------
--------------------------------------------------------------------------------------------------------------------
exec sp_Insert_Class '3DCEA8D9-92D8-484B-BAC1-DB13F0CB347F','GZ20200101','高一(1)班','刘齐','13385421639','阳光少年,花样少女',@cl_rtn output
--下面输出可加可不加,只是一个提示作用
--begin
if @cl_rtn=0
	set @msg='课程表=>' + '3DCEA8D9-92D8-484B-BAC1-DB13F0CB347F' + ':已经存在相同的。'
else if @cl_rtn=1
	set @msg='课程表=>' + '3DCEA8D9-92D8-484B-BAC1-DB13F0CB347F' + ':插入成功。'
else
	set @msg='课程表=>' + '3DCEA8D9-92D8-484B-BAC1-DB13F0CB347F' + ':更新成功。'
print @msg
--end
exec sp_Insert_Class 'F441C02F-835A-488B-A70F-71FE96655955','GZ20200102','高一(2)班','刘吉','13385421638','老司机队伍,勇拿第一',@cl_rtn output
exec sp_Insert_Class '760AE59A-D8A5-4B44-B701-E08500378F74','GZ20200103','高一(3)班','李欣颖','13313145201','母语为主,英语为辅',@cl_rtn output
exec sp_Insert_Class '9F28DD25-49CE-4C73-A594-D19B561FD31B','GZ20200104','高一(4)班','李国庆','13313145225','党中央路线是群众路线,你们就是党的群众',@cl_rtn output
exec sp_Insert_Class 'B66763ED-70E9-4F1A-90F7-2F23709A5884','GZ20200105','高一(5)班','朱明朝','13313149225','历史留给人的教训就是从未从历史中得到任何教训',@cl_rtn output
exec sp_Insert_Class 'C0BAD0C9-757A-44FB-898A-21CB86EE5810','GZ20200106','高一(6)班','徐霞客','13313949225','山川大河,地大物博,如画如诗',@cl_rtn output
exec sp_Insert_Class '473D3B0F-B0DB-46A8-A711-31B0CF013924','GZ20200107','高一(7)班','屠呦呦','13613949225','救死扶伤乃本职,奈何医者不自医',@cl_rtn output
exec sp_Insert_Class '1338AA6B-4ADD-4C89-80E6-AA90D1969A3D','GZ20200108','高一(8)班','侯德榜','13316949225','帝国垄断,国中尚无自给自足?',@cl_rtn output
exec sp_Insert_Class 'B0691073-7232-4EC2-BF05-D7449ADC50E6','GZ20200109','高一(9)班','杨振宁','13313949225','一声爆炸,国之骄傲',@cl_rtn output
exec sp_Insert_Class 'E8F75344-0673-493A-8E0D-E54861C603D3','GZ20200110','高一(10)班','子非鱼','13313649225','忍耐克己百折不屈',@cl_rtn output

exec sp_Insert_Class 'D078B827-E046-4FD6-8A64-387A420DF767','GZ20200201','高二(1)班','刘齐','13385421639','阳光少年,花样少女',@cl_rtn output
exec sp_Insert_Class 'AF5CB351-FDE0-482C-8B00-586C1BC0F0AE','GZ20200202','高二(2)班','刘吉','13385421638','老司机队伍,勇拿第一',@cl_rtn output
exec sp_Insert_Class '3FA698FC-4DB8-40FD-A499-59AE804EEA8D','GZ20200203','高二(3)班','李欣颖','13313145201','母语为主,英语为辅',@cl_rtn output
exec sp_Insert_Class '5983885B-8104-4F98-B777-37E39E660DF9','GZ20200204','高二(4)班','李国庆','13313145225','党中央路线是群众路线,你们就是党的群众',@cl_rtn output
exec sp_Insert_Class '94FFFA6C-0A66-4092-BDBF-5A4F3EE2C7DB','GZ20200205','高二(5)班','朱明朝','13313149225','历史留给人的教训就是从未从历史中得到任何教训',@cl_rtn output
exec sp_Insert_Class 'FFB34518-3581-43B5-8BA4-EDB32F036F9F','GZ20200206','高二(6)班','徐霞客','13313949225','山川大河,地大物博,如画如诗',@cl_rtn output
exec sp_Insert_Class '0826DCB4-3393-4706-9EF7-79DCD1C88152','GZ20200207','高二(7)班','屠呦呦','13613949225','救死扶伤乃本职,奈何医者不自医',@cl_rtn output
exec sp_Insert_Class '28A2CEED-21EC-428F-9F22-0BCC95C14CD7','GZ20200208','高二(8)班','侯德榜','13316949225','帝国垄断,国中尚无自给自足?',@cl_rtn output
exec sp_Insert_Class '675214FC-4127-4FFD-81FA-B247FAF00C89','GZ20200209','高二(9)班','杨振宁','13313949225','一声爆炸,国之骄傲',@cl_rtn output
exec sp_Insert_Class '2E7C95FA-5F8B-4724-8EC4-49A1081E7F7C','GZ20200210','高二(10)班','子非鱼','13313649225','忍耐克己百折不屈',@cl_rtn output

exec sp_Insert_Class 'DD11B770-DC0B-4DA1-BCA3-29045852F497','GZ20200301','高三(1)班','刘齐','13385421639','阳光少年,花样少女',@cl_rtn output
exec sp_Insert_Class 'B615B058-E009-4591-8B5C-631965E2816B','GZ20200302','高三(2)班','刘吉','13385421638','老司机队伍,勇拿第一',@cl_rtn output
exec sp_Insert_Class 'DCF72A56-2A9E-46CF-BB54-802443A7CCB0','GZ20200303','高三(3)班','李欣颖','13313145201','母语为主,英语为辅',@cl_rtn output
exec sp_Insert_Class '1B209C00-34ED-4EF9-8F39-BB8363FB60B2','GZ20200304','高三(4)班','李国庆','13313145225','党中央路线是群众路线,你们就是党的群众',@cl_rtn output
exec sp_Insert_Class '2868A43E-7E0D-4FF0-B8C9-3275AB7F80FC','GZ20200305','高三(5)班','朱明朝','13313149225','历史留给人的教训就是从未从历史中得到任何教训',@cl_rtn output
exec sp_Insert_Class '26B9B50F-4928-43BC-9BF0-8F17FFBF0835','GZ20200306','高三(6)班','徐霞客','13313949225','山川大河,地大物博,如画如诗',@cl_rtn output
exec sp_Insert_Class '4B907A49-BED6-4F54-9036-50DA7B346AAF','GZ20200307','高三(7)班','屠呦呦','13613949225','救死扶伤乃本职,奈何医者不自医',@cl_rtn output
exec sp_Insert_Class '53B2B9AC-592E-4CF8-BD87-27FB082CA454','GZ20200308','高三(8)班','侯德榜','13316949225','帝国垄断,国中尚无自给自足?',@cl_rtn output
exec sp_Insert_Class '9D09218A-6ACB-4087-9C47-7D2265CD80E7','GZ20200309','高三(9)班','杨振宁','13313949225','一声爆炸,国之骄傲',@cl_rtn output
exec sp_Insert_Class '09E4C136-640A-4EE1-B9F7-18446F5E4230','GZ20200310','高三(10)班','子非鱼','13313649225','忍耐克己百折不屈',@cl_rtn output 

--------------------------------------------------------------------------------------------------------------------
---------------------------------------------*******插入课程数据*******---------------------------------------------
--------------------------------------------------------------------------------------------------------------------
exec sp_Insert_Course '43650D43-CDA5-4F81-934F-2DF9B03038A0','语文','1教1101',@c_rtn output
--下面输出可加可不加,只是一个提示作用
--begin
if @c_rtn=0
	set @msg='课程表=>' + '43650D43-CDA5-4F81-934F-2DF9B03038A0' + ':已经存在相同的。'
else if @c_rtn=1
	set @msg='课程表=>' + '43650D43-CDA5-4F81-934F-2DF9B03038A0' + ':插入成功。'
else
	set @msg='课程表=>' + '43650D43-CDA5-4F81-934F-2DF9B03038A0' + ':更新成功。'
print @msg
--end
exec sp_Insert_Course '8C35128B-4AD1-4506-861B-A96F41072FDD','数学','1教1102',@c_rtn output
exec sp_Insert_Course '12A0C937-A570-4E3A-A5A9-D4841387E617','英语','1教1103',@c_rtn output
exec sp_Insert_Course '31AD3945-AB92-4F83-8CB9-19B01389B61F','政治','1教1104',@c_rtn output
exec sp_Insert_Course 'AA571527-97B1-4C3E-A651-ECA8B505B991','历史','1教1105',@c_rtn output
exec sp_Insert_Course 'DC3BB0A9-A046-4900-AFB1-76B850A937D7','地理','1教1106',@c_rtn output
exec sp_Insert_Course '6DA53E65-E564-4D4C-A7A0-966B0EE0FC65','生物','1教1107',@c_rtn output
exec sp_Insert_Course 'F1E0C121-3FFE-4F9C-825E-BB19EC43A4F9','化学','1教1108',@c_rtn output
exec sp_Insert_Course '7529A8CD-403B-45B5-8274-3E352558CF31','物理','1教1109',@c_rtn output
exec sp_Insert_Course 'BCBD9E50-602B-4097-9DD7-8E8CD751AA04','体育','1教1110',@c_rtn output

--------------------------------------------------------------------------------------------------------------------
---------------------------------------------*******插入学生数据*******---------------------------------------------
--------------------------------------------------------------------------------------------------------------------
--给予每个班100人,30个班即 30*100 = 3000人
exec sp_Create_AssignStudent '李思思',100,30

--------------------------------------------------------------------------------------------------------------------
---------------------------------------------*******插入学生成绩数据*******---------------------------------------------
--------------------------------------------------------------------------------------------------------------------
--给予每个学生每门课程200次历史成绩,共有3000人*10门课*200次=600,0000数据
exec sp_Create_StudentScore '43650D43-CDA5-4F81-934F-2DF9B03038A0',200		--	语文,200次成绩
exec sp_Create_StudentScore '8C35128B-4AD1-4506-861B-A96F41072FDD',200		--	数学,200次成绩
exec sp_Create_StudentScore '12A0C937-A570-4E3A-A5A9-D4841387E617',200		--	英语,200次成绩
exec sp_Create_StudentScore '31AD3945-AB92-4F83-8CB9-19B01389B61F',200		--	政治,200次成绩
exec sp_Create_StudentScore 'AA571527-97B1-4C3E-A651-ECA8B505B991',200		--	历史,200次成绩
exec sp_Create_StudentScore 'DC3BB0A9-A046-4900-AFB1-76B850A937D7',200		--	地理,200次成绩
exec sp_Create_StudentScore '6DA53E65-E564-4D4C-A7A0-966B0EE0FC65',200		--	生物,200次成绩
exec sp_Create_StudentScore 'F1E0C121-3FFE-4F9C-825E-BB19EC43A4F9',200		--	化学,200次成绩
exec sp_Create_StudentScore '7529A8CD-403B-45B5-8274-3E352558CF31',200		--	物理,200次成绩
exec sp_Create_StudentScore 'BCBD9E50-602B-4097-9DD7-8E8CD751AA04',200		--	体育,200次成绩

6 查询数据

--查询关联数据
select a.SName,b.ClName,d.CName,d.CRoom,c.Score from Student a
left join Class b on a.ClassId = b.id
left join Score c on a.Id = c.StudentId
left join Course d on c.CourseId = d.Id
--清空数据
delete from Class;delete from Student;delete from Score;delete from Course