ArcGIS操作教程(85)ArcMap中的查询表达式

之前我已经介绍过一些ArcMap查询图层的相关内容,详见《ArcMap中的查询图层》《ArcMap创建查询图层》《修改查询图层》,这里面涉及一个很重要的内容就是查询表达式的构建。本文将结合官方的相关内容做一个介绍。

关于SQL

相信学过数据库的人,对这个肯定不陌生。关于数据库的内容,我也会在以后的文章中做一些介绍。

SQL 表达式

SELECT * FROM TABLE_NAME

这是一个最简单的SQL表达式,查询表达式使用跟随在 Select * From <图层或数据集> Where 子句之后这样的一般格式(例如,跟随在 SELECT * FROM <图层名称> WHERE 之后的 SQL 表达式部分)。

以下是 ArcGIS 查询表达式的一般格式:

<字段名> <运算符> <值或字符串> 

对于组合查询,使用以下格式:

<字段名> <运算符> <值或字符串> <连接符> <字段名> <运算符> <值或字符串> ...

也可以使用括号 () 来定义组合查询中的运算顺序。

表达式的下一个部分是 WHERE 子句,这是构建的重要部分。基本的 SQL WHERE 子句如下所示

SELECT * FROM TABLE_NAME WHERE NAME = 'malagis'

SQL的其他语法

SQL是数据库的重要部分,也不是三言两语就能讲清楚的,这里推荐一个SQL的入门教程,点击这里.

ArcGIS中的 SQL使用参考

字段

在 SQL 表达式中指定字段时,如果该字段名可能产生岐义(比如与 SQL 保留关键字相同),则需提供一个分隔符。

由于存在许多保留关键字,并且后续版本中还能添加新的保留关键字,所以建议您始终使用分隔符将字段名称括起来。

DBMS 和 DBMS 之间的字段名分隔符有所不同。如果要查询任何基于文件的数据(例如,文件地理数据库、ArcSDE 地理数据库数据,或者 ArcIMS 要素类或影像服务子图层中的数据),可以将字段名称用双引号括起:

"AREA"

如果要查询个人地理数据库数据,可以将字段名称用方括号括起:

[AREA]

对于个人地理数据库栅格数据集,应将字段名称用双引号括起:

"AREA"

对于文件地理数据库数据,您可以将字段名称用双引号括起,但是通常不需要。

AREA
字符串

查询中的字符串必须始终用单引号括起。例如:

STATE_NAME = 'California'
  • 表达式中的字符串区分大小写。对于要素类和表,可以用 UPPER 或 LOWER 函数设置所选项的大小写。例如:
    UPPER(STATE_NAME) = 'RHODE ISLAND'
  • 个人地理数据库要素类和表中的字符串不区分大小写。如果需要,可以使用与 UPPER 或 LOWER 等效的 UCASE 和 LCASE 函数。
  • 如果字符串包含单引号,您首先需要使用另一单引号作为转义字符。例如:
    NAME = 'Alfie''s Trough'

进行部分字符串搜索所用的通配符还取决于所要查询的数据源。例如,在基于文件的或 ArcSDE 地理数据库数据源中,以下表达式将从美国州名称中选择 Mississippi 和 Missouri:

STATE_NAME LIKE 'Miss%'

百分号 (%) 表示这个位置可以是任意字符,即 1 个字符、100 个字符或者无字符均可。在查询个人地理数据库时,使用通配符“*”代表任意数量的字符,而使用“?”来代表一个字符。

字符串函数可用来格式化字符串。例如,LEFT 函数将返回字符串左侧特定数量的字符。在以下示例中,查询将返回以字母 A 开头的所有州:

LEFT(STATE_NAME,1) = 'A'

有关支持的函数列表,请参阅 DBMS 文档。

数值

无论您的区域设置如何,小数点 (.) 将始终用作小数分隔符。在表达式中不能使用逗号作为小数分隔符或千位分隔符。

可以使用等于 (=)、不等于 (<>)、大于 (>)、小于 (<)、大于等于 (>=) 和小于等于 (<=) 和 BETWEEN 运算符查询数值。例如:

POPULATION >= 5000

数值函数可用来格式化数值。例如,ROUND 函数可将文件地理数据库中的数值四舍五入到指定的小数位数:

ROUND(SQKM,0) = 500

有关支持的数值函数列表,请参阅 DBMS 文档。

日期和时间

地理数据库数据源将日期保存在日期时间字段中。但是,ArcInfo coverage 和 shapefile 不是这样。

因此,下面所列的大部分查询语法都包含对时间的引用。在某些情况下,当已知字段只包含日期时,查询中的时间部分可以安全地省略掉;而在其他情况下则需要声明,否则查询将返回语法错误。

ArcMap 日期格式的主要目的是存储日期,不是时间。当基础数据库实际上使用日期时间字段时,可以在此字段中只存储时间,但最好不要这样做。查询时间会比较麻烦;例如,12:30:05 p.m. 会被存储为 '1899-12-30 12:30:05'。

子查询

子查询是指嵌套在另一个查询中的查询。子查询可用于应用谓词或聚合函数,或将数据与存储在另一张表中的值进行比较。可使用 IN 或 ANY 关键字来完成。例如,以下查询只会选择未列在表 indep_countries 中的国家:

"COUNTRY_NAME" NOT IN (SELECT "COUNTRY_NAME" FROM indep_countries)

此查询将返回国家中 GDP2006 大于 GDP2005 的所有要素:

"GDP2006" > (SELECT MAX("GDP2005") FROM countries)

对于表中的每条记录,子查询可能需要在其目标表中分析所有数据。在大型数据集上执行时可能极其缓慢。

文件地理数据库仅提供对以下子查询的支持:

  • IN 谓词。例如:
    "COUNTRY_NAME" NOT IN (SELECT "COUNTRY_NAME" FROM indep_countries)
  • 包含比较运算符的标量子查询。标量子查询返回单个值。例如:
    "GDP2006" > (SELECT MAX("GDP2005") FROM countries)
    对于文件地理数据库,集合函数 AVG、COUNT、MIN、MAX 和 SUM 只能用在标量子查询内。
  • EXISTS 谓词。例如:
    EXISTS (SELECT * FROM indep_countries WHERE "COUNTRY_NAME" = 'Mexico')

更多内容:在 ArcGIS 中使用的查询表达式的 SQL 参考

MapGIS67破解版主菜单点不开 ArcGIS操作教程(86)ArcMap修改图例

作者:,GIS爱好者。
分享本文,请您带上本文链接
分享到:

发表评论