前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SQL命令 SELECT(四)

SQL命令 SELECT(四)

作者头像
用户7741497
发布于 2022-05-06 10:30:17
发布于 2022-05-06 10:30:17
1.5K00
代码可运行
举报
文章被收录于专栏:hml_知识记录hml_知识记录
运行总次数:0
代码可运行

SQL命令 SELECT(四)

WHERE子句

WHERE子句限定或取消查询选择中的特定行。 符合条件的行是那些条件表达式为真的行。 条件表达式是逻辑测试(谓词)的列表,可以通过ANDOR逻辑操作符链接这些测试(谓词)。 这些谓词可以使用NOT一元逻辑操作符进行反转。

SQL谓词可分为以下几类:

  • Comparison 谓词
  • BETWEEN 谓词
  • LIKE 谓词
  • NULL 谓词
  • IN and %INLIST 谓词
  • EXISTS 谓词
  • FOR SOME 谓词
  • FOR SOME %ELEMENT 谓词

条件表达式不能包含聚合函数。 如果希望使用聚合函数返回的值指定选择条件,请使用HAVING子句。

WHERE子句可以使用=(内部连接)符号连接操作符指定两个表之间的显式连接。

WHERE子句可以使用箭头语法(- >)操作符在基表和来自另一个表的字段之间指定隐式连接。

GROUP BY子句

GROUP BY子句接受查询的结果行,并根据一个或多个数据库列将它们分成单独的组。 当将SELECTGROUP BY结合使用时,将为GROUP BY字段的每个不同值检索一行。 GROUP BY子句在概念上类似于 IRIS扩展%FOREACH,但是GROUP BY操作整个查询,而%FOREACH允许在子填充上选择聚合,而不限制整个查询填充。 例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT Home_State, COUNT(Home_State) AS Population
 FROM Sample.Person
  GROUP BY Home_State

这个查询为每个不同的Home_State返回一行。

HAVING 子句

HAVING子句类似于对组进行操作的WHERE子句。 它通常与GROUP BY子句或%AFTERHAVING关键字一起使用。 HAVING子句限定或取消查询选择中的特定行。 符合条件的行是那些条件表达式为真的行。 条件表达式是逻辑测试(谓词)的列表,可以通过ANDOR逻辑操作符链接这些测试(谓词)。 条件表达式可以包含聚合函数。

ORDER BY 子句

ORDER BY子句由ORDER BY关键字后面跟着一个选择项或一个以逗号分隔的项列表组成,该列表指定显示行的顺序。 每个项目可以有一个可选的ASC(升序)或DESC(降序)。 默认为升序。 ORDER BY子句应用于查询的结果,并且经常与TOP子句配对。

下面的示例返回数据库中所有行的选定字段,并按年龄升序排列这些行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT Home_State, Name, Age 
FROM Sample.Person
ORDER BY Age

SELECT和事务处理

执行查询的事务被定义为READ COMMITTEDREAD UNCOMMITTED。 默认是READ UNCOMMITTED。 不在事务中的查询定义为READ UNCOMMITTED

  • 如果READ UNCOMMITTED,则SELECT返回数据的当前状态,包括未提交的正在进行的事务对数据所做的更改。 这些更改可能随后被回滚。
  • 如果READ COMMITTED,则行为取决于SELECT语句的内容。 通常,在read committed模式下的SELECT语句只会返回对已提交数据的插入和更新更改。 已被正在进行的事务删除的数据行不会返回,即使这些删除尚未提交并可能回滚。

但是,如果SELECT语句包含%NOLOCK关键字、DISTINCT子句或GROUP BY子句,则SELECT返回数据的当前状态,包括当前事务中尚未提交的对数据的更改。 SELECT中的聚合函数还返回指定列的数据的当前状态,包括未提交的更改。

Query Metadata

可以使用Dynamic SQL返回关于查询的元数据,例如查询中指定的列数、查询中指定的列的名称(或别名)以及查询中指定的列的数据类型。

示例

在下面的示例中,在Sample.Person中的所有记录上计算AvgAge computed字段。 HAVING子句管理AvgMiddleAge computed字段,从Sample.Person中的所有记录中计算那些超过40岁的人的平均年龄。 因此,AvgAgeAvgMiddleAge的每一行都有相同的值。 ORDER BY子句按照Home_State字段值的字母顺序对行进行显示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT Name,Home_State,Age,AVG(Age) AS AvgAge,
 AVG(Age %AFTERHAVING) AS AvgMiddleAge
 FROM Sample.Person
 HAVING Age > 40
 ORDER BY Home_State

WHERE/HAVING/ORDER BY

在下面的示例中,WHERE子句将选择限制在七个指定的东北部州。 AvgAge computed字段是根据来自那些Home_States的记录计算的。 HAVING子句管理AvgMiddleAge computed字段,从指定Home_States的记录中计算40岁以上的人的平均年龄。 因此,AvgAgeAvgMiddleAge的每一行都有相同的值。 ORDER BY子句按照Home_State字段值的字母顺序对行进行显示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT Name,Home_State,Age,AVG(Age) AS AvgAge,
 AVG(Age %AFTERHAVING) AS AvgMiddleAge
 FROM Sample.Person
 WHERE Home_State IN ('ME','NH','VT','MA','RI','CT','NY')
 HAVING Age > 40
 ORDER BY Home_State

GROUP BY/HAVING/ORDER BY

GROUP BY子句导致对每个Home_State组分别计算AvgAge computed字段。 GROUP BY子句还将输出显示限制为从每个Home_State遇到的第一个记录。 HAVING子句管理AvgMiddleAge computed字段,计算每个Home_State组中40岁以上人群的平均年龄。 ORDER BY子句按照Home_State字段值的字母顺序对行进行显示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 SELECT Name,Home_State,Age,AVG(Age) AS AvgAge,
 AVG(Age %AFTERHAVING) AS AvgMiddleAge
 FROM Sample.Person
 GROUP BY Home_State
 HAVING Age > 40
 ORDER BY Home_State

WHERE/GROUP BY/HAVING/ORDER BY

WHERE条款限制了对东北部七个州的选择。 GROUP BY子句导致对这七个Home_State组中的每一个单独计算AvgAge computed字段。 GROUP BY子句还将输出显示限制为从每个指定的Home_State遇到的第一个记录。 HAVING子句管理AvgMiddleAge computed字段,计算7个Home_State组中每个组中40岁以上人群的平均年龄。 ORDER BY子句按照Home_State字段值的字母顺序对行进行显示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT Name,Home_State,Age,AVG(Age) AS AvgAge,
 AVG(Age %AFTERHAVING) AS AvgMiddleAge
 FROM Sample.Person
 WHERE Home_State IN ('ME','NH','VT','MA','RI','CT','NY')
 GROUP BY Home_State
 HAVING Age > 40
 ORDER BY Home_State

嵌入式SQL和动态SQL示例

嵌入式SQL和动态SQL可用于从ObjectScript程序中发出SELECT查询。

下面的嵌入式SQL程序从一条记录中检索数据值,并将它们放在INTO子句中指定的输出主机变量中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ClassMethod Select2()
{
    n SQLCODE,%ROWCOUNT
    &sql(
        SELECT Home_State, Name, Age
            INTO :a, :b, :c
        FROM Sample.Person)
    if SQLCODE=0 {
        w !,"  Name=",b
        w !,"  Age=",c
        w !,"  Home State=",a
        w !,"Row count is: ",%ROWCOUNT 
    } else {
        w !,"SELECT 失败, SQLCODE=",SQLCODE  
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DHC-APP>d ##class(PHA.TEST.SQLCommand).Select2()
 
  Name=yaoxin
  Age=31
  Home State=WI
Row count is: 1

这个程序检索(最多)一行,因此%ROWCOUNT变量被设置为0或1。 要检索多行,必须声明游标并使用FETCH命令。

下面的动态SQL示例首先测试所需的表是否存在,并检查当前用户对该表的SELECT特权。 然后执行查询并返回结果集。 它使用WHILE循环对结果集的前10条记录重复调用%Next方法。 它使用%GetData方法显示三个字段值,这些方法指定了SELECT语句中指定的字段位置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ClassMethod Select3()
{
#;  s tname="Sample.Person"
#;  if $SYSTEM.SQL.TableExists(tname) & $SYSTEM.SQL.CheckPrivilege($USERNAME, "1," _ tname, "s"){
#;      GOTO SpecifyQuery
#;  } else {
#;      w "Table unavailable"  
#;      q
#;  }
#;SpecifyQuery
    s myquery = 3
    s myquery(1) = "SELECT Home_State,Name,SSN,Age"
    s myquery(2) = "FROM Sample.Person"
    s myquery(3) = "ORDER BY Name"
    s 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()
    if rset.%SQLCODE=0 {
        s x=0
        while x < 10 {
            s x = x + 1
            s status=rset.%Next()
            w rset.%GetData(2)," "   /* Name field */
            w rset.%GetData(1)," "   /* Home_State field */
            w rset.%GetData(4),!     /* Age field */
        }
        w !,"End of Data"
        w !,"SQLCODE=",rset.%SQLCODE," Row Count=",rset.%ROWCOUNT
    } else {
        w !,"SELECT 失败, SQLCODE=",rset.%SQLCODE 
    }
}

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SQL命令 SELECT(三)
列别名在结果集中显示为列标题。指定列别名是可选的;始终提供默认值。列别名以指定的字母大小写显示;但是,当在ORDER BY子句中引用时,它不区分大小写。C别名必须是有效的标识符。C别名可以是分隔的标识符。使用带分隔符的标识符允许列别名包含空格、其他标点符号或作为SQL保留名称。例如,SELECT Name AS "Customer Name" or SELECT Home_State AS "From"。
用户7741497
2022/05/06
2.4K0
SQL命令 HAVING(二)
如果Home_State等于括号列表中的任意值,则计算为TRUE。列表元素可以是常量或表达式。排序规则适用于IN比较,因为它适用于相等性测试。默认情况下,IN比较使用字段定义的排序规则类型;默认情况下,字符串字段定义为SQLUPPER,不区分大小写。
用户7741497
2022/05/05
8990
ORDER BY(二)
下面两个示例展示了在ORDER BY子句中指定排序列的不同方法。 下面两个查询是等价的; 第一种方法使用列名作为排序项,第二种方法使用列号(选择项列表中项目的序号):
用户7741497
2022/05/06
7290
SQL谓词 %INLIST
%INLIST谓词是 IRIS扩展,用于将字段的值与列表结构的元素匹配。 %INLIST和IN都允对多个指定值执行这样的相等比较。 %INLIST将这些多个值指定为单个列表参数的元素。 因此,%INLIST允许改变要匹配的值的数量,而无需创建单独的缓存查询。
用户7741497
2022/05/09
4530
SQL命令 TOP
可选的TOP子句出现在SELECT关键字和可选的DISTINCT子句之后,以及第一个选择项之前。
用户7741497
2022/05/07
1.8K0
使用动态SQL(二)
准备一条SQL语句将验证该语句,为后续执行做准备,并生成有关该SQL语句的元数据。
用户7741497
2022/06/07
6940
SQL谓词 LIKE
LIKE谓词允许选择那些匹配模式中指定的字符的数据值。 模式可以包含通配符。 如果pattern不匹配任何标量表达式值,LIKE返回空字符串。
用户7741497
2022/05/09
2.5K0
使用动态SQL(六)
下面的示例使用%ObjectSelectMode = 1进行准备,当使用字段名称属性返回值时,其类型类别为可Swizzle类型的字段(持久性类,序列类或流类)将自动发生Swizzle。转换字段值的结果是相应的对象参考(oref)。使用%Get()或%GetData()方法访问字段时,InterSystems IRIS不会执行此筛选操作。在此示例中,rset.Home处于Swizzle状态,而引用同一字段的rset.%GetData(2)处于not swizzled状态:
用户7741497
2022/06/07
5510
SQL命令 FROM(二)
这个可选关键字在查询的FROM子句中指定。 它建议 IRIS使用多个处理器(如果适用)并行处理查询。 这可以显著提高使用一个或多个COUNT、SUM、AVG、MAX或MIN聚合函数和/或GROUP BY子句的某些查询的性能,以及许多其他类型的查询。 这些通常是处理大量数据并返回小结果集的查询。 例如,SELECT AVG(SaleAmt) FROM %PARALLEL User.AllSales GROUP BY Region使用并行处理。
用户7741497
2022/05/05
1.8K0
SQL谓词的概述(一)
每个谓词包含一个或多个比较操作符,可以是符号,也可以是关键字子句。 SQL支持以下比较操作符:
用户7741497
2022/05/07
1.3K0
使用动态SQL(五)
要从查询结果集中返回特定的值,必须一次一行遍历结果集。 要遍历结果集,请使用%Next()实例方法。 (对于单一值,结果对象中没有行,因此%Next()返回0,而不是错误。) 然后,可以使用%Print()方法显示整个当前行的结果,或者检索当前行的指定列的值。
用户7741497
2022/06/07
9860
使用动态SQL(七)
SELECT或CALL语句返回所有这些元数据。 INSERT,UPDATE或DELETE返回语句类型元数据和形式参数。
用户7741497
2022/06/07
8970
SQL谓词 BETWEEN
BETWEEN谓词允许选择lowval和highval指定范围内的数据值。 这个范围包括低值和高值本身。 这等价于一对大于或等于操作符和一对小于或等于操作符。 下面的例子展示了这种比较:
用户7741497
2022/05/09
7370
SQL聚合函数 COUNT
COUNT可以在引用表或视图的SELECT查询或子查询中使用。 COUNT可以在SELECT列表或HAVING子句中与普通字段值一起出现。
用户7741497
2022/03/27
3.9K1
SQL谓词 IN
IN谓词用于将值匹配到非结构化的项系列。 通常,它将列数据值与以逗号分隔的值列表进行比较。 IN可以执行相等比较和子查询比较。
用户7741497
2022/05/09
1.5K0
使用动态SQL(四)
使用%Execute()或%ExecDirect()执行语句将返回一个实现%SQL.StatementResult接口的对象。该对象可以是单一值,结果集或从CALL语句返回的上下文对象。
用户7741497
2022/06/07
5320
SQL命令 HAVING(一)
可选的HAVING子句出现在FROM子句、可选的WHERE和GROUP BY子句之后,可选的ORDER BY子句之前。
用户7741497
2022/05/05
1.6K0
SQL谓词 %PATTERN
%PATTERN谓词允许将字符类型代码和字面值的模式匹配到由标量表达式提供的数据值。 如果模式匹配完整的标量表达式值,则返回该值。 如果pattern没有完全匹配任何标量表达式值,%pattern将返回空字符串。
用户7741497
2022/05/09
6480
使用动态SQL(三)
也可以通过使用$SYSTEM.SQL.Execute()方法执行SQL语句而无需创建对象实例。此方法既准备又执行SQL语句。它创建一个缓存的查询。下面的终端示例显示Execute()方法:
用户7741497
2022/06/07
5870
SQL命令 CREATE QUERY
CREATE QUERY语句在类中创建一个查询。 默认情况下,名为MySelect的查询将被存储为User.queryMySelect或SQLUser.queryMySelect。
用户7741497
2022/04/14
1K0
相关推荐
SQL命令 SELECT(三)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验