编写本书的目的在于架起两座桥梁∶一是让数据库工程师从初级向中级进阶的桥梁,旨在帮助初级工程师提升自己;二是理论(原理)和实践之间的桥梁。这里所说的"初级",具体是指已经掌握了 SQL 的基础知识和技能,具有半年到一年左右的使用经验这种水平。我们来做一个测试,帮助大家了解一下自己处于何种水平。下面有 10个问题,请回答 Yes 或No。
01.没有在聚合函数中使用过 CASE 表达式。
02.想象不出自连接是如何工作的。
03.感觉 HAVING 子句不是很常用。
04.感觉 IN 比 EXISTS 好用,所以更喜欢用 IN。
05.听到布尔类型,脑海里浮现出的只有true 和 false。
06.设计表的时候不加 NOT NULL 的约束。
07. SQL 全部用大写字母或全部用小写字母来写。
08.不能用一句话说出 GROUP BY和 PARTITION BY 的区别。
09.不知道 SQL 里的高阶函数的名字。
10.试着读过 Joe Celko 的《SQL 权威指南》1和《SQL解惑(第2版)》,但是感觉太难而没能读完(或者压根儿没有读过)。
大家的回答如何呢?如果全部都回答了No,那很好,不要担心什么,请合上本书,立刻踏上成为一名高级工程师的道路吧(也许只有本书 3-2 节"参考文献"值得略读一下)。相反,如果一半以上都回答了Yes,那么本书将照亮大家的前进之路——这正是编写本书的目的,相信大家读后一定会有收获。
但是,接下来要说的内容可能会让大家觉得有点前后矛盾。因为,这本书即将介绍的技术绝不是多么新潮的东西,而是遵循标准 SQL 的非常普通的技术。关于这一点,相信扫一眼目录你就会明白。CASE表达式、自连接、HAVING 子句、外连接、关联子查询、EXISTS....
这些都是数据库工程师日常工作中经常用到的技术。
编写本书的目的就是从新的角度把光照向这些"并没有什么特别的、谁都知道的技术",照亮它们迄今都没有被看到的一面。相信大家读完本书时,会从那个一直以来都被认为平淡无奇的关系数据库的世界里,看到一些不一样的光辉。
下面,就让我们立刻前往博大精深的关系数据库的世界,开始探险之旅吧。
第1章 神奇的SQL
1-1 CASE 表达式
→在 SQL里表达条件分支
CASE 表达式是 SQL里非常重要而且使用起来非常便利的技术,我们应该学会用它来描述条件分支。本节将通过行列转换、已有数据重分组(分类)、与约束的结合使用、针对聚合结果的条件分支等例题,来介绍 CASE表达式的用法。
写在前面
CASE 表达式是从 SQL-92 标准开始被引入的。可能因为它是相对较新的技术,所以尽管使用起来非常便利,但其真正的价值却并不怎么为人所知。很多人不用它,或者用它的简略版函数,例如 DECODE(Oracle)、IF (MySOL)等。然而,正如 Joe Celko 所说,CASE表达式也许是 SQL-92 标准里加入的最有用的特性。如果能用好它,那么 SQL 能解决的问题就会更广泛,写法也会更加漂亮。而且,因为 CASE 表达式是不依赖于具体数据库的技术,所以可以提高 SQL 代码的可移植性。这里强烈推荐大家改用 CASE 表达式,特别是使用 DECODE 函数的 Oracle 用户1。
1DECoDE 是 Oracle 用户很熟悉的函数,它有以下四个不如 CASE 表达式的地方。·它是 Oracle 独有的函数,所以不具有可移植性。
·分支数最大支持 127个(参数上限 255 个,一个分支需要2个参数)。·如果分支数增加,代码会变得非常难读。
·表达能力较弱。具体来说,参数里不能使用谓词,也不能嵌套子查询。
本节,我们将通过具体的例题来学习优点众多的 CASE 表达式。
CASE 表达式概述
首先我们来学习一下基本的写法,CASE 表达式有简单 CASE 表达式(simple case expression)和搜索 CASE 表达式(searched case expression)两种写法,它们分别如下所示。
■CASE 表达式的写法--
简单CASE 表达式 CASE sex
WHEN '1'THEN '男' WHEN '2'THEN '女' ELSE '其他' END-- 搜索CASE 表达式
CASE WHEN sex= '1' THEN '男'
WHEN sex = '2'THEN'女' ELSE '其他' END
这两种写法的执行结果是相同的,"sex"列(字段)如果是'1',那么结果为男;如果是'2',那么结果为女。简单 CASE 表达式正如其名,写法简单,但能实
现的事情比较有限。简单 CASE 表达式能写的条件,搜索CASE 表达式也能写,所以本书基本上采用搜索CASE 表达式的写法。
我们在编写 SQL 语句的时候需要注意,在发现为真的 WHEN 子句时,CASE 表达式的真假值判断就会中止,而剩余的 WHEN 子句会被忽略。为了避免引起不必要的混乱,使用 WHEN 子句时要注意条件的排他性。
■剩余的 WHEN 子句被忽略的写法示例-- 例如,这样写的话,结果里不会出现"第二" CASE WHEN col_1 IN('a','b')THEN '第一'
THEN '第二·
WHEN col_1 IN('a') ELSE '其他'END
此外,使用CASE 表达式的时候,还需要注意以下几点。
注意事项1∶统一各分支返回的数据类型
虽然这一点无需多言,但这里还是要强调一下∶一定要注意 CASE 表达式里各个分支返回的数据类型是否一致。某个分支返回字符型,而其他分支返回数值型的写法是不正确的。
注意事项2∶不要忘了写END
使用 CASE 表达式的时候,最容易出现的语法错误是忘记写 END。虽然忘记写时程序会返回比较容易理解的错误消息,不算多么致命的错误。但是,感觉自己写得没问题,而执行时却出错的情况大多是由这个原因引起的,所以请一定注意一下。
注意事项 3∶养成写 ELSE 子句的习惯
与END 不同,ELSE 子句是可选的,不写也不会出错。不写 ELSE 子句时,CASE 表达式的执行结果是 NULL。但是不写可能会造成"语法没有错误,结果却不对"这种不易追查原因的麻烦,所以最好明确地写上,ELSE 子句(即便是在结果可以为 NULL的情况下)。养成这样的习惯后,我们从代码上就可以清楚地看到这种条件下会生成 NULL,而且将来代码有修改时也能减少失误。
将已有编号方式转换为新的方式并统计
在进行非定制化统计时,我们经常会遇到将已有编号方式转换为另外一种便于分析的方式并进行统计的需求。
例如,现在有一张按照"1∶ 北海道'、'2∶青森'、…、'47∶冲绳"这种编号方式来统计都道府县2 人口的表,我们需要以东北、关东、九州等地区为单位来分组,并统计人口数量。具体来说,就是统计下表 PopTbl中的内容,得出如右表"统计结果"所示的结果。
【下载地址】
链接:https://pan.baidu.com/s/1FaguqfpcVrwj7UmQ4upq4A
提取码:d5pg
相关文章
Navicat for Mysql是用于Mysql数据库管理的一款图形化管理软件,非常的便捷和好用,可以方便的增删改查数据库、数据表、字段、支持mysql命令,视图等等。百度网盘下载链接:https://pan.baidu.com/s/1T_tlgxzdQLtDr9TzptoWQw 提取码:y2yq
数据库原理应用与实践(SQLServer)(高清PDF 下载)
本书围绕数据库的原理、应用和实施,系统、全面地介绍数据库的基本概念、方法和核心技术。全书分三部分进行阐述,第一部分侧重数据库理论基础,内容包
首先教你 SQL 整体优化、快速优化实施、如何读懂执行计划、如何左右执行计划这四大必杀招。整这些干嘛呢?答案是,传授一个先整体后局部的宏观解
本书全面探讨了SQL Server 2008 的内部工作原理。全书共分为 11章,首先在第 1 章中详细介绍了 SQL Server 200
SQL 语言的模型是集合数据,而不是物理文件。SQL 语言的"工作单位"是整个模式(schema),而不是单个表格。
编写本书的目的在于架起两座桥梁∶一是让数据库工程师从初级向中级进阶的桥梁,旨在帮助初级工程师提升自己;二是理论(原理)和实践之间的桥梁。
本书是畅销书《SOL基础教程》的第2版,介绍了关系数据库以及用来操作关系数据库的SOL语言的使用方法。书中通过丰富的图示、大量示例程序和详实
SQL是使用最广泛的数据库语言,几乎所有重要的 DBMS 都支持 SOL。本书由浅入深地讲解了 SQL 的基本概念和语法,涉及数据的排序、过
本书从介绍简单的数据检索开始,全面讲述了 SOL Server 的使用,包括连接的使用、子查询、基于全文本的搜索、函数和存储过程、游标、触发
SQL Server2016从入门到实战(高清PDF 下载)
SQLServer 数据库是 Microsof 公司推出的数据库管理系统,2016 版本在性能和人机交互等方面均有显著损高。本书是一本帮助用
SQLServer2014管理最佳实践第3版(高清PDF 下载)
SQL Server 2014 不只打破了原来由 Oracle/SPARC持有的纪录,而且在这两种配置下,表现得都优于Oracle。
本书从数据库的基础知识入手,全面介绍 SQL Server 2008 数据库应用知识。
SQL SERVER-2008从入门到精通(高清PDF下载)
本书注重理论与实践,在7大部分 26 章的篇幅中,按照一个知识点一个练习的方式,循序渐进、由浅入深地介绍SOL Server 2008 的核
它是在对 SQL Server 7.0版本重新设计的基础上建立的———提供了单独的日期和时间数据类型,以及地理空间支持。本书着重解决各层次开
PostgreSQL 是一个采取 相同的开 源理念的 优 秀的数据库系统 。这本书整体介绍数据库,全面覆盖现代的关系数据库的能以及怎么高效使
FlashFXP绿色版网盘下载,附激活教程 1839
FlashFxp百度网盘下载链接:https://pan.baidu.com/s/1MBQ5gkZY1TCFY8A7fnZCfQ。FlashFxp是功能强大的FTP工具
Adobe Fireworks CS6 Ansifa绿色精简版网盘下载 1607
firework可以制作精美或是可以闪瞎眼的gif,这在广告领域是需要常用的,还有firework制作下logo,一些原创的图片还是很便捷的,而且fireworks用法简单,配合dw在做网站这一块往往会发挥出很强大的效果。百度网盘下载链接:https://pan.baidu.com/s/1fzIZszfy8VX6VzQBM_bdZQ
navicat for mysql中文绿色版网盘下载 1652
Navicat for Mysql是用于Mysql数据库管理的一款图形化管理软件,非常的便捷和好用,可以方便的增删改查数据库、数据表、字段、支持mysql命令,视图等等。百度网盘下载链接:https://pan.baidu.com/s/1T_tlgxzdQLtDr9TzptoWQw 提取码:y2yq
火车头采集器(旗舰版)绿色版网盘下载 1737
火车头采集器是站长常用的工具,相比于八爪鱼,简洁好用,易于配置。火车头能够轻松的抓取网页内容,并通过自带的工具对内容进行处理。站长圈想要做网站,火车头采集器是必不可少的。百度网盘链接:https://pan.baidu.com/s/1u8wUqS901HgOmucMBBOvEA
Photoshop(CS-2015-2023)绿色中文版软件下载 1858
安装文件清单(共46G)包含Window和Mac OS各个版本的安装包,从cs到cc,从绿色版到破解版,从安装文件激活工具,应有尽有,一次性打包。 Photoshop CC绿色精简版 Photoshop CS6 Mac版 Photoshop CC 2015 32位 Photoshop CC 2015 64位 Photoshop CC 2015 MAC版 Photoshop CC 2017 64位 Adobe Photoshop CC 2018 Adobe_Photoshop_CC_2018 Photoshop CC 2018 Win32 Photoshop CC 2018 Win64