首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SQL高级查询(二)

今天我们继续来看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表中的数据:

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

A:电脑

B:键盘

C:耳机

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

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

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

类型1 类型2 类型3

价格1 价格2 价格3

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

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

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

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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190130G0BH3Q00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券