前言
这个是我工作两年多后,再次从最基础的SQL入门开始,认真的学一遍SQL Server,捡漏和巩固都有;因为自己刚开始学的时候,总是心烦气躁,最近换工作,发现1到2年经验,问到基础性的东西还是很多,这个时候需要的是扎实的基础功夫,所以一系列打击+反省后,自己节假日在家从最基础重新认识一下SQL Server,继续沉淀一下.哪里有不对或需深入探讨,请直接留言或者小窗我;欢迎~
(一) 数据库简介 SQL Server环境配置 数据库基础知识
1.什么是数据库,数据库有哪些特点,为什么要用数据库?
数据库是一种数据库管理软件,需要安装在电脑的操作系统上的;
数据管理系统(DBMS):DataBaseManagementSystem
数据库具有特点:
① 海量存储数据;
②查询速度快;
③控制并发性访问;
④安全性;
⑤数据的完整性;
2.不同的数据库,不同的特点
mySql:功能简单,速度很快,数据不够严谨;
MSSQL Server:只能运行在Windows平台上,与.net有很好的结合,比mySql功能多,但是对大数据量处理不是特别好;
Oracle:
SQLLite:
Access:文件级数据库;
3.数据库概念知识
数据库(DataBase):不同类的数据放到不同的数据库中;便于对数据的类别个性化管理;安全性高;避免命名冲突;
表(Table):关系型数据库的关系指的是表;
列(Column)/字段(Field)/行(Row)元祖;
主键(Primary Key):数据行中唯一标识,一个表中只能有一个主键;分为:逻辑主键和业务主键;
逻辑主键:没有任何业务意义的字段,完全是给程序看的字段;
业务主键:使用对业务有意义的字段,比如身份号/学号...;
主键须有的特点:
①不允许空的列为主键;
②没有重复数据的列;
③没有实际业务逻辑的列;(逻辑主键)
④稳定的列;(列中的数据不会经常变化的)
⑤选择单列为主键;(当需要多列来共同唯一标识一个表中的一条记录时,可选择多列组成一个主键,此时可以称为:组合主键/复合主键/联合主键)一般 不推荐使用组合主键;
数据冗余的问题:
造成了存储空间的浪费;
更新/删除 数据异常;
为了处理数据冗余的问题,需要将这样的表拆分为两个或者多个表来储存,这个时候需要用主外键将几个表的数据联合起来.
外键(Foreign Key),如何利用主外键将表中的数据联合起来?
当数据拆分为两个表来储存的时候, 每张表有它自己的主键.其中一张表除了它的主键还有一个列,这个列用来引用另一张表中的主键,这一列就是这张表的"外键列",有外键列的表叫做"外键表",主键被引用的表叫做"主键表".
因为外键列的数据引用的是另一张表的主键列数据,所以外键列的数据不可以随便填写,必须是另一张表的主键已经存在的数据.
4.SQL Server的安装和环境配置
安装过程网上有对应版本的图解教程,这里我就先不写了;
安装完后,需要启动SQL Server服务:
开始→运行→services.msc 然后找到对应的需要启动的服务;
查看数据库版本语句:Print @@Version;
5.SQL Server安装失败,如何干净的卸载掉;
①在程序卸载目录中,卸载掉所有带有SQL Server字样的程序;
②删除所有安装目录;
③删除注册表:开始→运行→regedit;在CURRENT_USER和LOCAL_MACHINE下的SoftWare下的微软项目中的带有SQL Server的都删除掉;
6.通过设计器创建数据库和表;
①每个数据库都有且只有一个主数据文件(.mdf),日志文件(_log.ldf);任意多个次要数据文件(.ndf),多个事务日志文件;
②文件组:可将多个数据文件逻辑分到一组,方便日后管理维护(备份/将表建立在对应文件组上等);
③分离:对要分离的数据库,右击,分离,删除链接;
④附加:右击数据库,选择附加,找到目录下的数据库文件;
⑤脱机:暂时不用这个数据库,右击脱机,还在原来的目录,需要恢复,右击联机;
⑥生成兼容脚本移动数据库:右击数据库→任务→生成脚本,可选生成向下版本,可选项根据需求;
注:<1>附加和分离是在数据库版本是一样的情况下进行的,不同版本是会出错;
<2>报错:"不允许保存更改.您所做的更改要求删除并重新创建以下表.您对无法重新创建的表进行了更改或者启用了"阻止保存要求重新创建表的更改"选项";解决方法:工具→选项→Designer/设计→ 勾去 阻止保存要求重新创建表的更改;
<3>报错:附加数据库时报错"..拒绝访问..";权限问题,设置数据库文件安全为:Everyone;
<4>低版本向高版本是兼容的,高版本向低版本是不兼容的;
7.数据库的数据类型;
①image:用来存储 byte[]类型;
②字符串类型:char,nchar,varchar,nvarchar,text,ntext,varchar(max),nvarchar(max)都属于字符串类型,下面是对应的区别;
<1>带n和不带n的区别:
char: char(2),表示可以存储2个字节,比如:ab,12,赵;
nchar:nchar(2),表示可以存储两个字符,每个字符占用2个字节,比如:貂蝉,ab,12;
总结:
不带n:存储中文占用2个字节;存储数字/英文等占用1个字节;
带n:无论存储中文/英文/数字,每个字符都占用2个字节;
带n的数据类型最长4000,nchar(4000)/nvarchar(4000);
不带n的数据类型最长是8000,char(8000)/varchar(8000);
<2>带var和不带var的区别:
char(10): 1 ;
1111111111;
varchar(10): 1;
1111111111;
总结:
不带var:固定长度,存储1个字符,也要占用10个字节,会自动补9个空格,占满10个字节;
带var:可变长度,会根据实际存储的字符大小动态重新分配存储空间,相对节省存储空间;
10,表示存储最大10个字节,无论是固定长度还是可变长度,超过后都会报错;
<3>大字符串存储时:
SQL 2005前用:text和ntext;
SQL 2005后用:varchar(max)/nvarchar(max);max表示4GB内存;
注:①对于双字节字符,用nvarchar解决;
③bit类型:在程序中和查询语句中bit的类型的值都是1(true)和0(false),但是在设计器中必须输入true/false;
注:详细的数据类型文档,在 帮助→索引中搜索"数据类型 [SQL Server]"都会有详细的解释文档;
8.数据库的5个系统数据库
①master:记录SQL Server系统的所有系统级信息.例如:登录账户信息,链接服务器和系统配置设置,记录其他所有数据库的存在,数据文件的位置,SQL Server的初始化信息等,如果master不存在,无法启动SQL Server;
②msdb:用于SQL Server代理计划警报和作业,数据库定时执行某些操作,数据库邮件等;
③model:用作于SQL Server实例上创建的所有数据库的模板.对model数据库的修改(数据库大小/排序规则/恢复模式/其他数据库选项)将应用于以后创建的所有的数据库.在model中创建一张表,以后创建其他数据库都默认有一张同样的表;
④tempdb:一个工作空间,用于保存临时对象或中间集.一个全局资源,可供链接到SQL Server的所有实例用户使用.每次启动SQL Server时都会重新创建tempdb;
⑤Resource:一个只读数据库.包含SQL Server包括的系统对象.系统对象在物理上保留在Resource数据库中, 但在逻辑上显示在每个数据库的sys架构中.