加入收藏 | 设为首页 | 会员中心 | 我要投稿 惠州站长网 (https://www.0752zz.com.cn/)- 办公协同、云通信、物联设备、操作系统、高性能计算!
当前位置: 首页 > 教程 > 正文

Apache Flink 漫谈系列 - SQL概览

发布时间:2018-11-18 23:35:03 所属栏目:教程 来源:孙金城
导读:副标题#e# 一、SQL简述 SQL是Structured Query Language的缩写,最初是由美国计算机科学家Donald D. Chamberlin和Raymond F. Boyce在20世纪70年代早期从 Early History of SQL 中了解关系模型后在IBM开发的。该版本最初称为[SEQUEL: A Structured English Q

大家看到在 SELECT 不仅可以使用普通的字段选择,还可以使用ScalarFunction,当然也包括User-Defined Function,同时还可以进行字段的alias设置。其实SELECT可以结合聚合,在GROUPBY部分会进行介绍,一个比较特殊的使用场景是携带 DISTINCT 关键字,示例如下:

(1) SQL 示例

在订单表查询所有的客户id,消除重复客户id, 如下:

  1. SELECT DISTINCT c_id FROM order_tab; 

(2) Result

Apache Flink 漫谈系列 - SQL概览

六、WHERE

WHERE 用于从数据集/流中过滤数据,与SELECT一起使用,语法遵循ANSI-SQL标准,语义是关系代数的Selection,根据某些条件对关系做水平分割,即选择符合条件的记录,如下所示:

Apache Flink 漫谈系列 - SQL概览

1. SQL 示例

在customer_tab查询客户id为c_001和c_003的客户信息,如下:

  1. SELECT c_id, c_name, c_desc FROM customer_tab WHERE c_OR c_; 

2. Result

Apache Flink 漫谈系列 - SQL概览

3. 特别说明

我们发现WHERE是对满足一定条件的数据进行过滤,WHERE支持=, <, >, <>, >=, <=以及AND, OR等表达式的组合,最终满足过滤条件的数据会被选择出来。并且 WHERE 可以结合IN,NOT IN联合使用,具体如下:

(1) SQL 示例 (IN 常量)

使用 IN 在customer_tab查询客户id为c_001和c_003的客户信息,如下:

  1. SELECT c_id, c_name, c_desc FROM customer_tab WHERE c_id IN ('c_001', 'c_003'); 

(2) Result

Apache Flink 漫谈系列 - SQL概览

(3) SQL 示例 (IN 子查询)

使用 IN和 子查询 在customer_tab查询已经下过订单的客户信息,如下:

  1. SELECT c_id, c_name, c_desc FROM customer_tab WHERE c_id IN (SELECT c_id FROM order_tab); 

(4) Result

Apache Flink 漫谈系列 - SQL概览

(5) IN/NOT IN 与关系代数

如上介绍IN是关系代数中的Intersection, NOT IN是关系代数的Difference, 如下图示意:

  • a. IN(Intersection)

Apache Flink 漫谈系列 - SQL概览

  • NOT IN(Difference)

Apache Flink 漫谈系列 - SQL概览

七、GROUP BY

GROUP BY 是对数据进行分组的操作,比如我需要分别计算一下一个学生表里面女生和男生的人数分别是多少,如下:

Apache Flink 漫谈系列 - SQL概览

1. SQL 示例

将order_tab信息按customer_tab分组统计订单数量,简单示例如下:

  1. SELECT c_id, count(o_id) as o_count FROM order_tab GROUP BY c_id; 

2. Result

Apache Flink 漫谈系列 - SQL概览

3. 特别说明

在实际的业务场景中,GROUP BY除了按业务字段进行分组外,很多时候用户也可以用时间来进行分组(相当于划分窗口),比如统计每分钟的订单数量:

(1) SQL 示例

按时间进行分组,查询每分钟的订单数量,如下:

  1. SELECT SUBSTRING(o_time, 1, 16) AS o_time_min, count(o_id) AS o_count FROM order_tab GROUP BY SUBSTRING(o_time, 1, 16) 

(2) Result

Apache Flink 漫谈系列 - SQL概览

说明:如果我们时间字段是timestamp类型,建议使用内置的 DATE_FORMAT 函数。

八、UNION ALL

(编辑:惠州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读