区分错误类型_数仓|几种SQL隐藏的错误,你遇到过吗?

cffc78923627595f95c79df08918161e.png

本文分享主要描述了几种书写SQL时常见的一些隐藏错误,主要包括:在运算符中使用null值、在聚合数据时使用null值、求平均值时使用判断条件、滤条件中使用and和or、查询的列字段之间缺少逗号分隔、inner join与left join。都是一些比较细节的点,希望本文对你有所帮助。

在运算符中使用null值

在SQL中常见的运算符有算术运算符(+,-),逻辑运算符(in,not in),比较运算符(>,<)等等。但是,如果参与运算的数据中存在null值,这个时候我们就要小心了,因为对于null值参与的运算可能会返回null值

  • 情况1:与null值列相加

比如有如下表:

当我们对每行的列字段相加时,会出现null

SELECTJan + Feb + Mar as total_amount -- 结果为null
FROM stores
WHERE store = 1

比如:

SELECT 100 + null + 190; -- 结果为null

其实,我们计算的时候希望null值变为0,但是SQL并没有帮我们转换,所以遇到这种存在null值的情况,要加以小心,我们可以通过判断进行处理,比如:

SELECT 100 + coalesce(null,0) + 190; -- 结果为290
  • 情况2:not in 操作

比如有如下表:

当我们使用下面语句进行查询时:

SELECT*
FROM scores
WHERE tag not in ("优")

结果输出为:

其实对于id=3的数据,也应该出现在结果里,但是没有出现,是因为null判断之后返回null值,比如:

select null not in ("tag1","tag2"); -- 返回null值
select coalesce(null,"") not in ("tag1","tag2"); -- 返回true

所以避免上述情况发生,需要使用判断进行处理,比如如果为NULL值,则取值空字符串。

在聚合数据时使用null值

一般使用聚合函数时,需要特别注意聚合的字段是否包含null值。当然,如果是求和,比如sum,应该不会有所影响,因为null值不参与求和。但是,在我们求平均值的时候,需要格外注意null值,看下面的例子:

当我们对amount求平均时:

SELECTavg(amount) as avg_amount
FROM orders

上面的结果会是什么呢?是150还是100呢?答案是:(150+150)/2=150,这个数据显示不是正确的,因为忽略了一行数据,解决上述问题我们可以使用判断当为null值时,取值0,,比如:

SELECTavg(coalesce(amount,0)) as avg_amount
FROM orders
-- 结果为(150+150+0)/3=100

求平均值时使用判断条件

还有一种情况是,当我们使用条件判断进行求平均值时,也要加以小心,稍不留神就会得到错误的结果,看下面的例子:如下表

当我们使用条件判断,求平均值时:

SELECT
avg(if(status = 1,amount,0)) as avg_complete_amount
FROM orders

猜一下上面的结果会是什么呢?100还是150呢?答案是100,这个结果显然不是我们想要的,因为status=1的数据只有两行,正确结果应该是:(150+150)/2=150.

那么怎么才能得到上面的结果呢?因为null值不参与计算,所以我们可以通过判断,当不满足条件时,取null值即可,SQL如下:下面SQL的判断是:if(status = 1,amount,null),这样就可以输出正确结果150了。

SELECT
avg(if(status = 1,amount,null)) as avg_complete_amount
FROM orders

滤条件中使用and和or

当我们使用一个复杂的条件语句时,很容易犯一个运算符优先级的错误。其中最为常见的就是:当编写SQL时,and先于or进行处理

比如有下面的表:

当我们要查询,用户等级rating为A或者B时,并且amount大于100的数据时:

SELECT*
FROMuser_amount
WHERE rating = "A" OR rating = "B" AND amount > 100;

上面的结果会输出:

1       A       50 
4       A       150
5       B       126

很显然结果是错误的,这是什么原因的,细心的你会发现,由于AND条件的优先级高于OR,所以上面的SQL语句会先筛选条件为rating = "B" AND amount > 100的数据,然后在筛选条件为**rating = "A"**的数据。解决上面的问题只需要加一个括号,区分一下优先级即可。如下:

SELECT
*
FROM
user_amount
WHERE (rating = "A" OR rating = "B") AND amount > 100;
-- 结果为:
4       A       150
5       B       126

查询的列字段之间缺少逗号分隔

如果不细心,会造成这种情况出现,就是一个字段作为了前面字段的别名,比如:

SELECTclo1,clo2 clo3
FROM tbl

上面的sql语句是可以被执行的,但是结果是col2的值对应的别名为clo3,并且数据会少一列,会让人感觉很诧异。

inner join与left join

这种情况一般在没有搞清楚表之间的关系时,或者主表选择不清楚时会出现,一旦使用了错误的JOIN类型,得到的结果可能会多也可能会少。所以在进行连接查询时,区分JOIN类型也是值得注意的,下图是JOIN类型之间的区别。

ad801a34d089550e3db48c540435e67a.png

总结

本文主要分享了一些书写SQL时常见的隐含错误,在平时的工作中应当尽量注意避免,希望本文对你有所帮助。

Hive SQL使用过程中的奇怪现象​mp.weixin.qq.com数仓面试|四个在工作后才知道的SQL密技​mp.weixin.qq.com数仓规范|使SQL更易于阅读的几个小技巧​mp.weixin.qq.comSQL查询的底层运行原理分析​mp.weixin.qq.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501960.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

-9 逆序输出一个整数的各位数字_【Java编程基本功】(八)逆序输出、是否为回文数,判断星期几,升序排列...

第二十四题给一个不多于5位的正整数&#xff0c;要求&#xff1a;一、求它是几位数&#xff0c;二、逆序打印出各位数字。代码&#xff1a;public 第二十五题一个5位数&#xff0c;判断它是不是回文数。代码&#xff1a;public 代码2&#xff1a;public 第二十六题请输入星期几…

动词变名词的变化规则_动词第三人称单数的变化规则及练习(含语音)

点击上面蓝字关注我“点击即可听录音”1. 大部分单词可以直接在动词后:s例&#xff1a;like -- likes play -- playsShe likes cola.发音规则&#xff1a;所加的“s”在清辅音后&#xff0c;发【s】&#xff0c;works在浊辅音及元音后&#xff0c;发【z】&#xff0c; plays在…

c语言sleep函数_做游戏,学C语言,小球碰撞游戏,菜鸡者从黑窗口到图形化编程...

CMD黑窗口小球运动这次教程&#xff0c;我们实现一个弹跳小球。需要学习完基础的变量、运算符、表达式&#xff0c;printf、scanf输入输出函数的用法&#xff0c;if-else、while、for语句的用法。第1步&#xff0c;显示静止的小球。效果为&#xff1a;第2步让小球斜着弹跳。主要…

语言五子棋无ai程序框图_2020输入法报告 如何选择更好的AI语音输入法?

不少人认为&#xff0c;现在输入法均已内置语音输入方式&#xff0c;只要是语音输入就没有什么差别。其实不然。近日&#xff0c;Mob研究院发布《2020中国第三方输入法行业洞察》报告&#xff0c;深入挖掘分析语音输入法行业现状及变化趋势。《报告》统计显示&#xff0c;讯飞输…

对应的ctrl_取消单元格合并,对空白单元格填充数据,学会Ctrl+Enter五秒搞定

Excel统计数据过程中&#xff0c;相信大家最不想碰到的就是合并单元格&#xff0c;因为合并区域会对我们的数据统计造成各种麻烦。取消单元格合并后&#xff0c;除第一个单元格有内容外其他的单元格都成了空值。案例说明&#xff1a;如上图所示&#xff0c;我们需要将左边合并单…

对比两个字符串相等_字符串匹配问题

0.题目在一个主串S{a, b, c, c, b, c, a, b, d}, 模式串T{a, b, d};请找出模式串在主串中第一次出现的位置提示: 不需要考虑字符串大小写问题&#xff0c;字符均为小写字母第一次在7的位置匹配上1.BF算法Brute-Force算法&#xff0c;简称为 BF算法&#xff0c;是一种简单朴素的…

eclipse 导入maven项目_解决Eclipse导入JAVA WEB项目错误的问题

蓝字关注远浩老师一、 本文问题在开发中不可避免地要涉及导入项目。Eclipse作为常用开发工具&#xff0c;导入JAVA WEB项目文件也很方便&#xff0c;但是我们经常发现导入完的项目有红色的叉来做错误提醒&#xff0c;甚至一些代码也出现错误提示的红线&#xff0c;如下图。 为了…

并发执行变成串行_大神浅谈数据库并发控制 锁和 MVCC

在学习几年编程之后&#xff0c;你会发现所有的问题都没有简单、快捷的解决方案&#xff0c;很多问题都需要权衡和妥协&#xff0c;而本文介绍的就是数据库在并发性能和可串行化之间做的权衡和妥协 - 并发控制机制。&#xfffc;如果数据库中的所有事务都是串行执行的&#xff…

docker 部署_Nginx K8s + Docker 部署 ,虚拟机部署教程。

Nginx K8s Docker 部署 &#xff0c;虚拟机部署教程&#xff01;Linux 虚拟机 部署1、下载nginx:http://nginx.org/download/2、选择一个版本进行下载&#xff1a;wget http://nginx.org/download/nginx-1.14.0.tar.gz3、解压&#xff1a;tar -xvf nginx-1.14.0.tar.gz4、安装…

双机热备_双机热备软件哪个好?双机热备软件推荐

服务器维护和管理是企业健康稳定运营的一项重要工作&#xff0c;而双机热备可以提供服务器的高可用性。但是成熟好用的双机热备软件有哪些呢&#xff1f;下面就给大家推荐几款。微软MSCSMSCS&#xff08;Microsoft Cluster Service&#xff09;实际上是微软自带的&#xff0c;不…

Json和Xml

一、前言 学习心得&#xff1a;C# 入门经典第8版书中的第21章《Json和Xml》 二、Xml的介绍 Xml的含义&#xff1a; 可标记性语言&#xff0c;它将数据以一种特别简单文本格式储存。让所有人和几乎所有的计算机都能理解。 XML文件示例&#xff1a; <?xml version"1.…

ec20驱动_物联网基础:移远EC20固件升级

使用移远 QFlash_V4.14 工具升级移远 EC20 4G模块固件1 准备工作 1.1 EC20 USB驱动安装安装过程参考移远官方手册&#xff1a;《Quectel_LTE&5G_Windows_USB_Driver_安装指导_V1.0.pdf》&#xff0c;有详细USB安装指导&#xff0c;该手册及驱动文件可以去移远官方下载或后续…

的微波感知_上海交大彭志科教授团队研发:微波微动监测与智能感知技术

上海9月18日电(葛俊俊) 准确监测方舱医院大量感染患者的生命状况&#xff0c;精确“诊断”大桥工程结构是否存在安全隐患&#xff0c;随时随地获取独居老人在家的健康体征……上海交通大学彭志科教授团队研发的基于微波感知的微动监测与环境智能前瞻技术&#xff0c;像一种神奇…

小米笔记本引导修复_知识帖,笔记本电脑不能开机?你可以试试这些办法

大家经常遇到电脑开机不能进入系统的时候是不是特别难受,朝歌后面几篇文章会讲讲一些常见的电脑问题和解决办法啦 前面有一个系列的文章都是在组装电脑的问题,大家感兴趣的可以关注了去主页看看呀 在现在的日常生活里,笔记本电脑对于很多人来说会比台式机重要的多,因为笔记…

java同步锁synchronized_synchronized、锁、多线程同步的原理是咋样的?

先综述个结论&#xff1a;一般说的synchronized用来做多线程同步功能&#xff0c;其实synchronized只是提供多线程互斥&#xff0c;而对象的wait()和notify()方法才提供线程的同步功能。一般说synchronized是加锁&#xff0c;或者说是加对象锁&#xff0c;其实对象锁只是synchr…

python追加_如何在Python中追加文件?

慕田峪7331174 您需要在附加模式下打开文件&#xff0c;方法是将“a”或“ab”设置为模式。见open&#xff08;&#xff09;。使用“a”模式打开时&#xff0c;写入位置将始终位于文件末尾&#xff08;附加&#xff09;。您可以使用“a ”打开以允许读取&#xff0c;向后搜索和…

系统相机裁剪比例_拍不出好照片,你缺的不是好手机而是相机设置的秘笈

玩转手机摄影&#xff0c;每天分享原创的手机摄影教程&#xff0c;手机相机功能、人像、风光、夜景、创意拍摄技巧&#xff0c;还有后期调色、修图等教程&#xff0c;欢迎感兴趣的朋友点击右上角&#xff0c;关注我们&#xff01;--------------------------------------------…

任意点 曲线距离_中级数学11-曲线函数

距离、中点、圆抛物线椭圆双曲线非线性方程曲线本章介绍曲线及其性质。这里应用两圆锥体构成的推覆体与一个平面相交的截面&#xff0c;形成的曲线。从左到右截面&#xff1a;圆、抛物线、椭圆、双曲线距离、中点、圆应用勾股定理可求出三角形各边的长度。同样在直角坐标系中&a…

opencv 边缘平滑_基于OpenCV的车道检测实现(一)

无人驾驶的话题日趋起热&#xff0c;而车道线检测对于无人驾驶的路径规划来讲特别重要。要遵守交通规则&#xff0c;首先的要求便是对车道线检测&#xff0c;而且通过检测车道线可以进一步的检测地面指示标志、进行前碰撞预警策略设计等。早早就对OpenCV感兴趣&#xff0c;但迟…

字符串equal_Java String:字符串常量池

作者&#xff1a;Seven_Nee来自&#xff1a;https://segmentfault.com/a/1190000009888357作为最基础的引用数据类型&#xff0c;Java 设计者为 String 提供了字符串常量池以提高其性能&#xff0c;那么字符串常量池的具体原理是什么&#xff0c;我们带着以下三个问题&#xff…