因本人较懒,有些图片缺失和东西写的比较简单,请多包涵php
编码规范: 命名的规范(入乡随俗)java
编码习惯:算法
团队合做: 团队配置管理软件: (TFS SVN)sql
第一章数据库
更改身份验证模式:服务器 属性 安全性缓存
Master: 记录全部系统信息安全
Model: 模板服务器
Msdb: 自动备份网络
Tempdb: 临时资源并发
经常使用的数据库对象: 表, 视图, 存储过程, 触发器, 用户自定义的函数, 索引等
文件构成:主数据文件(主数据文有且只有一个.mdf), 次要数据文件.ndf(0 ~ n个), 事务日志文件(增删(修改一条)改(修改两条).ldf)(至少一个)
第二章
Catalog(数据库)
数据库就是数据的仓库
由表, 关系, 操做对象组成
数据存储在表中(数据以记录的形式存在表中, 记录是客观存在的一个事物, 表的列)
定义表: 先定义表结构(列或字段 数据类型 约束)(从对象来的)
定义类: 属性(字段), 方法(class 类名 { })(从对象来的)
行(record) 列(colum) 字段(field)
经常使用数据类型
Unicode(用两个字节的长度 存储一个字符)
Char比varchar效率高
数据完整性: 实体完整性(对象: 数据行 要求全部行都有惟一的标识符(主键))(实施手段: 主键约束, 惟一约束, 标识列和GUID列),
域完整性(列, 字段)(数据类型, 格式, 值域范围, 是否容许为空)(限制数据类型, 检查约束, 外键约束, 默认值和非空约束),(字符, datatime加单引号)
参照完整性(引用完整性)(主外键关系)(不容许引用不存在的实体),
用户自定义完整性(多用触发器实现)(指数据的精确性和可靠性)
主键是数据行的惟一标识, 不重复的列才能当主键
业务主键 逻辑主键
主键选取原则(量少性, 稳定性)
GUID数据类型(uniqueidentifier)(newid()函数调用)
在字表中建立主外键关联(外键引用主表的主键)
(删除数据truncate, 主表用不了)
外键在子表中建 (自引用是容许的(递归中能够出现))
第三章
SQL
T-SQL (微软的), PL/SQL(Oracle的(甲骨文公司的))
数据查询语言: DQL(query: 查询)select(侧重对数据的操做)
数据操做语言: DML(insert, update, delete)(对数据库)
事物处理语言: TPL (begin transaction 开始事务, commit提交, rollback回滚)
数据控制语言: DCL (grant受权 revoke取消受权)
数据定义语言: DDL (create(建立) drop(删除) alter(更新/修改)(定义数据库及其对象(侧重结构))
指针控制语言:CCL (declare cursor(声名游标), fetch into(获取游标中的数据到变量中))
sys.sysdatabases
DB_ID(判断数据库)
建立表
1. 肯定表结构
2. 肯定每列的数据类型
3. 添加约束
4. ...
OBJECCT_ID(判断表)
ALTER TABLE
add constraint 添加约束
drop constraint
PK主键(primary key)
UQ惟一(unique)
CK检查(check)
DF默认
FK外键(foreign key references(引用))
第四章
insert: 插入语句
批量插入
--建立数据库
use master;
--select * from sys.sysdatabases;
go
if DB_ID('StuDB')is not null drop database StuDB;
go
create database StuDB;
go
--建立表
use StuDB; --打开数据库
go
--select * from sys.sysobjects;
if OBJECT_ID('t_classInfo') is not null drop table t_classInfo; --t_bassic_classInfo TBa_ClassInfo
go
create table t_classInfo
(
ClassId char(3) not null primary key,
ClassName varchar(30) not null,
Comment varchar(150)
)
if OBJECT_ID('t_student') is not null drop table t_student;
go
create table t_student
(
StuId char(3) not null primary key,
StuName varchar(30) not null,
Birthday date,
Gender varchar(4),
ClassId char(3)
)
--添加约束
alter table t_student
add constraint DF_t_student_Gender default('男') for Gender;
alter table t_student
add constraint CK_t_student_Gender check(Gender in ('男', '女', '未知'));
alter table t_student
add constraint FK_t_student_ClassId foreign key (ClassId) references t_classInfo(ClassId);
--科目表 t_course(CourseId, CourseName, Comment)
if OBJECT_ID('t_course') is not null drop table t_course;
go
create table t_course
(
CourseId char(3) not null primary key,
CourseName varchar(30),
Comment varchar(150)
)
go
--成绩表t_score(Id, StuId, CourseId, Score)成绩大于等于0 小于等于100 兼容一位小数
if OBJECT_ID('t_score') is not null drop table t_score;
go
create table t_score
(
Id int identity primary key,
StuId char(3), --references t_student(StuId),
CourseId char(3), --references t_course(CourseId),
Score numeric(4,1)
)
go
--添加约束
alter table t_score
add constraint FK_t_score_StuId foreign key (StuId) references t_student(StuId);
alter table t_score
add constraint FK_t_score_CourseId foreign key (CourseId) references t_course(CourseId);
alter table t_score
add constraint CK_t_score_Score check(Score >= 0 and Score <= 100)
select * from t_classInfo
insert into dbo.t_classInfo(ClassId, ClassName) values('C01','Web班');
insert into dbo.t_classInfo(ClassId, ClassName) values('C02','.net班'),
('C03','java班'),
('C04','php班');
--把查询结果插入到现有表中(insert select(表必须预先存在))
insert into dbo.t_classInfo(ClassId, ClassName)
select '','' union
select '','' union
select '','';
--用查询结果生成新表
--不使用create语句建立一个表结构和t_classInfo表结构相同的表,里面不插入任何数据
select * from t_classInfo
select top 0 * into t_class from t_classInfo
drop table t_class
select * from t_class
--#表名(临时表(保存在服务器内存中 会话结束会自动销毁))
--修改数据 不加where就是修改全表数据
update t_classInfo set ClassName = 'DotNet班',comment = '123' where ClassId = 'C02';
--删除数据行
delete from t_classInfo where ClassId = 'C04';
--*表明全部字段
第五章
is null
is not null(正规)(获取非空数据)
not + 字段 + is null (对条件取反)
规格:在sql语句中 若是字符串中有”’”,须要使用两个”’”进行替代
distinct:去除重复记录
union: 将多个查询结果合并成一个,自动去除重复行(加all 保留重复行)
使用union 进行数据排序要写在最后一个select中 而且只能使用第一条语句中出现的字段
表联结
交叉链接(cross join)
内联结(inner join) 执行原理:首先执行cross join(进行笛卡儿积产生笛卡尔集)使用on中的条件进行过滤(等值链接)
外联结:
左外联结: (left join)
右外联结: (right join)
Left (right) join执行原理: 首先执行inner join,把表中都有的数据过滤出来,两个表中没有匹配到的数据看保留字 若是是left,则把左表中没有匹配到的数据放入结果集中,不然相反(没有匹配上的字段的值以null值进行填充)
select * from t_student t0, t_class t1 where t0.ClassId = t1.ClassId;(等同于inner join)
等值链接丢数据
数据库进阶
数据库设计(Database Design)
Designer: 设计者
数据库设计,根据用户需求 在某一具体的数据库管理系统上,设计数据库的结构和创建数据库的过程
良好的设计能够(节省数据的存储空间,能保证数据的完整性,方便进行数据库应用系统的开发)
糟糕的数据库设计(数据冗余、存储空间浪费, 内存空间的浪费, 数据更新和插入的异常)
设计基本步骤:
用户需求已经明确
(建模 模型转换 规范化(三大范式))(实体 Entity)
范式(
第一范式: 确保每列的原子性(最小的原子单元)(行与列的交叉点不能存在一组值)
第二范式: 知足第一范式并除主键列都依赖于主键(每一个表只描述一件事)(复合主键: 不能存在部分依赖关系(与每一个主键都有依赖关系))
第三范式:知足第二范式并处主键之外的其余列都不传递依赖于主键列
)(计算列属于冗余列 可是查询性能会提高的话容许保留(性能比规范化更重要))
(沟通 语言表达(少说 多看 多听) 逻辑 条理(停5秒 分点))
(工程实例)
第二章
批处理: 效率高(严格区分大小写)(末尾加go(批处理的标志))(业务相关的语句放在同一个批处理中)
变量:变量是能够在程序运行期间变化的程序元素; 变量在任何程序中充当存储信息的存储器,保存在内存中; 程序运行时,为了完成算法,某些变量会发生变化; 变量都有本身所属的数据类型
局部变量:用户定义的(只能在同一批处理中使用(局部变量不能跨越批处理))
全局变量:只读的(系统维护和控制赋值)
set 一次只能为一个变量赋值
select 一次能够为多个变量赋值, 能够经过查询语句 批量赋值
convert 数据类型转换函数(目标类型, 要转换的变量)
局部变量须要初始化后使用, 不然值为null, 会致使后续结果为空
经过查询语句为变量赋值,必须保证查询结果返回一条记录,不然获取的是最后一条记录
select @a = a, @b = b from Table_A
@@ERROR 最后一个T-SQL语句的错误号
@@IDENTITY 最后一次插入的标识值
@@ROWCOUNT 受上一个SQL语句影响的行数
@@FETCH_STATUS 返回针对链接当前打开的任何游标发出的上一条游标 FETCH 语句的状态
标量:一对一
子查询
法一:采用T-SQL变量实现
declare @avgMoney money;
select avg(TotalMoney) from dbo.Tme_OrderInfo;
select * from dob.Tme_OrderInfo where totalMoney > @avgMoney;
法二:采用子查询
select * from dbo.Tme_OrderInfo where totalMoney > (select avg(TotalMoney) from dbo.Tme_OrderInfo)(子查询与判断符号一块儿用时必须保证查询结果只能有一个)
in 表示在列表中存在
exists 存在检测(检测是否存在)(返回值为true 或 false)
相关子查询:依赖于外部查询,不能独立调用;相关子查询效率低
在逻辑上,独立要先执行一次 只执行一次; 相关要在外部行执行的时候单独计算一次
何时用相关子查询:和本身比较的时候
exists 子查询
if exists (select * from sys.sysobjects where name = ‘test’) drop table test;
go
派生表
把子查询当表来用
第五章
索引:常规的未做索引的表中的行不会以特定的顺序存储,无序状态的表被称为堆(不用查询每行数据,有效的提升查询性能)
索引包含从表或视图中一个或多个列生成的键,映射到指定数据的存储位置的指针
键存储在一个 B树 (balance tree)中 快速有效的查找键值关联的行
只会对索引行加锁, 提升并发检索速度
汇集索引:表中各行的物理顺序和键值的逻辑(索引)顺序相同(每一个表只能有一个)(不容许空值)(选用以范围查询的列)(频繁更新的列和非惟一的列一般不选用汇集索引)(避免很是多或很是宽的键上建立汇集索引)(create table 和 alter table 建立主键会默认建立汇集索引)
非汇集索引:除汇集索引的索引 能够有多个 但要小于249个()(指针指向位于索引页中指针对应的物理数据)(页级别上不包含所有数据)
惟一索引:容许空值: 只能有一个(不容许两行具备相同的索引值)(实施实体完整性)(在建立主键约束和惟一性约束时自动建立)
非汇集索引建立原则:索引不是越多越好 (当选择用在非汇集索引的列时,要查找在where join order by 子句中频繁引用的那些列)(一个索引最多可使用16个列 全部索引键列组合起来不超过900字节)
常常插入操做的表上, 使用Fillfactor(填充因子)建索引减小页拆分
unique 惟一索引
clustered 汇集索引
nonclustered 非汇集索引
ix_ 代指索引
多列用 , 分隔 desc 降序 不加为升序
fillfactor = 填充因子 (百分比)
split(拆分)
视图
(封装)放在from子句中(能够看成表来用)
视图的做用:
1,能够筛选表中的行
2,防止未经许可的用户访问敏感数据
3,下降数据库的复杂度
4,将多个物理数据库抽象为一个逻辑数据库
create view (name) as (select语句) go
Exec sp_helptext ‘视图名称’;
encryption(加密)
可更新视图
insert update delete 等操做只能引用一个表中的列, 不容许直接修改基础表 只容许修改视图
可更新视图中不能包含聚合函数, select语句中不能使用group by 或 having子句, insert update delete 语句更新 发生变化的数据只能来自一个表, 必须包含基表的必填列, 视图不知足以上条件 能够只用 instead of触发器更新
第七章 事务
--建立银行信息表
if object_id('Account') is not null drop table Account;
go
create table Account
(
AccountId char(4) primary key,
Name varchar(20) not null,
Balance decimal(18, 2) not null
);
go
alter table Account add constraint CK_Account_Balance check (Balance >= 2);
insert into Account values
('0001', 'zhangsan', 2),
('0002', 'zhangsi', 20000);
select * from Account;
begin transaction
begin try
update Account set Balance = Balance + 20000 where AccountId = '0001';
update Account set Balance = Balance - 20000 where AccountId = '0002';
commit transaction;
end try
begin catch
rollback transaction
end catch
每条查询语句自成一个事务(transaction)
事务是做为单个逻辑工做单元执行的一系列操做, 是一个不可分割的工做逻辑单元
事务的属性:
原子性(Atomicity)必须是原子工做单元 不可分
一致性(Consistency)事务完成时, 数据处于一致状态
隔离性(Isolation)并发的事务时彼此隔离的 互不影响
永久性(Durability)事务完成就永久保存
begin transaction 开始事务
commit transaction 提交事务
rollback transaction 回滚事务
save tran 建立事务保存点(rollback把事务保存点以后的操做回滚 (回到事务保存点))
自动提交事务: 每条单独的T-SQL语句做为一个事务成功自动提交 错误自动回滚
显示事务: Begin transaction 指定事务的开始
隐性事务:set implicit transactions on 语句
事务的嵌套(父事务, 子事务)父事务回滚的时候以提交的子事务也会回滚
锁 是事务获取的一种控制资源 (保护数据资源, 防止其余食物对数据进行冲突或不兼容的访问)
数据并发访问时怎么保证数据的安全性
排它锁:修改数据时 事务会为所依赖的数据资源请求排它锁, 一旦授予, 事务将一直持有排它锁, 直至事务完成
共享锁:读取数据时, 事务默认会为所依赖的数据资源请求共享锁, 读操做一完成,就当即释放资源上的共享锁(不是长期独有占用)(表后边加with (xlock))
存储过程的概念和分类
存储过程是一组预先编译好的T-SQL代码, 做为一个总体用于执行特定的操做, 存储过程属于数据库对象,它们存放在数据库中, 须要时用户能够调用, 存储过程首次执行的时候, Sql Server建立执行计划并把它存储在计划内存缓存中,而后Sql Server就能对存储过程的后续执行重用计划, 合同没有编译且没有准备好的等价即查询相比,重用计划使得存储过程提供了更快速更可靠的性能
存储过程是数据库对象
存储过程能够包含数据操做语句,变量,逻辑控制语句等
存储过程的优势:执行速度快,容许模块化程序设计,提升系统安全性,减小网络流通量
系统存储过程 (经常使用的:sp_databases, sp_tables, sp_columns, sp_help, sp_helpconstraint, sp_helpindex, sp_helptext)
用户自定义存储过程
有默认值就必须都有默认值 没有就都没有
row_number 生成连续递增行号
游标和触发器
使用的五个步骤
声明游标(declare cursor for),打开游标(open),提取数据(循环),关闭游标(colse),释放游标(deallocate)
insensitive(使用游标时,对源表数据的更新不敏感,而且不容许经过游标修改源表数据)
scroll 设置fetch语句中参数first(上一条),last,prior,next,relative,absolute
read only 只读
update 定义可经过游标更新的列
fetch into select列的数据和变量列表数据一致
@@fetch_status全局变量 等于 0 是表示成功读取到数据行了
游标默认指向第一条记录以前
游标是逐条处理的工具
动态SQL EXEC(‘语句’)
触发器(跨表的check)(一种特殊的存储过程)(强制的约束)
完成复杂的数据约束,检查所作的sql操做是否容许,修改其它数据表里的数据,调用更多的存储过程,返回自定义的错误信息,更改本来要操做的sql语句,防止数据表结构被更改或数据表被删除
优势:自动的,层叠更改,强制限制,能够用于跟踪
dml触发器, ddl触发器, 登陆触发器
dml触发器:表或表的视图上执行能够触发,触发器和触发的语句在触发器内单个事务对待,检测到的错误,自动回滚
after触发器:记录已经更改完以后触发,检测到错误,能够回滚本次操做
instead of:取代本来要进行的操做
create trigger(建立触发器)
权限默认为数据库全部者,不得转让,严重减慢数据修改操做的性能,不能对系统表和临时表建立,不记录日志的更新不会引发dml触发器的触发
encryption 加密(for | after 都表明after触发器)
inserted表(存储着insert操做插入的行和update操做的新行) deleted表(村粗这update操做的旧行和delete操做删除的行)(两个逻辑表,有系统来维护,不容许用户直接修改)
第十章 函数
函数是用于封装频繁执行的逻辑的例程
存储过程只能用exec调用 不能放from后边当表来用(能够有返回值,仅限于整形)
任何须须执行的代码均可调用函数
函数是由一条或多条T-SQL语句组成的例程,可用于封装代码以便进行复用。函数接受零个或多个输入参数,并返回标量值或表,函数不支持输出参数
函数能够返回标量值,能够返回表
udf 用户定义函数(标量函数((用于将当前的值转换为新值,根据参数进行复杂的查找)返回单个数据值,类型在returns子句中定义),
内联表值函数(返回一个表,单个select语句的结果),
多语句表值函数(由一条或多条T-SQL语句构建的表(和存储过程不一样,多语句表值函数能够在select语句的from子句中进行引用)))
create function (函数名) returns(返回值类型)(子句)begin return (函数体) end
内联表值函数:一般使用视图的任何地方使用内联表值函数(内联用户定义函数)
create function ruturns + 变量名(将来返回的表) + table(类型) + (表结构 类型字段的定义) + begin return(后边什么也不加) end
内联表值函数 能够有逻辑结构
聚合函数通常出如今select子句或having子句中
Sql 知识点
1. 数据完整性的实现方式
2. 经常使用系统存储过程和系统变量的做用
3. 区分批量插入数据的两种语句
4. 掌握单条select语句的执行过程和书写顺序
5. 分组 分组后的筛选 排序的应用
6. 子查询的应用
7. 事务的定义 特性,类型,事务相关操做所使用的语句
8. 存储过程的概念 优势 将复杂操做封装到存储过程当中
9. 触发器工做原理
10 三大范式的规范定义
11. 视图的概念 优势 视图的应用
12. 游标的概念,利用游标解决实际问题
版权声明:本文版权归做者和博客园共有,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文链接,不然保留追究法律责任的权利。
做者:黯淡の青春 博客地址:http://www.cnblogs.com/wuwangqianxun/