0
点赞
收藏
分享

微信扫一扫

SQL可视化开发产品设计的一些逻辑思考


目录

​​需求场景​​

​​SQL方言​​

​​降低SQL开发门槛​​

​​提升SQL开发效率​​

​​降低SQL开发错误率​​

​​其它场景        ​​

​​DML语句​​

​​DELETE语句​​

​​UPDATE语句​​

​​SELECT语句​​

​​INSERT语句​​

​​DML语句分析​​

​​构成要素分析​​

​​执行流程分析​​

​​1 FROM 执行笛卡尔积​​

​​2 ON 应用ON过滤器​​

​​3 JOIN 添加外部行​​

​​4 WHERE 应用WEHRE过滤器​​

​​5 GROUP BY 分组​​

​​6 AGG_FUNC 计算聚合函数​​

​​7 HAVING 应用HAVING过滤器​​

​​8 SELECT 选出指定列​​

​​9 DISTINCT 行去重​​

​​10 ORDER BY 排列​​

​​11 LIMIT/OFFSET 指定返回行​​

​​关系代数分析​​

​​DML语句可视化设计​​

​​设计原则​​

​​Axure原型设计​​

​​整体设计​​

​​局部设计​​

        对于SQL开发的小白来说,可否有一种可视化产品来完成SQL语句的编写。本文因此而作。

需求场景

SQL方言

        对于一个DML或者DDL操作,不同的数据库类型,具体的SQL语句可能存在一些细微的差别。例如

修改表名操作,在MySQL中,DDL语句如下:

ALTER TABLE old_table_name RENAME new_table_name;

而在Hive中,DDL语句如下:

ALTER TABLE old_table_name RENAME TO new_table_name;

存在RENAME和RENAME TO的细微差别(不考虑SQL标准)。

        在SQL可视化产品中,可以通过使用同一种可视化组件,根据不同的数据库类型,生成对应的SQL语句。如此可解决SQL方言场景的需求。

降低SQL开发门槛

        SQL可视化开发可以降低SQL学习的门槛,小白也可以在SQL可视化开发产品中,通过拖拽等简单操作来编写出令自己都意外的SQL。有时候,SQL资深开发也很难立即写出某个数据库类型修改表字段名称的SQL,例如GreenPlum数据库,你可以立即写出吗?所以,无论对于资深的SQL开发人员,还是刚入门或者准备入门的SQL开发人员,都能提供友好的帮助。

提升SQL开发效率

        SQL可视化开发可以提高SQL开发的效率。例如,从一张表中查询某10个字段。编写SQL需要具体写出这10个字段。而通过SQL可视化开发,只需要勾选或者拖拽出10个字段即可完成。

降低SQL开发错误率

         另一方面,SQL可视化开发可以降低SQL编写的错误率。例如对于带有GROUP BY的SELECT语句:

SELECT
dept_id,max(age)
FROM table_name
...
GROUP BY dept_id
...

table_name中不是所有的字段都能出现在SELECT子句中,可以通过技术提供可以在SELECT中出现的字段列表。

其它场景        

        当然还有其他的许多需求场景,这里不再一一叙述。

        下面,我们以DML语句为例来叙述SQL可视化产品设计的整体逻辑。先整理出如下常见的DML语句。

DML语句

DELETE语句

        如下:

DELETE FROM tablename 
[WHERE expression]

语句含义:从tablename表中删除符合WHERE条件的数据。

UPDATE语句

        如下:

UPDATE tablename 
SET column = value [, column = value ...]
[WHERE expression]

语句含义:更新tablename表中符合WHERE条件的数据的column字段的值。

SELECT语句

        单表查询语句如下:

SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_name
[WHERE where_condition]
[GROUP BY col_list]
[HAVING boolean_expression ]
[ORDER BY col_list]

多表关联查询:

SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_one_name [INNER JOIN|LEFT JOIN|FULL JOIN] table_two_name
[WHERE where_condition]
[GROUP BY col_list]
[HAVING boolean_expression ]
[ORDER BY col_list]

INSERT语句

        INSERT语句有两种,一种是值插入,另外一种是查询插入,这里仅讨论查询插入,如下:

INSERT INTO|OVERWRITE TABLE tablename
[PARTITION (partcol1=val1, partcol2=val2 ...)]
SELECT
...
;

语句含义:将查询结果追加或者覆盖插入到表tablename分区中。

DML语句分析

构成要素分析

DML语句构成要素如下:

DELETE语句

UPDATE语句

SELECT语句

INSERT语句

SQL算子

DML算子

DELETE

UPDATE

SELECT

INSERT

字段算子


WHERE


SET、

WHERE

WHERE、

GROUP BY、

HAVING、

ORDER BY、

LIMIT

同SELECT

表算子

JOIN

UNION

SQL算子操作对象


单表

单表

多表

多表

字段或分区

字段、分区

字段、分区

字段、分区

字段、分区

函数或表达式

函数、表达式,例如max

函数、表达式,例如max

函数、表达式,例如max

函数、表达式,例如max

        首先,我们将一个DML语句的构成成分分为两大类:

(1)SQL算子,

(2)SQL算子操作对象。

        对于SQL算子,按照操作级别,又可以分为

(1)DML算子,

(2)表算子,

(3)字段算子。

        DML算子有SELECT、DELETE、UPDATE、INSERT等,它们确定了一个DML语句的具体操纵类型,在SQL算子中属于顶层。

        表算子有JOIN、UNION等,它们用于多表之间的操作,例如两表关联(JOIN)。

        字段算子主要操作字段级别的对象,例如GROUP BY按字段分组等。

        SQL算子操作对象,根据对象级别,又可以分为

(1)表,

(2)字段(或分区),

(3)函数或表达式

另外注意,字段对象和表对象是存在隶属关系的,字段对象属于具体的表对象,这也可以体现在设计中。

执行流程分析

        DML语句执行流程可以给DML语句要素设计提供一些思路。所以DML语句的执行流程也很重要。以MySQL数据库中最复杂的SELECT语句为例,说明:

整理出如下伪SQL查询语句:

(8) SELECT (9) DISTINCT|ALL column,
(6) AGG_FUNC(column or expression),...
(1) FROM left_table
(3) JOIN right_table
(2) ON left_table.column = right_table.column
(4) WHERE expression
(5) GROUP BY column
(7) HAVING expression
(10)ORDER BY column ASC|DESC
(11)LIMIT count OFFSET count;

小括号中数字表示执行的顺序。

        我们可以发现,SELECT语句是从 FROM 开始执行的。在实际执行过程中,每个步骤都会为下一个步骤生成一个虚拟表,这个虚拟表将作为下一个执行步骤的输入。 接下来,我们详细的介绍下每个步骤的具体执行过程。

1 FROM 执行笛卡尔积

         FROM 才是 SQL 语句执行的第一步,并非 SELECT 。对FROM子句中的前两个表执行笛卡尔积(交叉联接),生成虚拟表VT1,获取不同数据源的数据集。

FROM子句执行顺序为从后往前、从右到左,FROM 子句中写在最后的表(基础表 driving table)将被最先处理,即最后的表为驱动表,当FROM 子句中包含多个表的情况下,我们需要选择数据最少的表作为基础表。

2 ON 应用ON过滤器

        对虚拟表VT1 应用ON筛选器,ON 中的逻辑表达式将应用到虚拟表 VT1中的各个行,筛选出满足ON 逻辑表达式的行,生成虚拟表 VT2 。

3 JOIN 添加外部行

        如果指定了OUTER JOIN保留表中未找到匹配的行将作为外部行添加到虚拟表 VT2,生成虚拟表 VT3。保留表如下:

  • LEFT OUTER JOIN把左表记为保留表
  • RIGHT OUTER JOIN把右表记为保留表
  • FULL OUTER JOIN把左右表都作为保留表

在虚拟表 VT2表的基础上添加保留表中被过滤条件过滤掉的数据,非保留表中的数据被赋予NULL值,最后生成虚拟表 VT3

如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1~3,直到处理完所有的表为止。

4 WHERE 应用WEHRE过滤器

        对虚拟表 VT3应用WHERE筛选器。根据指定的条件对数据进行筛选,并把满足的数据插入虚拟表 VT4

  • 由于数据还没有分组,因此现在还不能在WHERE过滤器中使用聚合函数对分组统计的数据过滤。
  • 同时,由于还没有进行列的选取操作,因此在SELECT中使用列的别名也是不被允许的。

5 GROUP BY 分组

        按GROUP BY子句中的列/列表将虚拟表 VT4中的行唯一的值组合成为一组,生成虚拟表VT5。如果应用了GROUP BY,那么后面的所有步骤都只能得到的虚拟表VT5的列或者是聚合函数(count、sum、avg等)。原因在于最终的结果集中只为每个组包含一行。

同时,从这一步开始,后面的语句中都可以使用SELECT中的别名。

6 AGG_FUNC 计算聚合函数

        计算 max 等聚合函数。SQL Aggregate 函数计算从列中取得的值,返回一个单一的值。常用的 Aggregate 函数包涵以下几种:

  • AVG:返回平均值
  • COUNT:返回行数
  • FIRST:返回第一个记录的值
  • LAST:返回最后一个记录的值
  • MAX: 返回最大值
  • MIN:返回最小值
  • SUM: 返回总和

7 HAVING 应用HAVING过滤器

        对虚拟表VT5应用HAVING筛选器。根据指定的条件对数据进行筛选,并把满足的数据插入虚拟表VT6

        HAVING 语句在SQL中的主要作用与WHERE语句作用是相同的,但是HAVING是过滤聚合值,在 SQL 中增加 HAVING 子句原因就是,WHERE 关键字无法与聚合函数一起使用,HAVING子句主要和GROUP BY子句配合使用。

8 SELECT 选出指定列

        将虚拟表 VT6中的在SELECT中出现的列筛选出来,并对字段进行处理,计算SELECT子句中的表达式,产生虚拟表 VT7

9 DISTINCT 行去重

        将重复的行从虚拟表 VT7中移除,产生虚拟表 VT8。DISTINCT用来删除重复行,只保留唯一的。

10 ORDER BY 排列

        将虚拟表 VT8中的行按ORDER BY 子句中的列/列表排序,生成游标 VC9,注意不是虚拟表。因此使用 ORDER BY 子句查询不能应用于表达式。同时,ORDER BY子句的执行顺序为从左到右排序,是非常消耗资源的。

11 LIMIT/OFFSET 指定返回行

        从VC9的开始处选择指定数量行,生成虚拟表 VT10,并返回调用者。

        SQL的执行顺序,可以给DML语句可视化设计提供一些思路,可视化设计中可以通过数据流图来体现SQL的执行顺序。

关系代数分析

略。

DML语句可视化设计

设计原则

        根据上面对DML语句的分析,可以将这些DML语句构成要素设计成不同的可视化组件。遵循分类分层、自上而下的设计原则。

        分类设计指的是,根据DML语句构成要素不同,将不同类型要素设计成不同的可视化组件,例如SQL算子和SQL算子操作对象设计成不同的可视化组件。如图:

SQL可视化开发产品设计的一些逻辑思考_原型设计

         分层设计指的是,在设计SQL算子或者操作对象时,优先上一层设计,再钻取到下一层设计。例如我们在设计操作对象可视化组件时,优先设计表级别可视化组件,再设计字段级别可视化组件。如图:

SQL可视化开发产品设计的一些逻辑思考_数据库_02

        自上而下设计指的是,先整体设计,再局部设计。例如,两表关联查询,整体设计如下:

SQL可视化开发产品设计的一些逻辑思考_SQL可视化_03

 然后再设计JOIN组件中具体的关联方式和关联条件。

Axure原型设计

整体设计

DML语句整体设计,如下:

UPDATE语句

SQL可视化开发产品设计的一些逻辑思考_数据库_04

DELETE语句

SQL可视化开发产品设计的一些逻辑思考_原型设计_05

SELECT语句

单表查询

SQL可视化开发产品设计的一些逻辑思考_数据库_06

多表关联查询

SQL可视化开发产品设计的一些逻辑思考_axure_07

 这种设计整体清晰,但存在两个缺陷:

(1)无法表示关联方式

组件无法表示关联方式INNER JOIN、LEFT JOIN、FULL JOIN,

(2)无法表示表关联的左右关系

是table_one INNER JOIN table_two?还是table_two INNER JOIN table_one?

可以如下设计填补这个缺陷:

SQL可视化开发产品设计的一些逻辑思考_SQL可视化_08

显然,简洁性不如第一种。后文分别称这两种设计为多表关联查询设计一多表关联查询设计二

INSERT语句

从一个表中查询数据,写入到另外一张表中:

SQL可视化开发产品设计的一些逻辑思考_sql_09

 当然SELECT和INSERT组件可以合并成一个组件,如下:

SQL可视化开发产品设计的一些逻辑思考_sql_10

 优点:整体清晰,缺点:破坏了SELECT和INSERT组件的独立性。各有优势。

局部设计

        整体设计完以后,接着就要进行局部设计。也就是字段算子的设计,例如:WHERE、GROUP BY等。SELECT语句是所有DML语句中最复杂的,我们以SELECT语句设计为例来说明。如下三表关联查询:

SQL可视化开发产品设计的一些逻辑思考_SQL可视化_08

我们可以在SELECT组件上右键添加字段算子(GROUP BY等),添加好后,如图:

SQL可视化开发产品设计的一些逻辑思考_axure_12

 右边虚框可以展开和收缩。收缩后如下:

SQL可视化开发产品设计的一些逻辑思考_SQL可视化_08

当局部设计好后,就可以设计复杂的SQL语句了,例如:三个表分别查询以后再关联查询,采用多表关联查询设计二,就可以如下设计:

SQL可视化开发产品设计的一些逻辑思考_数据库_14

 对应SQL语句如下:

SELECT
...
FROM (SELECT
...
FROM table_one
WHERE ...
GROUP BY ...
HAVING ...
ORDER BY ...
LIMIT ...
) AS A INNER JOIN (
SELECT
...
FROM table_two
WHERE ...
GROUP BY ...
HAVING ...
ORDER BY ...
LIMIT ...
) AS B
ON ...
LEFT JOIN (
SELECT
...
FROM table_three
WHERE ...
GROUP BY ...
HAVING ...
ORDER BY ...
LIMIT ...
) AS C
ON ...
WHERE ...
GROUP BY ...
HAVING ...
ORDER BY ...
LIMIT ...

 如图,左边是通过拖拽形成的图形,右边是其生成的SQL:

SQL可视化开发产品设计的一些逻辑思考_sql_15

如果采用多表关联查询设计一,可以清晰表达如下:

SQL可视化开发产品设计的一些逻辑思考_原型设计_16

 右边虚框中同时表达了SQL执行数据流关系(SQL执行顺序),它的关系无需用户关心,自动生成,虚框收缩后,如图:

SQL可视化开发产品设计的一些逻辑思考_SQL可视化_17

举报

相关推荐

0 条评论