sybn sybn-util 项目说明文档 - 基于java的跨数据库联合查询

SqlDdlDao 对于 sql 标准的支持

2019-06-06
sybn

简介

常有人问起, SqlDdlDao 工具类对于 sql 规范的支持版本和支持程度.

因此, 在这里对 sql 规范的支持版本和程度做一下简单的归纳.

目前主要实现的是 sql 规范的 DQL 部分, 因此主要实现的是 SqlDqlDao 部分.

需求 对应接口 说明 jdbc完成度 java完成度
DQL SqlDqlDao
SqlDqlStreamDao
负责数据查询, 主要是: select 80% 100%
DML SqlDmlDao 负责数据修改, 主要是: insert, update, delete 0% 90%
DDL SqlDdlDao
SqlDdlStreamDao
负责表结构管理, 比如: create table / index
继承前两个接口
0% 20%
DCL 事务等管理 0% 0%

sql规范

下面是SQL发展的简要历史:

* 1986年,ANSI X3.135-1986,ISO/IEC 9075:1986,SQL-86
* 1989年,ANSI X3.135-1989,ISO/IEC 9075:1989,SQL-89
* 1992年,ANSI X3.135-1992,ISO/IEC 9075:1992,SQL-92(SQL2)
* 1999年,ISO/IEC 9075:1999,SQL:1999(SQL3)
* 2003年,ISO/IEC 9075:2003,SQL:2003
* 2008年,ISO/IEC 9075:2008,SQL:2008
* 2011年,ISO/IEC 9075:2011,SQL:2011

其中比较重要的标准是 SQL-92, 因此本文主要讨论 SqlDdlDao 对于 SQL-92 版标准内容的支持程度.

参考链接: https://blog.csdn.net/BeiiGang/article/details/43194453

SQL规范支持列表 V:0.3.11

SqlDdlDao 目前只是一个查询工具, 因此基于SQL语句的增删改基本上都没有实现.

修改数据的能力由 common 开放的 java 方法实现.

  • sql DQL 查询支持
[ WITH tableName1 AS ( query ), tableName2 AS ( query ), ... ] 
SELECT [ DISTINCT ] { * | exprs }
FROM { table | ( query ) }
[ WHERE expr ]
[ GROUP BY exprs ]
[ HAVING expr ]
[ ORDER BY expr [ ASC | DESC ], expr [ ASC | DESC ], ... ]
[ SKIP skip]
[ LIMIT [ skip, ] limit ]
[ UNION [ ALL ] <another query> ]
  • DQL 关键词支持
查询语句 支持程度
USE 支持
SHOW DATDBASES [LIKE ‘%aa%’] 支持
SHOW TABLES [FROM DB_NAME] [LIKE ‘%aa%’] 支持, 允许跨数据源
SHOW TABLE STATUS [FROM DB_NAME] [LIKE ‘%aa%’] 支持
SHOW CREATE TABLE 支持 (nosql数据库使用第一行模拟)
SHOW COLUMNS FROM / DESCRIBE / DESC 支持 (nosql数据库使用第一行模拟)
SHOW [FULL] PROCESSLIST 支持 (模拟)
SHOW FUNCTIONS 支持 (模拟)
SET @a := 1 支持
UNION / UNOIN ALL 支持, 允许跨数据源
SELECT DISTINCT 支持
CASE WHEN THEN ELSE END 支持
FROM table / FROM (select …) 支持
FROM table1 a, table2 b 非 jdbc 数据源: 不支持
jdbc 数据源: 直接转发给数据库
WHERE a in (select …) 支持, 允许跨数据源
GROUP BY 支持
HAVING a in (select …) 支持, 允许跨数据源
ORDER BY 支持
SKIP / LIMIT 支持
[INNER / LEFT / RIGHT / FULL] JOIN 非标准语法支持, 允许跨数据源
ON / USING 支持
  • 数据类型
数据类型 支持程度
BOOLEAN 支持
CHAR(n) / CHARACTER(n) 支持
VARCHAR(n) / VARCHAR2(n) 支持
CHARACTER VARYING(n) 支持
INTEGER / INT / SMALLINT 支持
DECIMAL(p,s) / DEC(p,s) / NUMERIC(p,s) / FLOAT(p) / REAL 支持
DOUBLE PRECISION 支持
DATE / datetime / timestamp 支持
TIME 未评估
INTERVAL year-month / day 未评估
BLOB 不支持
  • 条件
条件 支持程度
< > <= >= <> = 支持
AND OR NOT 支持
IS [NOT] NULL 支持
[NOT] LIKE 支持
[NOT] IN ( [,…] ) 支持
[NOT] BETWEEN x AND y 支持
[CONDITIONAL] ANY ( [,…] ) 不支持
[CONDITIONAL] ALL ( [,…] ) 不支持
  • 函数
函数 支持程度
AVG / MAX / MIN / SUM / COUNT 支持
GREATEST / LEAST(x,y,…) 支持
ROUND 支持
TRUNC(x,places/date,format) 不支持
POSITION(s1 IN s2) 不支持
EXTRACT(datetime FROM datetime_value) 支持
CHAR_LENGTH(s1) / LENGTH(s1) 支持
SUBSTRING(string FROM start [FOR length]) / SUBSTR(string,start,length) 部分支持
INSTR(str,substr,start,mnth) 不支持
INITCAP 支持
UPPER / LOWER(string) 支持
TRIM(BOTH/LEADING/TRAILING char FROM string) 支持
[L/R]TRIM(str,chrset) 支持
TRANSLATE / CONVERT(char USING value) / TRANSLATE(str,from,to) 部分支持
[L/R]PAD(str,to_len,str2) 支持
DECODE(expr,search1,result1,…[,default]) 不支持
NVL(expr,replace) 支持
Date Format - ROUND / TRUNC / TO_CHAR / TO_DATE(value,fmt) 部分支持
IF / IFNULL / COALSECE 支持

参考链接: https://blog.csdn.net/zhongmengya/article/details/5049025

像 now(), curdate() 等函数, 未被此版规范提及, 因此上表未有列出.

可以使用 show functions 查询所有支持使用的非聚合函数.

近期主要更新

  • 0.3.7 支持 ES 数据源
  • 0.3.8 支持 left join 等4种 join 的非标准语法实现
  • 0.3.9 支持 presto , 增强 [inner / left/ right/ full] JOIN
  • 0.3.10 支持 csv, excel 的 jdbc 查询
  • 0.3.11 提高 ES 和 Hbase 数据源的兼容性
  • 0.3.12 实现部分 DML 规范 (TODO 暂未完成)

在线测试

可以用以下链接尝测试执行sql, 其中的 sql 及 json数据 可以随意替换. 也可以使用测试表: sql_demo_table,mongo_demo_table,cinema_info

相关页面


Similar Posts

Comments

暂不开放评论! 可微信联系