SQL查询 |
在SuperMap组件产品中,有许多接口都用到了过滤条件,也就是标准 SQL 语句中的 WHERE 子句部分,比如各种涉及属性查询的接口、网络分析中弧段的过滤条件、拓扑处理中相交不打断的过滤条件等。本节专题特别总结了如何正确构建 SQL 语句,以及在 SuperMap 中支持的一些函数和运算符等。
一般情况下,SQL表达式的语法为“Select …(需要输出的字段名) from … (数据集名)where…(查询条件)(order by …asc/desc)(结果排序字段,可选)”。此外还有Group By 子句,在下面单独介绍。
在各种查询方法中,WHERE 子句都是通过用户直接构建,以字符串的形式作为参数使用。在 SQL 语句构建过程中,由于 SDBPlus 文件型数据源的属性表是存储在 Acess MDB 数据库中,使用的通配符与其他数据库如 Oracle 或 SQL Server 有不同之处,本文会标示出。
数值的查询可以使用 “=”、“<>”、“>”、“<”、“<=”、“>=”等操作符以及“BETWEEN...AND”关键字。例如:World_countries.Pop_1994 Between 10,000,000 and 20,000,000,该条件查询的是pop_1994字段值(1994年人口)在1,000万到2,000万之间的记录。
模糊查询使用关键字“LIKE”,而且不同类型的数据源使用的匹配符不尽相同。例如:
1.1.2.1 部分匹配
World_countries.CAPITAL Like "a*" (或 'a*')(注:数据库型数据源中的通配符为%),查询的是World_countries数据集中CAPITAL字段中以a打头的那些国家。
1.1.2.2 完全匹配
World_countries.CAPITAL Like "Beijing" (或 'Beijing')查询的是World_countries数据集中CAPITAL字段值为Beijing的国家。
1.1.2.3 单字匹配
World_countries.ISO_2 Like "A?" (或'A?') (注:数据库型数据源中的通配符为_)查询的是World_countries数据集中ISO_2字段值为 A 后面仅加一个字符的国家。
使用关键字“IN”,确定表达式的值是否等于指定列表内一系列值中的任意一个值。例如:
World_countries.ISO_2 in ('AD','BS','PH')查询的是World_countries数据集中ISO_2字段值为 AD,BS,PH 的一个或几个国家。
World_countries.SmID in (1,4)查询的是World_countries数据集中SmID字段值为1,4的国家。
注:对于字符型字段的查询需要将查询值使用英文单引号''或英文双引号""括起来,而数值型字段的查询不需要。
使用关键字“IS NULL”或“IS NOT NULL”,例如:
World_countries.ISO_2 is NULL查询的是World_countries数据集中ISO_2字段值为空的那些国家。
SQL 条件中可使用任意算术表达式,可以用括号来定运算优先级。例如:
World_countries.POP_1994 / (World_countries.SmArea/1,000,000) > 500,查询的是World_countries数据集中,1994年每平方公里(因为属性表中Area单位为米,所以使用World_countries.SmArea/1,000,000将其换算为平方公里)土地上人口大于500的国家。
可以使用“AND”、“OR”、“NOT”关键字组合任意合法的条件表达式。例如:
World_countries.SmArea> 5,000,000 AND World_countries.POP_1994 < 100,000,000查询的是国土面积大于500万平方公里(上面的数值已经换算成平方公里)并且94年人口小于1亿的国家。
比较运算符,如“>”、“<”、“>=”、“<=”、“<>”等,例如:
World_countries.NAME >= 'N'查询的是World_countries数据集中NAME字段值的首字母在N到Z之间的那些国家。
例如:World_countries. T_date= #08/10/94#
注:
Ø SQL Server 数据源中,查询语句为: World_countries.T_date= '1994-08-10';
Ø ORACLE数据源中,查询语句为: World_countries.T_date= TO_DATE('1994-08-10', 'YYYY-MM-DD');
Ø UDB数据源中,查询语句为:World_countries.T_date= to_date(1994-08-10 00:00:00);
查询的是World_countries数据集中date字段为1994-08-10的记录,即1994-08-10当天的记录。
World_countries.T_date Between #01/01/94# and #12/31/94# 查询的是World_countries数据集中1994年全年的记录。
若查询结果字段中使用到了多个字段运算的派生字段,可以用关键字“AS”来为其指定一个别名显示在输出的结果表中。例如:
(Pop2000-Pop_1990)/Pop_1990 as Growth_Rate,若不给定别名,系统则使用表达式内容本身作为临时字段名。若指定多个派生字段表达式,可用逗号分隔。
“SQL查询”功能还可以根据指定的某个(或多个)字段将查询结果进行分组,使指定字段上有相同值的记录分在一组,再通过聚合函数、数学函数等函数对查询结果进行统计计算而得到新的临时字段结果,当然,得到的统计结果字段同时也是上文述及的派生字段。
例如:select World_Countries.CONTINENT,Count(World_Countries.SmID) as Count from World_Countries group by World_Countries.CONTINENT 对世界地图中每一组CONTINENT相同的记录进行统计个数,即该洲内所有国家的个数。
注:在分组统计查询语句中,结果浏览字段,只能是分组字段(可以多个,置于前)和统计函数派生的字段(统计函数可以是多个,比如 Sum()、Count() 以 及Avg() 函数可以同时使用,但必须是对最后一个统计字段的统计。)