第一部分、SQL Server基础-建立数据库和数据表

1.1 建立数据库和数据表

         本节介绍如何使用SQL Server Management Studio及查新分析器建立数据库和数据表。首先需要在自己的台式机或者笔记本电脑上安装SQL Server 数据库引擎和SQL Server Management Studio两个组件。这两个组件有些安装包是放在一起的,有些是分开的,选择安装包时注意区分。本书使用的是SQL Server 2012版本,下载地址为:https://www.microsoft.com/zh-cn/download/details.aspx?id=29062,在下载页面有下载包的详细说明,大家可以根据自己机器的情况安装32位或者64位的版本,一般安装Express版本就可以了,如果需要学习数据仓库技术,可以安装Advanced版本。安装的过程很简单,一般都是跟着安装的界面点击“下一步”,需要注意的是在安装过程中需要选择“Windows和SQL Server”的两种用户验证方式,并设置数据库管理员sa的密码。SQL Server的身份认证方式在后续的Web开发中会使用到。

1.1.1 图形化方式建立数据库和数据表

  1、新建数据库

  安装SQL Server 数据库引擎和SQL Server Management Studio成功后,启动SQL Server Management Studio,出现如图1.1所示的界面:

   图1.1  登录SQL Server

         选择“Windows 身份认证”或者“SQL Server身份认证”,“Windows 身份认证”不需要输入密码,因为该认证方式是以Windows操作系统的管理员的身份登录数据库引擎,操作系统管理员拥有对其所管理的软件的所有权限。“SQL Server身份认证”需要输入在安装数据库引擎时,自定义的密码。登录数据库引擎成功后,出现SQL Server Management Studio的操作主界面,如图1.2所示:

 图1.2 SQL Server Management Studio操作主界面

         在上图的“数据库”处,点击鼠标右键,在弹出的快捷菜单中选择“新建数据库”,出现新建数据库的界面,如图1.3所示:

 

 图1.3 新建数据库

         在“数据库名称”处,输入“StdMng2020”作为数据库的名称,确定数据库名称后,数据库的mdf文件和log文件的名称会自动出现,mdf文件和log文件均存储在“D:\Data”目录下。将数据库的主文件(mdf文件)和日志文件(log文件)存放到指定而不是默认的目录是一个好的习惯,可以避免数据库的安装升级导致的数据库丢失的情况。点击“确定”按钮确认数据库的创建。

         2、建立数据表

  在SQL Server Management Studio的左侧数据库列表中找到刚刚新建的数据库“StdMng2020”,点击“+”号,展开数据库,在“表”处点击鼠标的右键,在出现的快捷菜单中选择“新建表”,出现如图1.4所示的界面:

  图1.4 新建数据表

         在定义表结构处,输入如表1.1所示的内容,定义t_Student表的结构:

表1.1  t_Student表结构

列名

数据类型

允许Null值

说明

Sno

varchar(50)

 

学生的学号,可变字符类型。主码。和t_SC表中的Sno形成外键关系,为被参考对象。

Sname

varchar(50)

 

学生的姓名,可变字符类型。

SGender

varchar(2)

 

学生的性别,可变字符类型。

SBirth

datetime

 

学生的出生日期,日期时间型。

Sdept

varchar(50)

学生所在的系别,可变字符类型。外键。和t_Sdept表中的SdeptId字段形成外键关系,为参考对象。表示学生只能属于一个已经存在的系别,或者为Null,表示学生不属于任何系别。

SImage

varbinary(MAX)

学生的登记照,blob(二进制大对象类型)。

Sage

 

学生的年龄,计算列,由SBirth导出。计算公式为:(datediff(year,sbirth,getdate()))。

         计算Sage的公式定义位置如图1.5所示:

 图1.5  Sage计算列公式定义

  datediff和getdate()均为SQL Server数据库引擎的内置函数,getdate()表示当前的日期,datediff(year,sbirth,getdate())表示取当前日期和sbirth值的差值,以年为单位。这样求得的学生年龄可能不太准确。比如说,如果今天是2020年4月3日,那么只要是1998年出生的,不管那一天,都是22岁,大家可以考虑计算学生年龄更加准确的公式。设置Sno字段为主码的操作如图1.6所示:

 图1.6 设置Sno为主码

         设置主码完成后,点击“保存”按钮,以“t_Student”为名称保存学生表。

         按如表1.2 所示的内容定义系别表结构,以SdeptID为主码,以t_Sdept为名称保存。

表1.2  t_Sdept表结构

列名

数据类型

允许Null值

说明

SdeptID

varchar(50)

 

系别编号,可变字符类型。主码。和t_Student表中的Sdept形成外键关系,为被参考对象。

SdeptName

varchar(50)

 

系别的名称,可变字符类型

  按如表1.3 所示的内容定义课程表结构,以Cno为主码,以t_Course为名称保存。

表1.3  t_Course表结构

列名

数据类型

允许Null值

说明

Cno

varchar(50)

 

课程的编号,可变字符类型。主码。和t_SC表中的Cno形成外键关系,为被参考对象。和自身的CPno形成外键关系,为被参考对象。

CName

varchar(50)

 

课程的名称,可变字符类型。

CPno

varchar(50)

课程的先修课,可变字符类型。外键。和自身的Cno形成外键关系,为参考对象。表示课程的先修课必须是一门已经存在的课程,或者为NULL,表示该课程没有先修课。

CCredit

smallint

 

课程的学分,16位短整型。

  按如表1.4 所示的内容定义学生选课表结构,以(Sno、Cno)为主码,以t_SC为名称保存。同时选中Sno、Cno的方法是按住“ctrl”键不放,然后鼠标依次点击Sno和Cno,保证同时选中后,然后点击设置主键的按钮。

表1.4 学生选课表

列名

数据类型

允许Null值

说明

Sno

varchar(50)

 

学生的学号,可变字符类型。主属性。外键。和t_Student表中的Sno形成外键关系,为参考对象。表示只能是一个已经存在的学生才能选择课程,并且有考试成绩,由于为主属性,故不能为NULL。

Cno

varchar(50)

 

课程的编号,可变字符类型。主属性。外键。和t_Course表中的Cno形成外键关系,为参考对象。表示只能是一门已经存在的课程才能被学生选择,并且有考试成绩,由于为主属性,故不能为NULL。

Grade

smallint

 

学生所选课程的考试成绩,16位短整型。

  3、建立表之间的关系。

  1)、设置系别和学生之间的一对多关系,外键为t_Student表中的Sdept,被t_Sdept表中的SdeptID约束。选中“t_Student”表后,点击鼠标右键,在出现的快捷菜单中选择“设计”,出现如图1.7所示的界面:

 图1.7 t_Student表设计界面

         点击关系按钮后,在出现的关系设置界面,设置系别和学生的关系,如图1.8所示:

 

  图1.8 设置系别和学生之间的关系

         点击保存按钮,保存所设置的关系。

  2)、设置先修课和课程之间的一对多关系,外键为t_Course表中的CPno,被t_Couese表中的Cno约束。设置过程如图1.9所示:

图1.9设置先修课和课程之间的关系

        3)、学生选课表和学生及课程之间的多对多关系。外键为t_SC表中的Sno,被t_Student表中的Sno约束;外键为t_SC表中的Cno,被t_Course表中的Cno约束。设置过程如图1.10所示:

  

 图1.10 学生选课表和学生及课程之间的关系

         保存完成后,鼠标右键点击“数据库关系图”,在出现的快捷菜单中选择“新建数据库关系图”,在出现的“添加表”对话框中,依次选择“t_Student”、“t_Sdept”、“t_Course”、“t_SC”四个表,点击确定,出现如图1.11所示的数据表之间的关系图:

图1.11 数据表之间的关系图

         若图形如1.11所示,表示数据表之间的关系建立是正确的。

  4)、为学生表建立以下三个约束

         学生姓名的唯一键约束,右键点击t_Student表,在出现的快捷菜单中选择“设计”,出现如图1.12所示的界面,在工具栏上点击“管理键和索引”,出现如图1.13所示的界面,按图1.13所示,建立学生姓名的唯一键约束。

 图1.12 学生表设计界面

 图1.13  设置学生姓名为唯一键约束

         注意唯一键是约束,不是主码,不要和主键的概念混淆。唯一键是只不允许有重名的学生,是数据完整性的一种保证,注意唯一键是可以允许整个表的学生姓名中,有一个可以为NULL的。学生姓名的唯一键设置完成后,关闭对话框。在t_Student表的设计界面,点击工具栏上的“管理Check约束 ”按钮,按图1.14所示,分别为学生表的性别字段及出生日期字段设置CHECK约束,从而保证性别字段只能输入“男”或者“女”,出生日期在“1990-01-01”和“2000-01-01”之间。

 

  

图1.14 Check约束设置

         Check约束是保证用户自定义完整性的一个重要手段,是数据库中数据有效性的重要保证。

1.1.2  SQL语句方式建立数据库和数据表

         本节演示使用SQL语句建立数据库及数据表,关于create database和create table的具体语法本节不做深入的讨论,大家可以查阅官方文档,获得更详细的帮助(最好在安装数据库引擎时,选择安装SQL Server 2012 联机丛书,这样在SQL Server Management Studio的帮助菜单中,就可以获得SQL语句的详尽帮助)。

         如果已经按上节的图形化方式建立了StdMng2020数据,请将其删除,再进行本节的演练。

  1、建立数据库

         在工具栏点击“新建查询”,打开一个空的查询分析器,输入以下SQL语句,建立StdMng2020数据库。

--创建数据库
create database StdMng2020
on (name = StdMng2020, FILENAME ='d:\Data\StdMng2020.mdf')
LOG ON (name = StdMng2020_Log , FILENAME ='d:\Data\StdMng2020.ldf');
GO

注意SQL语句在SQL Server中的大小写是不区分的,按F5键,或者ALT+X,执行SQL语句。执行成功后,刷新数据库,确认StdMng2020数据库建立成功。

         2、创建数据表

         在同一个查询分析器中,将上述的建立数据库的SQL语句注释掉(CTRL+K+C,取消注释为CTRL+K+U)。初学者在此经常犯错,在没有注释前面语句的情况下,继续执行后面的SQL语句,会导致前面的SQL语句重复执行,出现一些不必要的错误。在同一个查询分析器中执行多个SQL语句块的一个好习惯就是将与本次执行无关的SQL语句块删除,或者注释掉。在查询分析器中,输入以下的SQL语句,依次建立“t_Sdept”、“t_Student”、 “t_Course”、“t_SC”4个数据表:

-保证当前数据库为StdMng2020
use StdMng2020

--建立系别表
create table t_Sdept
( 
  SdeptID varchar(50) primary key,
  SdeptName varchar(50) not null
)

--建立学生表
create table t_Student
(
  sno varchar(50) primary key,
  --定义姓名为唯一键约束
  sname varchar(50) unique,
  SGender varchar(2) not null 
  --check约束,性别只能是‘男’或者‘女’
  check(SGender in('','')),
  SBirth datetime not null
  --check约束,出生日期在'1990-01-01' 和'2000-01-01'之间
  check (SBirth between '1990-01-01' and '2000-01-01') ,
  Sdept  varchar(50)  null,
  SImage  varbinary(max) null
  --定义外键
  foreign key (sdept)  references t_sdept(SDeptID)  
)

--添加Sage为计算列
alter  table t_Student add  Sage  as datediff(year,sbirth,getdate())

--建立课程表
create table t_Course
( 
  Cno varchar(50) primary key,
  CName varchar(50) not null,
  CPno  varchar(50) null,
  CCredit smallint not null,
  --定义外键
  foreign key (CPno)  references t_Course(Cno)
)

--建立学生选课表
create table t_SC
(
  Sno varchar(50),
  Cno varchar(50),
  Grade smallint ,
  --定义主键
  primary key (Sno,Cno),
  --定义外键
  foreign key (Sno)  references t_Student(Sno),
  foreign key (Cno)  references t_Course(Cno)
)

   执行这段语句请注意以下几个问题:

  • 建立表的语句次序不要错,按“t_Sdept”、“t_Student”、 “t_Course”、“t_SC”的次序,否则外键引用可能会出错。
  • 每建立一个表,就执行建立该表的语句,可以利用SQL Server 查询分析器的特点,将某段SQL语句块选中(鼠标拖放操作),然后执行,这时,不论其它语句块是否处于注释状态,所执行的语句只有选中的语句块。
  • 养成写注释的好习惯,对SQL语句块中的关键语句或者执行逻辑写注释,一个是便于阅读,第二也是一个整理思路的过程。团队开发中,自己写的代码往往也需要给团队中的其它成员阅读,所以清晰的注释有助于大家的交流。不要认为代码是你自己写的,只给自己看,就不用写注释,人的大脑是会遗忘的,如果没有注释,2个月后,再来看自己写的代码,保证已经不认为这个代码是自己写的,或者非常疑惑,当时自己为什么要这些写。

  建立4个表的语句全部执行完成后,再次建立数据库关系图,如果得到的关系图和图1.XX一致,则说明建立数据表是成功的。

1.1.3  插入测试数据

         为方便后续章节的SQL语句的学习,需要在数据表中插入一些记录,在同一个查询分析器中,继续输入以下的语句,然后执行,保证以下数据全部插入到对应的数据表中。

--插入系别表
insert t_Sdept(SdeptID,SdeptName) values('cs','计算机系')
insert t_Sdept(SdeptID,SdeptName) values('IS','信息技术系')
insert t_Sdept(SdeptID,SdeptName) values('MA','数学系')
insert t_Sdept(SdeptID,SdeptName) values('CHS','化学系')

--插入课程表,注意插入课程的次序
insert t_Course(Cno,CName,Cpno,Ccredit) values('2','数学',null,2)
insert t_Course(Cno,CName,Cpno,Ccredit) values('6','数据处理',null,2)
insert t_Course(Cno,CName,Cpno,Ccredit) values('4','操作系统',6,3)
insert t_Course(Cno,CName,Cpno,Ccredit) values('7','PASCAL语言',6,4)
insert t_Course(Cno,CName,Cpno,Ccredit) values('5','数据结构',7,4)
insert t_Course(Cno,CName,Cpno,Ccredit) values('1','数据库',5,4)
insert t_Course(Cno,CName,Cpno,Ccredit) values('3','信息系统',1,4)

--插入学生记录
insert t_Student (Sno,sname,sGender,sBirth,sdept,sImage)
values ('200215121','李勇','','1994-04-13','CS',null)

insert t_Student
(Sno,sname,sGender,sBirth,sdept,sImage)
values ('200215122','刘晨','','1995-07-16','CS',null)

insert t_Student(Sno,sname,sGender,sBirth,sdept,sImage)
values('200215123','王敏','','1996-02-14','MA',null)

insert t_Student
(Sno,sname,sGender,sBirth,sdept,sImage)
values('200215125','张立','','1995-12-14','IS',null)

--插入选课记录
insert t_sc values('200215121','1',92)
insert t_sc values('200215121','2',85)
insert t_sc values('200215121','3',88)
insert t_sc values('200215122','2',90)
insert t_sc values('200215122','3',80)

   可以在查询分析器中输入”select * from t_Student”检查学生表的数是否插入正确,以同样的语句检查其它表中的数据插入情况。

  点击“保存”按钮,将整个查询分析器中的SQL语句保存为一个以.sql为扩展名的文件到磁盘上。然后删除StdMng2020数据库。在SQL Server Management Studio中打开刚刚保存的文件,直接执行整个文件的内容,执行成功后,检查数据库、数据表、数据表之间的关系及各个表中的数据是否正确。

  比较图形化方式和SQL语句方式建立数据库和表,各有优势。图形化方式简单直观,不需要理解和记忆建立数据库和表的SQL语句和语法,直接在图形界面上完成一些输入和设置,就可以完成数据库的设计。SQL语句方式灵活可控,使用sql脚本文件,就可以轻松的在不同的数据库引擎上,完成数据库结构的还原。实际应用过程中,两种方式经常交替使用,各取所长。作为计算机类专业的学生,SQL语句方式建立数据库和表的方式是必须掌握的。 

 

posted @ 2020-07-27 20:17  llz730221  阅读(612)  评论(0)    收藏  举报