简介
常有人问起, 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