【数据库】SQL(HQL)使用 - hippowc/hippowc.github.io GitHub Wiki
- 将一个select语句结果作为一个表:通过()将select括起来,并命名一个表名
select * from
(
select * from table1
) table2
- 列重命名:select as <other_name>
select id as 编号, name ‘名称’, sex 性别 from student;
- 表重命名:select * from <table_name> <other_name>
select id, name, s.id, s.name from student s;
- inner join (join):返回两表交集
- left join:返回左表全集
- right join:返回右表全集
- full outer join:返回两表全集
合并两个或多个 SELECT 语句的结果。UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
union在进行表求并集后会去掉重复的元素,所以会对所产生的结果集进行排序运算,删除重复的记录再返回结果。union all则只是简单地将两个结果集合并后就返回结果。因此,如果返回的两个结果集中有重复的数据,那么返回的结果就会包含重复的数据。
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
group by是对数据进行分组,执行后,上下文会切换为每组而不是每行,结合聚合函数使用。group by按照某些列的值进行分组,即,该列的值相同的为一组。然后其他列需要以聚合函数的方式进行展示,如果其他列未指定相应的聚合函数,则取该组的第一条数据。
如果仅仅作为去重处理的化,与distinct类似
聚合函数是对一组值执行计算并返回单一的值的函数,它经常与SELECT语句的GROUP BY子句一同使用,大概有这么几类
- avg 返回组中的平均值
- count 返回组中项目的数量
- max 返回组中最大值
- min 返回组中最小值
- sum 返回组中和
等等,不同数据库提供的聚合函数有所不同。
- from子句组装来自不同数据源的数据
- where子句基于制定的条件对记录进行筛选
- group by子句将数据划分多个分组
- 使用聚集函数进行计算
- having子句筛选分组
- 计算所有表达式
- order by对结果集进行排序
- select截取相应列
- limit截取结果集
having的功能类似与where,但是筛选的时机和对筛选对象的要求有所不同:
- where子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
- having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。
一个例子:
select user_id, count(*) from user_info where xxx group by user_id having count(*) > 1;
这个语句的作用是:筛选出user_info表中user_id重复的记录,首先使用where条件过滤,然后根据user_id分组(使用group by之后,上下文变为分组),所以聚合函数count()是针对每组进行count,然后使用having对得到的信息进行筛选,选出count()大于1的数据,即重复的user_id记录
mysql 有很多强大的函数,可以做很多事情
- datediff 函数返回两个日期之间的天数
SELECT DATEDIFF(‘2018-07-01‘,‘2018-07-04‘);
- concat() 将多个字符串连接成一个字符串。
concat(str1, seperator,str2,seperator,...)
- JSON_EXTRACT() json解析
JSON_EXTRACT (data, '$.filed'),
- explode:将hive中一列的array或map拆分为多行
- lateral view:与类似explode这种udtf一起使用,将udtf结果放到虚拟表,然后与原本数据表每个id做join
A B C
190 [1030,1031,1032,1033,1190] id1
191 [1030,1031,1032,1033,1190] id2
# 使用explode 拆分 B列
select explode(B) as D from t
# explode函数时不能有其他列,错误例子
select A,explode(B),C as D from t # 这样写是错误的
# 正确的做法,lateral view udtf(expression) <table_name> as <column_name>
select A,B,C from test lateral view explode(B) tmp as B
- collect_set 对group by的数据进行去重,并形成一个集合
- concat_ws 对集合元素进行合并