zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

数据库基础第三章:数据表管理

数据库基础 管理 数据表 第三章
2023-09-14 09:07:50 时间

一、数据类型

 

 

Character 字符串:

数据类型描述存储
char(n) 固定长度的字符串。最多 8,000 个字符。 n
varchar(n) 可变长度的字符串。最多 8,000 个字符。  
varchar(max) 可变长度的字符串。最多 1,073,741,824 个字符。  
text 可变长度的字符串。最多 2GB 字符数据。  

Unicode 字符串:

数据类型描述存储
nchar(n) 固定长度的 Unicode 数据。最多 4,000 个字符。  
nvarchar(n) 可变长度的 Unicode 数据。最多 4,000 个字符。  
nvarchar(max) 可变长度的 Unicode 数据。最多 536,870,912 个字符。  
ntext 可变长度的 Unicode 数据。最多 2GB 字符数据。  

Binary 类型:

数据类型描述存储
bit 允许 0、1 或 NULL  
binary(n) 固定长度的二进制数据。最多 8,000 字节。  
varbinary(n) 可变长度的二进制数据。最多 8,000 字节。  
varbinary(max) 可变长度的二进制数据。最多 2GB 字节。  
image 可变长度的二进制数据。最多 2GB。  

Number 类型:

数据类型描述存储
tinyint 允许从 0 到 255 的所有数字。 1 字节
smallint 允许从 -32,768 到 32,767 的所有数字。 2 字节
int 允许从 -2,147,483,648 到 2,147,483,647 的所有数字。 4 字节
bigint 允许介于 -9,223,372,036,854,775,808 和 9,223,372,036,854,775,807 之间的所有数字。 8 字节
decimal(p,s)

固定精度和比例的数字。允许从 -10^38 +1 到 10^38 -1 之间的数字。

p 参数指示可以存储的最大位数(小数点左侧和右侧)。p 必须是 1 到 38 之间的值。默认是 18。

s 参数指示小数点右侧存储的最大位数。s 必须是 0 到 p 之间的值。默认是 0。

5-17 字节
numeric(p,s)

固定精度和比例的数字。允许从 -10^38 +1 到 10^38 -1 之间的数字。

p 参数指示可以存储的最大位数(小数点左侧和右侧)。p 必须是 1 到 38 之间的值。默认是 18。

s 参数指示小数点右侧存储的最大位数。s 必须是 0 到 p 之间的值。默认是 0。

5-17 字节
smallmoney 介于 -214,748.3648 和 214,748.3647 之间的货币数据。 4 字节
money 介于 -922,337,203,685,477.5808 和 922,337,203,685,477.5807 之间的货币数据。 8 字节
float(n) 从 -1.79E + 308 到 1.79E + 308 的浮动精度数字数据。 参数 n 指示该字段保存 4 字节还是 8 字节。float(24) 保存 4 字节,而 float(53) 保存 8 字节。n 的默认值是 53。 4 或 8 字节
real 从 -3.40E + 38 到 3.40E + 38 的浮动精度数字数据。 4 字节

Date 类型:

数据类型描述存储
datetime 从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 3.33 毫秒。 8 bytes
datetime2 从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 100 纳秒。 6-8 bytes
smalldatetime 从 1900 年 1 月 1 日 到 2079 年 6 月 6 日,精度为 1 分钟。 4 bytes
date 仅存储日期。从 0001 年 1 月 1 日 到 9999 年 12 月 31 日。 3 bytes
time 仅存储时间。精度为 100 纳秒。 3-5 bytes
datetimeoffset 与 datetime2 相同,外加时区偏移。 8-10 bytes
timestamp 存储唯一的数字,每当创建或修改某行时,该数字会更新。timestamp 基于内部时钟,不对应真实时间。每个表只能有一个 timestamp 变量。  

其他数据类型:

数据类型描述
sql_variant 存储最多 8,000 字节不同数据类型的数据,除了 text、ntext 以及 timestamp。
uniqueidentifier 存储全局标识符 (GUID)。
xml 存储 XML 格式化数据。最多 2GB。
cursor 存储对用于数据库操作的指针的引用。
table 存储结果集,供稍后处理。

二、数据表管理

表是存储各种数据的载体,具有以下特点:

 在特定的数据库中表名是唯一的,在特定的表中,列名是唯一的,但不同的表可以有相同的
列名。两者的唯一性都是由 SQL Server 强制实现的。

 表是由行和列组成的,行又称为 记录,列被称为 字段。行和列的次序是任意的。
 每个表最多有 1024 列。

数据行在表中是唯一的, 行的唯一性可以通过定义主键来实现。

一般来说,在一个表中,不允许有两个完全相同的行存在。

2.1. 创建数据表

在创建数据表之前,需要定义表中的列(字段)的名称,同时还需要定义每列的数据类型和宽
度。数据类型指定了在每列中存储的数据的类型,例如文本、数字、日期等。宽度指定了可以向列中
输入多少个字符或数字,也可以使用用户自定义类型数据。除此之外,还需要设定表中列是否允许为
空,是否有默认值,是否设置为标识列等。下面以创建“客房类型”表为例来介绍几个与创建表结构
相关的概念。图 3-1 是在 SQL Server Management Studio 中使用图形化方式创建数据表,图书信息表
中的字段有:编号、图书名称、作者、出版社、价格、ISBN。其结构和数据如图 3-2 所示。

( 1) 列的属性

表的列名在同一个表中具有唯一性,同一列的数据属于同一种数据类型。除了用列名和数据类型
来指定列的属性外,还可以定义其它属性:如 NULL(空值)属性、NOT NULL(不为空)属性和
IDENTITY(标识列) 属性、默认约束、空值约束。

2.1.1、NULL 或 NOT NULL

如果表的某一列被指定具有 NULL 属性,那么就允许在插入数据时省略该列的值。反之,如果表的
某一列被指定具有 NOT NULL 属性,那么就不允许在没有指定列缺省值的情况下插入省略该列值的数
据行。如图 3-3 中,定义图书信息表的表结构,分别定义列名、该列的数据类型和该列是否允许为空。

当勾选“允许 Null 值”时,表示允许为空,即该列数据可以不添加数据,反之,该列必须添加数据。

2.1.2、IDENTITY

IDENTITY 属性可以使表的列包含系统自动生成的数字。这种数字在表中可以唯一标识表的每一
行,即表中的每一行数据在指定为 IDENTITY 属性的列上的数字均不相同。指定了 IDENTITY 属性的列
称为 IDENTITY 列。当用 IDENTITY 属性定义一个列时,可以指定一个初始值和一个增量。插入数据到
含有 IDENTITY 列的表中时,初始值在插入第一行数据时使用,以后就由 SQL Server 根据上一次使用
的 IDENTITY 值加上增量得到新的 IDENTITY 值。如果不指定初始值和增量值,则其缺省值均为 1。
对于 IDENTITY,必须注意以下几点:

a) IDENTITY 属性只适用于整型类型的列;

b) 一个表最多只能设置一个 IDENTITY 属性;

c) IDENTITY 属性的列中每个单元格中值无需人为添加或修改;

d) IDENTITY 属性列中的编号,一旦删除,将是永久性的;

e) 一个列不能同时具有 NULL 属性和 IDENTITY 属性,只能二者选其一。

在图 3-4 中,编号设置为 IDENTITY 属性,则该列数据不需要用户添加,且由系统根据标识规范自
动添加。标识种子为 1,表示该列初始值为 1。标识增量为 1,表示增量为 1,即每添加一条记录,该
列的数据会加 1。

2.1.3、 默认约束(Default Constraint)

默认约束指用户在进行插入操作时,没有显式地为列提供数据,那么系统将把默认值赋给该列。
默认值约束所提供的默认值可以为常量、函数、系统函数、空值等,表中的每一列只能定义一个默认
约束,对于具有 IDENTITY 属性和 timestamp 数据类型的字段,不能使用默认约束,同时,定义的默认
值长度不允许大于对应字段所允许的最大长度。char var   varchar

 datetime类型的默认值为getdate()则获得当前日期与时间

2.2、列的常见约束

2.2.1、主键约束(Primary Key Constraint)

主键用来标识记录的唯一性。数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的
组合。一个数据表只能有一个主键,且主键的取值不能缺失,即不能为空值(Null),主键可以是多
列的组合,值不允许重复。

通俗来说就是可以唯一区分每一条数据的列,如我们定义用户表时把‘‘身份证号’’作为主键,这样
身份证号这一列就是唯一的,根据身份证号可以精确的找到对应的用户数据,因为每个人的身份证号
都不一样。强烈建议每张表都定义主键,如果考虑数据迁移则可以把主键定义成 UUID。下面是一些
关于主键的示例:

学生表:(学号,姓名,性别,出生日期,入学时间)学号是主键

商品表:(商品编号,商品名称,商品价格)商品编号是主键

选课表:(课程编号,学生编号,分数)课程编号与学生编号是组合主键

有时候我们在定义一张表时没有办法确定哪一列作为主键,可以添加编号作为主键列。在如图 3-
6 中,我们把编号这列设置为主键。设置成功后,字段名前面会出现一把金色的钥匙。

2.2.2、唯一约束(Unique Constraint)

要求该列唯一,允许为空,但只能出现一个空值。

第一:创建唯一约束

 

 

2.2.3、检查约束(Check Constraint)

某列取值范围限制、格式限制等,如有关年龄的约束。

第一:定义 CHECK 约束

 

2.2.4、外键约束(Foreign Key Constraint)

用于两表间建立关系,需要指定引用主表的那一列。

在关系数据库中,每个数据表都是由关系来连系彼此的关系,父数据表(Parent Entity)的主键
(primary key)会放在另一个数据表,当做属性以创建彼此的关系,而这个属性就是外键。
比如,学生跟老师之间是教学的关系,学生数据表会有个属性叫指导老师(FK),而这个值就是对
应到老师数据表的老师代号(PK),学生的指导老师就是外键。

 

下面是一个使用外键关联两张表的示例:

宿舍表:(宿舍编号 PK,宿舍位置,电话)宿舍编号是主键

学生表:(学号 PK,姓名,性别,出生日期,宿舍编号 FK)学号是主键,宿舍编号是外键,它
引用宿舍表的主键值。

外键取值规则:空值或参照的主键值。

(1)、插入非空值时,如果主键表中没有这个值,则不能插入。

(2)、更新时,不能改为主键表中没有的值。

(3)、删除主键表记录时,你可以在建外键时选定外键记录一起级联删除还是拒绝删除。

(4)、更新主键记录时,同样有级联更新和拒绝执行的选择。

在上例中,我们新增一张“图书类别”表,其结构和数据如图 3-11 所示:

 

在图书信息表中,我们可以通过“类别”这个字段可以得知该图书属于哪个类别。比如,《孙子兵
法》就属于“军事”类别的图书。因此,我们认为字段“类别”是图书信息表的外键,而外键的数据
必须依赖于另一张表主键的数据。相对而言,外键所在的表,我们称之为外键表,主键所在的表,我
们称之为主键表。在此案例中,图书信息是外键表,图书类别是主键表。那么,我们怎么把类别这个
字段设置为外键呢,其步骤为:

第一:选择外键列

 

 

 2.3、使用SQL创建表

--创建数据库
--drop database ServicePlatform
--go
create database ServicePlatform
on primary
(
name='ServicePlatform',
filename='D:\ServicePlatform\ServicePlatform\Data\ServicePlatform.mdf'
)
go
use ServicePlatform;
go

--表1 组织机构表
if OBJECT_ID('Organization') is not null
drop table Organization;
go
create table Organization
(
Id int identity(1,1) primary key,  --医院编号
Name nvarchar(100) not null, --医院名称
State int default(1), --状态 [0冻结,1正常]
InsertTime datetime default(getdate()) --添加记录的时间
)
go

--表2 科室表
if OBJECT_ID('Department') is not null
drop table Department;
go
create table Department
(
Id int identity(1,1) primary key,  --科室编号
OrganizationId int references Organization(Id), --所属机构
Name nvarchar(100) not null --科室名称
)
go

 

三、作业与单词

1、单词

(1)、char 字符

(2)、var 可变的

2、创建表

关于三个表: 学生信息表, 成绩表,课程表进行组合查询的操作 ,话不多说,先上表信息。
学生表

 

 

 

课程信息表

 

 

 

 学生成绩表

 

 

3、创建一个商品数据库(spdb),创建两个表:

(1)、商品类型(splx)

bh 编号 int pk not null

mc 名称 nvarchar(100) not null

1 数码

2 服饰

3 水果

 

(2)、商品(sp)

spbh 商品编号 int pk not null

spmc 商品名称 nvarchar(200) not null

splx 商品类型 fk(外键) int

spjg 商品价格 numeric(10,2)

 

101 华为荣耀8X 1 1998.5

102 外套   2   88.8

103 芒果   3   8.95

 

4、SQL_server中创建订单数据库

任务描述:

  • 关系模型

1、代理商(代理商编号、姓名、地址、邮政编码、提成金额、提成比例)

其中代理商编号为primary key(主码)

 

2、客户(客户编号、姓名、地址、邮政编码、收支差额、贷款限额、代理商编号)

其中客户编号为primary key(主码)

  

3.产品(产品编号、描述信息、库存量、类别、仓库的编号、价格)

其中产品的编号为primary key(主码)

  

4.订单(订单编号、订货日期、客户编号)

  

5.订货项目(订单编号、产品编号、订购数量、订购单价)

  

 

  • 原始数据

1.对于代理商(代理商编号、姓名、地址、邮政编码、提成金额、提成比例)

01、联邦、东环路1号、541001、30000.00、40

02、惠普、东环路2号、541002、4000.00、10

03、三洋、东环路3号、541003、10000.00、30

04、联想、东环路4号、541004、100000.00、60

05、海尔、东环路5号、541005、200000.00、60

 

2.客户(客户编号、姓名、地址、邮政编码、收支差额、贷款限额、代理商编号)

100、张三、西环路1号、100001、10.00、100.00、02

200、李四、西环路2号、100001、-10.00、10.00、04

300、王五、西环路3号、100001、100.00、1000.00、02

400、赵六、西环路4号、100001、600.00、2000.00、01

500、洪七、西环路5号、100001、300.00、900.00、05

600、李明、西环路6号、100001、20.00、300.00、03

700、张进、西环路7号、100001、400.00、1000.00、03

 

3.产品(产品的编号、描述信息、库存量、类别、仓库的编号、价格)

0011、药物,单位(瓶)、1000、12、1001、40.00

0022、机器,单位(件)、300、3、1002、50000.00

0033、中药,单位(包)、800、12、1001、300.00

0044、软件,单位(套)、1500、10、1003、2000.00

0055、家具,单位(件)、6000、3、1002、1000.00

0066、小型机,单位(台)、10000、3、1002、200000.00

 

4.订单(订单编号、订货日期、客户编号)

111、2000-10-01、200

222、2000-09-01、200

333、2001-01-01、500

444、2002-02-02、300

555、2003-03-03、100

 

5.订货项目(订单编号、产品编号、订购数量、订购单价)

111、0033、200、280.00

222、0066、6000、150000.00

333、0033、100、280.00

444、0011、300、39.00

555、0055、5500、950.00

444、0044、1000、1900.00

 

5、创建如下两个表

表1 部门表 bm

部门编号 bmbh int pk主键 从1开始每次增长1

部门名称 bmmc nvarchar(50) 不为空 唯一键(不重复)

 

表2 员工表 yg

工号 gh int pk 从100001开始每次增长1

姓名 xm nvarchar(30) 不为空

性别 xb nvarchar(1) 不为空,默认为“男”

入职日期 rzrq datetime 默认为当前日期 getdate()

工资 gz numeric(10,2) 约束必须是0-999999之间

部门号 bmh int 可空 外键

 

sql脚本:

--创建数据库
drop database Empdb;
go
create database EmpDB
on
(
name='EmpDB',  --数据库名称
filename='e:\data\empdb.mdf'
)
go
use EmpDB
go
--表1 部门表 bm
--部门编号 bmbh int pk主键 从1开始每次增长1
--部门名称 bmmc nvarchar(50) 不为空 唯一键(不重复)

if  OBJECT_ID('bm') is not null  --根据名称查找对象的编号,如果不为空则对象存在
drop table bm
go
create table bm  --创建名称为bm的表
(
bmbh int identity(1,1) primary key,  --部门编号 数字类型 从1开始每次增长1 主键
bmmc nvarchar(50) unique not null  --部门名称 字符类型 长度50 唯一键 不为空
)
go

--表2 员工表 yg
--工号 gh int pk 从100001开始每次增长1
--姓名 xm nvarchar(30) 不为空
--性别 xb nvarchar(1) 不为空,默认为“男”
--入职日期 rzrq datetime 默认为当前日期 getdate()
--工资 gz numeric(10,2) 约束必须是0-999999之间
--部门号 bmh int 可空 外键


if  OBJECT_ID('yg') is not null  --根据名称查找对象的编号,如果不为空则对象存在
drop table yg
go
create table yg  --创建名称为bm的表
(
gh int identity(100001,1) primary key,  --工号 数字类型 从100001开始每次增长1 主键
xm nvarchar(30) not null,  --姓名 字符类型 长度30 不为空
xb nvarchar(1) default(''),  --性别 字符类型 长度1 默认值为男
rzrq datetime default(getdate()),  --入职日期 日期时间类型 默认值为当前系统时间
gc numeric(10,2),
bmh int references bm(bmbh)  --外键引用主键表的字段
)
go
--加check约束
ALTER TABLE yg ADD CONSTRAINT ck_yg_gc
    CHECK (gc >= 0 AND gc <= 999999)
 

--添加数据
insert into bm(bmmc) values('人事部');
insert into bm(bmmc) values('财务部');
insert into bm(bmmc) values('技术部');

insert into yg(xm,xb, gc,bmh) values('张学友','',18952.88,1);
insert into yg(xm,xb, gc,bmh) values('刘德华','',16952.53,2);
insert into yg(xm,xb, gc,bmh) values('李焕英','',13678.79,3);

--查询数据
select bmbh,bmmc from bm;  --查询bm表中的bmbh,bmmc列

select * from yg where xb=''  --查询yg表中xb='男'的所有列

--更新数据
update yg set gc=gc+10000 where xb='';  --更新yg表,将xb=女的gc增加10000

--删除
delete from bm;  --删除bm表中的所有数据

delete from yg where gc>20000  --删除yg表中工资超过20000的员工

 

 

6、创建如下两个表

1、创建数据库CarDB,存放到d:\data目录下

2、创建类型表,CarType,字段如上

bh 编号 int 自动增加(1001-9999)主键  

mc 名称 nvarchar(50) 不允许为空 唯一键

3、创建汽车表 Car

qcbh 汽车编号 int 自动增长 主键

qcmc 汽车名称 nvarchar(50) 不允许为空

qcnb 汽车类别 int 外键,链接到CarType表

zdss  最大时速  int 检查约束只能取值在20-1000之间

scrq 生产日期 datetime 默认为当前日期 getdate()