SQL杂俎_陪老婆一起学SQL系列_Chapter 03_查询基础2

前言

回顾了一下前面几篇的内容,发现【查询基础1】里面的内容可能有些多了,

为了避免填鸭式的教程风格,

接下来的内容会采取 “短篇幅,多章节”的思路去写,每个章节只写一两块的内容~~~

1、加减乘除

作为数据处理的基本操作,加减乘除必然是SQL可以实现的功能。

示例1:

--查询每个同学的分数
SELECT 
    name AS "姓名",
    score AS "得分",
    --老师发现有一题存在问题,每个同学都加2分
    score + 2 AS "加两分后的成绩",   /*加法*/ 
        
    --满分100分,同学们都被扣了多少分?
    100 - score AS "被扣分数",      /*减法*/ 
        
    --换算成120制,得分是多少
    score * 1.2 AS "120分制",      /*乘法*/ 
        
    --每个人分数的一半是多少?
    score  / 2 AS "分数的一半"      /*除法*/ 
FROM student

执行结果:

 如图,“被扣分数”这一列里显示的就是每位同学与满分100分之间的差距,

每一行的数据,都产生了用别名命名的新的列。

运算就是这样以行为单位执行的

2、混合运算

仔细观察示例1中的结果,发现在老师给同学们都加上2分之后,“被扣分数”,“120分制” 和 “分数的一半”

这三列的新数据仍然是基于最原始的得分去计算的。
(第一条数据 刘盖文的原始得分是86,加上2分后,应该是88分,一半的分数应该为44,但示例1中仍然是43)

数据查询的结果需要同步更新,我们修改如下:

示例2:

SELECT 
    name AS "姓名",
    score AS "得分",
    score + 2 AS "加两分后的成绩",
    100 - score + 2 AS "被扣分数",
    score + 2 * 1.2 AS "120分制",
    score + 2  / 2 AS "分数的一半"
FROM student

执行结果:

好像和我们想象的不一样啊???!!!

因为,SQL语句中同样是遵守四则运算规则的。

所以 score + 2 * 1.2 执行的顺序实际上是 2*1.2然后再 + score


解决办法就是使用括号“()”,SQL语句中可以像正常的计算公式一样使用括号,

示例3:

SELECT 
    name AS "姓名",
    score AS "得分",
    --老师发现有一题存在问题,每个同学都加2分
    score + 2 AS "加两分后的成绩",  /*加法*/ 
        
    --满分100分,同学们都被扣了多少分?
    100 - (score + 2) AS "被扣分数",      /*减法*/ 
        
    --换算成120制,得分是多少
    (score + 2) * 1.2 AS "120分制",       /*乘法*/ 
        
    --每个人分数的一半是多少?
    (score + 2)  / 2 AS "分数的一半"      /*除法*/ 
FROM student

执行结果:

括号中的运算表达式的优先级会得到提升。

 tips:括号提升优先级的功能,不仅仅局限于四则运算,后面我们还会用到~

3、特殊的 NULL

在前面示例1、示例2的执行结果中,其实还有一行数据(截图隐藏了)

 “美芬”同学的得分在原始的 student 表中是 NULL

 通过上面的例子,我们发现加减乘除四则运算中,NULL值产生的结果都是NULL。

实际上,所有包含NULL的计算,结果肯定是NULL。

Tips:

# 在很多时候,类似 9 / 0 这样除数为0 的情况会触发报错,但 NULL / 0 不会报错,结果依然是NULL

# 如果实际数据处理的过程中,需要实现 NULL + 2 = 2的效果,我们可以借用其他方式,后面会介绍到。

原文地址:https://www.cnblogs.com/MyDoldrums/p/14104884.html