由于工作需要 , 最近做了很多 BI 取数的工作 , 需要用到一些比较高级的 SQL 技巧 , 总结了一下工作中用到的一些比较骚的进阶技巧 , 特此记录一下 , 以方便自己查阅 。

文章插图
图片来自 Pexels
主要目录如下:
- SQL 的书写规范
- SQL 的一些进阶使用技巧
- SQL 的优化方法
在介绍一些技巧之前 , 有必要强调一下规范 , 这一点我发现工作中经常被人忽略 , 其实遵循好的规范可读性会好很多 , 应该遵循哪些规范呢?
①表名要有意义 , 且标准 SQL 中规定表名的第一个字符应该是字母 。
②注释 , 有单行注释和多行注释 , 如下:
-- 单行注释 -- 从SomeTable中查询col_1SELECT col_1FROM SomeTable;/* 多行注释 从 SomeTable 中查询 col_1*/ SELECT col_1FROM SomeTable; 多行注释很多人不知道 , 这种写法不仅可以用来添加真正的注释 , 也可以用来注释代码 , 非常方便 。③缩进
就像写 JAVA , Python 等编程语言一样 , SQL 也应该有缩进 , 良好的缩进对提升代码的可读性帮助很大 。
以下分别是好的缩进与坏的缩进示例:
-- 好的缩进 SELECT col_1,col_2,col_3,COUNT(*)FROM tbl_AWHERE col_1 = 'a'AND col_2 = ( SELECT MAX(col_2)FROM tbl_BWHERE col_3 = 100 )GROUP BY col_1,col_2,col_3-- 坏的示例 SELECT col1_1, col_2, col_3, COUNT(*) FROMtbl_A WHEREcol1_1 = 'a' ANDcol1_2 = ( SELECT MAX(col_2) FROMtbl_B WHEREcol_3 = 100 ) GROUP BY col_1, col_2, col_3 ④空格代码中应该适当留有一些空格 , 如果一点不留 , 代码都凑到一起 , 逻辑单元不明确 , 阅读的人也会产生额外的压力 。
以下分别是是好的与坏的示例:
-- 好的示例 SELECT col_1FROM tbl_A A, tbl_B BWHERE ( A.col_1 >= 100 OR A.col_2 IN ( 'a', 'b' ) )AND A.col_3 = B.col_3;-- 坏的示例 SELECT col_1FROM tbl_A A,tbl_B BWHERE (A.col_1>=100 OR A.col_2 IN ('a','b'))AND A.col_3=B.col_3; ④大小写关键字使用大小写 , 表名列名使用小写 , 如下:
SELECT col_1, col_2, col_3,COUNT(*)FROM tbl_AWHERE col_1 = 'a'AND col_2 = ( SELECT MAX(col_2)FROM tbl_BWHERE col_3 = 100 )GROUP BY col_1, col_2, col_3 花了这么多时间强调规范 , 有必要吗 , 有!好的规范让代码的可读性更好 , 更有利于团队合作 , 之后的 SQL 示例都会遵循这些规范 。SQL 的一些进阶使用技巧
①巧用 CASE WHEN 进行统计
来看看如何巧用 CASE WHEN 进行定制化统计,假设我们有如下的需求 , 希望根据左边各个市的人口统计每个省的人口:

文章插图
使用 CASE WHEN 如下:
SELECT CASE pref_nameWHEN '长沙' THEN '湖南'WHEN '衡阳' THEN '湖南'WHEN '海口' THEN '海南'WHEN '三亚' THEN '海南'ELSE '其他' END AS district,SUM(population)FROM PopTbl GROUP BY district; ②巧用 CASE WHEN 进行更新现在某公司员人工资信息表如下:

文章插图
现在公司出台了一个奇葩的规定:
- 对当前工资为 1 万以上的员工 , 降薪 10% 。
- 对当前工资低于 1 万的员工 , 加薪 20% 。
--条件1 UPDATE Salaries SET salary = salary * 0.9 WHERE salary >= 10000; --条件2 UPDATE Salaries SET salary = salary * 1.2 WHERE salary < 10000; 这么做其实是有问题的 , 什么问题 , 对小明来说 , 他的工资是 10500 , 执行第一个 SQL 后 , 工资变为 10500*0.9=9450, 紧接着又执行条件 2 , 工资变为了 9450*1.2=11340 , 反而涨薪了!如果用 CASE WHEN 可以解决此类问题 , 如下:
UPDATE Salaries SET salary = CASE WHEN salary >= 10000 THEN salary * 0.9 WHEN salary < 10000 THEN salary * 1.2 ELSE salary END; ③巧用 HAVING 子句一般 HAVING 是与 GROUP BY 结合使用的 , 但其实它是可以独立使用的 , 假设有如下表 , 第一列 seq 叫连续编号 , 但其实有些编号是缺失的 , 怎么知道编号是否缺失呢?
推荐阅读
- 微信的操作系统之路
- 淘金币推广有效果吗 淘金币推广怎么设置
- 淘宝开店的四个步骤 开淘宝网店需要注意的问题
- EasyLog:一个支持百亿级别的 Java 分布式日志组件
- 淘宝店铺直通车怎么开效果好 淘宝开直通车的详细步骤
- 10 款下载量最高的 Mac 软件分享
- Windows操作系统中的休眠模式和睡眠模式有什么区别?
- 茶叶末釉瓷器鉴别,识别仿古瓷茶具鉴别常用的简便方法
- JVM常用的命令
- TCP粘包的解决方案
