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
时间: 2024-10-12 20:32:57