文章目录

  • 第一章 SQL谓词的概述(一)
  • 使用谓词
  • 谓词列表
  • NULL
  • 排序
  • 复合谓词
  • 使用OR的集合谓词

第一章 SQL谓词的概述(一)

描述计算结果为真或假的逻辑条件。

使用谓词

谓词是一个条件表达式,其计算结果为布尔值(truefalse)。

谓词可以如下使用:

  • SELECT语句的WHERE子句或HAVING子句中确定哪些行与特定查询相关。
    注意,不是所有谓词都可以在HAVING子句中使用。
  • JOIN操作的ON子句中确定哪些行与连接操作相关。
  • UPDATEDELETE语句的WHERE子句中,确定要修改哪些行。
  • WHERE CURRENT OF语句的AND子句中。
  • CREATE TRIGGER语句的WHEN子句中确定何时应用触发操作代码。

谓词列表

每个谓词包含一个或多个比较操作符,可以是符号,也可以是关键字子句。
SQL支持以下比较操作符:

  • = (equals) ,<> (does not equal),!= (does not equal),> (is greater than),>= (is greater than or equal to),< (is less than),<= (is less than or equal to) - 比较条件。
    可用于数字比较或字符串排序顺序比较。
    对于数值比较,空字符串值(")被计算为0
    在任何相等比较中,NULL总是返回空集;
    请使用IS NULL谓词。
  • IS [NOT] NULL - 测试字段是否有未定义(NULL)值。
  • IS [NOT] JSON - 测试一个值是JSON格式的字符串还是JSON数组或JSON对象的oref
  • EXISTS (subquery) - 使用子查询测试指定表是否存在一行或多行。
  • BETWEEN x AND y - BETWEEN条件同时使用>=<=比较条件。
    匹配必须在两个指定的范围限制值(包括)之间。
  • IN (item1,item2[...,itemn])IN (subquery) - 一个等式条件,它将字段值与逗号分隔列表中的任何项或子查询返回的任何项匹配。
  • %INLIST listfield - 将字段值与%List结构化列表中的任何元素匹配的相等条件。
  • [ - 包含运算符。
    Match必须包含指定的字符串。
    Contains操作符使用EXACT排序规则,因此区分大小写。
    必须以逻辑格式指定值。
  • ] - 跟随运算符。在排序规则序列中,匹配项必须出现在指定项之后。必须以逻辑格式指定值。
  • %STARTSWITH string - 匹配必须以指定的字符串开始。
  • FOR SOME - 布尔比较条件。对于指定字段的至少一个数据值,For Some条件必须为True
  • FOR SOME %ELEMENT - 带有%VALUE%KEY谓词子句的列表元素比较条件。%value必须与列表中至少一个元素的值匹配。%key必须小于或等于列表中的元素数。%VALUE%KEY子句可以使用任何其他比较运算符。
  • LIKE - 使用文字和通配符的模式匹配条件。当希望返回包含已知子字符串的文字字符或包含已知序列中的多个已知子字符串的数据值时,请使用LIKELIKE使用其目标的排序规则进行字母大小写比较。(与CONTAINS运算符形成对比,后者使用精确排序规则。)
  • %MATCHES - 使用文字、通配符以及列表和范围的模式匹配条件。如果希望返回的数据值包含已知子字符串的文字字符,或包含一个或多个落在可能字符列表或范围内的文字字符,或按已知序列包含多个这样的子字符串,请使用%Matches%Matches使用精确排序规则进行字母大小写比较。
  • %PATTERN - 使用字符类型的模式匹配条件。例如,'1U4L1",".A'(1个大写字母,4个小写字母,一个文字逗号,后跟任意数量的字母字符)。如果希望返回包含已知字符类型序列的数据值,请使用%Pattern%Pattern可以指定已知的文字字符,但在数据值不重要但这些值的字符类型格式很重要时尤其有用。
  • ALLANYSOME - 一种量化的比较条件。
  • %INSET%FIND - 启用使用以编程方式指定的抽象临时文件或位图索引筛选RowId字段值的字段值比较条件。%Inset支持简单比较。%Find支持涉及位图索引的比较。

NULL

NULL表示没有任何值。根据定义,它不能通过所有布尔测试:没有值等于NULL,没有值不等于NULL,没有值大于或小于NULL。即使NULL=NULL也不能作为谓词。因为IN谓词是一系列相等性测试,所以在IN值列表中指定NULL没有意义。因此,指定任何谓词条件都会消除该字段的任何为空的实例。在结果集中包含来自谓词条件的NULL字段的唯一方法是使用IS NULL谓词。下面的示例显示了这一点:

SELECT FavoriteColors FROM Sample.Person
WHERE FavoriteColors = $LISTBUILD('Red') OR FavoriteColors IS NULL

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XwWNzwN7-1638325545366)(B67456004B384EE297AA420BA69A6E5A)]

排序

谓词使用为字段定义的排序规则类型。
默认情况下,字符串数据类型字段是用SQLUPPER排序规则定义的,它不区分大小写。

如果在查询中指定排序规则类型,则必须在比较的两边指定它。
指定排序规则类型会影响索引的使用;

某些谓词比较可能涉及嵌入在字符串中的子字符串:Contains操作符([)、%MATCHES谓词和%PATTERN谓词。
这些谓词总是使用EXACT排序法,因此总是区分大小写。
因为有些排序规则会在字符串中附加一个空格,所以如果这些谓词遵循字段的默认排序规则,它们就不能执行它们的功能。
但是,LIKE谓词可以使用通配符来匹配嵌入在字符串中的子字符串。
LIKE使用字段的默认排序规则,默认情况下不区分大小写。

复合谓词

谓词是条件表达式的最简单版本;
条件表达式可以由一个或多个谓词组成。
可以使用ANDOR逻辑操作符将多个谓词链接在一起。
通过将NOT一元操作符放在谓词之前,可以颠倒谓词的含义。
NOT一元操作符只影响紧随其后的谓词。
谓词严格按照从左到右的顺序计算。
可以使用括号对谓词进行分组。
可以在左括号前放置NOT一元操作符,以反转一组谓词的含义。
括号前后、括号与逻辑运算符之间不需要空格。

IN%INLIST谓词在功能上相当于多个OR相等谓词。
下面的例子是等价的:

ClassMethod Predicates()
{s q1 = "SELECT Name,Home_State FROM Sample.Person "s q2 = "WHERE Home_State='MA' OR Home_State='VT' OR Home_State='NH'"s myquery = q1_q2s tStatement = ##class(%SQL.Statement).%New()s qStatus = tStatement.%Prepare(myquery)if qStatus '= 1 {w "%Prepare failed:" d $System.Status.DisplayError(qStatus) q}s rset = tStatement.%Execute()d rset.%Display()
}
DHC-APP>d ##class(PHA.TEST.SQLCommand).Predicates()
Name    Home_State
Lepon,Jeff Z.   NH
Ingleman,Terry A.       NH
Jung,Keith W.   NH
Gallant,Thelma Q.       MA
Jackson,Ralph V.        VT
Tesla,Geoffrey O.       NH
Tweed,Al O.     NH
Fives,Kristen F.        NH
Olsen,Ashley G. NH9 Rows(s) Affected
ClassMethod Predicates1()
{s q1 = "SELECT Name,Home_State FROM Sample.Person "s q2 = "WHERE Home_State IN('MA','VT','NH')"s myquery = q1 _ q2s tStatement = ##class(%SQL.Statement).%New()s qStatus = tStatement.%Prepare(myquery)if qStatus '= 1 {w "%Prepare failed:" d $System.Status.DisplayError(qStatus) q}s rset = tStatement.%Execute()d rset.%Display()
}
ClassMethod Predicates2()
{s list = $LISTBUILD("MA","VT","NH")s q1 = "SELECT Name,Home_State FROM Sample.Person "s q2 = "WHERE Home_State %INLIST(?)"s myquery = q1 _ q2s tStatement = ##class(%SQL.Statement).%New()s qStatus = tStatement.%Prepare(myquery)if qStatus '= 1 {w "%Prepare failed:" d $System.Status.DisplayError(qStatus) q}s rset = tStatement.%Execute(list)d rset.%Display()
}

FOR SOME %ELEMENT谓词可以包含逻辑操作符,也可以使用逻辑操作符链接到其他谓词。
下面的例子显示了这一点:

SELECT Name,FavoriteColors FROM Sample.Person
WHERE FOR SOME %ELEMENT(FavoriteColors)(%VALUE='Red' OR %Value='White' OR %Value %STARTSWITH 'B') AND (Name BETWEEN 'A' AND 'F' OR Name %STARTSWITH 'S')
ORDER BY Name

注意括号(Name BETWEEN 'A' AND 'F' OR Name %STARTSWITH 'S');
如果没有这些分组括号,FOR SOME %ELEMENT条件将不适用于Name %STARTSWITH 'S'

使用OR的集合谓词

FOR SOME %ELEMENT 是一个集合谓词。
该谓词与OR逻辑操作符的使用受到限制,如下所示。
不能使用OR逻辑操作符将引用表字段的集合谓词与引用另一个表中的字段的谓词关联起来。
例如,

WHERE FOR SOME %ELEMENT(t1.FavoriteColors) (%VALUE='purple')
OR t2.Age < 65

因为这个限制取决于优化器如何使用索引,所以SQL只能在向表添加索引时强制执行这个限制。
强烈建议在所有查询中避免这种类型的逻辑。

第一章 SQL谓词的概述(一)相关推荐

  1. 第一章 SQL中使用的符号

    文章目录 第一章 SQL中使用的符号 符号表 第一章 SQL中使用的符号 SQL中用作运算符等的字符表 符号表 每个符号的名称后跟其ASCII十进制代码值. 符号 名称和用法 [space] or [ ...

  2. 第十一章 SQL谓词 %INLIST

    第十一章 SQL谓词 %INLIST 将一个值匹配到%List结构化列表中的元素. 大纲 scalar-expression %INLIST list [SIZE ((nn))] 参数 scalar- ...

  3. 第十九章 SQL谓词 %STARTSWITH(一)

    第十九章 SQL谓词 %STARTSWITH(一) 用指定初始字符的子字符串匹配值. 大纲 scalar-expression %STARTSWITH substring 参数 scalar-expr ...

  4. 用c语言运行程序的优点,C语言学习与总结---第一章:C语言概述

    第一章:C语言概述 1.绪论 2.计算机程序 3.计算机语言 4.C语言的发展及其特点 5.最简单的C语言程序 6.运行C语言程序的方法与步骤 7.程序设计任务 1.绪论 C语言是计算机基础语言,本次 ...

  5. 【C语言】第一章 计算机及程序设计概述 题解

    第一章 计算机及程序设计概述 1.略 2.略 3.略 4.代码如下: #include <stdio.h>int main() {printf("请输入摄氏温度℃:") ...

  6. 【WEB漏洞】第一章 sql注入(一)

    系列文章目录 ` 第一章 sql注入(一)

  7. 计算机组成原理-第一章(1)-概述

    计算机组成原理 此系列为王道计算机考研组成原理精细笔记 计算机组成原理-第一章(1)-概述 计算机组成原理 前言 一.计算机系统的概述 二.计算机发展简史 第一代-电子管 第二代-晶体管 第三代-中小 ...

  8. c井语言和SQL第一章上机1,第一章 SQL Server 数据库基础复习内容(上机)

    上机课程总目标 在本学期中,将模拟开发一套学员信息管理系统,用来管理学员的个人基本资料,老师资料,学生成绩,课程信息等教学相关内容,以实现学校的信息自动化,提高工作效率. 该系统包括学生档案管理.学生 ...

  9. 第十二章 SQL谓词 %INSET

    第十二章 SQL谓词 %INSET 将一个值匹配到一组生成的值. 大纲 scalar-expression %INSET valueset [SIZE ((nn))] 参数 scalar-expres ...

最新文章

  1. 嵌入式系统降低功耗的设计技术
  2. Flask-SQLAlchemy 中多表链接查询(不使用外键)
  3. 启用邮箱提示访问特权不够
  4. DispatcherServlet的用途
  5. ORACLE利用STANDBY端RMAN备份进行数据恢复
  6. Dojo学习笔记(三):类化JavaScript
  7. #nginx# 泛解析大量域名的情况下 将不带www的域名,301到与之对应的www前缀的域名...
  8. Python工程师必看的面试问题与解答(中) 1
  9. java 线程百科_Java并发——线程介绍
  10. leetcode刷题:求容器中能乘最大多少水
  11. JavaSE----常用类(String、StringBuilder、StringBuffer)
  12. 操作系统概念学习笔记 4 操作系统结构和操作简述
  13. 软件测试学习(二)测试用例例子、黑盒测试(一)
  14. Java进阶:Docker
  15. 容器技术Docker K8s 34 容器服务ACK基础与进阶-安全管理
  16. 虫师带你入门Chrome Headless,从此爬虫0门槛!
  17. 利用@media与@media screen进行响应式布局
  18. 高度坍塌的产生条件和解决方法
  19. sense8影评摘抄
  20. 7-62 贴“福”字

热门文章

  1. 2018: 穿山甲到底说了什么? | 掘金年度征文
  2. Implementing a simple OWS service
  3. 硬币系列二 | 从照片中自动检测硬币
  4. offsetWidth和width的区别 逻辑中断 delete运算符 。。。。
  5. 生成对抗网络(GAN)详解与实例
  6. JavaSE_强化篇_kuang
  7. PHP--ThinkPHP6.0模板常量的设置
  8. 一种会发光的扎带标签 lassorfid新品
  9. E. Resistors in Parallel
  10. python_way,day3 集合、函数、三元运算、lambda、python的内置函数、字符转换、文件处理...