第一天 -- 《2014-07-05 sql server》1 ——建库建表建约束 + 基本数据类型
一、上午 《01、回顾》
1、数据库介绍:
(1)特点:
海量存储、查找速度快、并发性问题控制、安全性、数据完整性(保存在数据库中的数据是正确的,真实的)。
(2)数据库种类:
关系型数据库:Oracle、MSSQL、MySQL市场占有率前三。
嵌入式关系数据库:现在最好的是SQLite
文档型NoSQL:现在最好的是Mongodb
缓存型NoSQL(key-value型):现在最好的是Redis
2、字符串类型(可见下图)
VarChar(n) 与 Char(n) 都表示非Unicode字符; NVarChar(n) 与 NChar(n) 都表示Unicode字符,如果有中文等内容就需要它们。(一个字符占2个字节)。
VarChar(n) 与NVarChar(n) 都表示可伸缩字符串,即字符串实际长度可以自动收缩。(少于指定长度n)
Char(n) 与 NChar(n) 都表示不可伸缩字符串,即如果字符串实际长度少于n的话,数据库以空格填满。

注意:(1)N‘字符串’ 表示Unicode字符串常量
(2)Null表示未知数据,它与任何数值运算都为Null。比如工资为Null,加上100后还是未知,即Null
(3)下面几个例子体现可变长度VarChar与NVarChar和不可变Char与NChar截然不同的特点:
前两者可以直接连接字符串,后两者因为已用空格补全,不能直接连接其他字符串(需要RTRIM函数去除右侧空格)。


(4)数据库字符串类型 varchar(n), nvarchar(n) 长度、性能、及所占空间分析
好好读读超连接的文章。总结是:
nvarchar(n)或nvarchar(max)中的n及max只是一个符号,不会影响占用空间及性能,除非max存储字符数大于4000,所以我们只要关注实际业务需要就可以了。但是假如列里真的存储了超长字符串,它在LIKE模糊查询时、在字符串拼接时,显然非常影响软件性能。(但这不是列数据类型本身造成的,是你的业务逻辑应该找个更合理优化的方案)
3、数据库实例
在一个实例上可以有多个数据库。数据库实例,可以理解为在一台计算机上安装的多个数据库服务。
4、注意SQL中的数据类型兼容性。
(1)即SQL任何数据都可以转为字符串。而数字的字符串可以与数值兼容。
(2)加号+首先是个算术运算符,只有当+号两边都是字符串时,才是字符串连接符。
如果有一边是数值,那么+号会尝试将另一个转换为数值然后进行加法运算。假如转换失败,就报错。
如: select ‘5’ + 10; --执行得到结果集15(因为两个操作数有个数值类型,所以做了加法运算)
而: select 'a5' + 10; --执行后报错: 在将 varchar 值 'a5' 转换成数据类型 int 时失败。
如果是两个字符串:select ‘5’ + ‘10’; --执行后得到结果集 ‘510’ (因为首先两个操作数都是字符串,所以就直接按字符串连接处理了)
5、数据库对字符的大小写不敏感(除非对数据库进行特别设置)
(1)SQL语句不区分大小写,(关键字、标识符都不区分)
(2)表中字符串数据不区分大小写。
如:select * from 表名 where name = 'a'; -- 实际上会把name为a或A的记录全部查出来。
6、SQL语言:
DDL:数据定义语言——建库建表建约束。
DML:数据操作语言——CRUD
DCL:数据库控制语言——授权、取消授权、
7、主键 Primary Key
唯一标识表中的一条记录 和 主外键关联的用途。
二、上午 《02、代码创建数据库》
1、创建数据库

由上图可知,创建一个数据库最基本的几个参数:
(1)数据库名称 (2)数据文件逻辑名name (3)初始大小size (4)增长方式filegrowth(如10%或5Mb)
(5)最大容量maxsize(如100Mb,不写就是不限制最大容量,建议用后者) (6)文件全名filename(路径+文件名)
三、上午 《03、创建数据库补充》--> 《05、使用代码创建表》前半部分
1 use master; 2 if exists(select * from sysdatabases where name = 'TestSchool') 3 drop database TestSchool; 4 --实例上的所有数据库都可以在master.sysdatabases视图中查得到。 5 go 6 7 8 create database TestSchool 9 on primary --放在主文件组 10 ( 11 name = 'TestSchool_data', 12 size = 5mb, 13 filegrowth = 10%, 14 maxsize = 100mb, --不写表示不限制大小 15 filename = 'D:\Test\TestSchool_data.mdf' --主数据文件 16 17 ), --多文件间要加逗号。 18 filegroup group2 --下面这个次要文件创建在文件组group2上 19 ( 20 name = 'TestSchool_data2', 21 size = 5mb, 22 filegrowth = 10%, 23 maxsize = 100mb, --不写表示不限制大小 24 filename = 'D:\Test\TestSchool_data2.ndf' --次要数据文件 25 ) 26 log on 27 ( 28 name = 'TestSchool_log', 29 size = 1mb, 30 filegrowth = 3mb, 31 --maxsize = 100mb, --不写表示不限制大小,(日志文件不要限制) 32 filename = 'D:\Test\TestSchool_log.ldf' --日志文件 33 34 )
四、上午 《05、使用代码创建表》后半部分
1、创建数据表

由上图可知创建表的基本语法:
--创建数据表
--语法:
--create table 表名
--(
-- 字段名称 字段类型 字段特征(是否非空 标识列 默认值 主键 唯一键 check 约束 ),
-- 字段名称 字段类型 字段特征(是否非空 标识列 默认值 主键 唯一键 check 约束 )
--)
1 use TestSchool; 2 3 if exists(select * from sysobjects where name = 'Teacher') 4 drop table Teacher; 5 go 6 --所有数据库中的表、视图、索引、约束等等对象都可以在系统sysobjects视图中查到。 7 create table Teacher 8 ( 9 Id int identity(1,1) primary key, 10 Name nvarchar(50) not null, 11 Gender bit not null, 12 Age int not null check(Age>0 and Age<100), 13 Salary money, 14 Birthday datetime not null default('2017-1-1') 15 )
五、上午 《06、实体完整性》--《08、引用完整性》
使用数据库有一个重要特点:数据完整性。
那么数据完整性包括哪些方面?又有哪些手段可以保证这些完整性呢?
1、数据完整性包含:
(1)实体完整性:要保证每一行记录是唯一的,不重复的。
保证的手段有(可以配合使用):
标识列(系统自动生成,永不重复)
主键(唯一、非空)
唯一键(唯一,可以有一个Null)
(2)域完整性:要保证列的值是合理和准确的。
保证的手段有:
非空约束(not null)
数据类型
检查约束(check)
默认值(default) --实际开发中,很多列设有默认值,而不设置为not null
外键约束()
(3)引用完整性:要保证外键的值只能是主表中已存在的主键值
保证的手段有: —— 去从表(外键表)创建主外键关系
外键约束()
2、表约束
从以上手段中抽出以下几个,定义为表的约束。
主键约束 (primary key) PK
外键约束 (foreign key) FK
非空约束
唯一约束 (unique) UQ
检查约束 (check) CK
默认约束 (default) DF
六、下午 《01、引用完整性的补充》后半部分
1、更新和删除规范(级联)---发生在更新主表或者删除主表记录时。
no action --不执行任何操作 --就是有错报错。(更新或删除主表记录,而从表有引用的时候。没引用么就无所谓了)
CASCADE --级联操作 --就是更新主表主键,从表关联记录的外键自动都被更新;删除主表记录,从表关联记录自动都被删除。
Set Null --设置为Null --就是主表更新主键或者删除记录,从表关联记录的外键值设置为Null(如果该列约束为no null 就会报错)
Set default -- 设置为指定值 --就是主表更新主键或者删除记录,从表关联记录的外键值设置为default约束的值(如果该列无default约束 就会报错)
2、在创建或重启时检查现有数据
外键可以设置是否“检查现有数据”,针对表中已经存在数据,后期加上的外键约束,可以指定不检查,过去的事就叫他过去吧。
七、下午 《02、代码创建主外键》--《03、建立约束时的补充》
1、为表加约束的基本语法
----创建约束的语法:
--alter table 表名
--add constraint 约束的名称(以简写做为前缀) 约束的类型 约束的说明(字段 表达式 值)
1 alter table Teacher 2 add constraint PK_Teacher_id primary key(Id) -- 主键 3 4 if exists(select * from sysobjects where name='UQ_Teacher_Name') 5 alter table teacher drop constraint UQ_Teacher_Name 6 --如果已存在唯一键约束,先删除它 7 alter table teacher 8 add constraint UQ_Teacher_Name unique(name) --唯一键 9 10 if exists(select * from sysobjects where name = 'CK_Teacher_Age') 11 alter table teacher drop constraint CK_Teacher_Age 12 --如果已存在check约束,先删除它 13 alter table teacher 14 add constraint CK_Teacher_Age check(age>0 and age <=100) 15 16 17 alter table teacher 18 add constraint DF_Teacher_Birthday default('1990-9-9') for birthday --for是说明为那一个字段添加默认值 19 20 if exists(select * from sysobjects where name='FK_Teacher_classid') 21 alter table teacher drop constraint FK_Teacher_classid 22 23 alter table teacher --从表的某一个字段引用主表的某一个字段 24 with nocheck --不检查现有数据 25 add constraint FK_Teacher_classid foreign key(classId) references classes(cid) 26 on delete set null 27 on update set default
注意: “键”约束都是圆括号里面放入列名,如:primary key(Id)、 unique(name) 、foreign key(classId)
2、更新和删除规则
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
3、不检查现有数据
with nocheck
八、下午 《主键的补充说明(自编)》-- int自增主键 VS GUID主键
使用INT做主键的优点:
1、需要很小的数据存储空间,仅仅需要4 byte 。
2、insert和update操作时使用INT的性能比GUID好,所以使用int将会提高应用程序的性能。
3、index和Join 操作,int的性能最好。
4、容易记忆。
5、支持通过函数获取最新的值,如:Scope_Indentity() 。
使用INT做主键的缺点
1、如果经常有合并表的操作,就可能会出现主键重复的情况。
2、使用INT数据范围有限制。如果存在大量的数据,可能会超出INT的取值范围。
3、很难处理分布式存储的数据表。
使用GUID做主键的优点:
1、它是独一无二的。
2、出现重复的机会少。
3、适合大量数据中的插入和更新操作。
4、跨服务器数据合并非常方便。
使用GUID做主键的缺点:
1、存储空间大(16 byte),因此它将会占用更多的磁盘大小。
2、很难记忆。join操作性能比int要低。
3、没有内置的函数获取最新产生的guid主键。
4、GUID做主键将会添加到表上的所以其他索引中,因此会降低性能。
总结:
上面列出了GUID和INT两种数据类型做主键优缺点。我觉得,对于大数据量,建议使用guid做主键。而使用int会得到最佳的性能。
浙公网安备 33010602011771号