CN102222097A - 复杂sql语句的生成方法 - Google Patents

复杂sql语句的生成方法 Download PDF

Info

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
Application number
CN2011101632804A
Other languages
English (en)
Inventor
刘文洁
李战怀
周云涛
张晓�
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Northwestern Polytechnical University
Original Assignee
Northwestern Polytechnical University
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Northwestern Polytechnical University filed Critical Northwestern Polytechnical University
Priority to CN2011101632804A priority Critical patent/CN102222097A/zh
Publication of CN102222097A publication Critical patent/CN102222097A/zh
Pending legal-status Critical Current

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语句的生成方法。
背景技术
文献“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关键字,则:
Figure BSA00000519521900041
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,则:
Figure BSA00000519521900051
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;否则继续处理下一个分组。
CN2011101632804A 2011-06-16 2011-06-16 复杂sql语句的生成方法 Pending CN102222097A (zh)

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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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查询语言的转换算法及关系数据的查询方法

Patent Citations (2)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
Title
胡宏银等: "基于VBA 的SQL 生成***设计与实现", 《武汉化工学院学报》 *
邓 江等: "复杂对象查询的实现技术", 《西北工业大学学报》 *

Cited By (5)

* Cited by examiner, † Cited by third party
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