SQL SERVER 从入门到精通 第5版 第一篇 基础知识 (1-4章) 读书笔记
第一章 数据库基础
P3. 数据库的体系结构(纯理论,不重要)
三种模式:数据库系统的三级模式结构是指模式,外模式和内模式。
两种映射:外模式/模式映射,模式到内模式的映射
P5.数据模型
常见的数据模型有层次模型,网状模型和关系模型
P7.关系数据库的规范化,三条范式:
第一范式(1NF):在一个关系中,消除重复字段,且各字段都是最小的逻辑存储单位.
第二范式(2NF):若关系模型属于第一范式,则关系中每一个非主关键字段都完全依赖于主关键字段,不能只部分依赖于关键字的一部分.
第三范式(3NF):若关系模型属于第一范式,且关系中所有非主关键字段都依赖于关键字段.第三范式要求去除传递依赖.
说人话就是: 一拆表,二设主键,三设外键.(第三点加个问号.大佬说他都是现查现关联,不然改起来很麻烦)
P7.数据库的设计原则
1.数据库内数据文件的数据组织应获得最大限度的共享,最小的冗余度,消除数据及数据依赖关系中的冗余部分,使依赖于同一个数据模型的数据达到有效的分离。
2.保证输入,修改数据时,数据的一致性,正确性。
3.保证数据与使用数据的应用程序之间的高度独立性。
P8.实体关系
1.一对一关系
2.一对多关系
3.多对多关系(要拿第三个表来搭桥)
常见数据库: ACCESS(关系型),SQL Server(关系型),Oracle(关系型),MySQL(关系型),(还有一个splite ?)
第二章 SQL Server数据库环境搭建(略)
第三章 创建与管理数据库
P22.数据库常用对象
1.表:由行和列组成,用于组织和存储数据
2.字段: 表中的列,称为字段.具有自己的属性,如字段的数据类型,大小等.数据类型决定了这个字段能存储哪种数据.
SQL支持5种数据类型:字符型,文本型,数值型,逻辑型和日期时间型
3.索引:索引是一个单独的,物理的数据库结构,它依赖于表建立,在数据库中,索引使数据库程序无需对整个表进行扫描,就可以找到所需的数据。
4.视图:视图是从一张和多张表中导出的表(也称虚拟表),是用户查看数据表中数据的一种方式,表中包括几个被定义的数据列与数据行,其结构和数据建立在对表的查询基础之上。
5.存储过程:SQL语句集合.经编译后命名存储在sql server服务器端的数据库中,由用户通过指令存储过程名执行,当这个存储过程被调用执行时,这些操作也会同时执行。
P23.数据库的组成
一.文件
1.主要数据文件:存放数据和数据库的初始化信息,每个数据库有且只有一个主要数据文件,默认扩展名为 .mbf
2.次要数据文件:存放除主要数据文件以外的所有数据文件,有些数据库可能没有制要数据文件也可能有多个制要数据文件,默认扩展名是.ndf
3.事务日志文件:存放用于恢复数据库的所有日志信息,每个数据库至少有一个事务日志文件,也可以有多个事务日志文件,默认扩展名是 .ldf
二.文件组
1.主文件组:包含主要数据文件和任何没有明确指派给其他文件组的文件.系统表的所有页都分配在主文件组中。
2.用户定义文件组主要是在Create DataBase 或者 Alert DataBase语句中,使用 FileGroup关键字指定的文件组。
文件组在新建数据库时可以选择它的位置 ,也可以自定义添加一个和设置为默认文件组
后期也可以通过右击数据库,在属性中设置文件组
对文件进行分组时,一定要遵循如下文件和文件组的设计规则:
1.文件只能是一个文件组的成员
2.文件和文件组不能由一个以上的数据库使用。
3.数据和事务日志信息不能属于同一个文件或文件组。
4.日志文件不能作为文件组的一部分,日志空间与数据空间分开管理。
注意:系统管理员在进行备份操作时,可以备份或恢复个别文件或文件组,而不用备份后恢复整个数据库。
SQL server数据库在安装时默认创建了4个系统数据库,分别是master,tempdb,model和msdb.
master:是SQL server中最重要的数据库.记录SQL server实例的所有系统级信息,包括实例范围的元数据,端点,链接服务器和系统配置设置。
tempdb:一个临时数据库.用于保存临时对象或中间结果集。
model:用于SQL server实例上创建的所有数据库的模板,对model数据库进行的修改将应用于以后创建的所有数据库。
msdb:用于sql server代理计划警报和作业。
P24. SQL Server对象标识符的命名规则。
对象标识符是在定义对象时创建的标识符,随后用于引用改对象.
>.标识符首个字符必须是"_","@","#" 或者字母开头,别整其他稀奇古怪的玩意.
>.标识符后续的字符,可以是数字和字母,千万别把运算符整进去(+-*/^),如果必须要用的话,请用方括号(分隔标识符)括起来,比如[ 我 + 你 ] 这里面又有空格,又有运算符,但不得不说,你咋想的?
>.整个标识符不能包含空格,并且不能是保留字和其他特殊字符
额外的: @开头表示局部变量或者参数,#开头是临时表或者过程,##全局临时对象
P28.创建数据库
一.菜单创建
二.SQL语句创建
create database mrkj --创建数据库mrkj on --主数据文件 (name=mrdat, --name 文件名,filename 文件路径 filename='G:\sql\mrkj.mdf', --指定主数据文件的路径 size=10, --文件大小 maxsize=100, --最大值 filegrowth=5) --标识增量 log on --事务日志文件 (name='mingrilog', --name 文件名,filename 文件路径 filename='G:\sql\mrkj.ldf', --指定事务日志文件的路径 size=8mb, --文件大小 maxsize=50mb, --最大值 filegrowth=8mb) --增长率
P31.修改数据库
一.修改所有者(管理员)
>.右击需要修改的数据库,选择属性
>.剩下的自己看着办
二.使用ALTER DATABASE语句修改数据库
ALTER DATABASE命令可以修改数据库的大小,缩小数据库,更改数据库的名称(仅限所有者).以下是参数但不说明:
>.ADD FILE
>.TO FILEGROUP
>.ADD LOG FILE
>.REMOVE FILE
>.ADD FILEGROUP
>.MODIFY FILE
>.MODIFY FILEGROUP
>.SET
P33.删库(跑路?)
不可恢复!
不可恢复!
不可恢复!
删除数据库,必须要满足以下条件:
>. 取消日志传送操作。
>.若要删除为事务复制发布的数据库或删除为合并复制发布或订阅的数据库,必须首先从数据库中删除备份,如果数据库已损坏,不能删除备份,可以先设置数据库为脱机状态,然后再删除数据库。
>.删除数据库快照
>.老板同意
界面删除,如下图
使用DROP DATABASE 删除.
DROP DATABASE m1,m2,m3... --同时删除多个数据库
另外,正在被USE的数据库无法被删除
第四章 操作数据表
P37 基本数据类型
>. 基本类型
>.用户自定义类型 (EXEC sp_addType 指令)
自定义数据类型可以像基本类型一样正常应用.
delphi IdSMTP发送邮件 - zyb2016 - 博客园 (cnblogs.com)
FOR XML (SQL Server) - SQL Server | Microsoft Learn
P39.数据的完整性
>.空值与非空值.表中的每一列(字段)都有一组属性,如数据类型,数据长度和为空性等.列可以定义为"允许空值(null)" 和"不允许空值(not null)"
>.默认值.在创建表时,使用关键字DEFAULT设置默认值
>.特定标识属性.比如自增值(IDENTITY / aɪˈdɛntəti / )
>.约束.即限制.强制限制用户数据合理化.自动维护数据库的完整性.主要有以下几种约束(后面再详细讲)
>.非空(Not Null)
>.检查(Check)
>.唯一性(Unique) / juːˈniːk /
>.主键(Primary key) / ˈpraɪˌmɛri /
>.外键(Forergn key) / ˈfɔːrɪn /
P40.数据表的创建与管理
>.操作表
>.使用use +数据库名称,转到对应数据库的工作环境
>.使用Create table 语句创建新表
>.使用Alter Table 语句修改表结构
>.使用Drop Table 语句删除表
>.操作数据
>.使用Insert 语句添加数据
>.使用Update 语句修改数据
>.使用Delete 语句删除数据(如果不指定Where条件,会删除表内的所有记录)
P50.创建,删除和修改约束
约束是SQL Server提供的自动强制数据完整性的一种方式,它定义列的取值规则,是强制完整性的标准机制.
>.非空约束(Not Null).
>.主键约束(primery key)
>.唯一约束(Unique)
>.检查约束(Check)
>.默认约束(Default)
>.外键约束(Foreign key)
以下是一些简单的实例,帮助大家深入体会这些约束是如何使用的.
CREATE TABLE myTable ( id INT NOT NULL PRIMARY KEY, -- 主键约束,唯一标识每一行的值 name VARCHAR(50) NOT NULL, -- 非空约束,name字段不允许为空值 age INT CHECK (age >= 18), -- 检查约束,age字段的值必须大于等于18 email VARCHAR(50) UNIQUE, -- 唯一约束,email字段的值必须唯一 phone VARCHAR(20) NULL, -- 允许为空值 gender CHAR(1) DEFAULT 'M', -- 默认约束,gender字段的默认值为M created_at DATETIME DEFAULT GETDATE(), -- 默认约束,created_at字段的默认值为当前时间 department_id INT, -- 外键字段,用于引用department表中的id字段 CONSTRAINT FK_department FOREIGN KEY (department_id) REFERENCES department(id) -- 外键约束,保证department_id的值在department表的id字段中存在 );
请注意!上面的创建过程中,所有约束都没有起名,系统给自动安排一个比较"特别"的名字,在修改时会有点麻烦,需要在表属性的约束中才能找到
在修改约束时,不管是删除还是追加约束,总是会用到 constraint / kən’streɪnt / 这个关键字来操作,constraint 后面接的是约束的名字
作业: SQL SERVER为什么要给每个约束起名?这么多表,约束这么多,记不住 了怎么办?
-- 修改 NOT NULL 约束 ALTER TABLE myTable ALTER COLUMN name VARCHAR(50) NOT NULL; -- 修改 PRIMARY KEY 约束 -- 注意:在 SQL Server 中,修改主键约束需要先删除原有的主键约束,再重新添加新的主键约束 ALTER TABLE myTable DROP CONSTRAINT PK_myTable; --PK_myTable 是约束的名字,如果创建时没有起,就在表属性-约束下面找 ALTER TABLE myTable ADD CONSTRAINT id PRIMARY KEY (id); --CONSTRAINT id 这里的ID是给约束起名,PRIMARY KEY(id)中的ID是设置ID字段为主键字段 -- 修改 CHECK 约束 ALTER TABLE myTable DROP CONSTRAINT age; ALTER TABLE myTable ADD CONSTRAINT age CHECK (age >= 21); -- 修改 UNIQUE 约束 ALTER TABLE myTable DROP CONSTRAINT email; ALTER TABLE myTable ADD CONSTRAINT email UNIQUE (email); -- 修改 NULL 约束 -- 可以使用以下语句添加或移除 NULL 约束,NULL 约束的添加和移除只需在相应的列上进行修改即可 ALTER TABLE myTable ALTER COLUMN phone VARCHAR(20) NULL; ALTER TABLE myTable ALTER COLUMN phone VARCHAR(20) NOT NULL; -- 修改 DEFAULT 约束 -- 可以使用以下语句修改字段的默认值 ALTER TABLE myTable ADD CONSTRAINT gender DEFAULT 'F' FOR gender; ALTER TABLE myTable ADD CONSTRAINT created_at DEFAULT GETDATE() FOR created_at; -- 修改外键约束 ALTER TABLE myTable DROP CONSTRAINT department; ALTER TABLE myTable ADD CONSTRAINT department FOREIGN KEY (department_id) REFERENCES department(id);
下面是一个创建表时,给约束起名的标准示例:
CREATE TABLE myTable ( id INT CONSTRAINT PK_id PRIMARY KEY, name VARCHAR(50) CONSTRAINT NN_name NOT NULL, age INT CONSTRAINT CK_age CHECK (age >= 18), email VARCHAR(50) CONSTRAINT UC_email UNIQUE, phone VARCHAR(20) NULL, gender CHAR(1) CONSTRAINT DF_gender DEFAULT 'M', created_at DATETIME CONSTRAINT DF_created_at DEFAULT GETDATE(), department_id INT CONSTRAINT FK_department_id REFERENCES department(id) );
>.主键带PK前缀
>.非空带NN前缀
>.检查带CK前缀
>.唯一带UC前缀
>.默认值带DF前缀
>.外键带FK前缀