fastdb 简介 查询语言
Grammar conventions
|
|
Example
|
Meaning
|
expression
|
non-terminals
|
not
|
terminals
|
|
|
disjoint alternatives
|
(not)
|
optional part
|
{1..9}
|
repeat zero or more times
|
select-condition ::= (expression ) ( traverse ) ( order )expression ::=disjunctiondisjunction ::= conjunction | conjunction or disjunctionconjunction ::=comparison | comparison and conjunctioncomparison ::=operand = operand |operand != operand |operand <> operand |operand < operand |operand <= operand |operand > operand |operand >= operand |operand (not) like operand | operand (not) like operand escape string |operand (not) in operand |operand (not) in expressions-list |operand (not) between operandand operand |operand is (not) nulloperand ::=additionadditions ::= multiplication | addition + multiplication | addition|| multiplication |addition - multiplicationmultiplication ::=power | multiplication* power | multiplication / powerpower ::=term | term ^ powerterm ::= identifier | number | string |true | false | null |current | first | last |( expression ) |not comparison |- term | term[ expression ] |identifier . term |function term | existsidentifier : termfunction ::=abs | length | lower | upper | integer |real | string | user-functionstring ::=' { { any-character-except-quote } ('') }'expressions-list ::=( expression { , expression })order ::= order by sort-listsort-list ::=field-order { , field-order }field-order ::= [length]field (asc | desc)field ::=identifier { . identifier }traverse ::=start from field ( follow by fields-list )fields-list ::= field { , field }user-function ::=identifier
标识符大小写敏感,必须以一个a-z,A-Z,_ 或者$字符开头,只包含a-z, A-Z, 0-9,_或者$字符,不能使用SQL保留字。
保留字列表
|
||||
abs
|
and
|
asc
|
between
|
by
|
current
|
desc
|
escape
|
exists
|
false
|
first
|
follow
|
from
|
in
|
integer
|
is
|
length
|
like
|
last
|
lower
|
not
|
null
|
or
|
real
|
start
|
string
|
true
|
upper
|
|
|
exists i: (contract[i].company.location = 'US')将选择由位于‘US'的公司载运的合同的所有细节,而下面的查询:not exists i: (contract[i].company.location = 'US')将选择由'us'之外的公司载运的合同的所有细节可以由嵌套的exists子句。使用嵌套exist算子等同于使用相应的索引变量的嵌套循环。例如查询 exists column: (exists row: (matrix[column][row] = 0))将选择matrix字段的元素为0的所有记录,该字段拥有整形数组的数组数据类型。这个构造等同于下面的两层嵌套循环:bool result = false; for (int column = 0; column < matrix.length(); column++) { for (int row = 0; row < matrix[column].length(); row++) { if (matrix[column][row] == 0) { result = true; break; } } }
References
fastdb提供特别的运算符以通过引用来递归遍历记录
start from root-references ( follow bylist-of-reference-fields )这个结构的第一部分用来指定根对象,无结束符的root-references应该是一个引用变量或者一个引用数组类型的变量。这里可以使用两个特别的关键字first和last,分别用来定位表中第一个或最后一个记录。如果要要检查一个引用数组或者某些情况下一个引用字段引用的所有记录,这个结构可以无需follow部分。如果指定了follow by部分,fastdb将递归遍历表中的记录,从根引用开始,使用list-of-reference-fields在记录间转换。list-of-reference-fields应当由引用字段或者引用数组。遍历是按照顶-左-右顺序的层次遍历(首先访问父结点然后是从左到右顺序的兄弟结点)。当遇到null引用或者一个已经被访问过的纪录的引用时递归终止。例如下面的查询将按照TLR顺序在一棵记录树中查找weight大于1的记录: "weight > 1 start from first follow by left, right"对于下面的树: A:1.1 B:2.0 C:1.5 D:1.3 E:1.8 F:1.2 G:0.8
the result of the query execution will be:
查询结果将是:('A', 1.1), ('B', 2.0), ('D', 1.3), ('E', 1.8), ('C', 1.5), ('F', 1.2)正如已经提到过的fastdb总是处理对象并且不支持连接。连接可以用引用来实现。考虑经典的Supplier-Shipment-Detail例子:struct Detail { char const* name; double weight; TYPE_DESCRIPTOR((KEY(name, INDEXED), FIELD(weight)));}; struct Supplier { char const* company; char const* address; TYPE_DESCRIPTOR((KEY(company, INDEXED), FIELD(address)));}; struct Shipment { dbReference<Detail> detail; dbReference<Supplier> supplier; int4 price; int4 quantity; dbDateTime delivery; TYPE_DESCRIPTOR((KEY(detail, HASHED), KEY(supplier, HASHED), FIELD(price), FIELD(quantity), FIELD(delivery)));};我们打算获得某些特定供应商的供应的某些特定细节。在关系数据库中这种查询将会写成这样: select from Supplier,Shipment,Detail where Supplier.SID = Shipment.SID and Shipment.DID = Detail.DID and Supplier.company like ? and Supplier.address like ? and Detail.name like ?
fastdb中将会写成这样:
dbQuery q = "detail.name like",name,"and supplier.company like",company, "and supplier.address like",address,"order by price";fastdb将首先在表Detail中进行索引查找获得匹配查找条件的记录。然后在所选的记录中再进行一次索引查找以定位装载记录。然后对剩余的选择断言进行顺序查找。
Predefined functions
|
|||
Name
|
Argument type
|
Return type
|
Description
|
abs
|
integer
|
integer
|
absolute value of the argument
|
abs
|
real
|
real
|
absolute value of the argument
|
integer
|
real
|
integer
|
conversion of real to integer
|
length
|
array
|
integer
|
number of elements in array
|
lower
|
string
|
string
|
lowercase string
|
real
|
integer
|
real
|
conversion of integer to real
|
string
|
integer
|
string
|
conversion of integer to string
|
string
|
real
|
string
|
conversion of real to string
|
upper
|
string
|
string
|
uppercase string
|
Argument type
|
Argument value
|
Argument value type
|
dbUserFunctionArgument::atInteger
|
u.intValue
|
int8
|
dbUserFunctionArgument::atBoolean
|
u.boolValue
|
bool
|
dbUserFunctionArgument::atString
|
u.strValue
|
char const*
|
dbUserFunctionArgument::atReal
|
u.realValue
|
real8
|
dbUserFunctionArgument::atReference
|
u.oidValue
|
oid_t
|
dbUserFunctionArgument::atRawBinary
|
u.rawValue
|
void*
|
#include <math.h> ... USER_FUNC(sin);函数只能在定义的应用中使用。函数对于其他应用和交互sql是不可访问的。在返回字符串的函数中,返回的字符串必须用new运算符复制,因为fastdb在拷贝完返回值后将调用析构函数。在fastdb,函数的参数可以(当不是必须)用圆括号括起来,因此下面的表达式都是合法的: '$' + string(abs(x)) length string y 带两个参数的函数也可以当作运算符。考虑下面的例子,其中定义了函数contains进行大小写敏感的字串查找。 bool contains(dbUserFunctionArgument& arg1, dbUserFunctionArgument& arg2) { assert(arg1.type == dbUserFunctionArgument::atString && arg2.type == dbUserFunctionArgument::atString); return stristr(arg1.u.strValue, arg2.u.strValue) != NULL; } USER_FUNC(contains); dbQuery q1, q2; q1 = "select * from TestTable where name contains 'xyz'"; q2 = "select * from TestTable where contains(name, 'xyz')";在这个例子中,查询q1和q2是等价的。
fastdb 简介 查询语言相关推荐
- ORM查询语言(OQL)简介--概念篇
相关文章内容索引: ORM查询语言(OQL)简介--概念篇 ORM查询语言(OQL)简介--实例篇 ORM查询语言(OQL)简介--高级篇:脱胎换骨 ORM查询语言(OQL)简介--高级篇(续):庐山 ...
- SQL(结构化查询语言)简介
一.结构化查询语言简介 结构化查询语言(Structured Query Language)简称SQL, 是操作和检索关系型数据库的标准语言,20世纪70年代由IBM公司开发,目前应用于各种关系型数据 ...
- 07--MySQL自学教程:DQL(Data Query Language:数据库查询语言)简介、基础查询、条件查询、模糊查询以及排序(一)
1. DQL(Data Query Language:数据库查询语言)知识点概览 DQL(Data Query Language:数据库查询语言): 用来查询数据(记录),不会对数据进行改变,而是让数 ...
- 结构化查询语言(SQL)简介
第一部分:介绍 结构化查询语言(SQL)是现代数据库体系结构的基本构成部分之一.SQL定义了在大多数平台上建立和操作关系数据库的方法.乍看这种语言很可怕,很复杂,但它真的不是那么糟.现在你将会知道它的 ...
- FastDB.html
简介 FastDB 是一个高效率的内存数据库系统,具有实时性能和方便的 C++ 接口.FastDB 并不支持客户端/ 服务器结构,所有使用FastDB 数据库的应用程序都必须运行在同一台主机上.Fas ...
- FastDB 高效率的内存数据库系统
FastDB 高效率的内存数据库系统 简介 FastDB 是一个高效率的内存数据库系统,具有实时性能和方便的 C++ 接口.FastDB 并不支持客户端/ 服务器结构,所有使用FastDB 数据库的应 ...
- FastDB 应用开发指南(一)
FastDB 应用开发指南(一) 简介 FastDB 是一个高效率的内存数据库系统,具有实时性能和方便的 C++ 接口.FastDB 并不支持客户端/ 服务器结构,所有使用FastDB 数据库的应用程 ...
- 双表查询java代码_什么是JDBC?Java数据库连接性简介
JDBC(Java数据库连接性)是Java API,用于管理与数据库的连接,发出查询和命令以及处理从数据库获得的结果集.JDBC在1997年作为JDK 1.1的一部分发布,是为Java持久层开发的首批 ...
- 使用 JSONP 实现跨域通信,第 2 部分: 使用 JSONP、jQuery 和 Yahoo! 查询语言构建 mashup...
使用 JSONP 实现跨域通信,第 2 部分: 使用 JSONP.jQuery 和 Yahoo! 查询语言构建 mashup 使用 JSONP 实现跨域通信,第 2 部分: 使用 JSONP.jQue ...
最新文章
- ajax提交相对路径报错,ajax提交请求为啥url要用这个函数encodeURI
- Java基础-异常(Exception)处理
- 正则表达式教程手册、正则一点通(Chinar出品)
- java access 分页查询语句,简单又高效的Access分页语句
- 如何快速学会嵌入式?
- unity3D 5中如何修改及显示Text的值
- 为什么需要动态SQL?
- Vue项目代码改进(三)—— Cookie、LocalStorage和SessionStorage的使用
- gdb调试常用命令速查(段错误调试)
- 用手刻出计算机系统,一种计算机模拟手工雕刻制版的方法
- Error:The module 'app' is an Android project without build variants, and cannot be built.
- 从C到JAVA,从面向过程到面向对象
- 毕设题目:Matlab元胞自动机交通流
- 基于MIPS指令集的单周期处理器设计
- JS实现经纬度坐标转成XY坐标
- NPV、IRR的计算
- 未来10年,软件开发技术的8个发展趋势
- 联想小新一键恢复小孔_联想一键恢复系统怎么用?小新Air 13 Pro怎么还原操作系统?...
- 智能测试实践之路-UI缺陷检测
- 企业文件加密系统 — 文件透明加密的优势和功能
热门文章
- python基础(24)IO编程
- 谈谈对Python爬虫的理解
- 海思SD3403/SS928开发(三)红外DC接入
- sublime text 打开总是弹框报错Unable to download XXX. Please view the console for more details.解决办法
- 霍尔效应——ABS传感器
- Python--模块和包
- linux创建套接字文件类型,Linux日记---0X03文件类型
- JavaScript注释(多行注释+单行注释)
- Python图像识别-Opencv05 色彩
- Linux常用命令——sysctl命令