mysql迫切连接_SQL水平迫切进阶

前言中按惯例测试了是否适合做此书的读者。

我们来做一个测试,帮助大家了解一下自己处于何种水平。下面有10 个问题,请回答 Yes 或No。

1. 没有在聚合函数中使用过 CASE 表达式。

2. 想象不出自连接是如何工作的。

3. 感觉 HAVING 子句不是很常用。

4. 感觉 IN 比 EXISTS 好用,所以更喜欢用 IN。

5. 听到布尔类型,脑海里浮现出的只有 true 和 false。

6. 设计表的时候不加 NOT NULL 的约束。

7. SQL 全部用大写字母或全部用小写字母来写。

8. 不能用一句话说出 GROUP BY 和 PARTITION BY 的区别。

9. 不知道 SQL 里的高阶函数的名字。

10. 试着读过 Joe Celko的《SQL 权威指南》 A 和《SQL 解惑(第 2版)》B,但是感觉太难而没能读 完(或者压根儿没有读过)。

然后我感觉自己被唬住了。

跳过目录,直接开始。首先是CASE表达式,SQL-92标准里面加入的特性。

CASE表达式的写法:

-- 简单 CASE 表达式

CASE sex

WHEN '1' THEN '男'

WHEN '2' THEN '女'

ELSE '其他' END

-- 搜索 CASE 表达式

CASE WHEN sex = '1' THEN '男'

WHEN sex = '2' THEN '女'

ELSE '其他' END

使用CASE表达式的好处就是相较于DECODE函数(oracle)和IF(mysql),语法通用,方便移植。注意上面的关键字不要漏写,例如习惯写ELSE(自己不写,那默认会当做ELSE NULL),记得写END。

SELECT语句中使用CASE表达式,一般在GROUP BY中也要写同样的内容。但MYSQL和PostgreSQL中可以在GOURP BY中用SELECT中CASE表达式的别名。

CASE表达式和CHECK约束,这段看得我云里雾里。主要的优势还是,若使用CASE表达式来完成条件分支,比较符合人类语言。而且可以涵盖得比较全面的情况。(原文的例子是反映作者国家的社会现状吗?)但是本人也没有用CHECK的需求,先跳过。

跟着介绍CASE语句于UPDATE中用作条件分支。好处是语句执行一次就可以根据各种情况来更新。更方便,速度更快(这里需要亲身经历才能体会)。不需要考虑update语句的执行顺序问题。下面是例子,权当参考,

-- 用 CASE 表达式写正确的更新操作

UPDATE Salaries

SET salary = CASE WHEN salary >= 300000

THEN salary * 0.9

WHEN salary >= 250000 AND salary < 280000

THEN salary * 1.2

ELSE salary END;

这里想象一下,如果ELSE漏写了,那这个表不涵盖在CASE表达式条件中的salary值就会被置为NULL。在生产环境干这事就精彩了。

这里还举了两个主键值'a'、'b'调换的例子,老套的a换为c -> b换为a -> c换为b三个update语句要执行三次,现在可以一次性完成,写CASE。

-- 用 CASE 表达式调换主键值

UPDATE SomeTable

SET p_key = CASE WHEN p_key = 'a'

THEN 'b'

WHEN p_key = 'b'

THEN 'a'

ELSE p_key END

WHERE p_key IN ('a', 'b');

做交叉表,在WHEN条件中写IN或EXISTS,也是容易得很。

“”与 DECODE 函数等相比,CASE 表达式的一大优势在于能够判断表达式。

也就是说,在 CASE 表达式里,我们可以使用 BETWEEN、LIKE 和 等

便利的谓词组合,以及能嵌套子查询的 IN 和 EXISTS 谓词。因此,CASE

表达式具有非常强大的表达能力。

“”

反正CASE表达式可以玩得很复杂,可以将需要多步骤的查询一次搞定。

书中本节最后有个使用聚合函数,count(*)和group by的例子,里面提到

“新手用HAVING子句进行条件分支,高手用SELECT子句进行条件分支。

... ...

CASE 表达式用在 SELECT 子句里时,既可以写在聚合函数内部,也可以写在聚合函数外部。这种高度自由的写法

正是 CASE 表达式的魅力所在。 ”

大家要注意,SQL里面的CASE表达式,不要和其他编程语言中的CASE语句混淆了。

下面是本节要点。

1. 在 GROUP BY 子句里使用 CASE 表达式,可以灵活地选择作为聚合 的单位的编号或等级。这一点在进行非定制化统计时能发挥巨大的威力。

2. 在聚合函数中使用 CASE 表达式,可以轻松地将行结构的数据转换 成列结构的数据。

3. 相反,聚合函数也可以嵌套进 CASE 表达式里使用。

4. 相比依赖于具体数据库的函数,CASE 表达式有更强大的表达能力 和更好的可移植性。

5. 正因为 CASE 表达式是一种表达式而不是语句,才有了这诸多优点。

如果想了解更多关于 CASE 表达式的内容,请参考下面的文献资料。

1. Joe Celko,《SQL 权威指南(第 4 版)》(人民邮电出版社,2013 年) 请参考15.3.5 节“在 UPDATE 中使用CASE 表达式”和18.1 节“CASE 表达式”等。从 CASE 表达式的详细用法到具体事例,这两节都有广泛

的介绍。

2. Joe Celko,《SQL 解惑(第 2 版)》(人民邮电出版社,2008 年) 关于在 CASE 表达式中嵌入聚合函数,请参考“谜题 13 教师”“谜题 36 双重职务”“谜题43 毕业”。另外,“谜题44 成对的款式”运用了在 UPDATE 里进行条件分支的技巧,“谜题 45 辣味香肠比萨饼”用 CASE 表 达式巧妙地将行结构的数据转换成了列结构的数据。

CASE表达式作者说将会贯穿于整本书,读者必须熟悉。若没有完全消化以上5点,那可以买书看看。或者找作者推荐的参考资料啦。

每一小节后面还有练习题。等有时间再乖乖去做下,先吃快餐。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值