SQL 编写技巧总结(持续更新中)

UDF 函数整理

用处

语法

获取json数据

get_json_object(字段,'$.x.x')

截取字符串

substr(字段,从第几位开始截取)

字符串日期相减

DATEDIFF(日期1,日期2)【yyyy-MM-DD格式】

将一个复杂类型ARRAY或者MAP转换为单行记录

SELECT explode(myCol) AS myNewCol FROM myTable;

将使用的表与UTF等函数做结合关联

LATERAL VIEW udtf(expression) tableAlias AS columnAlias (‘,’ columnAlias)* fromClause: FROM baseTable (lateralView)*

参考 http://blog.csdn.net/bitcarmanlee/article/details/51926530

提升效率

  • 查询必须加分区字段
  • 连表查询,查询条件尽量放在子查询去
  • 子查询不要出现select *

列转行

在一些情况下,我们可能需要列转行的操作 看下面一个case

date

homepage

uv

2018-03-05

mp

10

2018-03-05

zby

20

2018-03-06

mp

40

2018-03-07

zby

25

表TB_A结构如下

date

homepage

uv

2018-03-05

mp

10

2018-03-05

zby

20

2018-03-06

mp

40

2018-03-07

zby

25

我们的需求是统计每天所有门票(mp)和周边游(zby)的所有uv

目标结构是这样

mp

zby

50

45

这个时候我们可以这么做

  • step1:case when then实现列转行
  • step2:sum聚合实现求和,去除null
select sum(mp) mp,sum(zby) zby
from    (select 
        case when homepage = 'mp' then uv end 'mp'
        case when homepage = 'zby' then uv end 'zby'
    from TB_A)

Union

将两个结果集的数据做纵向连接,可以直接作为一个新的结果集,需要两个结果集的返回字段一致

[SQL 1]
union/union all
[SQL 2]

分为Union 和 Union All,二者区别如下:

用法

区别

union

取两个结果集的唯一值

union all

直接连接不去重

Join

将两个结果集做横向连接,作为一个新的数据源,放在[from] 里面语句段里面

select [select statement]
from 
t1 left/right/inner/full/outer join t2 on [on statement]
where
[where statement]

主要分为 left/right/inner/full/outer join,区别如下

用法

区别

left join(left outer join )

关联的信息左边数据集有数据即可返回,右边没有返回null

right join(right outer join )

关联的信息右边数据集有数据即可返回,右边没有返回null

inner join

关联的信息必须左右边数据集都存在

outer/full join

关联的信息必须左右边数据集有一方存在即可

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

Mysql 架构和索引

字段类型选择 慷慨是不明智的 在相关的表中使用相同的数据类型,因为可能进行join 选择标示符:整数通常是最佳选择,尽量避免使用字符串 大致决定数据类型(数字,...

36190
来自专栏乐沙弥的世界

MongoDB 部分索引(Partial Indexes)

a、部分索引就是带有过滤条件的索引,即索引只存在与某些文档之上 b、满足过滤条件的文档在查询时,其执行计划将使用该列上的索引,否则不会被使用 c、稀疏索...

14800
来自专栏WindCoder

Mybatis问题:There is no getter for property named ‘stype’ in ‘class java.lang.Integer’

在做一个查询时,传的参数是个Integer类型的变量,而不是键值对式的,同时在xml中对其进行了判断。代码如下:

4.4K10
来自专栏编程心路

SSH框架之旅-hibernate(3)

表 A 中的一条记录只能和表 B 的一条记录,反之亦然。这种关系的表并不常见,因为既然可以存放在两张表中的数据,也可以用一张表来存放。一对一的表关系用于: 1...

10720
来自专栏冷冷

【译】MySQL char、varchar的区别

本文旨在涵盖两种数据类型的相似性和差异。两者几乎相同,但在某些方面,两略有不同。 介绍 CHAR和VARCHAR几乎相同,但在存储和从数据库中检索数据的阶段,两...

38290
来自专栏转载gongluck的CSDN博客

逆转字符串

逆转字符串——输入一个字符串,将其逆转并输出 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #inc...

29240
来自专栏程序猿成长计划

MySQL之ROUND函数四舍五入的陷阱

在MySQL中,ROUND函数用于对查询结果进行四舍五入,不过最近使用ROUND函数四舍五入时意外发现并没有预期的那样,本文将这一问题记录下来,以免大家跟我一样...

48840
来自专栏AhDung

【SQL】sql版Split函数。用于拆分字符串为单列表格

功能与.net版string.Split函数类似,只不过.net返回的是数组,这个返回的是一个单列表格,每个拆分出来的子串占一行。可选是否移除空格子串和重复项。...

39930
来自专栏chenssy

【死磕Sharding-jdbc】---SQL解析-INSERT解析

分析insert解析之前,首先看一下mysql官方对insert语法的定义,因为SQL解析跟语法息息相关:

15120
来自专栏Java呓语

第11章、数据类型

关键字 INT 是 INTEGER 的别名,关键字 DEC 和 FIXED 是 DECIMAL的别名。 在 MyISAM/MEMORY/InnoDB和NDB表...

11220

扫码关注云+社区

领取腾讯云代金券