FROM子句
描述了查询从哪些数据表中获取数据。语法如下:
from TABLE [[as] ALIAS] [,...] [[inner|left|right|full] join] TABLE [[as] ALIAS] [on SEARCH_CONDITION] [...]]
|
TABLE [[as] ALIAS][,...]
TABLE在MOQL中并不是指一个真正的持久化数据表,它所指代的是一个置于内存中的集合对象。这个集合对象可以是一个java.util.Map对象、系统数组对象、所有继承了java.util.Iterator接口的对象、数据库查询结果java.sql.ResultSet对象、MOQL自己查询返回的org.moql.RecordSet对象以及一个子查询。这些集合对象中的每一个对象元素被MOQL看做为一条记录。MOQL查询中定义的查询结果输出列、条件、分组以及排序等都是针对这些对象元素来设定的。另外,该子句与SQL的From子句一致,支持为TABLE设定一个易记的别名,并可在后续的MOQL编写中以该别名访问TABLE的信息。如:
List<BeanA> beanAList = BeanFactory.createBeanAList(0,100); DataSetMap dataSetMap = new DataSetMapImpl(); dataSetMap.putDataSet("BeanA", beanAList); String sql = "select a.id, a.name, a.num%500 from BeanA a where a.num%500 > 10 order by 3"; try { Selector selector = MoqlUtils.createSelector(sql); selector.select(dataSetMap); RecordSet recordSet = selector.getRecordSet(); outputRecordSet(recordSet); } catch (MoqlException e) { e.printStackTrace(); } |
链表BeanA在上例中的别名为a,a.id、a.name等都是通过使用别名完成的对链表BeanA元素对象的访问。
当MOQL需要同时从多个TABLE中查询数据时,其语法表现形式与SQL一致,都是将多个表放在from关键字后,并用“,”隔开,且TABLE的数目没有限制。如:
select a.id, a.name, a.num%500, b.id, b.name, b.num%500 from BeanA a, BeanB b where a.num%500 > 10 or b.num%500 < 400 order by 3 desc, 6 desc |
[[inner|left|right|full] join] TABLE [[as] ALIAS] [,...]
描述了进行多个表查询时,表之间的数据连接方式。MOQL缺省支持inner join(内连接)、left join(左[外]连接)、right join(右[外]连接)以及full join(全[外]连接)四种表连接方式。当join没有添加任何前缀时,表示inner join(内连接)。同一MOQL语句中,连接的个数没有限制。至于内连接、左连接、右连接、全连接的数据连接效果,MOQL与SQL完全一致,在此就不做赘述,可以参考SQL相关的资料进行了解。
[onSEARCH_CONDITION]
描述了数据连接时的连接条件。SEARCH_CONDITION为具体的连接条件,其详细描述参见《MOQL—过滤器(Filter)》。
MOQL表连接查询的语句示例如下:
select a.id, a.name, a.num, b.id, b.name, b.num, c.id, c.name, c.num from BeanA a left join BeanB b on a.id = b.id right join BeanC c on c.id = b.id order by 3 desc |
WHERE子句
描述了数据查询的查询条件,该条件与FROM子句中的join操作的on条件描述一致。
[where SEARCH_CONDITION] |
SEARCH_CONDITION为具体的查询条件,其详细描述参见《MOQL—过滤器(Filter)》。
GROUP BY子句
描述查询的用哪些字段进行分组。使用该子句时,与SQL一致,在SELECT子句中描述的所有没有进行聚合计算的字段都必须包含在该子句中。
[group by COLUMN [, ...]] |
COLUMN
COLUMN可以是一个出现在SELECT子句中的列、列的别名或列所处的索引位置,索引位置从1开始计数。一个GROUP BY子句可以包括一个或多个COLUMN。如:
select count(a.id) cnt, sum(a.num) sum, a.num%500 mod, a.id from BeanA a group by 3, a.id |
项目地址:http://sourceforge.net/projects/moql/
代码路径:svn://svn.code.sf.net/p/moql/code/trunk