第一天 -- 《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会得到最佳的性能。

 引用文章《GUID和INT两种数据类型做主键的比较》

 

      

posted on 2017-07-19 17:02  困兽斗  阅读(528)  评论(0)    收藏  举报

导航