|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
原文地址:https://mp.weixin.qq.com/s?__biz ... 6&lang=zh_CN#rd
一、DQL语法结构
其实也很简单,语法结构主要是:
Term Boolean Term [Boolean Term …]
Term即术语,Boolean即逻辑符。初看起来就是“术语加逻辑符”,用空格间隔。可是Term有哪些,逻辑符又有哪些呢?
二、Tearm术语
Term由三个部分构成:标识符、操作符、值。其语法为:
[Identifier] Operator [Value]
继续深入下去,标识符又分为三种类型:汇总字段(字段名)、视图或文件夹.列名、@函数。其中视图或文件夹.列名中的列名必须是主要的可排序的列名称;函数则主要有@all、@ModifiedInThisFile 、@DocumentUniqueID和@Created等。
操作符有= 、> 、>= 、 < 、 <= 和in [all]等。
值也有三种,对应三种字段数值类型:文本、时间日期和数字。
三、逻辑符
逻辑符由"and"、"or"、"and not"、"or not"等四个组成。熟悉一点其他脚本或编程语言的朋友,应该对这四个单词非常熟悉,所以不过多地进行解释了。
四、几个简单的例子
虽然DQL并不复杂,但听起来很有点枯燥,幸亏我们可以举些例子,以加深大家的理解。
A、如要查询订单号在146751和150111(包括150111)之间的所有文档,则查询语句应该这么写:
order_no > 146751 and order_no <= 150111
是不是很简单,像以前的公式?现在我们稍微看一个复杂一点的,还记得操作符号in [all]吗?
B、下列代码的意思是找出username字段中包含'Chad Keighley’, ‘Jeff Chantel’, ‘Louis Cawlfield’, ‘Mariel Nathanson’任意一个名字的所有文档。
username in (‘Chad Keighley’, ‘Jeff Chantel’, ‘Louis Cawlfield’, ‘Mariel Nathanson’)
C、下面用一个值为日期的查找文档方法,比如找到字段date_origin日期值在2018年10月10号以后的所有文档
date_origin > @dt(‘20181010T100000+0500’)
时间日期值是GMT或ZULU时间格式中指定的ISO8601兼容值,一般会用公式@dt(‘datetime value’)进行获取或处理。
D、如果查找Orders视图中的order_type为Phone的所有文档,其语句为
‘Orders’.order_type = ‘Phone’
E、在‘Orders’, ’Special orders folder 1’, ‘Old_orders 2’视图或文件夹中找所有的文档
in (‘Orders’, ’Special orders folder 1’, ‘Old_orders 2’)
五、逻辑运算符和顺序
大家还记得逻辑符吗?and、or、and not、or not四个,即且、或、且否、或否。比如以下语句:
Order_origin in (‘London’, ‘LA’, ‘Tokyo’) AND date_origin > @dt(‘20160511’) or partno = 388388
猜一猜这段代码的执行吧?从某个数据库中取出,Order_origin字段值为London, LA, Tokyo中的一个且date_origin字段值必须为2016年5月11号以后的所有文档,或者partno字段值为388388的文档。这个和执行的先后顺序有关,默认地,DQL按照语句的先后顺序执行。
当然,下面这段,因为后面的or语句被整体括号在一块,所以会优先执行
‘Soon to be special’.Status = ‘Shipping’ and ( order_origin = ‘LA’ or sales_person in (‘Chad Keighley’, ‘Jeff Chantel’, ‘Louis Cawlfield’, ‘Mariel Nathanson’))
其意思正是,先取出date_origin字段值为LA,或sales_person字段值为
‘Chad Keighley’, ‘Jeff Chantel’, ‘Louis Cawlfield’, ‘Mariel Nathanson’中的一个,符合这些条件的所有文档,而后且这些文档要符合在名为Soon to be special(谁会取这种名字?)视图中的Status列值为Shipping。
下面这个语句则更进一步使用or Not逻辑符,返回的那些文档,必须符合名为Soon to be special视图中的Status列值为Inventory,并且order_origin为Detroit,sales_person不能为‘Harold Cunningham’, ‘Julie Leach’, ‘Gordon Smith’, ‘Terence Henry’中的一个。
‘Soon to be special’.Status = ‘Inventory’ and ( order_origin = ‘Detroit’ or NOT sales_person in (‘Harold Cunningham’, ‘Julie Leach’, ‘Gordon Smith’, ‘Terence Henry’))
六、in all语句
in前面我们使用过,在后面加上一个all语句,则是必须包含括号中的所有值,比如Part_no in all ( 389, 27883, 388388, 587992 ) ,文档中的Part_no必须同时包含389, 27883, 388388, 587992四个值,而categories In all ('test1','test2') " 意思是categories必须拥有test1和test2两个值,如下图
而后可以获得这个文档
像语句in all (‘Orders’, ’Special orders folder 1’, ‘Old_orders 2’) 则是指必须同时出现在‘Orders’, ’Special orders folder 1’, ‘Old_orders 2’文件夹或视图中的那些文档。
in前面我们使用过,在后面加上一个all语句,则是必须包含括号中的所有值,比如Part_no in all ( 389, 27883, 388388, 587992 ) ,文档中的Part_no必须同时包含389, 27883, 388388, 587992四个值,而categories In all ('test1','test2') " 意思是categories必须拥有test1和test2两个值,如下图
而后可以获得这个文档
像语句in all (‘Orders’, ’Special orders folder 1’, ‘Old_orders 2’) 则是指必须同时出现在‘Orders’, ’Special orders folder 1’, ‘Old_orders 2’文件夹或视图中的那些文档。
七、几个问题
Q1:DQL中的语句区分大小写吗?比如字段名和字段中的值?
A1: 目前就我测试的结果来看,不区分。
Q2: 执行DQL语句搜索的数据库是不是需要建立索引。
A2:就目前测试来看,不需要。只需要执行我在前面一篇中提到的几个步骤即可。
Q3:以前我们知道,使用数据库索引搜索文档之前,必须要更新索引,DQL搜索执行时,是不是每次都需要更新相应的索引?
A3:不需要执行任何索引更新,DQL直接在数据库中进行搜索。
|
|