SELECT 和 TSelectSqlStatement类
各种数据库中使用的SELECT语句, 在SQL ANSI中对应<query specifcation>
,或更复杂的<query expression>
。
我们常说的SUBQUERY,是<left paren> <query expression> <right paren>
,代表从<query expression>
衍生出来的一个标量、一行记录、或一个表。
一些基本的术语
1. table expression
<table expression>
te1, Specify a table or a grouped table.
<table expression> ::=
<from clause>
[ <where clause> ]
[ <group by clause> ]
[ <having clause> ]
[ <window clause> ]
2. table reference
<table reference>
tr1,tr2, Reference a table.
Since the result of a query is a Table derived by evaluating that query, not all SQL Tables have an explicit <Table name>
– so SQL allows you to refer to any Table using a <Table reference>
. (重点是SQL中的table不仅仅是数据库中存在的base table, 还有其它例如subquery
, VALUES CLAUSE, function table等)。
<table reference> ::=
<table factor>
| <joined table>
<table factor> ::=
<table primary> [ <sample clause> ]
3. query specifcation
<query specifcation>
qs1, Specify a table derived from the result of a <table expression>
.
<query specification> ::=
SELECT [ <set quantifier> ] <select list> <table expression>
4. query expression
<query expression>
qe1, Specify a table.
在<query specifcation>
的基础上,支持<with clause>
和 SET OPERATOR(UNION,EXCEPT,INTERSECT),同时支持<table value constructor>
,<explicit table>
.
<query expression>
用括号括起来后,可以用在SQL中任何需要Table的地方。
<query expression> ::=
[ <with clause> ] <query expression body>
<query expression body> ::=
<query term>
| <query expression body> UNION [ ALL | DISTINCT ]
[ <corresponding spec> ] <query term>
| <query expression body> EXCEPT [ ALL | DISTINCT ]
[ <corresponding spec> ] <query term>
<query term> ::=
<query primary>
| <query term> INTERSECT [ ALL | DISTINCT ] [ <corresponding spec> ] <query primary>
<query primary> ::=
<simple table>
| <left paren> <query expression body> <right paren>
<simple table> ::=
<query specification>
| <table value constructor>
| <explicit table>
5. subquery
<subquery>
s1, Specify a scalar value, a row, or a table derived from a <query expression>
.
<scalar subquery> ::=
<subquery>
<row subquery> ::=
<subquery>
<table subquery> ::=
<subquery>
<subquery> ::=
<left paren> <query expression> <right paren>
GSP 中的对应类
SQL语句在GSP中都有对应的类,其中对应<query expression>
的是TSelectSqlStatement
,TSelectSqlStatement
也可以表示<query specification>
,<table value constructor>
及用SET OPERATOR连接的<query specification>
。
1. TSelectSqlStatement
表示<query specification>
这是最常见的用法,TSelectSqlStatement
类的属性包含<table expression>
的各个组成部分<from clause>
,<where clause>
,<group by clause>
,<having clause>
,<window clause>
,也可以包含<with clause>
。
2. TSelectSqlStatement
表示 SET OPERATOR连接的<query specification>
这种情况下,只有TSelectSqlStatement getLeftStmt()
and TSelectSqlStatement getRightStmt()
可用,分别表示
SELECT boss_name, salary FROM Bosses
UNION
SELECT employee_name, salary FROM Employees;
中的
SELECT boss_name, salary FROM Bosses
SELECT employee_name, salary FROM Employees;
其中,getLeftStmt()
表示的TSelectSqlStatement可以再次表示SET OPERATOR连接的<query specification>
,形成递归。而getRightStmt()
表示的TSelectSqlStatement只能是<query specification>
。
public boolean isCombinedQuery()
可以用来确定TSelectSqlStatement
是否为SET OPERATOR连接。
3. TSelectSqlStatement
表示<table value constructor>
<table value constructor>
最长见的用法是在INSERT
语句中,但也可以用在需要SELECT
的地方。
这就是为什么<table value constructor>
在GSP中是用TSelectSqlStatement
类来表示的原因。
VALUES (’NEWAAA’, ’new’), (’NEWBBB’, ’new’)
因此,当我们处理表示<table value constructor>
的TSelectSqlStatement
类实例时,必须要小心,
因为很多SELECT
语句中的元素这时在TSelectSqlStatement
类实例中不存在,
访问这些类属性将会导致NullPointerException
的错误。
isValueClause()
可以用来检查一个TSelectSqlStatement
类是否表示<table value constructor>
,如果是,用
TValueClause getValueClause()
来获取进一步的详细内容。
Reference
- te1. ISO/IEC 9075-2 (SQL/Foundation) 2006. p318, 7.4
- tr1, ISO/IEC 9075-2 (SQL/Foundation) 2006. p321, 7.6
- tr2, crate-sql99.pdf, p462
- qs1, ISO/IEC 9075-2 (SQL/Foundation) 2006. p361, 7.12
- qe1, ISO/IEC 9075-2 (SQL/Foundation) 2006. p371, 7.13
- s1, ISO/IEC 9075-2 (SQL/Foundation) 2006. p390, 7.15