第 5章 空间数据查询
5.1 对象查询
5.1.1 对象
5.1.2 对象查询
5.2 SQL查询
5.2.1 通过“选择”来查询
5.2.2 通过“选择 SQL”查询
5.2.3,SQL选择”的操作示例
5.2.4 SQL选择
5.2.5,选择列”字段
5.2.6,条件”字段
5.2.7,按列排序”字段
5.2.8,按列分组”字段
5.2.9 聚合函数
5.3 习题 5
5.1 对象查询
5.1.1 对象
1,点对象,点是有特定的位置,维数为零的物体 。
2,线对象:是 GIS中非常常用的维度为一的空间组分,表示对象和它们边界的空间属性,由一系列坐标表示。
3,多边形对象,面状实体也称为多边形,是对湖泊、岛屿、地块等一类现象的描述。通常在数据库中由一封闭曲线加内点来表示。
5.1.2 对象查询图 5-1 选择好记录的窗口图 5-2,浏览表”对话框图 5-3 查询结果浏览窗口
5.2 SQL查询
SQL( Structure Query Language) 是结构化查询语言,是一套强大的查询系统。语言简单、指令简洁、操作简单、
功能强大,被广泛运用在相互关联的数据库中,并能完成十分复杂的查询和选择。
5.2.1 通过,选择,来查询图 5-4,查询”菜单图 5-5,选择”对话框
1,从表中选择记录
2,满足条件
3,存结果于表
4,结果排序按列
5,浏览结果
6,保存模板
7,载入模板图 5-6,表达式”对话框
5.2.2 通过,选择 SQL”查询
1,选择列
2,从表
3,条件
4,按列分组
5,按列排序
6,结果放入表
7,浏览结果
8,使用下拉列表
9,保存模板
10,载入模板图 5-7,SQL选择”对话框
5.2.3,SQL选择,的操作示例例如:查询并显示出人口大于 3000万的省份图 5-9 满足条件的浏览窗口图 5-10 人口 >3000万的省份单独显示图 5-11 不排序 图 5-12 升序 图 5-13 降序
5.2.4 SQL选择
① 打开希望查询的表(倘若尚未打开的话)。
② 选择“查询” →,SQL选择”。
③ 打开一个地图窗口或一个浏览窗口(若用户想看到查询结果)。
④ MapInfo自动选中结果表中所有行。
⑤ 若希望对查询表做一个永久拷贝,选择
“文件” →,另存为”。
5.2.5,选择列,字段
1,计算派生列
,SQL选择”可以计算派生列并将其保存在结果表中。
【例 5-1】 显示一个进行加法运算的派生列表达式,它将两个数值型列相加。例中假设 Purchase92和 Purchase93都是数值型字段。
选择列,Purchase 92 Purchase 93
2,选择显示在结果表中的列结果表中只包括在,选择列,域中输入的一个或多个列 。
这一点在表中有许多列,而只希望使用其中少数列 ( 可能是因为在屏幕上一次只能显示其中少数列 ) 时很有用 。
输入一系列列名:
① 在,从表,域中输入表名 ( 若还未输入的话 ) 。 可以直接输入表名或是在,表,下拉式列表中选择表名 。
② 单击,选择列,域,该域中出现插入符 。
③ 如果该域中有星号,先用 〈 Backspace〉 键或 〈 Delete〉 键将其删除 。,选择列,域中可以含有一个星号或者一系列列名 。
④ 在对话框右侧的,列,下拉列表中选择一个列名 。 MapInfo
将该列名复制到,选择列,域中 。
⑤ 如果希望查询中包含多个列,可以在“列”下拉式列表中选择其它列名。在选择其它列名时,MapInfo自动插入逗号以分隔列名。
3,使用,SQL选择,对话框的,选择列,字段使用,选择列,域来指定查询结果表中应该出现哪些列 。 若想结果表中含有与原始表相同的列集,在,选择列,
域中输入一个星号 ( *) 。
若想结果表中含有的列集与原始表不同,删除星号,
并输入用逗号分隔的一系列列名或表达式,如下所述 。
,选择列,域可包含星号或一系列列表达式,但二者不可得兼 。 在填写,选择域,之前,请先填好,从表,域 。
若查询涉及多个表,每个列名前必须加上表名,用句点分开表名和列名。这样,若你执行涉及两个表的查询,
其中一个是,Canada”表,用户希望查询包括,Canada”表的,Population”列,则必须使用列表达式
Canada.Population。 无论何时使用两个或多个表,“列”
下拉式列表会自动将表名插入到列名前。
5.2.6,条件,字段
1,按行序连接表若两个表没有公共列,还可以按照记录的顺序进行表连接 。 若知道一个表的第一条记录对应于另一个表的第一条记录,或更一般地说,一个表的第 N条记录对应于另一个表的第 N条记录,就可以通过引用一个特殊的名为 RowID的列将两个表连接 。
RowID列含有代表着表中每个记录的行号的整数 。 因此,任何表的第一条记录的 RowID值为 1,
第二条记录的 RowID值为 2,依此类推 。
要连接两个表使得 MapInfo匹配两个表的第 N条记录,指定一个如下形式的,条件,表达式 。
条件,TABLE_1.RowID = TABLE_2.RowID
2,按地理关系连接表若两个表有图形对象,MapInfo能根据那些对象之间的空间关系来连接表 。
图 5-10 对象包蕴关系
3,连接两个或多个表
MapInfo能利用该公共字段将两表连接。
表 5-1 Counties表表 5-2 Orders表方法:
选择列,*
从表,Counties,Orders
条件:
Counties.CountyName
= Orders.County
表 5-1 Counties表
CountyName Pop_1980 Pop_1990
Foster 23,789 27,135
Williamette 35,456 34,846
Mason 147,101 151,201
表 5-2 Orders表
Order # Customer County
478001 Francis Foster
478002 James Foster
478003 Wickwire Mason
4,执行子选择
MapInfo允许 SQL选择中有子选择。子选择是被放在,SQL选择”对话框中的“条件”
域内的选择语句。
【 例 5-9】 选择 states中超过 4,000,000人的所有城市 。
*
从表 cities
条件 obj within any(select obj from states
where Pop_1990 > 4000000)
5,设置过滤规则过滤条件是常用于比较列值与其它值的逻辑表达式 。 例如,下面的过滤条件使用大于运算符
( >) 来检查 Order_Amount列的值是否大于 100。
,条件,,Order_Amount > 100
如果查询包括上述,条件,子句,MapInfo只选择 Order_Amount值大于 100的行 。
如果表达式被词 and或 or隔开,“条件”子域可包含两个或多个逻辑表达式。如果表达式被词
and连接,MapInfo只选择满足全部两个条件的行。
如果表达式被词 or连接,MapInfo选择满足任一条件的所有行。
6,使用,SQL选择,对话框的,条件,字段
,条件,域有好几个作用 。 某些情况下,用户可能要使用一个条件表达式来过滤表,以便只看到那些满足一定准则的行 。 在其它情况下,可使用条件域来指定关系连接,从而查询能包括二个或多个表中的列 。
注意,不能在“条件”域中使用聚合函数。
5.2.7,按列排序,字段
1,选择升序或降序排序缺省情形下 MapInfo按升序对表进行排序。
要将字段按降序排以使大数字排在小数字前,
可以在“按列排序”域中将 desc放在列名字前。
【例 5-12】 查询 World表时,以下的 Order By排序准则。按列排序,Population desc将该表按
Population字段进行降序排序。
选择列,*
从表,City_1K
按列排序 State,Population desc
2,使用,按列排序,字段排序结果表在,SQL选择”对话框中使用“按列排序”
域,可将结果表的记录排序。排序影响在浏览窗口中记录从上而下出现的顺序。
【 例 5-13】 按照 State列对 City_1K表排序 。
结果表按州名排序;但是,在 California组内各行中,城市并未排序,San Francisco出现在 Anaheim之上 。 要改正这一问题,可以在
,按列排序,域中输入两个列名:
选择列,*
从表,City_1K
按列排序,State,City
5.2.8,按列分组,字段
1,按列分组示例
【 例 5-14】 设想有一个顾客订单表 。 该表中每一行表示单个订单 。 表中一列包含订货销售代理的名字,另一列含有顾客名字,还有一列包含订货量 。
对每个销售代理,可找出:
① 该代理的订单数目 。
② 该代理的平均订货量 。
③ 该代理的总订货量 。
以下 SQL选择查询产生所需结果:
选择列 Sales_Rep,count(*),average(AMOUNT),
sum(AMOUNT)
从表 Orders
按列分组 Sales_Rep
2,使用,按列分组,字段分类汇总结果表
【 例 5-15】 若有一个顾客数据库,并按州名列分组,MapInfo
会将所有得克萨斯州的顾客放入一组,所有加利福尼亚州的顾客放入另一组,等等 。 然后,MapInfo计算每一组的聚合信息 ( 总计,平均等 ) 。
指定分类汇总标准:
① 在,按列分组,域中,输入 MapInfo用于计算分类汇总的列的列名或列号 。
例如,若要按州总计顾客表,可输入表示顾客所在州的列的列名 ( 如 StateName) 。
② 在,选择列,域中,输入同一列名 ( 如 StateName) 。
③ 在“选择列”域中,输入一个或多个运算符( Sum、
Count Avg,Min或 Max)。 请记住用逗号分隔开聚合运算符。
5.2.9 聚合函数
MapInfo提供以下聚合函数:
Count(*):计算一组中记录总数 。 它简单地使用
*作参数,因为它应用到整条记录,而非某个特定字段 。
Sum(表达式 ):计算一组中所有记录的 〈 表达式 〉 总计值 。
Avg(表达式 ):计算一组中所有记录的 〈 表达式 〉 平均值 。
Max(表达式 ):找出一组中所有记录的 〈 表达式 〉 最大值 。
Min(表达式 ):找出一组中所有记录的〈表达式〉
最小值。
5.3 习题 5
一,思考题
1,对象有哪几种形式?并说明对象的特征 。
2,说明,选择,查询与,SQL”查询的区别是什么?
3,使用,SQL”选择的过程步骤是什么?
4,如何正确理解对象包蕴关系 。
二,上机练习
1,上机进行对象的查询,并显示查询结果 。
2,上机分别练习,选择,查询与,SQL”查询这两种查询方法 。
3,上机完成本书中的,SQL”查询实例。