目录

需求场景

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中的别名。


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算子或者操作对象时,优先上一层设计,再钻取到下一层设计。例如我们在设计操作对象可视化组件时,优先设计表级别可视化组件,再设计字段级别可视化组件。如图:

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

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


Axure原型设计

整体设计

DML语句整体设计,如下:

UPDATE语句


DELETE语句


SELECT语句

单表查询

多表关联查询

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

(1)无法表示关联方式

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

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

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

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

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


INSERT语句

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

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

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


局部设计

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

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

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

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

对应SQL语句如下:

SELECT
...
FROM (SELECT...FROM table_oneWHERE ... GROUP BY ...HAVING ...ORDER BY ...LIMIT ...) AS A INNER JOIN (SELECT...FROM table_twoWHERE ... GROUP BY ...HAVING ...ORDER BY ...LIMIT ...) AS B ON ...LEFT JOIN (SELECT...FROM table_threeWHERE ... GROUP BY ...HAVING ...ORDER BY ...LIMIT ...) AS C ON ...
WHERE ...
GROUP BY ...
HAVING ...
ORDER BY ...
LIMIT ...

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

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

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

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

  1. 后台产品的数据可视化图表产品设计

    前些天,做后台的数据子系统的时候,需要用到一些可视化的数据图表,我用到了一个自认为效果比较好,而且比较方便的方式来实现. 在网上巴拉巴拉地找了一番,目前用到这种方法来做数据图表的人并不多,我给身边的朋 ...

  2. IPTV界面产品设计的几点思考

    受互联网产品思维及视觉冲击,用户对大屏电视的要求也越来越高,对于电视,用户不再只追求直播.视频的清晰度,而是考虑产品的整体设计能否给自己舒适感.合理上手感.懒性引导感,亲切互动感.它就像衣服,用户穿上 ...

  3. 关于会员积分体系的产品设计

    一.会员体系&积分体系说明 会员体系&积分体系,站在运营的角度本质都是通过一系列的运营规则和专属权益来提升用户对平台的忠诚度,反哺平台的各项业务,将用户一步步培养为产品的忠实粉丝. 站 ...

  4. 1.产品/数据产品设计

    1. 概述 产品设计逻辑和流程可以分为3个环节:用户需求调研梳理.产品设计流程和产品原型及需求文档 数据产品的本质是更好地为用户提供信息服务.数据产品设计的关键点和起点在于深刻准确地把握用户需求,而用 ...

  5. 电商产品设计:后台订单管理设计

    打开百度APP看高清图片 订单管理在整个网上商城的地位举足轻重,它涉及到企业整个销售链路的核心环节,同时又关系到用户商品的最终交易结果,所以一份订单在生成到交易结束的整个生命周期里,产品经理和业务经理 ...

  6. 《用户体验要素—以用户为中心的产品设计》读书笔记

    <用户体验要素>这本书将产品设计划划分为5个层次,又将产品划分为功能型平台产品与信息型媒介产品,分别定义了这五个层面上优化用户体验的关键.这五个层次由抽象到具体.由核心到细节涵盖了产品设计 ...

  7. 《系统架构:复杂系统的产品设计与开发》——第3章,第3.4节特殊的逻辑关系...

    本节书摘来自华章出版社<系统架构:复杂系统的产品设计与开发>一书中的第3章,第3.4节特殊的逻辑关系,作者[美]布鲁斯·卡梅隆,更多章节内容可以访问云栖社区"华章计算机" ...

  8. 【产品】可视化大屏设计思路

    可视化大屏设计思路: 根据大屏面向的用户和使用的场景,确定中心主题. 大体分两种类型,一种是信息数据展示类型,另一种是实时监控决策类型.一定要思考清楚用户看到大屏后可以收获到哪些信息,规划好大屏的整条 ...

  9. 软件开发实训(720实训)——4从调研到设计,换发型产品设计的从0到1

      文章主题: 从调研到设计,换发型产品设计的从0到1 内容关键词: MECE分析法.制定整体计划.结构输入.产品机会点 知识来源: 网络整理.张森鹏创业经历.张森鹏产品理念分享 课程: 软件项目实训 ...

最新文章

  1. matlab fminimax 多变量,Matlab应用实例(8)—fminimax
  2. centos7安装tomcat8.5.46版本
  3. python做excel麻烦_高效办公必备:别人通宵做的 Excel,我用Python 半小时搞定!
  4. cuda安装配置VS2013
  5. 数据结构之 栈 (Python 版)
  6. 1009 C语言 SUM problem
  7. windows 7 引导过程概述
  8. 字符串输入控制:与空格、回车的输入相关的几种函数
  9. selenium+testng+reprotng+ant配置
  10. 【DL】第3章 使用词嵌入计算文本相似度
  11. wkhtmltopdf工具将html转换为pdf
  12. 初中数学503个必考知识点_高考数学必考知识点高中数学重点知识归纳
  13. java地铁售票机系统_Java_地铁购票系统
  14. iOS 【微信登录流程以及遇到的一些坑】
  15. 数论及其应用——同余式定理
  16. 论坛数据库设计 mysql_论坛数据库设计初步
  17. 无延时直播/超低延时直播画面同步性测试(实测组图)
  18. 研究生毕业论文致谢导师,导师批注亮了!网友:哈哈哈哈哈哈
  19. 最好玩的计算机游戏排行,10款好玩的电脑单机游戏 好玩的单机游戏排行
  20. 直播程序源码Android10.0 导航栏和状态栏动态控制合集

热门文章

  1. 拼多多 算法工程师-20180921
  2. 趁着周日我卷了 uni-app《uview 狠 优秀的UI框架》
  3. 地图服务商瓦片数据链接地址
  4. 读Chris Crawford 有感.
  5. 第五人格服务器维修到几点,第五人格1月10日更新几点结束 第五人格1月10日更新维护公告...
  6. 成功实现ajax,xmlhttp跨域访问
  7. 虚拟机无法运行英雄联盟解决办法
  8. EA 的类型/EA 智能交易的介绍(自动化交易/程序化交易/量化交易)
  9. PS基础 —— 界面介绍
  10. 计算机能力培训计划,计算机技能培训计划-20210707025117.pdf-原创力文档