北大青鸟S2sql数据库设计和高级查询总结
第一章 数据库的设计良好的数据库设计1、节省数据库的存储空间2、能够保证数据的完整性3、方便进行数据库应用系统的开发糟糕的数据库设计1、效率低下2、更新和检索数据时会出现许多问题设计数据库的步骤1、需
第一章 数据库的设计
良好的数据库设计
1、节省数据库的存储空间
2、能够保证数据的完整性
3、方便进行数据库应用系统的开发
糟糕的数据库设计
1、效率低下
2、更新和检索数据时会出现许多问题
设计数据库的步骤
1、需求分析阶段 分析客户的业务和数据处理需求
⑴ 收集信息
⑵ 标识对象(实体)
⑶ 标识每个对象需要存储的详细信息
⑷ 标识对象之间的关系
2、概要设计阶段 绘制数据库的E-R 模型图(实体关系图)
3、详细设计阶段 将E-R 图转换为多张表, 进行逻辑设计, 并应用数据库设计的三大规范进行设计
4、代码编写阶段
映射基数
1一对一
2一对多
3多对一
4多对多
实体关系图
矩形表示实体集
椭圆形表示属性
菱形表示关系集
直线用来连接
设计数据库问题
1 信息重复
2 更新异常
3 插入异常(无法表示某些信息)
4 删除异常(丢失有用的信息)
数据库设计的三大规范理论
一 第一范式的目标是确保 每列的原子性
二 第二范式的目标是确保 表中的每列都和主键相关
三 第三范式的目标是确保 每列都和主键直接相关, 而不是间接相关(不能传递依赖)
,规范化和性能的关系
在必要的情况下 允许适当的数据冗余
第二章 数据库的实现
一 建库
ues master
go
if exists (select * from sysdatabases where name ='数据库名字')
drop database 数据库名 --判断这个数据库名字是否存在, 如果存在 删除 create database 数据库名
on [primary]
(
name='',
filename='',
size ='', 建立数据库的主文件 如果需要建立次要文件(ndf) 用逗号隔开 maxsize ='',
filegrowth =''
)
log on
(
name ='',
filename='',
size ='', 建立日志文件 如果建立多个日志文件 在后面用逗号隔开 maxsize ='',
filegrowth =''
)
go -- 批处理
二 建表
ues 数据库名字
go
if exists (select * from sysobjects where name ='表名')
drop table 表名 --判断是否有这个名字的表
create table 表名
(
字段名 数据类型 列的特征
如 stuid int identity(1,1) not null --identity 表示是否为自动增长
)
go
,三 加约束
1 主键约束(primary key constraint) --constraint 约束
alter table 表名
add constraint 约束名(PK_***) primary key(约束的字段)
2 唯一约束(unique constraint)
alter table 表名
add constraint 约束名(uq_***) unique(约束的字段)
3 检查约束(check constraint)
alter table 表名
add constraint 约束名(ck_***) check(约束的条件)
4 默认约束(default constraint)
alter table 表名
add constraint 约束名(df_***) default('默认值') for 约束的字段
5 外建约束(foreign key constraint)
alter table 表名
add constraint 约束名(fk_***) foreign key(约束的字段) references 主表的表名(主表的字段)
总结
create database 建库
create table 建表
add constraint 加约束
drop database 删库
drop table 删表
drop constraint 删约束
use master select * from sysdatabases 判断是否有库名
select * from sysobjects 判断是否有表名
完整性
1 实体完整性(保证数据是唯一的如主键唯一键标示列)
2 引用完整性(保证两表数据一致如外键)
3 域完整性(保证数据的准确性如检查约束默认约束非空)
三层安全模型
1 登陆帐号-- 决定登陆服务
windows 身份验证
exec sp_grantlogin 'windows域名域帐户'
sql 身份验证
exec sp_addlogin '帐户名',' 密码'
2 数据库用户--访问数据库
use 数据库名
go
exec sp_grantdbaccess '登陆帐户',('数据库用户') 如果不写数据库用户默认为登陆帐号名 3 权限 --在数据库里的操作
,use 数据库名
go
grant 权限(增, 删, 改, 查, 建表(create table)) on 表名 to 用户名
第三章 T-SQL 编成
使用变量
一局部变量
declare @变量名 类型
赋值: 1、 set @变量名 = 值
2、 select @变量名 =值
二全局变量
@@error 最后一个T-SQL 错误的错误号
@@identity 最后一次插入的标示值
@@language 当前使用的语言的名称
@@max_connections 可以创建的同时连接的最大数目 @@rowcount 受上一个sql 语句影响的行数
@@servername 本地服务器的名称
@@servicename 该计算机上的sql 服务的名称 @@timeticks 当前计算机上每刻度的微秒数 @@transcount 当前连接打开的事物数 @@version sql server 的版本信息
输出语句
1、print 局部变量或字符串
2、select 局部变量 as 自定义列名(查询语句的特殊应用)
逻辑控制语句
1、
if(条件)
begin -- 开头
语句
end --结束
else --为可选
begin -- 开头
语句
end --结束
2、
while (条件)
语句
[break]
,3、
case
when 条件1 then 结果1
when 条件2 then 结果2
[else 其他结果]
end
批处理语句
以一条命令的方式来处理一组命令的过程称为批处理
批处理的好处就是能够简化数据库的管理
第四章 高级查询
一 简单子查询
select *** from 表1 where 字段1 >(子查询) 它等于一个等值内连接
将子查询和比较运算符联合使用,必须保证子查询返回的值不能多与一个
二 in 和 not in 子查询
in 后面的子查询可以返回多条记录
select *** from 表1 where 字段1 in(not in)(子查询)
三 exists not exists子查询
if exists (子查询)
语句
如果子查询的结果非空,则exists(子查询) 将返回真(true) ,否则返回假(false)
第五章 事务、索引和试图
一 事务:是一个整体,要么都成功,要么都失败
事务时作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有4个属性 1 原子性(atomicity)
事务是一个完整的操作。事务的各元素是不可分得
2 一致性(consistency)
当事务完成时,数据必须处于一致状态
3 隔离性(isolation)
对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的, 它不应以任何方式依赖于或影响其它事务
4 持久性(durability)
事务完成之后,它对系统的影响是永久的
简称 ACID
,二 如何创建事务
开始事务:begin transaction
提交事务:commit transaction
回滚(撤销) 事务: rollback transaction
事务的分类有3种
1 显示事务: 用 begin transaction 明确指定事务的开始
2 隐式事务: 通过设置 set implicit_transaction on 语句, 将隐式事务模式设置为打开
3 自动提交事务: 这是sql server 的默认模式 它将每条单独的T-SQL 语句视为一个事务. 如果成功执行, 则自动提交. 如果错误, 则自动回滚.
在这里用的了全局变量@@error
declare @errorsum int
set @errorsum =0
语 句
set @errorsum =@errorsum @@error
三 什么是索引
索引, 它是sql server编排数据的内部方法, 相当于字典中的目录
索引页, 数据库中存储索引的数据页
通过索引可以大大提高数据库的检索速度, 改善数据库性能
加快查询的速度(通过平衡二叉树)
增删改 速度慢, 所需要的空间大
索引可分为3类
1 唯一索引: 唯一索引不允许两行具有相同的索引值.
创建了唯一约束, 将自动创建唯一索引, 为了最佳性能, 建议使用主键的约束
2 主键索引: 在数据库关系图中为表定义一个主键将自动创建主键索引, 主键索引是唯一索引的特殊类型.
3 聚集索引: 在聚集索引中, 表中各行的物理顺序与健值的逻辑(索引) 顺序相同.
非聚集索引: 表中各行的物理顺序与键值的逻辑顺序不匹配.
在sql server 中, 一个表只能 创建一个聚集索引, 但可以有多个非聚集索引, 设置某列为主键, 该列就默认为聚集索引
四 建立索引
create [unique][clustered][nonclustered] index ix_(name)
on 表名 (字段名)
with fillfactor =30
1 unique 指定唯一索引 可选
2 clustered nonclustered 指定是聚集索引还是非聚集索引, 可选
3 fillfactor 表示填充因子, 指定0--100的值, 该值指示索引页填满的空间所占的比例 (百分比越小, 所留得空白空间越大)
什么情况下可以建立索引
1 该列用于频繁搜索
2 该列用于对数据进行排序
请不要对下面的列创建索引
,1 列中仅包含几个不同的值
2 表中仅包含几行.
五 什么是试图
试图使另一种查看数据库中一个或多个表中的数据的方法. 它是一种虚拟表
试图通常用来进行以下三种操作
1 筛选表中的行
2 防止未经许可的用户访问敏感数据
3 将多个物理数据表抽象为一个逻辑数据表
(降低数据库的复杂程度)
好处
1对最终用户的好处
结果更容易理解
获得数据更容易
2对开发人员的好处
限制数据检索更容易
维护应用程序更方便
六 如何创建试图
create view view_(name)
as
(select 语句)
第六章 存储过程
一 什么是存储过程
存储过程(procedure)类似于java 语言中的方法,它是sql 语句和控制流语句的预编译集合。 存储过程的优点
1 允许模块化程序设计
2 允许更快地执行
3 减少网络流量
4 可作为安全机制使用
存储过程分为以下两类
1 系统存储过程
2 用户自定义的存储过程
3 扩展存储过程(系统定义好的,以xp_开头)
二 常用的系统存储过程
所有的系统存储过程的名称都以sp_开头
sp_databases (列出服务器上的所有数据库)
,sp_helpdb (报告有关指定数据库或所有数据库的信息)
sp_renamedb (更改数据库的名称)
sp_tables (返回当前环境下可查询的对象的列表)
sp_columns (返回某个表列的信息)
sp_help (查看某个表的所有信息)
sp_helpconstraint (查看某个表的约束)
sp_stored_procedures (列出当前环境中的所有存储过程)
sp_password (添加或修改登陆帐号的密码)
sp_helptext (显示默认值、未加密的存储过程、用户定义的存储过程、触发器或试图的实际文本)
扩展参数
exec xp_cmdshell dos命令 [no_output]
三 用户定义的存储过程
1 创建不带参数的存储过程
create proc[edure] 存储过程名
[
@参数1 数据类型 [默认值] [output]
@参数2 数据类型 [默认值] [output]
]
as
sql 语句
2 创建步带参数的存储过程
1 输入参数
可以在调用时向存储过程传递参数,此类参数可以用来在存储过程中传入值 2 输出参数(引用传递)
如果希望返回值,则可以使用输出参数,输出参数后有'output' 标记,执行存储过程后, 将把返回值存放在输出参数中,可供其它T-SQL 语句读取访问
3 创建带输出参数的存储过程
如果希望调用存储过程后,返回一个或多个值,这时需要使用输出(output)参数。
使用输出参数创建存储过程时,在参数后面需要跟随'output' 关键字,调用时也需要在变量后跟随'output' 关键字
四 处理错误信息
如果存储过程变得越来越复杂,则需要在存储过程中加入错误检查语句
raiserror ({msg_id|msg_str}{,severity,state}[with option[,...n]])
例 raiserror('及格线错误,请指定0-100之间的分数,统计中断退出',16,1)
msg_id 在sysmessages 系统表中指定的用户定义错误信息
msg_str 用户定义的特定信息,最长255个字符
severity 与特定信息相关联,表示用户定义的严重性级别。用户可使用的级别为0-18级(一般下为16)
19-25级是为sysadmin 固定角色的成员预留的,并需要指定with log选项 20-25
,为致命错误
state 表示错误的状态,是1-127的值
option 指示是否将错误记录到服务器错误日至中