SQL用了两年多,我最常用的2个小技巧

简介: SQL是所有数据从业者必须打牢的基本功之一,扎实的SQL查询和适当的调优技巧是检验SQL能力的两大重要准则。个人曾经专门花费过好多时间用于提升SQL能力,期间也刷了大量的SQL题目,在这期间也不断摸索总结了一些小技巧,今天本文就来分享其中的两个,也差不多是日常使用中最为高频的两个了。

640.png

5分钟学会的两个小技巧


为了配合演示这两个小技巧,本文所使用示例数据如下,其实这也是前几天推文中所使用的数据:


640.png

示例学生成绩表


01 SQL的数据类型隐式转换


很多编程语言都限定了数据类型,例如在Python中字符串"0"和数值0是不相等的,布尔型True和数值1也是不相等,但在SQL中则不然,其内置了数据类型隐式转换功能,所以执行查询 select "0"=0 会返回1的,这既说明字符串"0"和数值0是相等的,也说明SQL中的布尔值会自动转换为1或0。


640.png


利用这一小技巧,在实现很多统计指标时就可以有很多小技巧。例如计算学生成绩表中每名学生的成绩的优秀率,即成绩在90分以上的科目与本人总科目的占比。为实现这一查询,常规的操作是分别统计每名学生成绩在90分以上的科目数量和总科目,然后进行相除得到占比。


实际上,在给出前述小例子的基础上,这一需求可以如下实现:


640.png


其中,在每名学生的分组中,条件判断score>=90返回一组0或1的结果,对这组0/1取值进行求均值操作,即等价于求成绩>=90的科目占比。


02 巧妙运用if函数和null


SQL内置了众多函数,但对于一名程序员而言if函数应该尤为常见和常用;另一方面,null值也是SQL中一个神奇的存在,它有两大特性:一是任何值与null的任何计算都会得到null值;二是在任何聚合函数中,null值都不参与计算(例如,count计数就是查找null以外的结果数量)。配合使用if函数和null值,有时也可实现很好的效果。


例如,仍然针对以上学生成绩表,需要分别统计每名学生成绩在80分以上成绩的平均值,也就是如果成绩>=80则参与最后均值计算,否则不参与。配合if函数和null的特性,可以如下优雅的实现:


640.png


实际上,上述查询语句中,首先通过if函数衍生一个临时字段if(score>=80, score, null)其取值为:成绩≥80时取成绩值,否则置为null,即相当于仅保留了成绩在80分以上的记录;而后嵌套一层avg函数即直接实现了计算80分以上平均值的效果。


当然,对于这一需求也可以先用where条件过滤出成绩在80分以上的记录后再聚合统计。


640.png



目录
相关文章
|
2月前
|
SQL 数据库
小技巧:如何让 ABAP OPEN SQL 代码具有自解释性(Self-Explained)
小技巧:如何让 ABAP OPEN SQL 代码具有自解释性(Self-Explained)
25 0
|
9月前
|
SQL 缓存 druid
JAVA代码优化,接口优化,SQL优化 (小技巧)(一)
JAVA代码优化,接口优化,SQL优化 (小技巧)(一)
198 0
|
9月前
|
SQL 缓存 NoSQL
JAVA代码优化,接口优化,SQL优化 (小技巧)(四)
JAVA代码优化,接口优化,SQL优化 (小技巧)(四)
175 0
|
SQL 存储 关系型数据库
聊聊sql优化的15个小技巧
聊聊sql优化的15个小技巧
聊聊sql优化的15个小技巧
|
SQL 数据库
|
SQL Oracle 关系型数据库
小技巧 | 如何在SQL Server中快速创建测试数据?
平时在做练习题的时候你都是怎么创建测试数据的? 是这样的吗,新建表结构,然后写入测试数据,最后保存? 今天我们来教教大家一个快速创建测试数据的小技巧。
|
存储 SQL 分布式计算
MaxCompute SQL使用小技巧之行列转换
行列转换在业务需求分析经常使用,方法很多,这里介绍下使用Maxcomputer内置函数进行转换
1253 0
|
SQL Perl
简单实用的sql小技巧(第二篇)
ASCII和CHR 在平时的工作中,可能会在sql或者pl/sql块中嵌入特殊字符,比如空格,回车之类。这个时候可以使用ascii和chr来做字符和ascii码的转换。
680 0