编辑推荐

微软MVP、51CTO专家讲师韩立刚老师呕心著作,十余年企业实践经验+大学授课经验,毫无保留

l范式、多表联接、联接查询、存储过程、索引、触发、事务、锁……这些核心概念你真的懂吗?

l用好懂的方式水煮讲解复杂概念,所有似懂非懂一扫而光!

l超10年企业实战经验与多年大学授课经验完美结合

l课本知识与企业需求无缝衔接,项目教学+案例教学+校企合作的完美实践

内容简介

跟韩老师学SQL Server数据库设计与开发》是一本数据库设计与开发的创新型教材。

跟韩老师学SQL Server数据库设计与开发》以SQLServer为平台,在满足知识系统性的前提下,重点解决数据库设计与开发的学习过程中的重点难点问题。《跟韩老师学SQL Server数据库设计与开发》力求深入浅出,生动有趣,贴合职业需求,以好教、好学、有用为标准,是一本真正具有创新意义的数据库技术教材经典。

在软件设计和开发过程中,需求分析确定后,在开发软件前就需要先设计数据库,然后再编写代码。《跟韩老师学SQL Server数据库设计与开发》讲解的内容是软件开发人员必须要掌握的技术,先讲解如何根据项目的需求按关系型数据库设计规范设计数据库中的表,然后使用自己设计的数据库来学习SQL语句。

跟韩老师学SQL Server数据库设计与开发》完整地讲述了SQL语句中使用的变量、数据类型、注释行、运算符、常用函数,以及流程控制语句。从单表查询讲起,讲解使用WHERE筛选行将查询的结果分组、排序,然后讲解多表查询和数据汇总,讲解多表交叉联结、内联结、外联结、自联结,使用UNION合并查询结果集,使用聚合函数汇总查询结果,接着讲解了子查询、开窗函数和行列转换技术,实现数据完整性,创建和使用索引优化性能,在数据库中创建和使用视图简化查询,使用存储过程操作数据库,创建用户自定义函数,在SQL语句中使用自定义函数,使用触发器实现复杂的业务逻辑,使用事务实现数据的完整性和一致性。

跟韩老师学SQL Server数据库设计与开发》适合于本专科计算机专业或相关专业的数据库教学用书。也适合于数据库管理员、软件开发人员、企业IT运维人员及广大数据库爱好者自学使用

作者简介

●微软MVP,超过10年微软、思科技术培训及企业实践经验

●现任河北师范大学一线授课讲师

●51CTO视频学院金牌讲师,听课人数达到数百万。录有完整的IT技术视频课程体系,现已录制共49套课程,总时长超过3万分钟

●在IT教育领域倡导“视频教学+QQ答疑”和“终身师徒关系”教学模式

●韩老师的课程,学生的普遍感受是学得轻松、学得透彻、学得管用,在找工作或换工作时心里真正有底气。原因有四:

1.一是着力解决大学生在传统数据库教材中不易吃透的、似是而非的、似懂非懂问题。

2.二是着力解决普通数据库技术教材中理论不易实践的问题。

3.三是着力解决普通数据库教材中知识点与企业实际需求脱节的问题。

4.四是着力解决怎样才能让学生学得轻松、学得生动、学得深刻的问题。

目录

前言

第1章关系数据库/1

1.1关系模型基本概念/1

1.2E-R模型到关系模型的转化/3

1.3数据库设计规范/6

1.3.1第一范式(1NF)/6

1.3.2第二范式(2NF)/7

1.3.3第三范式(3NF)/8

第2章Transact-SQL概述/10

2.1启动SQLServerManagementStudio(SSMS)/10

2.2T-SQL语句的类型/12

2.2.1DDL语句/12

2.2.2DCL语句/13

2.2.3DML/14

2.3T-SQL语法要素/16

2.3.1SQL语句的批处理符号GO/16

2.3.2EXEC/17

2.3.3注释符/17

2.3.4标识符/18

2.4变量/19

2.5数据类型/21

2.5.1字符串类型/21

2.5.2Unicode字符串类型/23

2.5.3日期时间类型/23

2.5.4数值类型/23

2.6运算符/25

2.6.1算术运算符/25

2.6.2比较运算符/25

2.6.3逻辑运算符/25

2.6.4连接运算符/26

2.7常用函数/26

2.7.1聚合函数/27

2.7.2数值函数/28

2.7.3字符串函数/29

2.7.4日期时间函数/30

2.7.5数据类型转换函数/31

2.7.6控制NULL的常用函数/32

2.8流程控制语句/32

2.8.1条件判断语句IF…ELSE和CASE/33

2.8.2循环语句/35

第3章查询基础/36

3.1简单查询逻辑处理过程/36

3.2数据库对象的引用规则/39

3.3指定表的返回列来筛选列/40

3.4使用WHERE筛选行/41

3.4.1使用比较运算符过滤数据/41

3.4.2搜索范围内的值/41

3.4.3使用IN指定列表搜索条件/42

3.4.4使用LIKE关键字进行模糊匹配/42

3.4.5使用NULL比较搜索条件/43

3.4.6筛选时影响性能的注意事项/44

3.5格式化结果集/44

3.5.1在选择列表中使用常量、函数和表达式/44

3.5.2使用别名/45

3.5.3使用ORDERBY子句对结果排序/46

3.5.4使用TOP限制结果集/48

3.5.5使用DISTINCT消除重复行/50

3.6使用GROUPBY子句和聚集函数进行

分组计算/51

3.6.1在查询中使用聚集函数/51

3.6.2GROUPBY使用基础/52

3.6.3使用HAVING子句筛选分组后的数据/53

第4章多表联接查询和数据汇总/55

4.1联接基础知识/55

4.1.1在FROM子句中联接/56

4.1.2在WHERE子句中联接/56

4.2交叉联接/57

4.3内联接/57

4.4外联接/59

4.4.1左外联接/59

4.4.2右外联接/60

4.4.3完全外部联接/60

4.5自联接/62

4.5.1使用同一列进行自联接/62

4.5.2使用不同列进行自联接/62

4.6联接查询的逻辑处理过程/64

4.7多表联接查询/64

4.8UNION合并结果集/64

4.8.1UNION和UNIONALL/65

4.8.2对合并结果集进行排序/66

4.8.3结果集的合并顺序/66

4.9汇总数据/67

4.9.1ROLLUP/67

4.9.2CUBE/70

4.9.3使用GROUPINGSETS/70

4.9.4GROUPING查看汇总行并区分NULL/71

第5章子查询/73

5.1独立子查询/73

5.1.1独立标量子查询/74

5.1.2独立多值子查询/74

5.2相关子查询/75

5.3使用IN(NOTIN)和EXISTS(NOTEXISTS)谓词/76

5.3.1IN和NOTIN/77

5.3.2EXISTS和NOTEXISTS/77

5.4表表达式/81

5.4.1派生表/81

5.4.2公用表表达式(CTE)/84

第6章开窗函数和行列转换/89

6.1窗口和开窗函数/89

6.2排名窗口函数/90

6.2.1使用ROW_NUMBER()进行分区编号/91

6.2.2使用RANK()和DENSE_RANK()进行分区排名/94

6.2.3使用NTILE()进行数据分组/96

6.3聚合窗口函数/97

6.4行列转换/100

6.4.1行转列/100

6.4.2列转行/105

第7章数据修改/109

7.1插入数据/109

7.1.1使用INSERT和VALUES插入数据/109

7.1.2使用SELECTINTO插入数据/110

7.1.3使用INSERT和SELECT插入数据/111

7.2删除数据/112

7.2.1使用DELETE删除行/112

7.2.2使用TRUNCATETABLE删除所有行/113

7.3更新数据/113

7.3.1使用SET和WHERE更新数据/113

7.3.2更新基于其他表的数据/113

7.4使用MERGE合并数据/114

7.5通过表表达式修改数据/118

第8章数据完整性/121

8.1数据完整性的类型和实现方式/121

8.1.1域完整性及实现方式/122

8.1.2实体完整性及实现方式/122

8.1.3参照完整性及实现方式/122

8.2实现实体完整性/124

8.2.1使用主键/124

8.2.2使用UNIQUE约束/127

8.2.3使用自增列/127

8.3实现域完整性/131

8.3.1CHECK约束/131

8.3.2DEFAULT约束/132

8.3.3NOTNULL定义/133

8.4参照完整性/134

8.4.1实现表间列的参照完整性/134

8.4.2实现表内列的参照完整性/137

8.5使用关系图实现参照完整性/138

8.6使约束失效/141

8.7使用图形界面实现数据完整性/141

8.7.1添加主键/141

8.7.2设置UNIQUE约束/142

8.7.3设置CHECK约束/142

8.7.4设置默认值约束/144

8.7.5设置外键/145

8.7.6禁用约束/147

第9章索引/148

9.1数据的存储方式/149

9.1.1页(Page)/149

9.1.2区(Extent)/152

9.1.3索引分配映射页(IAM页)/152

9.1.4估算表的大小/153

9.2B树(BalancedTree)/154

9.3查看页内容的工具/156

9.3.1DBCCIND/156

9.3.2DBCCPAGE/158

9.4堆(Heaps)/160

9.5聚集索引/162

9.5.1约束与索引的关系/162

9.5.2唯一聚集索引的物理结构/163

9.5.3不唯一聚集索引的物理结构/167

9.5.4使用聚集索引查找数据的执行计划/168

9.6非聚集索引及其物理结构/169

9.6.1在堆中的非聚集索引/169

9.6.2在聚集表中的非聚集索引/172

9.6.3使用非聚集索引查找数据的执行计划/175

9.7修改数据对索引结构的影响/176

9.7.1页拆分和行移动现象/176

9.7.2插入行/178

9.7.3删除行/179

9.7.4更新行/180

9.8碎片和索引维护/180

9.8.1碎片/180

9.8.2维护索引/182

9.9复合索引/187

9.10包含列索引/188

9.11索引交叉/188

9.12筛选索引/189

9.13全文搜索/190

9.13.1创建和修改全文目录/191

9.13.2创建全文索引/191

9.13.3全文搜索的查询方法/192

9.14统计信息/194

9.14.1了解统计信息的作用/194

9.14.2查看和分析统计信息/195

9.14.3创建统计信息/198

9.14.4更新统计信息/198

9.14.5同步和异步统计信息更新/200

9.15基于索引设计的考虑/200

第10章视图/202

10.1视图简介/202

10.2使用标准视图/204

10.2.1创建标准视图/204

10.2.2通过视图更新数据/206

10.2.3修改和删除视图/208

10.3视图选项/209

10.3.1使用ENCRYPTION选项/209

10.3.2使用SCHEMABINDING选项/210

10.3.3使用CHECKOPTION选项/211

10.4使用索引视图/212

10.4.1创建索引视图/213

10.4.2索引视图的性能/213

10.4.3更新索引视图/214

10.5视图的优点/215

第11章存储过程/216

11.1存储过程的类型/216

11.1.1系统存储过程/217

11.1.2扩展存储过程/217

11.1.3用户自定义存储过程/217

11.2SQL存储过程/218

11.2.1创建无参数的存储过程/218

11.2.2修改和删除存储过程/220

11.2.3创建带参数的存储过程/221

11.2.4获取存储过程的执行结果/223

11.3存储过程示例分析/224

11.4存储过程的解析特点/225

11.5存储过程的编译、重编译/226

11.6使用存储过程的优缺点/227

第12章用户自定义函数/229

12.1UDF简介/229

12.2标量UDF/230

12.3内联表值函数/232

12.4多语句表值函数/233

12.5UDF的修改和删除/235

12.6UDF的调用分析/235

第13章触发器/239

13.1触发器的概念和分类/239

13.2DML触发器/240

13.2.1两张特殊的临时表/240

13.2.2insert触发器/241

13.2.3delete触发器/242

13.2.4update触发器/244

13.2.5禁用和启用触发器/244

13.2.6检测基于列修改的触发器/244

13.2.7FIRST触发器和LAST触发器/245

13.3使用触发器实现审核跟踪/246

13.4DML触发器的工作原理和事务控制/246

13.4.1触发器的工作原理/247

13.4.2DML触发器的事务控制/248

13.5DDL触发器/249

13.5.1创建数据库级别的DDL触发器/249

13.5.2创建服务器级别的DDL触发器/250

第14章事务和锁/251

14.1事务/251

14.1.1显式事务处理模式/252

14.1.2自动提交事务模式/253

14.1.3隐式事务处理模式/253

14.1.4嵌套事务的控制/254

14.1.5事务、事务日志和检查点/255

14.2并发访问引起的问题/257

14.3锁/260

14.3.1锁的粒度和锁升级/260

14.3.2锁的类型和查看锁/261

14.3.3锁的兼容性/265

14.4设置事务隔离级别/266

14.4.1SQL标准定义的4种事务隔离级别/266

14.4.2行版本的事务隔离级别/271

14.5隔离级别、锁和并发问题的关系/274

14.6死锁/275

前言/序言

基础不牢地动山摇

●何去何从?

也许你正在大学学习数据库课程,也许你已从计算机或相关专业大学毕业,无论如何,你或多或少已听说了SQL、SQLServer、Oracle、DB、MySQL、Access等一大堆相关概念。倒底从哪里开始学?

SQL的英文全称是StructuredQueryLanguage,也就是结构化查询语言。SQLServer、Oracle、DB、MySQL、Access这些都是数据库系统,是关系型数据库系统。而SQL正是我们与这些数据库系统进行交流活动的语言。

所以,可以说SQL是关系型数据库的基础。

不必在意你选择的是SQLServer、Oracel或者是其它什么数据库系统,只要把SQL吃透,用哪个数据库系统开发学习,大同小异,易如反掌。而考虑到实验环境搭建的便利性以就业等因素,从SQLServer开始学习数据库知识是现在主流的教学实践。

●基础不牢,地动山摇

韩老师自从51CTO网络发布数据库视频课程以来,短短时间内已经有几十万人学习了他的课程,好评如潮。经过对学生的构成信息进行分析,我们发现,70%多的学生都是在大学期间已经学过这门课程的同学,他们为什么还要再次进行学习数据库知识?

从传统的计算机、网络、软硬件开发,到炙手可热的大数据、云计算、物联网,这些所有的技术像一座座高楼大厦拔地而起,数据库正如承载着这些建筑的地基。这就要求我们希望在IT领域某求发展或成功的学生,必须把数据库技术的学习作为一件基础任务,对任何概念或原理的不理解或似懂非懂,都可能让大厦面临不可预知的风险。

但显然,要想把数据库学好,有几个显而易见的困难。

其一,我们的传统数据库技术教材,一般较为晦涩难懂。这当然有其历史原因,IT技术当多数源自西方,我们起步时把西方的一些图书翻译过来作为我们的资料,很多教材也是源自这此最初的翻译资料。翻译这个事情,“失真”情况很不稀罕,对于初学者,书上有些内容看不懂时不必过早归结于是“自己”笨的原因。举个例子,“用例”这个词是面向对象编程中最常用的术语之一,对这个词,很多初学者一头雾水,咱们中国本来没这个词儿啊!到底是啥意思?关于用例的概念,很多教材中了不吝笔墨叭啦叭啦讲一大堆,结果是越讲越糊涂。有些同学为了弄懂就各种查呀找呀,最终发现人家英文名本来叫“case”,一般我们可翻译为“案例”,如果把书上的“用例”换成“案例”,多少学生将会因此在软件道路上可以走得更远更好?历史原因很客观,但这不能成为我们在学习过程中不求甚解的理由,更不能成为教材编写者“人云亦云”的理由。

其二,我们的传统教材,对理论及重难点的讲解创新极少,一般是比别人咋讲我咋讲。所谓创新,并不是要求我们老师来推翻理论。古时侯养孩子没那么多适合婴儿吃的食品,一般是母亲把大人吃的东西嚼碎然后再喂孩子吃。学生在学习新知识时,其实与婴儿吃饭无异,对于教材中涉及的对于学生来说难于消化的理论或知识点,老师如果仅是照本宣科给学习讲一遍,意义不大,一定得把这些东西先行掰开嚼碎再喂给学生。根本的办法是,编写教材的老师能够用心,争取自己编写的教材对于难点的讲解更通俗,更易懂,更有趣。

其三,传统的教材与职业需求脱节。限于教材编写者自身的业务水平与讲师的业务水平,造成了有时候授课老师只讲会讲的,不讲有用的。这样的学生毕业后,如果想找到理想工作,必须重新学习提高。

基础不牢,地动山摇。学习过程困难万万千,工作的岗位上更是如此,克难而进还是得过且过,是职业生涯平庸与卓越的核心要素。

●数据库之Why&How

很多同学在总结为什么自己的数据库技术没有学好的时候,会把原因归结为自己不努力、自己不刻苦等原因。自我反省是必须的,但很多同学都没想到或者想到也不敢说:“这个教材编写的水平太次!”

好教材的标准很多,但有几个标准是必不可少的,一要让人看得懂,二要让人容易懂,三要让人喜欢看,第四是学会要有用。

我以数据库学习过来人的名义,以及51CTO视频学院中数十万学过韩老师视频课程的学员的名义,郑重向广大数据库初学者推荐韩老师的这《跟韩老师学SQL Server数据库设计与开发》。韩老师的这《跟韩老师学SQL Server数据库设计与开发》,完全体现了其视频课程的生动有趣、深入浅出、紧贴职业需求的特点,系统性却有大幅度提升。这是一本充满创新、真正经典、与时俱进、与众不同的数据库教科书。

周春元

跟韩老师学SQL Server数据库设计与开发》策划编辑

前言

我不知道社会上有多少人想学精通计算机网络原理,也不知道我讲的计算机网络原理有什么过人之处。直到有一天,我把在软件学院随堂录制的计算机网络视频放到51CTO学院,看到了几十万访问量和众多的好评,才知道原来有那么多人在互联网上苦苦寻找好的教程,才知道学生喜欢我的这种授课方式。

高校计算机专业的学生大多需要学习“计算机网络原理”这门课程,很多学校还是必修课。很多非计算机专业的学生,想转行进入IT领域发展,想打好扎实的基础,也都知道应该掌握计算机网络原理。

当前有关计算机网络的图书分两大类,一类是网络设备厂商考证的教程,比如思科网络工程师教程CCNA、CCNP,华为认证网络工程师HCNA、HCNE等;另一类就是高校的计算机网络原理的教材,代表教材就是谢希仁编著的《计算机网络》。

然而这些厂商认证的教材,其目的只是为了培养能够熟练操作和配置其网络设备的工程师,对计算机网络通信原理和过程并没有进行深入细致的讲解,重点是如何配置网络设备。而高校计算机网络原理教材,则深入讲解了计算机通信过程和各层协议,并没给学生讲解如何使用具体的网络设备配置来验证所学的理论,更没有进一步扩展这些理论可以应用在哪些场景,让学生感觉空洞和学无所用,只感觉到这些理论的抽象。很多老师在讲授这门课程时,不但学生感觉没意思,自己也觉得没意思。

我从事IT企业培训和企业IT技术支持15年,积累了大量的实战经验,在河北师大软件学院以谢希仁编著的《计算机网络》为教程讲授计算机网络原理7年,在授课过程中增加了大量的案例,设计了合适的实验来验证所学的理论。不仅给学生讲清楚了计算机各层通信协议,还捕获了数据包,让学生看到数据包的结构,看到每一层的封装;网络层不仅教会网络畅通的条件,还能在思科路由器上配置静态路由和动态路由;不仅教会传输层协议和应用层协议之间的关系,还能设置Windows服务器实现网络安全;不仅讲解了常见的应用层协议,还能使用抓包工具捕获客户端和服务器之间交互的数据包,会分析各种应用层协议数据包格式。

2016年,时机成熟,我决心编写计算机网络原理教程,以谢希仁编著的《计算机网络》(第六版)为蓝本,绘制大量插图展示所讲理论,每一段理论结束后,紧跟着就是如何使用这些理论来解决实际中的问题,对知识进一步扩展。力求对书中内容的安排恰到好处,设计了经典的实验,做到了让理论不再抽象,让课程充满趣味,让学习充满乐趣。

●《跟韩老师学SQL Server数据库设计与开发》主要内容

第1章本章是整《跟韩老师学SQL Server数据库设计与开发》的概览,先介绍计算机网络在当今信息时代的作用,接着介绍了网络和互联网以及最大的互联网Internet。为了让大家感觉网络不那么抽象,以一个企业的网络为例给大家展示了局域网和广域网。接着介绍了国际标准化组织对计算机通信过程的分层,即OSI(开放系统互连)参考模型,同时列举了一些案例以加深大家对OSI参考模型的理解和应用。

第2章本章讲解计算机网络通信的物理层,先讲解通信方面的知识,也就是如何在各种介质(光纤,铜线)中更快地传递数字信号和模拟信号。涉及到的通信概念有:模拟信号、数字信号、全双工通信、半双工通信、单工通信、常用编码方式和调制方式,信道的极限容量。

第3章本章不属于计算机网络原理的内容,但要想更好地理解后面讲到的计算机网络原理,更具体地探索计算机通信过程,还需要捕获数据包,分析数据包的数据链路层首部、网络层首部、传输层首部以及应用层协议。这就需要使用网络设备来搭建学习环境。本章讲解如何在Windows7操作系统上安装GNS3,设置GNS3运行环境,搭建学习环境。

第4章不同的网络类型有不同的通信机制(即数据链路层协议),数据包在传输过程中通过不同类型的网络,就要使用该网络使用的通信协议,同时数据包也要重新封装成该网络的帧格式。本章先讲述数据链路层要解决的三个基本问题:封装成帧、透明传输、差错检验;再讲述两种类型的数据链路层:点到点链路的数据链路层和广播信道的数据链路层,这两种数据链路层的通信机制不一样,使用的协议也不一样,点到点链路使用PPP协议(PointtoPointProtocol),广播信道使用带冲突检测的载波侦听多路访问(CSMA/CD)协议。

第5章本章讲解IP地址格式、子网掩码的作用、IP地址的分类以及一些特殊的地址。介绍什么是公网地址和私网地址,以及私网地址如何通过NAT访问Internet;讲解如何进行等长子网划分和变长子网划分。当然,如果一个网络中的计算机数量非常多,有可能一个网段的地址块容纳不下,我们也可以将多个网段合并成一个大的网段,这个大的网段就是超网。最后还讲了子网划分的规律和合并网络的规律。

第6章网络层的功能是为数据包选择转发路径。本章讲述网络畅通的条件,给路由器配置静态路由和动态路由,通过合理规划IP地址可以使用路由汇总和默认路由简化路由表。作为扩展知识,本章还讲解排除网络故障的方法,使用ping命令测试网络是否畅通,使用pathping和tracert命令跟踪数据包的路径。同时也讲解了Windows操作系统中的路由表,以及给Windows系统添加路由。

第7章本章讲解网络层第三部分内容—网络层协议。讲解网络层,当然要讲网络层首部,路由器就是根据网络层首部转发数据包的,可见网络层首部各字段就是为了实现网络层功能。除了讲解网络层首部,还讲解TCP/IP协议栈网络层的4个协议:IP协议、ICMP协议、IGMP协议和ARP协议。

第8章本章讲解TCP/IP协议栈传输层的两个协议TCP和UDP,首先介绍这两个协议的应用场景,再讲解传输层协议和应用层协议之间的关系、端口和服务之间的关系。搞清这些关系后,自然就会明白设置服务器防火墙实现网络安全的道理。传输层首部要实现传输层的功能,而TCP和UDP两个协议实现的功能不同,因此这两个协议的传输层首部也不同,需要分别讲解。本章的重点是TCP协议,将详细讲解TCP协议如何实现可靠传输、流量控制、拥塞避免和连接管理。

第9章本章讲解应用层,就是讲几种标准的应用层协议,应用层协议定义了服务器和客户机之间如何交换信息、服务器和客户端之间进行哪些交互、命令的交互顺序,规定了信息的格式以及每个字段的意义。不同的应用实现的功能不一样,比如访问网站和收发电子邮件实现的功能就不一样,因此就需要有不同的应用层协议。

●《跟韩老师学SQL Server数据库设计与开发》适合于:

计算机专业的大学生。

想从事IT方面的工作,系统学习IT技术的有梦想的人。

打算考取思科或华为网络工程师认证的人。


其他推荐