数据库的总结

  1 1.SQL Server数据库基础
  2 
  3 1-1:使用数据库的必要性
  4     a.可以结构化存储大量的数据信息,方便用户进行有效的检索和访问。
  5     b.可以有效地保持数据信息的一致性、完整性,降低数据冗余。
  6     c.可以满足应用的共享和安全方面的要求。
  7     d.数据库技术能够方便智能化地分析,产生新的有用信息。
  8 1-2:DBMS(数据库管理系统)的发展史
  9     a.萌芽阶段--文件系统
 10     b.初级阶段--第一代数据库
 11     c.中级阶段--第二代数据库
 12     d.高级阶段--新一代数据库
 13 1-3:当今数据库简介
 14     a.SQL Server简介
 15         (1)企业版(SQL Server 2005 Enterprise Edition)
 16         (2)标准版(SQL Server 2005 Standard Edition)
 17         (3)工作组版(SQL Server 2005 Workgroup Edition)
 18         (4)开发版(SQL Server Developer Edition)
 19         (5)评估版(SQL Server Evaluation Edition)
 20      b.Oracle简介
 21         Oracle是一种大型的数据库,用于大型的网站开发使用,它的配置、管理、系统维护成为了一种专门的技术,涉及到比较多的、系统的专业知识。
 22     c.DB2简介
 23         DB2数据库核心又称为DB2通用服务器,不但可以运行于多种操作系统之上,而且它根据相应的平台环境做了调整和优化,以便能够达到更好的性能。其它数据库如:SyBase、MySQL等等,在不同的行业、不同的应用场合也有一定的应用。
 24 1-4:数据库的基本概念
 25     a.实体和记录(实体是所有客观存在的,不同的数据体现了不同的实体。数据库当中的每一行又叫做一条记录)
 26     b.数据库和数据库表(不同的记录组织在一起,形成了数据库的"表"。表是实体的集合,是用来存储具体的数据的。关系,通过建、类型、规则、权限、约束、触发器等抽象概念来表达。通常说"把数据存到数据库当中",其实就是存到"数据库的表当中")
 27     c.数据库系统和数据库管理系统(数据库管理系统【DBMS】是一种系统软件,由一个互相关联的数据集合和一组访问数据的程序构成。这个数据集合通常称为数据库。 数据库系统【DBS】是一个实际可运行的软件系统,可以对系统提供的数据进行存储维护和应用,它是有存储介质、处理对象和管理系统共同组成的集合体。它通常由软件、数据库和数据库管理员组成。)
 28     d.数据冗余(Redundance)【数据的重复性】和数据完整性(Integrality)【数据的准确性】【有些时候还是可以有少量数据的冗余现象】
 29 1-5:SQL Server 2005管理器
 30     SQL Server数据库按用途可分为:系统数据库和用户数据库
 31     Microsoft SQL Server提供以下数据库:
 32         (1)Master数据库(1.所有的登录账户和系统配置设置2.所有其他的数据库及数据库文件的位置3.SQL Server的初始化信息)
 33         (2)Tempdb数据库(在SQL Server每次启动时重新创建)
 34         (3)Model数据库(Model数据库用作在系统上创建所有数据库的模板)
 35         (4)Msdb数据库(Msdb数据库提供SQL Server代理程序调度警报、作业以及记录操作时使用)
 36     a.新建一个数据库连接(Window省份验证和SQL Server身份验证)
 37     b.新建数据库登录名
 38 1-6:创建和管理SQL Server数据库
 39     a.创建数据库
 40         (1)数据库文件(Database File)
 41         (2)事务日志文件(Transaction Log File)
 42         (3)文件组(File Group)【主文件组(Primary File Group)和此文件组(Secondary File Group)】
 43     b.数据库管理和维护
 44         (1)分离和附加数据库(数据库启动的时候,数据库文件时不可以粘贴和复制的)
 45         (2)设置数据库状态(属于脱机状态的数据库,文件是可以复制和粘贴的,点击联机即可联机)
 46         (3)收缩数据库
 47         (4)删除数据库(谨慎操作)
 48 2.SQL Server数据库表管理
 49 
 50 2-1:表的几个基本概念
 51     a.数据完整性(可靠性、准确性)
 52         (1)实体完整性约束【行】(索引、唯一约束、主键约束或标识列属性)
 53         (2)域完整性约束【列】(数据类型、检查约束、输入格式、外键约束、默认值、非空约束)
 54         (3)引用完整性约束(在输入或删除数据行时,引用完整性约束用来保持表之间已定义的关系 如:主表和子表)
 55         (4)自定义完整性约束(用户自定义完整性用来定义特定的规则。如果不满足要求则不能插入,这个时候就需要使用数据库的规则、存储过程或者触发器对象来进行约束)
 56      b.主键(Primary Key)和外键(Foreign Key)
 57         (1)主键
 58             表中有一列或几列组合的值能用来唯一地标识表中的每一行,这样的一列或者多列组合叫做表的主键。一个表只能有一个主键,主键约束确保了表中的行是唯一的;尽管表中可以没有主键,但是通常情况下应当为表设置一列为主键。如果两列或多列组合起来唯一地标识表中的每一行,则该主键也叫做"组合键";在选择哪列为主键时应该考虑连个原则:最少性和稳定性。
 59         (2)外键
 60             "外键"就是用来达到这个目的的,它是对应主键而言的,就是"子表"中对应于"主表"的列,在子表中称为外键或者引用键,它的值要求与主表的主键或者唯一键相对应,外键用来强制引用完整性。一个表可以有多个外键。
 61 2-2:建立数据库表
 62     
 63     a.在SQL Server Management Studio中建立数据库表
 64     b.确定列的数据类型
 65         (1)二进制数据类型
 66             binary varbinary image
 67         (2)文本数据类型
 68             char varchar nchar nvarchar text ntext
 69         (3)日期和时间
 70             datetime
 71         (4)数字数据
 72             int smallint tinyint bigint (float real)
 73         (5)货币数据类型
 74             Money
 75         (6)Bit数据类型
 76             Bit
 77     c.是否允许为空值(如果该列允许为空,则在输入数据行的时候,这一项可以不输入)
 78     d.建立主键
 79     e.默认值
 80     f.标识列(数据属于数字类型int,标识种子,标识增量,不重复)
 81 2-3:建立表间关系
 82 2-4:建立检查约束
 83 2-5:导入和导出数据
 84 2-6:删除表(谨慎小心)
 85 
 86 3.SQL Server数据管理
 87 
 88 3-1:SQL简介
 89     a.SQL和T-SQL(T-SQL【Transact-SQL是标准的SQL强化版】)
 90     b.T-SQL的组成
 91         (1)DML(数据操作语言):用来查询、插入、删除、修改数据库中的数据
 92         (2)DCL(数据控制语言):用来控制数据库组件的存取许可、存取权限等等
 93         (3)DDL(数据定义语言):用来建立数据库、数据库对象和定义其列大部分是以Create开头的命令,如:CreateTable、CreateView及Drop Table等等
 94 3-2:T-SQL中的条件表达式和逻辑运算符
 95     a.条件表达式
 96         (1)常量:表示单个指定数据值的符合(如:字符,数字、字)
 97         (2)列名(表当中列的名称,表达式中仅允许使用列的名称)
 98         (3){一元运算符}:仅有一个操作数的运算符
 99         (4){二元运算符}:将两个操作数组合执行操作的运算符
100             = > < >= <= <>不等于 !非
101         (5)通配符:通配符经常与like关键字一起配合使用
102             '_'一个字符  如:A Like 'C_'
103             %  任意长度的字符串 如:B Like 'CO_%'
104             [] 括号中所指定范围内的一个字符 如:C like '9W0[1-2]'
105             [^] 不在括号中所指定范围内的任意一个字符 如:
106 D LIKE like '9WO[^1-2]'
107             如:TelCode LIKE '13[5-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
108     b.逻辑表达式(IN 关键字用来限制范围)
109         T-SQL支持的逻辑运算符有And、Or和Not
110         如:Not (付款方式='信用卡') OR (信用卡 in ('牡丹卡','金汇卡','龙卡','阳光卡'))
111 
112 3-3:使用T-SQL插入数据
113     a.语法:insert [into] <表名> [列名] values <值列表>
114     b.一次性插入多行数据
115         (1)通过Insert Select语句将现有表中的数据添加到新表中
116             inset into TongXunLu (姓名,地址,电子邮件)
117             select SName,SAddress,SEmail
118             from Students
119         (2)通过Select Into语句将现有数据添加到新表中
120         select Students.SName,Students.SAddress,Students.SEmail
121         into TongXunLu
122         from Students
123         语法:
124         select identity(数据类型,标识种子,表示增量) as 列名
125         into 新表
126         from 原始表
127         修改为:
128         select Students.SName,Students.SAddress,Students.SEmail,identity(int,1,1)
129         as StudentID
130         into TongXunLu
131         from Students
132         (3)通过Union关键字合并数据进行插入
133         insert Students (SName,SGrade,SSex)
134         select '王军',7,1, union
135         select '李四',3,6, union
136         select '张三',4,1, union
137         select '小红',7,2
138 
139 3-4:使用T-SQL更新数据
140 
141     语法:update <表名> set <列名=更新值> [where <更新条件>]
142     如:
143     update Students
144     set SAddress="四川成都"
145     where SAddress="上海"
146 
147 3-5:使用T-SQL删除数据
148     a.使用Delete删除数据
149         语法:delete from <表名> [where <删除条件>]
150         如:
151         delete from Students
152         where SName='张青裁'
153         错误做法:
154         如:
155         delete SAddress from Students
156 
157     b.使用Truncate Table删除数据(清空重置【顺序】)
158         TRUNCATE TABLE Students
159      Truncate Table的执行速度比Delete快而且占用的资源更少
160 
161 4.数据查询(一)
162 
163 4-1:T-SQL查询基础
164     a.查询和记录集
165     b.使用Select语句进行查询
166     语法:
167     select <列名>
168     from <表名>
169     [where <查询条件表达式>]
170     [order by <排序的列名> [ASC或DESC]]
171         (1)查询所有的数据行和列
172             select *from Students
173         (2)查询部分行列---条件查询
174             Select SCode,SName,SAddress
175             from Students
176             where SAddress='河南新乡'
177         (3)在查询中使用列名
178             select SCode as 学员编号,SName as 学员姓名
179             from Students
180             where SAddress <> '河南新乡'
181             (兼容性,字符串结果为字符串,数值型结果为数值型)
182             select FirstName+'.'+LastName as '姓名'
183             from Employee
184 
185             select '姓名'=FirstName+'.'LastName
186             from Employee
187         (4)查询空行
188             select SName from Students where SEmail IS NULL
189         (5)在查询中使用常量列
190             select 姓名=SName,SAddress=地址,'河北兴隆' as 学校名称
191              from Students
192         (6)查询返回限制的行数
193             select Top 5 SName,SAddress
194             from Students where SSex=0
195     
196 
197 4-2:查询排序
198     如:
199     select StudentID as 学员编号,(Score*0.9+5) as 综合成绩
200     from Score
201     where (Score*0.9+5)>60
202     order by Score
203 4-3:在查询中使用函数
204     a.字符串函数
205     b.日期函数
206     c.数学函数
207     d.系统函数
208 
209 4-4:数据查询的案例分析(1)
210 
211 5.数据查询(二)
212 
213 5-1:模糊查询
214     a.使用Like进行模糊查询
215         select *from Students where SName LiKE '张%'
216     b.使用Between在某个范围内进行查询(使用NOT去反)
217         select *from Sales where ord_date not between '1992-8-1'
218     c.使用In在列举值内进行查询
219     如:
220     select SName as 学员姓名 from Students where SAddress in('北京','广州','上海')
221     order by SAddress
222 
223 5-2:SQL Server中的聚合函数
224     a.Sum(select sum(ytd_sales) from titles where type='business')
225     b.Avg(select avg(Score) as 平均成绩 from Score where Score>=60)
226     c.Max和Min(select avg(Score) as 平均成绩,max(Score) as 最高分,min(Score) as 最低分 from Score where Score>=60)
227     d.Count(select count(*) as 及格人数 from Score where Score>=60)
228 
229 5-3:分组查询
230     a. 使用Group By进行分组查询
231     如:
232     select CourseID,avg(Score) as 课程平均成绩
233     from Score
234     group by CourseID,CourseID
235     b.使用Having子句进行分组筛选
236     如:
237     select StudentID as 学员编号,CourseID as 内部测试,avg(Score) as 内部测试平均成绩 from Score
238     group by StudentID,CourseID
239     having count(Score)>1
240     
241     Where ---->Group By---->Having
242 
243 5-4:多表联接查询
244     a.多表联接查询的分类
245         (1)内联接(Inner join)
246         (2)外联接
247             左外联接(Left Join或Left Outer Join) 右外联接(Right Join或Right Outer Join) 完整外联接(Full Join或Full Outer Join)
248         (3)交叉联接(交叉联接返回左表中的所有行,左表中的所有行再一一组合,相当于两个表"相乘")
249     b.内联接查询
250         (1)在Where子句中指定联接条件
251         (2)在From子句中使用Join..on
252     c.外联接查询
253         (1)左外联接查询
254         (2)右外联接查询
255 
256 5-5:数据查询的案例分析(2)
257     a.查询一张表中的奇数行和偶数行
258     b.银行卡恢复
259 
260 
261 
262 6.数据库的设计
263 
264 6-1:为什么需要规范的数据库设计
265     a.什么是数据库的设计(将数据库中的数据对象以及这些数据对象之间关系,进行规划和结构化的过程)
266     数据库的设计目的:减少数据冗余,维护数据的完整性(减少复杂程度)
267     b.数据库设计非常重要
268         (1)效率高    (2)便于进一步扩展    (3)使得应用程序开发变得更容易
269 
270 6-2:设计数据库的步骤
271     a.需求分析阶段    b.概要设计阶段    c.详细设计阶段    d.代码实现阶段
272     (收集信息、标识对象、标识每个对象需要存储的详细信息、标识对象之间的关系)
273 
274 6-3:绘制E-R(实体-关系)图
275     a.实体-关系模型(箭头指向1方向、矩形代表实体集、椭圆代表属性、鳞形代表关系集、直线用来连接属性和实体或关系集)
276     (实体、属性、关系、映射基数【一对一、一对多、多对一、多对多】、实体关系图)
277     b.如何将E-R图转化为表(多多关系建立表关系是通常拆分为一多关系)
278 6-4:数据规范化
279     a.设计问题(减少数据冗余,维护数据的完整性(减少复杂程度))
280     【信息重复、更新异常、插入异常(无法表示某些信息)、删除异常(丢失有用的信息)】
281     b.规范设计(三大范式)
282     【第一范式:目标是确保每列的原子性、都不可再分的最小数据单元(过细、过于复杂、需求)】
283     【第二范式:如果满足1NF,并且除了主键以外的其他列,都依赖于该主键。一个表描述一件事情(组合键)】
284     【第三范式:如果一个关系满足2NF,并且除了主键以外的其他列都不直接依赖于主键列(低-高、列表拆分、关联性【连动性 会变化、规律性、拆分 完整性 效率 包含性)】
285         (1)是否满足第一范式
286         (2)是否满足第二范式
287         (3)是否满足第三范式
288         【通常情况下,为了操作方便可以适当增加数据冗余现象】
289 
290 
291     c.规范化和性能的关系
292     【既要考虑三大范式,避免数据的冗余和各种数据操作异常,又要考虑数据访问性能】
293     【通常情况下,为了操作方便可以适当增加数据冗余现象】
294 
295 
296 7.数据库的实现
297     
298 7-1:T-SQL语句回顾(注意:删除和更新,一定要记住加条件!!!!)
299     a.添加数据
300         语法:insert [into] 表名 (字段1,字段2,。。。) values (值1,值2,。。)
301         insert into stuInfo(stuName,stuNo,stuAge) values ('张三','s2234',22)
302     b.修改数据
303         语法:update 表名 set 字段1=值1,字段2=值2,。。where (条件)
304         update stuInfo set stuAge=25 where stuName='张三'
305     c.查询数据
306         语法:select 字段1,字段2,。。from 表名 where (条件) order by 字段名
307         select stuName,stuNo from stuInfo where stuAge<25 order by stuNo
308     d.删除数据
309         语法:delete from 表名 where (条件)
310         delete from stuInfo where stuAge<20
311 
312 7-2:使用SQL语句创建和删除数据库(主数据文件:*.mdf、次要数据文件:*.ndf、日志文件:*ldf)
313     a.创建数据库
314     语法:
315     create database 数据库名
316     on [primary]
317     (
318     <数据文件参数>[,..n]  [<文件组参数>]
319     )
320     [log on]
321     (
322     {<日志文件参数>  [,..n]}
323     )
324     go
325     文件参数语法如下:
326     ([name=逻辑文件名,]
327      filename=物理文件名
328      [,SIZE=大小]
329      [,maxsize={最大容量|unlimited}]
330      [,filegrowth=增长量])  [,..n]
331     文件组的语法如下:
332     filegroup 文件组名 <文件参数> {,..n}
333     b.删除数据库
334     语法:
335     drop database 数据库名
336     扩展:
337      remove file 文件名
338      modify file (name=文件名,filegrowth=50MB)   【modify修改】
339      例如:
340      use master
341      go
342      if exists(select *from sysdatabases where name='stuDB')
343      drop database stuDB
344      create database stuDB
345      on(
346      ...
347      )
348      log on
349      (
350      ...
351      )
352      go
353 
354     【select db_id(stuDB)
355            (object_id)
356     if db_id('stuDB') is not null
357     drop database stuDB】
358     
359 7-3:使用SQL语句创建和删除表
360     a.创建表
361     create table 表名
362     (
363     字段1 数据类型 列的特征,
364     字段2 数据类型 列的特征,
365     ...
366     )
367     go
368     例如:
369     use stuDB
370     go
371     create table stuInfo
372     (
373     stuName varchar(20) not null,--学员姓名
374     stuNo char(6) not null--学号
375     )
376     go
377     b.删除表
378     drop table 表名
379     例如:drop table stuInfo
380     【
381     use stuDB
382     go
383     if exists(select *from sysobjects where name='stuInfo')
384     drop table stuInfo
385     create table stuInfo
386     (
387     ...
388     )
389     go    
390     】
391     (sysdatabases 数据库、sysobjects 表,视图,存储过程、sysindexs 索引)
392 7-4:使用SQL语句创建和删除约束
393     【主键约束 Primary Key constraint、唯一约束 Unique Constraint、检查约束 Check Constraint、默认约束 Default Constraint、外键约束 Foreign Key Constraint】
394     a.添加约束
395     语法:
396     alert table 表名
397     add constraint 约束名 约束类型 具体的约束说明
398     例如:
399     --添加主键约束
400     alert table stuInfo
401     add constraint PK_stuNo primary key (stuNo)
402     go
403     --唯一约束
404     alert table stuInfo
405     add constraint UQ_stuID unique (stuID)
406     go
407     --默认约束
408     alert table stuInfo
409     add constraint DF_stuAddress default ('地址不详') for stuAddress
410     go
411     --检查约束
412     alert talbe stuInfo
413     add constraint CK_stuAge check(stuAge between 15 and 40)
414     go
415     --外键约束
416     alert table stuMarks
417     add constraint FK_stuNo
418     foreign key (stuNo) references stuInfo (stuNo)
419     go
420     b.删除约束
421     语法:
422     alert table 表名
423     drop constraint 约束名
424     例如:
425     alert talble stuInfo
426     drop constraint DF_stuAddress
427     例如:
428     alert table 表名
429     drop column 字段名
430     例如:
431     alert table 表名
432     drop column 字段名 数据类型
433     
434 
435 7-5:使用SQL语句创建登录
436     【第一关:登录到服务器,第二关:访问到数据库,第三关:表单,授权(增、删、改、查)】
437     a.创建账户(二种身份验证:SQL身份验证和Windows身份验证)
438     语法:
439     Windows身份:exec sp_grantlogin 'Windows域名\域账户'
440     SQL身份:exec sp_addlogin '账户名','密码'
441     例如:
442     --添加Windows登录账户
443     exec sp_grantlogin 'jbtraining\s26301'
444     --添加SQL登录账户
445     exec sp_addlogin 'zhangsan','1234'
446     b.创建数据用户
447     语法:
448     exec sp_grantdbaccess '登录账户','数据库用户'
449     例如:
450     --在stuDB数据库中添加两个用户
451     use stuDB
452     go
453     exec sp_grantdbaccess 'jbtraining/s26301','s26301DBUser'
454     --S26301DBUser为数据库用户名
455     exec sp_grantdbaccess 'zhangsan','zhangsanDBUser'
456     c.给数据库用户授权(增、删、改、差、创建表)
457     语法:
458     grant 权限 [on 表名] to 数据库用户
459     例如:
460     use stuDB
461     go
462     --为zhangsanDBUser分配对表stuInfo的select、insert、update权限
463     grant select ,insert,update on stuInfo to zhangsanDBUser
464     --为S26301DBUser分配创建表的权限
465     grant create table to S26301DBUser
466     扩展:(表约束的禁用)
467     --1.在已有的数据表中加约束,但不影响原有数据
468     alert table 表名
469     with NoCheck
470     add constraint 约束名     check (stuAge Between 15 and 40)
471     --2.对已有约束,进行临时禁用
472     步骤一:alert table 表名
473         NoCheck constraint 约束名
474     步骤二:alert table 表名
475     步骤三:check Constraint 约束名      【批量数据使用】
476 
477 
478 8.T-SQL编程
479     
480 8-1:使用变量
481     a.局部变量
482     语法:set @variable_name=value或select @variable_name=value
483     声明变量:declare @variable_name DataType
484     例如:declare @name varchar(8) 
485           declare @seat int
486     b.全局变量(@@error、@@identity、@@servicename、@@version)
487 8-2:输出语句
488     语法:
489     print 局部变量或字符串
490     select 局部变量 as 自定义列名
491     例如:
492     print '服务器的名称:'+@@servername
493     select @@servername as 服务器名称
494     print '当前错误'+@@error
495     print '当前错误号'+convert(varchar(5),@@error)
496 
497     insert into stuInfo(stuName,stuNo,stuSex,stuAge) values('梅超风','s25318','女','23')
498     --如果大于0,表示上一条语句执行有错误
499     print '当前错误号'+convert(varchar(5),@@error)
500     print '刚才报名的学员,座位号为:'+convert(varchar(5),@@identity)
501 
502 8-3:逻辑控制语句
503     
504     a.if-else条件语句        if(条件)
505     语法:                     begin
506     if(条件)                        语句1
507       语句或语句块                    语句2
508     else                         ...
509       语句或语句块                 end
510                     else
511                              ...
512     b.while循环语句
513     语法:
514     while(条件)
515         语句或语句块
516             [break]
517     c.Case多分支语句
518     语法:
519     case
520         when 条件1 then 结果1
521         when 条件2 then 结果2
522         [else 其他结果]    
523     end
524 
525 8-4:批处理语句(提高效率)
526     概念:它是一条或多条SQL语句的集合,SQL Server将批处理语句编译成一个可执行单元,此单元为执行计划。
527 
528 
529 9.高级查询
530 
531 9-1:简单子查询
532     例如:
533     declare @age int 
534     select @age=stuAge from stuInfo where stuName='李斯文'
535     select *from stuInfo where stuAge>@age
536     go
537 
538 
539     select *from stuInfo
540     where stuAge>(select stuAge from stuInfo where stuName='李斯文')
541     go
542     语法:
543     select ...from 表1 where 字段1>(子查询)
544 
545     例如:
546     select stuName from stuInfo inner join stuMarks
547     on stuInfo.stuNo=stuMarks.stuNo where writtenExam=60
548     go
549 
550 
551     select stuName from stuInfo
552     where stuNo=(select stuNo from stuMarks where writtenExam=60)
553     go
554 
555 
556 9-2:IN和NOT IN子查询
557     
558     子查询(结果)    条件来源多表: 子查询    要的信息来源多表:表联接 【条件我要来源于多表】
559     子查询不仅可存在于结果,也可以是条件 (<,>,=,>=【一行一列】) (in【多行一列】) (exists【多行多列,无条件】)
560     老技术替换新技术        分页主键唯一    表联接(存在主外键关系)    子查询(等值联接)
561     在复杂运算中,如果中间查询结果在后面需要使用即可以保存为一张临时表#
562     例如:
563     select stuName from stuInfo
564     where stuNo not in (select stuNo from stuMarks)
565     go
566 
567     
568     select stuName from stuInfo
569     where stuNo in(select stuNo from stuMarks)
570     go
571 
572 9-3:EXISTS和NOT EXISTS子查询
573     语法:
574     if exists(子查询)
575     语句
576     例如:
577     if exists(select *from sysdatabases where name='stuDB')
578     drop database stuDB
579     create database stuDB
580 
581 9-4:T-SQL语句的综合应用(P74页)
582 
583 
584 10.事务、索引和视图
585     
586 10-1:事务
587     事务的应用场景:当一个事务需要两条或两条以上SQL Server语句完成时,可以使用事务保证其完整性(要不执行完成,否则,全不执行)
588     a.为什么需要事务(如:银行转账)
589     b.什么是事务
590         事务是作为单个逻辑工作单元执行的一系列操作(原子性、一致性、隔离性、持久性)
591     c.如何创建事务
592         开始事务:begin transaction    提交事务:commit transaction  回滚事务:rollback transaction
593         显示事务:用begin transaction指定  隐式事务:设置set implicit_transactions on 直到关闭
594         多态SQL语句当成一个事务
595         自动提交事务
596     在一个事务中:前面的SQL语句会影响到后面的SQL语句执行(前面SQL语句结果,可以被条件SQL语句所访问)
597     在一个事务中设置回滚点(save) rollback回滚    事务间可以嵌套其它事务(外层管理内层事务)【P88页】
598 
599 10-2:索引
600 
601     a.什么是索引
602     在现在,索引是唯一能够提高检索速度(高效) 当出现第一排序列与第二排序列时,只有在满足第一排序列才能够进行下一排序列
603     索引页、索引、唯一索引、主键索引、聚集索引,非聚集索引
604     注意:在创建唯一约束的时候,就会默认创建唯一索引,尽管唯一索引有助于找到信息,但为了获得最佳性能,建议使用主键约束
605           一个表只能创建一个聚集索引,但可以有多个非聚集索引,设置某列为主键,该列就默认为聚集索引和主键索引(基于主键索引、排序)
606           聚集索引查询速度要快于非聚集索引
607     b.如何创建索引
608         (1)使用Microsoft SQL Management Studio 创建索引
609         (2)使用T-SQL语句创建索引
610         语法:
611         create [unique] [clustered|nonclustered] index index_name
612         on table_name (column_name[,column_name]...)
613         [with
614             fillfactor=x
615         ]
616         其中:unique指定唯一索引、clustered,nonclustered指定是聚集索引还是非聚集索引、fillfactor表示填充因子(少),指定一个0-100的值,该值只是索引页填满的空间所占得百分比。(方便更新)
617         例如:
618         --指定索引按索引,ix_stuMarks_writtenExam查询
619         select *from stuMarks
620         (index=ix_stuMarks_writtenExam)
621         where writtenExam between 60 and 90
622         (使用索引可加快数据检索速度)(缺点:更新速度慢,查询速度快)
623 
624 10-3:视图
625 
626     a.什么是视图
627     视图操作的通常用三种操作:
628     筛选表中的行、防止未经许可的用户访问敏感数据(安全性)、将多个物理数据表抽象为一个逻辑数据表(降低复杂度、简化数据库的结构)
629     b.如何创建视图
630     增加三级权限体系,下次可分配到视图和存储过程
631         (1)使用Microsoft SQL Server Manager Studio 创建视图
632         (2)使用T-SQL语句创建视图
633         语法:
634         create view view_name        视图:只存放SQL语句(select 一条语句)    
635         as                存在业务逻辑   as开头    go结束
636             <select 语句>            
637         go                
638         
639 
640         select *from 表名
641             视图        (可删除操作多表联查有要求)
642             结果集        (更新操作,更新到基表)
643 
644         例如:
645         --使用视图:视图是一个虚拟表,可以像物理表一样打开
646         select *from view view_stuMarks
647         --创建视图:查看学员的成绩情况
648         create view view_stuInfo_stuMarks
649         as
650             select 姓名=stuName,学号=stuInfo.stuNo,笔试成绩=writtenExam,机试成绩=labExam,平均分=(writtenExam+labExam)/2
651             from stuInfo left join stuMarks on stuInfo.stuNo=stuMarks.stuNo
652         go
653 
654 
655 11-1:存储过程
656 
657     a.什么是存储过程
658     查询分析器、批处理go远远低于存储过程效率、编译,优化、执行速度更快,只执行一次、安全性P94页、最后可分配到存储过程
659     使用存储过程的几个优点:
660         (1)允许模块化程序设计(可理解所有方法使用,业务逻辑封装存储过程)
661         (2)允许更快执行(数据与数据交互时,当数据需大量使用的时候,写入存储过程中)
662         (3)减少网络流量(仅反馈信息)
663         (4)可作为安全机制使用(系统存储过程、用户自定义的存储过程)
664     b.常用的系统存储过程
665         通常以:sp开头的为系统存储过程,xp开头的为doc命令创建的存储过程
666         注意:在数据库中,通常不可以修改数据库名称,但可以通过在新建查询中调用sp_renamedb系统存储过程来修改。
667         语法:
668         exec xp_cmdshell doc命令 [no_output]
669         
670 
671 11-2:用户定义的存储过程
672     a.创建不带参数的存储过程
673     语法:
674     create proc[edure] 存储过程名
675         [{@参数1 数据类型}{=默认值] [output],
676          ...,
677         {@参数n 数据类型} [=默认值] [output]
678         ]
679     b.创建带输入参数的存储过程(输入参数、输出参数)
680     语法:
681     create proc[edure] 存储过程名
682         [{@参数1 数据类型}{=默认值] [output],
683          ...,
684         {@参数n 数据类型} [=默认值] [output]
685         ]
686     as
687         SQL语句
688     go
689     
690     例如:
691     use stuDB
692     --检测是否存在:存储过程存放在系统表sysobjects中
693     if exists(select *from sysobjects where name='proc_stu')
694     drop procedure proc_stu
695     go
696     --创建存储过程
697     create proc proc_stu
698         @writtenPass int=60,
699         @labPass int=60
700         as
701            print '笔试及格线:'+convert(varchar(5),@writtenPass)
702                  +'机试及格线:'+convert(varchar(5),@labPass)
703            print '---------------------------------------------'
704            print '       参加本次考试没有通过的学员:            '
705            select stuName,stuInfo.stuNo,writtenExam,labExam from stuInfo
706            inner join stuMarks on stuInfo.stuNo=stuMarks.stuNo
707                where writtenExam<@writtenPass or labExam<@labPass
708     go
709     --调用存储过程
710     exec proc_stu --都采用默认值:笔试和机试及格线都为60分
711     exec proc_stu 64 --机试采用默认值:笔试及格线64分,机试及格线60分
712     exec proc_stu 60,55 --都不采用默认值:笔试及格线60分,机试及格线55分
713     --错误的调用方式:exec proc_stu ,55 --希望笔试采用默认值,机试及格线55分
714     --正确的调用方式:exec proc_stu @labPass=55 --笔试采用默认值,机试及格线55分
715     
716     c.创建带输出参数的存储过程
717     例如:
718     use stuDB
719     go
720     --检测是否存在:存储过程存放在系统表sysobjects中
721     if exists(select *from sysobjects where name='proc_stu')
722     drop proc proc_stu
723     go
724     --创建存储过程
725     create proc proc_stu
726       @notpassSum int output,--output关键字,否则视为输入参数
727       @writtenPass int=60,--默认参数放后
728       @labPass int=60  --默认参数放后
729     as
730       print '笔试及格线:'+convert(varchar(5),@writtenPass)
731         +'机试及格线:'+convert(varchar(5),@labPass)
732       print '---------------------------------------------'
733           print '       参加本次考试没有通过的学员:            '
734           select stuName,stuInfo.stuNo,writtenExam,labExam from stuInfo
735       inner join stuMarks on stuInfo.stuNo=stuMarks.stuNo
736       where writtenExam<@writtenPass or labExam<@labPass
737     go
738 
739     --调用存储过程
740     declare @sum int --定义变量,用于存放调用存储过程时返回的结果
741     exec proc_stu @sum output ,64 --调用时,也带output关键字,机试及格线默认为60
742     print '-------------------------------------------------------------------'
743     if @sum>=3
744         print '未通过人数:'+convert(varchar(5),@sum)+'人,超过60%,及格分数线还应下调'
745     else
746         print '未通过人数:'+convert(varchar(5),@sum)+'人,已控制在60%以下,及格分数线适中'
747     go
748 
749     d.处理错误信息
750     
751     语法:
752     raiserror (msg_id |msg_str) {,serverity,state} [with option[,...n]]
753     msg_id:在sysmessages系统表中指定的用户定义错误信息
754     msg_str:用户定义的特定信息,最长255个字符
755     severity:与特定信息相关联,表示用户定义的严重性级别
756     state:表示错误的状态,是1-127的值
757     option:指示是否将错误记录到服务器错误日志中
758 
759     例如:
760     declare @myTable table (stuName varchar(20),stuPwd varchar(20))
761     select *from @myTable
762     表变量不要超过一万条,超过一万用临时表
763     结果集:insert into @myTable
764         exec proc_finduseByName
765     select '王三',28,'男' union
766     select ......
767     select *from @myTable
768     存储过程中可调用其它存储过程当成一个T-SQL语句
769     print+'两边数据类型一致'
770     仅仅可以改变  全局变量
771     print @@error
772     raiserror ('dddd',11,2)
773     print @@error
774     大于10才影响error
775     --1.中间那个参数大于10,可影响error
776     --2.使用with,设置@@error   with+seterror   with+login    完后+return
777     将错误提取带出存储过程
778     
779     无参,无输出
780     输出结果方式    (1)输出结果集[一,多个   结果集]        (2)返回参数 变量 任意类型 P112页        (3)return 只返回类型
781     调用:    (1)简单 exec proc_finduserByName 'wangjn',20,temp output --(insert into 表名 values ('王军',20,'金堂'))
782         (2)完整(可换位置) exec proc_finduserByName @userName='王军'  --(insert into 表名(列名1,列名2) values (值1,值2))
783         存储过程中不允许创建视图
784         参数列表建议:输入-输出-含默认值        查询赋值(只有一条)        定义使用时都使用output
785     在存储过程中实现分页:
786     declare @sqltxt varchar(100)
787     set @sqltxt='select *from '+@tableName+'where'+@colName+'='+@value
788 
789     select top 10[sqltext] *from userInfo where userid not in (select top 10*2[@Num或@sqltext] userid from userInfo)
790     
791     exec proc_finduserByName 'userInfo','userName'
792 
793 T-SQL补充:
794     在进行表联接的时候,小表考前,大表靠后(增强查询效率)
795     A.declare @mytb Table (id int,names varchar(10))
796     表变量,在内存中
797     B.create table #myTable (id int ,names varchar(10))
798     #局部临时表,当前数据库
799     C.create table ##myTable (id int,names varchar(10))
800     ##全局临时表,在tempdb数据库中(占表名或位置)
801     区别:
802     A.声明周期短(作用域小),用于当前批处理语句之中
803     B.连续不断(有效),只在当前联接对象有效
804     C.连续不断(有效),不同联接对象任可使用
805     触发器(操作日志表):(代码或语句)
806     触发器与表相连,建于某一张表单上
807     触发器是一种特殊的存储过程
808     特殊:(1)不能使用exec外部调用或只使用显型调用(insert,update,delete)(2)特殊事务不有使用begin transaction而自动触发成一个事务成功或失败
809     语法:
810     create trigger Trigger1
811     on dbo.userInfoTable
812     for /*insert,update,delete*/
813     as
814         /*if update()...列集触发器*/
815     触发器的原理:
816     (1)一行数据发生变化,就会被触发一次
817     例如:insert 就会记录了插入信息    deleted就记录了删除信息
818     (2)只有一个(inserted、deleted)被触发,只能访问到(inserted、deleted)相应信息
819     (3)将更新划分为两张表  inserted表与deleted表
820     (4)update中:返回(inserted、deleted)语句,只保存了一条语句,并且它与所关联的表结构一样
821     在触发器里永远不存在where条件
822     触发器影响相应效率(inserted、deleted),并且它当中有两张内存表
823     列集触发器的诊断    即:if   /*update (列名)....*/   无单引号在小括号内中
824     例如:
825     if update(列名 )  不加单引号
826     select @new=HowseHolderIdNo from inserted
827     select @old=HowseHoderIdNo from deleted
828     if @old<>@new
829         begin
830             insert into 表名 select...
831             ...........
832             ..........
833         end

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏文渊之博

SSIS技巧--优化数据流缓存

问题     我们经常遇到一种情况,在SSMS中运行很慢的一个查询,当把查询转化成从源到目的数据库的SSIS数据流以后,需要花费几倍的时间!源和数据源都没有任何...

1849
来自专栏aoho求索

MySQL探秘(二):SQL语句执行过程详解

 昔日庖丁解牛,未见全牛,所赖者是其对牛内部骨架结构的了解,对于MySQL亦是如此,只有更加全面地了解SQL语句执行的每个过程,才能更好的进行SQL的设计和优化...

551
来自专栏性能与架构

Mysql Join语句的优化

1. 尽可能减少Join语句中Nested Loop的循环总次数 最有效的办法是让驱动表的结果集尽可能地小,这也正是在本章第二节中所提到的优化基本原则之一——“...

3426
来自专栏数据和云

【云和恩墨大讲堂】谈Oracle表新增字段的影响

作者简介 ? 刘晨,网名bisal,Oracle 10g/11g OCM,并国内首批Oracle YEP成员,博客:blog.itpub.net/bisal 很...

2727
来自专栏沃趣科技

MySQL8.0之数据字典

MySQL 8.0 将数据库元信息都存放于InnoDB存储引擎表中,在之前版本的MySQL中,数据字典不仅仅存放于特定的存储引擎表中,还存放于元数据文件、非事务...

3969
来自专栏软件开发

一个小时学会MySQL数据库

随着移动互联网的结束与人工智能的到来大数据变成越来越重要,下一个成功者应该是拥有海量数据的,数据与数据库你应该知道。

1023
来自专栏逸鹏说道

解决session阻塞的问题

简介 对于数据库运维人员来说创建session或者查询时产生问题是常规情况,下面介绍一种很有效且不借助第三方工具的方式来解决类似问题。 最近开始接触运维...

3316
来自专栏Java爬坑系列

【MySQL疑难杂症】如何将树形结构存储在数据库中(方案二 Path Enumeration)

  今天来介绍把树形结构存入数据库的第二种方法——路径枚举法。   还是借用上一篇的栗子,为了方便大家查阅,我把图又原样搬过来了。 image.png   需...

2308
来自专栏恰同学骚年

《T-SQL查询》读书笔记Part 1.逻辑查询处理知多少

  T-SQL是ANSI和ISO SQL标准的MS SQL扩展,其正式名称为Transact-SQL,但一般程序员都称其为T-SQL。

804
来自专栏Java技术分享

Hibernate 的性能优化的时候碰到了"抓取策略",有四种

    所以到处找资料, 但是无论从一些讲 Hibernate 书籍,还是他人 Blog 中都没有找到详细

2197

扫码关注云+社区