case when 子查询_SQL高级查询(二)

v2-bbfef41fb6639e20d2d4cc5fc64f531c_1440w.jpg?source=172ae18b

今天我们继续来看SQL语句的一些高级用法。

1 函数


之前我们已经掌握了聚合函数的用法, 实际上SQL中其他类型函数还有200多种,这里我们只介绍常用的几种就可以了。

算术函数

abs(数值):

该函数是绝对值函数,返回括号中数值的绝对值。

mod(被除数,除数):

该函数是求余函数。例如,4/2的余数是0,所以mod(4,2)的结果也是0.

round(数值,需保留的小数位数):

round是四舍五入函数。例如,对于2.345我们想保留2位小数,结果就是

round(2.345,2)= 2.35

字符串函数

concat(字符串1,字符串2,...):

该函数是字符串拼接函数,顾名思义,它是将括号中的字符串都连接起来。例如,concat(‘我’,‘爱’,‘吃鸡肉’)的结果就是‘我爱吃鸡肉’。

length(字符串):

该函数为计算字符串长度的函数。如length(‘ABCD’)的结果是4.

lower(字符串):

该函数为小写转换函数。例如,lower(‘ABCD’)的结果就是‘abcd’。

upper(字符串):

该函数为大写转换函数。例如,upper(‘abc’)的结果为‘ABC’。

replace(对象,需要替换的字符串,替换之后的字符串):

该函数为替换字符串函数。例如,replace(‘123木头人’,‘木头人’,‘456’)的结果为‘123456’。

substring(对象 from 截取的起始位置 for 截取的字符个数):

该函数为字符串截取函数。例如,substring(‘123木头人’ from 2 for 3)的结果为‘23木’。

日期函数

current_date:

返回当前日期(年月日),注意没有括号。

current_time:

返回当前时间(时分秒),注意没有括号。

current_timestamp:

返回当前日期和时间(年月日时分秒),也是没有括号。

extract(元素 from 日期):

该函数为日期截取函数,可以将日期中的年月日时分秒单独剥离出来。例如,extract(year from ‘2019-01-01’)的返回结果为2019。注意,返回的结果是数值类型。

转换函数

cast(对象 as 想要转换的数据类型):

该函数可将原来的数据类型转换为另一种你所需的数据类型。例如,cast(‘2019-01-01’ as date)可将字符串‘2019-01-01’转换为日期2019-01-01.

coalesce(参数1,参数2,...):

该函数返回参数中从左边开始第一个不为null的值。例如,coalesce(null,‘ABC’,null)的返回结果就是‘ABC’。那这个函数有什么用呢?它可以将列中的null值转换为其它值。假如我有一列名为tool的数据:

tool(列名)

pc

pad

null

telephone

可以看到,tool列中含有null值,那么使用coalesce(tool,1)的结果就是:

tool(列名)

pc

pad

1

telephone

null值被1所替换。

2 谓词


什么是谓词?谓词就是返回值为true/false/unknown的函数。像之前我们使用过的>、<、=等就属于谓词。今天来介绍几个其他常用的谓词。

like

like谓词用来进行一致性的查询,主要有3种情况。我们来看几个例子:

like ‘abc%’

%的含义是任意长度的字符串,这个like子句的含义是,以abc开头的,任意字符长度的字符串(包括0)。

like ‘%abc%’

这条子句的含义是,包含有abc的任意长度的字符串。

like ‘%abc’

这条子句的含义是,以abc结尾的任意长度的字符串。

like ‘abc_’

这条子句的含义是,以abc开头的,随后只有1个字符的字符串。'_'下划线代表一个字符。

in

in谓词的用法跟or类似。举个例子,我们有不同价格的商品,现在要筛选出价格为10,100,1000的三种商品。用or子句,可以写为:

price = 10 or price =100 or price =1000;

而用in谓词的话,可以写为:

price in (10,100,1000)

简洁明了。同样,如果想筛选除了10,100,1000之外的商品,可以用not in:

price not in (10,100,1000)

3 case表达式


case表达式也是SQL中很重要的内容,它主要是在区分情况时出现。case表达式的语法如下:

case when 返回真值的表达式 then 表达式

when 返回真值的表达式 then 表达式

...

else 表达式

end

其中,返回真值,就是返回true、false、unknown这三个值。如果when值为真,则执行then后的表达式,case语句执行完毕;如果when值不为真,则执行下一行的when语句,重复上一过程;如果所有when值都不为真,则执行else后的表达式,随后case语句执行完毕。

我们还是用shell数据库中的cargo表来举例,首先来看下cargo表中的数据:

v2-14ed199c18f35fc969a1ad4fa76e8550_b.jpg

现在我们想要达到这样的效果:

A:电脑

B:键盘

C:耳机

注意到并没有哪一列含有‘ABC’,这时就可以用case表达式了:

v2-5ccfffdc6f9b24ffbd9c12c6f17faeef_b.jpg

如上图,else子句也可以省略,默认返回null。

case表达式还有一个重要的用途就是进行行列转换,如果我想得到不同类型商品的汇总价格,但是要以下的效果:

类型1 类型2 类型3

价格1 价格2 价格3

如果我们按之前的group by分组,其结果如下图:

v2-cd1b6b3cabce39f90f5b49d4e425accf_b.jpg

可以看到,类型在行的位置,现在需要进行转置,将类型放在列的位置,可以用case表达式来实现:

v2-a3ee1f6f50750fa8bbd3ce4190bbb2b1_b.jpg

如上图,限于篇幅,我只写了电脑和键盘类。其思路是,如果类型为电脑,则返回其价格,否则返回0,最后对case表达式返回的值进行求和,就得到了电脑类的汇总价格。对于其他类别也是一样。

好了,这就是今天的全部内容。未完待续,敬请期待。


更多干货内容,欢迎关注今日头条账号“人人都会机器学习”;你也可以搜索知识星球“自学机器学习”,里面也有精彩内容;还可以关注公众号:“数据实干家”,为你献上数据大餐。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值