CN102222097A - 复杂sql语句的生成方法 - Google Patents
复杂sql语句的生成方法 Download PDFInfo
- Publication number
- CN102222097A CN102222097A CN2011101632804A CN201110163280A CN102222097A CN 102222097 A CN102222097 A CN 102222097A CN 2011101632804 A CN2011101632804 A CN 2011101632804A CN 201110163280 A CN201110163280 A CN 201110163280A CN 102222097 A CN102222097 A CN 102222097A
- Authority
- CN
- China
- Prior art keywords
- statement
- sql
- sql statement
- select
- sqllist
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种复杂SQL语句的生成方法,用于解决现有的SQL语句的生成方法不能生成根据组合关键字的复杂SQL语句的技术问题。技术方案是以Postgres数据库测试集为基础,通过对SQL关键字分类、组合、设计基础SQL语句和生成方法,来根据用户指定的关键字自动生成复杂的SQL语句,可以生成根据组合关键字的复杂SQL语句。这些语句可以直接应用于数据库***的测试过程,解决手工编写组合关键字的SQL语句出错率高,效率低的问题。
Description
技术领域
本发明涉及一种SQL语句的生成方法,特别是一种复杂SQL语句的生成方法。
背景技术
文献“SQL生成器的设计与实现[J].计算机工程与设计.2006.Vol.27(11):p2024-2027”公开了一种SQL语句的生成方法,该方法基于SQL92标准,能够实现复杂的SQL语句的生成。首先根据用户指定的数据库表字段和SQL子句、函数或表达式等条件,进行完整性和重复性检查,然后根据SQL92标准拼出特定的符合要求的SQL语句。该方法可以简化SQL语句的生成过程,提高数据库应用程序的开发效率。但是要求用户必须掌握SQL语句的语法和各种复杂表达式的构成方法,输入正确的参数才能得到所需的SQL语句,使用起来较为复杂。其次,该方法只能实现针对指定表字段的SQL语句,不能实现针对指定SQL组合关键字的SQL语句,因此,在数据库测试领域无法应用。
发明内容
为了克服现有的SQL语句的生成方法不能生成根据组合关键字的复杂SQL语句的不足,本发明提供一种SQL语句的生成方法,该方法以Postgres数据库测试集为基础,通过对SQL关键字分类、组合、设计基础SQL语句和生成方法,来根据用户指定的关键字自动生成复杂的SQL语句,可以生成根据组合关键字的复杂SQL语句。
本发明解决其技术问题所采用的技术方案是:一种SQL语句的生成方法,其特点是采用以下步骤:
(a)构建基础SQL语句:
select*from t1;(1)
select id from t1 where id=1;(2)
select distinct id,name from t1 where id>=1order by id;(3)
select count(id),sum(id),avg(id),max(id),min(id)from t1 group by name having count(id)>0order by id;(4)
select*from t1,t2;(5)
select*from t1 natural join t2 on t1.id=t2.id;(6)
select*from t1 join t2 using(id);(7)
select*from t1 left outer join t2 using(id);(8)
select*from t1 right outer join t2 using(id);(9)
select*from t1 where id=(select id from t1 where id=1);(10)
(b)构建SQL关键字列表KeyWordsList和SQL语句列表SQLList:
KeyWordsList={用户指定的组合SQL关键字},
SQLList={};
(c)关键字分组,关键字按照匹配原则归属于四个组:
单表查询={with,select,distinct,as,from,where,group by,having,order by,limit,offset,sum,count,min,max,avg};多表连接查询={natural,join,on,using};多表交、并、差集查询={intersect,union,except,};子查询={select,from,where,select};
(d)对于单表查询,根据输入关键字从基础SQL语句(1)~(4)中查找包含特定关键字的语句加入SQLList,关键字列表减去生成语句中包含的SQL语句,执行步骤(i);
(e)对于多表连接查询,执行下面流程生成SQL语句,加入SQLList,关键字列表减去生成语句中包含的SQL语句,执行步骤(i);
step1:计算连接关键字个数N,根据输入关键字从自定义基础SQL语句(5)~(9)中选择包含指定关键字的SQL语句;
step2:如果是N=1,直接返回该语句,否则进入step3;
step3:删除基础SQL语句后分号,加空格,复制从基础SQL语句连接关键字开始至语句末尾的SQL语句并添加到空格后,N-1;
step4:如果N=1,添加分号,返回SQL;如果不是,返回step3;
(f)对于多表交、并、差集查询,执行下面流程生成SQL语句,加入SQLList,关键字列表减去生成语句中包含的SQL语句,执行步骤(i);
step1:计算连接关键字个数N,取得自定义基础SQL(1);
step2:添加交,并,差关键字,N-1;
step3:添加自定义基础SQL(1);
step4:如果N=0,添加分号,返回SQL;如果不是,返回step2;
(g)对于子查询的SQL语句,继续如下步骤,生成SQL语句加入SQLList,关键字列表减去生成语句中包含的SQL语句,执行步骤(i);
step1:计算子查询级数N,取得自定义基础SQL(10);
step2:查找第一个id=1的位置,删除1,添加“()”,将(2)***括号内,N-1;
step3:如果N=0,返回SQL;如果不是,返回step2。
(h)如果关键字不在基础SQL语句中包含,从Postgres测试集合中挑选匹配的SQL语句加入SQLList,执行步骤(i);
(i)如果KeyWordsList为空,过程结束,返回SQLList;否则继续处理下一个分组。
本发明的有益效果是:由于以Postgres数据库测试集为基础,通过对SQL关键字分类、组合、设计基础SQL语句和生成方法,来根据用户指定的关键字自动生成复杂的SQL语句,可以生成根据组合关键字的复杂SQL语句。这些语句可以直接应用于数据库***的测试过程,解决手工编写组合关键字的SQL语句出错率高,效率低的问题。
下面结合具体实施方式对本发明作详细说明。
具体实施方式
假设指定如下的SQL关键字为{select,join,join,group by,where,intersect},需要生成SQL语句,则生成方法如下:
A.构建基础SQL语句如下:
select*from t1;(1)
select id from t1 where id=1;(2)
select distinct id,name from t1 where id>=1order by id;(3)
select count(id),sum(id),avg(id),max(id),min(id)from t1 group by name having
count(id)>0order by id;(4)
select*from t1,t2;(5)
select*from t1 natural join t2 on t1.id=t2.id;(6)
select*from t1 join t2 using(id);(7)
select*from t1 left outer join t2 using(id);(8)
select*from t1 right outer join t2 using(id);(9)
select*from t1 where id=(select id from t1 where id=1);(10)
B.根据输入SQL组合关键字构建SQL关键字列表KeyWordsList和SQL语句列表SQLList,关键字列表的初值为用户输入的所有关键字,SQL语句列表初值为空。
KeyWordsList={select,join,join,group by,where,intersect},
SQLList={};
C.对关键字分组:
单表={select,group by,where},多表连接={join,join},多表交集={intersect}
D.对于单表查询,根据输入关键字从基础SQL语句(1)~(4)中查找包含特定关键字的语句加入SQLList,关键字列表减去生成语句中包含的SQL语句,执行步骤(i);按照关键字包含最多的SQL优先选择的原则,从基础SQL语句(1)~(4)查到(2)包含{select,where},(4)包含{group by},将这两条SQL语句加入SQLList,关键字列表减去这三个,则:
KeyWordsList={join,join,intersect},
SQLList={select id from t1 where id=1;
select count(id),sum(id),avg(id),max(id),min(id)from t1 group by name having count(id)>0order by id;};
E.对于多表查询,继续判断是否连接查询,如果是,执行下面流程生成SQL语句,加入SQLList,关键字列表减去生成语句中包含的SQL语句,执行步骤(i);
step1:计算连接关键字个数N,根据输入关键字从自定义基础SQL语句(5)~(9)中选择包含指定关键字的SQL语句;
step2:如果是N=1,直接返回该语句,否则进入step3;
step3:删除基础SQL语句后分号,加空格,复制从基础SQL语句连接关键字开始至语句末尾的SQL语句并添加到空格后,N-1;
select*from t1 natural join t2 on t1.id=t2.id join t2 on t1.id=t2.id;
将上述语句加入SQLList,关键字列表减去两个join关键字,则:
step4:如果N=1,添加分号,返回SQL;如果不是,返回step2;
F.对于多表交集查询,执行下面流程生成SQL语句,加入SQLList,关键字列表减去生成语句中包含的SQL语句,执行步骤(i);
step1:计算连接关键字个数N,取得自定义基础SQL(1);
step2:添加交,并,差关键字,N-1;
step3:添加自定义基础SQL(1);
step4:如果N=0,添加分号,返回SQL;如果不是,返回step2;
上述语句加入SQLList,KeyWordsList减去intersect,则:
G.对于子查询的SQL语句,继续如下步骤,生成SQL语句加入SQLList,关键字列表减去生成语句中包含的SQL语句,执行步骤(i);
step1:计算子查询级数N,取得自定义基础SQL(10);
step2:查找第一个id=1的位置,删除1,添加“()”,将(2)***括号内,N-1;
step3:如果N=0,返回SQL;如果不是,返回step2。
H.如果关键字不在基础SQL语句中包含,从Postgres测试集合中挑选匹配的SQL语句加入SQLList,执行步骤(i);
I.如果KeyWordsList为空,过程结束,返回SQLList;否则继续处理其他分组。
根据上述方法,一共生成了4条SQL语句,包含用户指定的关键字和指定的连接层次。且根据最大匹配原则保证返回的SQL语句集最少,每条语句中包含尽可能多的关键字,复杂程度最高。通过该方法生成的SQL语句直接应用于数据库测试领域,测试人员不需要了解SQL的语法规则,只要输入需要测试的组合SQL关键字,就可以生成符合语法规则的SQL语句,简化了测试过程,降低了测试难度。而且,生成的SQL语句中可以包含任意层次的连接查询和子查询等,容易测试程序的各种分支和边界。
Claims (1)
1.一种复杂SQL语句的生成方法,其特征在于采用以下步骤:
(a)构建基础SQL语句:
select*from t1;(1)
select id from t1 where id=1;(2)
select distinct id,name from t1 where id>=1order by id;(3)
select count(id),sum(id),avg(id),max(id),min(id)from t1 group by name having count(id)>0order by id;(4)
select*from t1,t2;(5)
select*from t1 natural join t2 on t1.id=t2.id;(6)
select*from t1 join t2 using(id);(7)
select*from t1 left outer join t2 using(id);(8)
select*from t1 right outer join t2 using(id);(9)
select*from t1 where id=(select id from t1 where id=1);(10)
(b)构建SQL关键字列表KeyWordsList和SQL语句列表SQLList:
KeyWordsList={用户指定的组合SQL关键字},
SQLList={};
(c)关键字分组,关键字按照匹配原则归属于四个组:
单表查询={with,select,distinct,as,from,where,group by,having,order by,limit,offset,sum,count,min,max,avg};多表连接查询={natural,join,on,using};多表交、并、差集查询={intersect,union,except,};子查询={select,from,where,select};
(d)对于单表查询,根据输入关键字从基础SQL语句(1)~(4)中查找包含特定关键字的语句加入SQLList,关键字列表减去生成语句中包含的SQL语句,执行步骤(i);
(e)对于多表连接查询,执行下面流程生成SQL语句,加入SQLList,关键字列表减去生成语句中包含的SQL语句,执行步骤(i);
step1:计算连接关键字个数N,根据输入关键字从自定义基础SQL语句(5)~(9)中选择包含指定关键字的SQL语句;
step2:如果是N=1,直接返回该语句,否则进入step3;
step3:删除基础SQL语句后分号,加空格,复制从基础SQL语句连接关键字开始至语句末尾的SQL语句并添加到空格后,N-1;
step4:如果N=1,添加分号,返回SQL;如果不是,返回step3;
(f)对于多表交、并、差集查询,执行下面流程生成SQL语句,加入SQLList,关键字列表减去生成语句中包含的SQL语句,执行步骤(i);
step1:计算连接关键字个数N,取得自定义基础SQL(1);
step2:添加交,并,差关键字,N-1;
step3:添加自定义基础SQL(1);
step4:如果N=0,添加分号,返回SQL;如果不是,返回step2;
(g)对于子查询的SQL语句,继续如下步骤,生成SQL语句加入SQLList,关键字列表减去生成语句中包含的SQL语句,执行步骤(i);
step1:计算子查询级数N,取得自定义基础SQL(10);
step2:查找第一个id=1的位置,删除1,添加“()”,将(2)***括号内,N-1;
step3:如果N=0,返回SQL;如果不是,返回step2;
(h)如果关键字不在基础SQL语句中包含,从Postgres测试集合中挑选匹配的SQL语句加入SQLList,执行步骤(i);
(i)如果KeyWordsList为空,过程结束,返回SQLList;否则继续处理下一个分组。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2011101632804A CN102222097A (zh) | 2011-06-16 | 2011-06-16 | 复杂sql语句的生成方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2011101632804A CN102222097A (zh) | 2011-06-16 | 2011-06-16 | 复杂sql语句的生成方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN102222097A true CN102222097A (zh) | 2011-10-19 |
Family
ID=44778649
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2011101632804A Pending CN102222097A (zh) | 2011-06-16 | 2011-06-16 | 复杂sql语句的生成方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102222097A (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104756101A (zh) * | 2012-10-31 | 2015-07-01 | 惠普发展公司,有限责任合伙企业 | 执行具有多个集合操作符的查询 |
CN107341235A (zh) * | 2017-07-04 | 2017-11-10 | 北京京东尚科信息技术有限公司 | 报表查询方法、装置、介质和电子设备 |
CN107562955A (zh) * | 2017-09-30 | 2018-01-09 | 北京酷我科技有限公司 | 一种sql语句的快速生成方法 |
CN107798026A (zh) * | 2016-09-05 | 2018-03-13 | 北京京东尚科信息技术有限公司 | 数据查询方法和装置 |
CN109558447A (zh) * | 2018-12-14 | 2019-04-02 | 万翼科技有限公司 | 数据管理方法、装置及计算机可读存储介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1556482A (zh) * | 2003-12-31 | 2004-12-22 | 中兴通讯股份有限公司 | 一种用于实现数据库多表查询的数据处理方法 |
CN101561817A (zh) * | 2009-06-02 | 2009-10-21 | 天津大学 | 一种XQuery到SQL查询语言的转换算法及关系数据的查询方法 |
-
2011
- 2011-06-16 CN CN2011101632804A patent/CN102222097A/zh active Pending
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1556482A (zh) * | 2003-12-31 | 2004-12-22 | 中兴通讯股份有限公司 | 一种用于实现数据库多表查询的数据处理方法 |
CN101561817A (zh) * | 2009-06-02 | 2009-10-21 | 天津大学 | 一种XQuery到SQL查询语言的转换算法及关系数据的查询方法 |
Non-Patent Citations (2)
Title |
---|
胡宏银等: "基于VBA 的SQL 生成***设计与实现", 《武汉化工学院学报》 * |
邓 江等: "复杂对象查询的实现技术", 《西北工业大学学报》 * |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104756101A (zh) * | 2012-10-31 | 2015-07-01 | 惠普发展公司,有限责任合伙企业 | 执行具有多个集合操作符的查询 |
CN107798026A (zh) * | 2016-09-05 | 2018-03-13 | 北京京东尚科信息技术有限公司 | 数据查询方法和装置 |
CN107341235A (zh) * | 2017-07-04 | 2017-11-10 | 北京京东尚科信息技术有限公司 | 报表查询方法、装置、介质和电子设备 |
CN107562955A (zh) * | 2017-09-30 | 2018-01-09 | 北京酷我科技有限公司 | 一种sql语句的快速生成方法 |
CN109558447A (zh) * | 2018-12-14 | 2019-04-02 | 万翼科技有限公司 | 数据管理方法、装置及计算机可读存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Park et al. | Deco: A system for declarative crowdsourcing | |
Zheng et al. | Natural language question/answering: Let users talk with the knowledge graph | |
CN104123374B (zh) | 分布式数据库中聚合查询的方法及装置 | |
CN102222097A (zh) | 复杂sql语句的生成方法 | |
CN105868411B (zh) | 一种非关系型与关系型数据库一体化数据查询方法与*** | |
Meliou et al. | Causality and explanations in databases | |
US11599535B2 (en) | Query translation for searching complex structures of objects | |
CN105718593B (zh) | 一种数据库查询优化方法及*** | |
CN101561817A (zh) | 一种XQuery到SQL查询语言的转换算法及关系数据的查询方法 | |
CN107480198A (zh) | 一种分布式NewSQL数据库***和全文检索方法 | |
JP2006012173A5 (zh) | ||
Chen et al. | Senbazuru: A prototype spreadsheet database management system | |
Heidenreich et al. | A framework for generating query language code from OCL invariants | |
CN107016011A (zh) | 用于自然语言查询的联接路径的消岐 | |
CN102609451A (zh) | 面向流式数据处理的sql查询计划生成方法 | |
CN103778251B (zh) | 面向大规模rdf图数据的sparql并行查询方法 | |
Glavic et al. | TRAMP: understanding the behavior of schema mappings through provenance | |
CN102033885A (zh) | 用于XML数据存储库中的XPath执行的方法和*** | |
CN111914066B (zh) | 多源数据库全局搜索方法及*** | |
Zhao et al. | Multiple nested schema of HBase for migration from SQL | |
CN103678634A (zh) | 一种提高J-Hi开源开发平台中数据查询速度的方法 | |
CN105975489A (zh) | 一种基于元数据的在线sql代码补全方法 | |
CN109739882A (zh) | 一种基于Presto和Elasticsearch的大数据查询优化方法 | |
Chandarana et al. | SpeakQL: towards speech-driven multi-modal querying | |
CN107729428A (zh) | 一种基于Presto和Elasticsearch的SQL查询方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20111019 |
|
RJ01 | Rejection of invention patent application after publication |