原创|使用教程|编辑:龚雪|2014-05-15 09:10:10.000|阅读 2474 次
概述:本文介绍了MapInfo Professional入门过程中的空间查询与地理分析教程,上半部分先为大家介绍地理数据的选择与查询方法。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
相关链接:
1)关于selection
尽管MapInfo Professional可通过表形式允许将数据附属到地图对象中去,这时可进行标注等操作,但其真正的强大之处在于对数据分析能力体现在其分和组织的能力上。在数据分解为逻辑群组之后,即可基于一个或多个变量来进行分析。
MapInfo Professional可以从数据中检索信息或是单独的记录。我们将以此方式检索的一条或多条记录称为选中部分。选中部分是基于一个或多个变量收集的数据的子集。
1.选中部分的特征
选中部分是临时表。在作出选择之后,MapInfo Professional创建临时表(称为选中部分)来存储已选记录。
2.使用这一选中部分表,可以执行众多可对永久(基础)表执行的任务,例如:
要将选中部分转换为永久列,可在文件菜单上单击另存副本为。在将临时选中部分表另存为永久表之后,可将新表当做任意其他表一样处理。
选中部分表完全取决于创建其所源自的表。如果关闭基础表,所有关联的选中部分表均将删除。
3.选中部分命令和工具说明
MapInfo Professional提供了众多命令和工具用于作出选择。这些命令和工具可分为两类:
2)屏幕选择
要从屏幕选择对象,则包含对象所需的图层必须为可选。要令图层可选,可在地图菜单上,单击图层控制,然后选择用于该图层的“可选”复选框。
在可选图层中选择地图对象时,MapInfo Professional使用在“参数设置”对话框(选项菜单)的“突出显示控制”部分定义的设置突出显示对象。在可编辑图层中选择地图对象时,MapInfo Professional将在所选对象的范围中放置编辑句柄(小方框)。
如果地图窗口中有多个可选图层,MapInfo Professional将从最顶部的可选图层选择对象。
例如,现有国界可选图层和州界可选图层。如果国界位于地图窗口最顶部的图层中,则MapInfo Professional将从国家图层选择对象。如果州界位于地图窗口最顶部的图层中,则MapInfo Professional将从州图层选择对象。在使用选择工具时,MapInfo Professional还将为最顶部的可选图层显示信息提示。将光标置于对象之上时,信息提示将显示对象的标注表达式。在地图窗口的参数设置中,可以关闭信息提示(在选项菜单,指向参数设置然后单击地图窗口)。与此类似,如果执行边界搜索,要搜索的边界对象应该位于最顶部图层之中。
例如,假设有一个州界图层和一个邮政编码边界图层。如果要选择邮编边界中的所有对象,邮编图层应该是最顶部的边界图层。如果要选择给定州内的所有对象,州图层应该是最顶部的边界图层。通过选择地图菜单,单击图层控制,可以重排图层。
在选择对象时按住CTRL键,即可从最顶部表之外的其他表选择对象。
例如,假定有三个可选图层分别是STATES、COUNTIES和CITIES。如果要在STATES表选择对象,但该表是地图窗口中最低部的图层,可执行以下操作:
1、按住CTRL键,然后使用选择工具单击地图。现在即位于第二个图层中。
2、按住CTRL键,然后再使用选择工具单击地图。现在即可从第三个图层STATES图层中选择对象。
3)查询选择
查询是针对数据库提出的收集信息的数学问题。在MapInfo Professional中的“查询”菜单下有两个查询构建器,即“选择”和“SQL选择”。确定受到机场噪音污染的居民的SQL查询。
如果采用选择,可以对单独表提出问题。
如果采用SQL选择,则可以针对一个或多个信息表来询问问题并执行以下任务:
创建表达式
要执行Select查询,必须创建表达式。表达式是一个用于询问问题的逻辑语句。例如,手头有一个出租公寓表。如果要创建所有总成本少于$800的所有公寓的临时表,可使用以下表达式:
其中RENT是包含月租的数字列的列名。
MapInfo Professional搜索公寓表中满足此条件的所有记录,并将相应记录置于临时表中,该临时表可用于制地图、浏览、制统计图或执行附加查询。
此外还可以对数据执行数学运算。例如,要创建总成本低于$800的所有公寓的临时表。总成本等于月租和每月公用费用的总和。
可使用以下表达式:
令MapInfo Professional将RENT列中的数字和UTILITIES列中数字加在一起,然后将该和与数字800比较。
创建表达式可以采用两种方式。第一种方式是直接键入表达式。在创建较为简单的表达式之后,此方法通常比较快。第二种方法是在“选择”对话框中按下辅助按钮,然后使用“表达式”对话框中的弹出式列表构建表达式。这一方法在学习构建表达式和构建复杂表达式的时候尤为实用。
“表达式”对话框提供了三个下拉列表帮助您构建表达式。列、操作数和函数。
列
此弹出式列表列出从中进行选择的表中的各列。如果该表包含自此前查询的派生的列,则这些列也将列出。
操作数
这一弹出式列表包含数学和逻辑操作符号。此弹出式列表的数学操作数包括加、减、乘、除、大于、小于和等号。使用这些符号可用于创建数学公式。
例如,要从销售代表的表中选择平均毛销售额大于$2000每月的销售代表。毛销售额是通过将销售额和佣金加在一起得到的总和。表中现在有两列:TOTAL_SALES是每个销售代表的年销售额,COMMISSION是每个销售代表的年佣金。此时可构建以下表达式:
此表达式令MapInfo Professional将TOTAL_SALES列中的数字和COMMISSION列中的数字加在一起。但是,这只提供了当年的毛销售额。我们要得到是每月平均的毛销售额。因此,我们将该总和除以12,以便提供月平均值。随后将该数字与2000相比较。
操作数弹出式列表还包括逻辑操作数联接AND、NOT、OR和LIKE。操作数LIKE可以和以下两个统配符一起使用:“%”和“_”。“%”字符可匹配0个或更多个字符_”字符只能匹配一个字符。
函数
这一弹出式列表包含多个数学函数,可采用一个或多个参数并返回值。使用函数可对列中的数据执行基本数学函数。例如:
例如,一个气象学者要选择其所在城市中,温度和全国平均值相差大于10度的所有天数。在其表中有一个AVG_DIFF列,其中包含了全国平均值和城市平均值之间的差值。此时可构建以下表达式:
此表达式令MapInfo Professional选择平均差异小于-10或大于+10的所有记录。但是,她还创建了以下表达式:
此表达式令MapInfo Professional选择平均差异的绝对值大于10的所有记录。
函数弹出式列表包含众多其他函数,其中包括面积、周长、正弦和余弦和日期相关的函数。有关这些函数的完全列表,请参阅“创建表达式”。
检验
此按钮检查创建的表达式,并检验其是否有效。如果是编写表达式的新手,这一功能尤为实用。
4)Select查询
通常使用Select选择对象的过程如下:
1、在查询菜单上,单击选择,以显示“选择”对话框。
2、要查看已选记录的列表,可选中“浏览结果”复选框。
3、MapInfo Professional将创建新的选择表的浏览窗口。
MapInfo Professional将该表命名为Query1。下一个临时选择表将命名为Query2。您可以替代MapInfo Professional的缺省名称,并未选中部分提供含义明确的名称。在“存结果于表中”对话框中键入新名称。使用“另存副本为”将该表另存为单独的表。
使用文件子集创建新表
与MapInfo Professional一起使用的众多数据集均包含多于项目所需的对象和信息。在众多情况下,均可和完整数据产品的子集一起方便地使用。例如,如果正在通过人口普查数据来跟踪特定国家的犯罪统计信息,则将不需要整个国家的人口普查数据。您可以只提取该国家的人口普查数据。
此处有两种方式来创建一个新表,来在其中包含现有文件中的记录子集。您可以通过交互方式选择表示要使用选择工具置于新表中的记录的对象。或者也可使用SQL Select命令来基于SQL函数选择对象的子集。
无论是采用交互式方式选择还是使用SQL选择语句进行选择,保存生成的表的是同一过程。
注:后续内容中的众多查询均可使用SQL SELECT命令或通过较为简单的选择命令来完成。因为SQL SELECT功能更加强大,用途更广,所以在以下示例中使用“SQL选择”对话框。
5)SQL查询
选中部分是表中数据行的子集,是基于表中一列或多列选择的。选中部分是通过采用有关数据的公式化问题(即查询)来创建的。爱达荷州有多少客户?哪一警区的暴力犯罪率最高?MapInfo Professional将这些问题的结果存储在名为查询表的临时列中。
在本章的第一部分,我们介绍了作为使用查询选择命令获取的结果的选中部分和查询表。我们现在将关注MapInfo Professional中功能强大和实用的特性使用SQL选择查询。如果需要使用MapInfo Professional的选择命令来创建复杂的查询,SQL选择将更适合完成相应任务。由选择命令生成的查询表中的记录包含的所有信息均属于基础表的记录中包含的信息。事实上,两者是相同的记录。这些记录是通过特定方式安排在一起的,以便于查看。使用SQL SELECT,可以创建包含只隐含在基础表中的信息的查询表。
“SQL选择”对话框是MapInfo Professional中最出色的对话框之一。但是也不能盲目。在了解了各个对话框的功用之后,创建功能强大的选择语句就会变得相当简单。相应语句既可直接键入到对话框中,也可以使用右侧的弹出式菜单来将具体项目输入到对话框中。
说明对话框最便捷的方式是逐步了解以下示例。本例使用MapInfo Professional中包含的WORLD表中的数据,以便于使用SQL SELECT自行练习。在各个步骤中,我们已经提供了 对话框各个组成部分的简介。示例之后提供了每个对话框的完全说明。
示例1 - 使用面积计算人口密度
在本例中,我们将使用世界地图来创建人口密度超过500人/平方英里的所有国家的表。以下公式将计算人口密度。
在WORLD表中包含一个人口列(pop_1994),其中没有包括国家面积列。但是,由于WORLD表中具有和记录关联的图形对象,因此MapInfo Professional即可计算每个国家的总面积。
打开WORLD.tab表,单击窗口的最大化按钮来将其显示最大化。在查询菜单上,单击SQL选择,以显示“SQL选择”对话框。
要填写“SQL选择”对话框,可执行以下操作:
1、在“从表”对话框中,从“表”下拉列表中选择WORLD。在一个SQL语句中可指定多个表。本示例只使用了一个表WORLD。
2、在填写“选择列”框之前,应该先填写“从表”框。MapInfo Professional将使用“从表”框中的表来生成“列”下拉列表中的列的列表。
3、将光标置入“选择列”框,然后删除星号(*)。在本示例中,我们将指定要纳入到生成的查询表中的列的列表,而不是纳入全部列。
注:“选择列”框中的星号(*)表示缺省查询所有列。
切记查询表是MapInfo Professional创建用于存储查询结果的临时表。
4、从“列”下拉列表中选择COUNTRY。
5、从“列”下拉列表中选择POP_1994。
现在我们需要计算人口密度。切记人口密度是通过人口除以面积计算的。在表中没有Area列。但是此处提供了一个函数Area,可用于计算任意可地图化的对象的面积。由于WORLD表可地图化,MapInfo Professional可计算每个国家的面积,因此可以计算每个国家的人口密度。
6、从操作数列表中选择除号(/)。
7、从“函数”弹出式列表中选择AREA。
这将创建派生列。派生列是包含针对其他一列或多列执行的计算结果的列。在MapInfo Professional创建查询表时,将包含以下两列:COUNTRY列POP_1994/AREA(OBJ,“SQ MI”)列,即人口密度列。MapInfo Professional对于所有地理函数而言都包括一个单位语句。如果要MapInfo Professional返回采用平方公里为单位的面积,则需要将“sq mi”更改为“sq km”现在,我们需要构建表达式来只选择人口密度大于500人/平方英里的国家。
8、使用Tab键转至“条件”框,然后从“列”下拉列表中选择POP_1994。
9、从操作数下拉列表中选择除号(/)。
10、从“函数”弹出式列表中选择AREA。
11、从操作数下拉列表中选择大于号(>)。
12、键入数字500。
现在即创建了用于“选择人口密度(pop_1994/Area(obj,“sq mi”))大于(>)500人/平方英里的所有国家”的表达式。
13、将“按列分组”框留为空。
14、使用Tab键转至“按列排序”框,然后从“列”列表选择COUNTRY。
“按列排序”框可用于指定查询表显示记录的顺序。通过选择Country列,MapInfo Professional将根据国家名称来按照字母顺序列出记录。
15、使用Tab键转至“结果放入表”,然后键入DENSITY。
缺省情况下,MapInfo Professional将该查询表命名为Query1。后续的查询表将依次命名为Query2、Query3等。在“结果放入表”框中,可以通过键入新表名来更改查询表的名称。MapInfo Professional将查询表命名为DENSITY。
16、单击检验。
MapInfo Professional将检查SQL语句的语法。如果语句中存在任意错误,MapInfo Professional将提供错误消息,提示是什么错误和包含错误的框。
17、选中“浏览结果”复选框以创建查询表的浏览窗口。如果不选择“浏览结果”,MapInfo Professional仍将创建临时查询表,但是不会显示该表。如果要在此后显示表,可在“窗口”菜单中选择“浏览”选项,然后从下拉列表中选择DENSITY。
18、单击确定以创建下表。
第一列包含国家名称。第二列包含人口密度。请注意国家是按照字母顺序(OrderBy:Country)列出的,且每个列出的国家的人口密度大于500人/平方英里(pop_1994/Area(obj,“sq mi”)>500).
示例2 - 使用SQL计算人口密度
要设置SQL SELECT语句,来选择具有较高人口密度的国家,可执行以下操作:
1、在文件菜单上,单击打开表,然后在地图窗口打开STATES表。
2、在查询菜单上,单击SQL选择,以显示“SQL选择”对话框。
这将创建新表HIDENSTY,其中只包含了具有相对较高人口密度(人口除以总面积)的国家选择列”框中的星号(*)将STATES表中的所有列传输到HIDENSTY表。
3、打开文件菜单,单击另存副本为,然后保存选中部分表。该表可使用任意文件名保存。
保存查询
使用选择或SQL选择命令创建的任意查询可以另存为MapInfo Professional查询表。查询表由.tab文件和.QRY文件构成。在执行选择或SQL选择语句之后,在文件菜单上,单击保存查询以将查询保存为表。打开此表之后,查询所基于的表将再次打开,查询将再次执行。
注:站队其他查询创建的查询不能保存为表,也不能保存到工作空间之中。
将查询保存到工作空间
查询还可保存到工作空间之中。打开包含查询的工作空间时,查询将执行,此时由查询创建的任意窗口将重新显示。和将查询保存为表不同的是,在将查询保存到工作空间时,并未创建单独的.tab文件。
注:要将查询保存到工作空间,则必须在启动参数设置中选中“在工作空间中保存查询”。MapInfo Professional缺省为选择此复选框。
使用模板进行查询
查询模板可用于将Select或SQL SELECT语句保存为模板和将其再次载入。这样每次要使用查询时,即无需重新构建查询选择”和“SQL选择”对话框中均提供了“载入模板”和“保存模板”选项,可用于更加轻松地完成上述操作。对于使用原始查询中的表的更新版本来重建查询而言,或者对于具有和创建查询语句所基于的表中字段相同的表执行查询而言,查询模板非常实用。
保存模板
在编写完Select或SQL SELECT查询之后,可将查询另存为模板。要将查询保存为模板,可执行以下操作:
1、在“选择”或“SQL选择”对话框中,可单击保存模板按钮来将查询保存到模板 或查询文件。此时将显示“将对话框内容存入查询文件中”对话框。
2、为查询文件提供名称、选择文件夹,然后单击保存。查询文件将使用.QRY扩展名 保存,并保存在目录参数设置中指定的目录总。
注:查询保存模板时,无需完整或具备正确语法。
载入模板
您可以载入任意保存的查询模板。
要载入查询模板,请执行以下操作:
1、在“选择”或“SQL选择”对话框中,单击载入模板按钮。此时将显示“从查询 文件中载入对话框内容”对话框。其中列出了.QRY文件。
2、选择要使用的.QRY文件,然后单击打开选择”或“SQL选择”对话框中将显示 源自已经载入的模板的值。此时只需执行查询来创建查询浏览窗口。
派生列
派生列是查询表中的列,其内容是通过将表达式应用于某些基础表中现有的列值来创建的。在上例中,人口密度是派生列。
缺省情况下,“选择列”框包含一个星号(*),该星号表示将基础表中的所有列均包含在查询表中。如果无需所有列,可删除该星号,然后只列出要使用的列。
您可以创建多个派生列。创建派生列的数量不限。请注意创建的派生列越多,MapInfo Professional执行查询的时间就越长。
此外还可以基于以下聚集函数来创建派生列:count、sum、avg、wtavg、max和min。
例如:
创建列别名
MapInfo Professional创建派生列时,将使用表达式本身作为该派生列的名称。该名称有可能不便记忆。但是您可以为列指定别名。
例如,DENSITY浏览窗口中的人口密度列的标题将为:
我们可以重命名该列,以便其含义更加明确。要重命名列,可在列示相应的列时向“选择列”框添加新的名称。该别名必须在表达式之后。并且必须用空格和表达式分隔开来,并且包含在引号之内。例如:
在MapInfo Professional创建临时查询表时,人口密度列将重命名为POP_DENSITY。您可以使用别名来重命名表中的任意列,而不只限于派生列。例如,如果表中的每个国家是贵公司的单独的销售区,则可能将Country列重命名为“TERRITORY”。操作过程相同:
示例3 - 计算全世界人口密度
在本例中,我们展示了若干SQL选择特性:
本例中,现有一个全球人口统计数据表(WORLD)。要创建一个表来显示全球的人口密度。
使用以下公式:
如果WORLD表没有总人口或总面积列,我们可以通过对Population列应用sum()聚集函数和Area函数来派生这两个列。我们将在第一个查询中来完成这一点。
1、打开WORLD表,将其显示最大化。
2、在查询菜单上,单击SQL选择。此时将显示“SQL选择”的对话框。
3、从“SQL选择”对话框,可执行以下操作:
4、单击检验。单击确定。
5、选中“浏览结果”复选框。
6、单击确定。
此时MapInfo Professional生成包含两列、名为TOT_POP_AREA的查询表。第一列显示人口的总计值,第二列显示总面积的返回值。
现在我们得到总人口和总面积,通过针对刚刚创建的TOT_POP_AREA表执行SQL选择,还可以计算世界的人口密度。在该“SQL选择”中,将用总人口除以总面积。
1、在查询菜单上,单击SQL选择可显示“SQL选择”对话框。
2、按照以下方法填充该对话框:
请注意,选择Total_Pop之后,COL1将显示在“选择列”字段中。这是该字段的列编号。选择来自上一个查询的派生列之后,MapInfo Professional使用列编号,而不是列名。可以按名称或编号引用列,其中编号指定“选择列”框中列的显示顺序。COL1和COL2分别是指第一列和第二列。
3、从操作数下拉列表中选择除号(/)。
4、从列下拉列表中选择TOTAL_AREA。COL2将显示在“选择列”字段中。
5、将“条件”、“按列分组”和“按列排序”留为空白。
6、标记“将结果放入表”框中,然后键入WORLD_DENSITY,将此作为该表的名称。
7、单击检验。单击确定。
8、选中“浏览结果”复选框。
9、单击确定。
MapInfo Professional生成名为WORLD_DENSITY的查询表,该表将返回全世界的人口密度值,即每平方英里的人数。
聚合数据
聚合数据之后,可以针对表中所有列的所有列值执行数学计算。与只用于执行数学函数或单独记录的“选择”命令不同,SQL用于聚合(或汇总)整个记录的数据。
MapInfo Professional查找指定列中唯一的数据值集,并为每个这样的唯一数据值集创建一。聚合数据之后,需要指定以下内容:
例如,您拥有包含销售代表和其前三个月销售业绩的表:
SALES_REP |
月份 |
销售额 |
John |
五月 |
1200 |
Cathy |
五月 |
900 |
Julie |
五月 |
1100 |
John |
六月 |
900 |
Cathy |
六月 |
1400 |
Julie |
六月 |
600 |
John |
七月 |
1200 |
Cathy |
七月 |
700 |
Julie |
七月 |
1000 |
通过在“SQL选择”对话框中指定以下各项,MapInfo Professional还可以计算每个销售代表的总销售额:
SALES_REP |
sum(SALES) |
John |
3300 |
Cathy |
3000 |
Julie |
2700 |
或者MapInfo Professional可以计算每个销售代表的平均销售额:
SALES_REP |
avg(SALES) |
John |
1100 |
Cathy |
1000 |
Julie |
900 |
或者MapInfo Professional可以计算每个月的总销售额:
月份 |
sum(SALES) |
五月 |
3200 |
六月 |
2900 |
七月 |
2900 |
MapInfo Professional拥有六个聚合函数:
组合和排序数据
可以通过特定的列将SQL查询进行分组,以便将包含相同值的所有行组合在一起。在“SQL选择”对话框的“按列分组”框中指定此列。与聚合函数结合使用时,将所有组合列中带有相同值的行视为一个组。将禁用重复的行,并且将基于聚合函数向派生列报告聚合值。按照在“选择列”框中列出的名称或位置指定列。使用派生列时,必须指定列编号。
沿着相同的行,可以告诉MapInfo Professional以某种方式排列查询结果的顺序。缺省情况下,MapInfo Professional将按照升序值(即按照字符字段的字母顺序)排列记录的顺序。
列出多列之后,MapInfo Professional将从第一列开始排列记录的顺序。在第一个“按列排序”中具有相同值的记录是按照第二个“按列排序”中的值进行排序。与上述Group By子句相同,使用列名或位置编号。对于派生列,使用编号。对于位置编号不要使用“col”。
使用“SQL选择”连接表
对多个表执行“SQL选择”操作时,MapInfo Professional需要连接各种表中记录的信息。地图表只包含图形对象及其名称,以及一些地理区域的统计数据的表。您希望显示地图表上的统计数据。那么可以使用“SQL选择”来创建一个查询表,其中在一个表中连接统计数据和地图数据。
使用多个表时,必须在条件中置入一个语句,以告诉MapInfo Professional如何匹配不同表中的行。
例如,WORLD表包含国家及按照国家划分的经济统计数据(Eco_Stats)的表。要创建包含这两个数据集的查询表:
要匹配的两列不必同名。例如,现有包含销售区域列(TERRITORY)的国际客户(Int_Cust)表。此列包含大陆名称,因为公司是按照大陆划分销售区域的。如果要临时连接两个表:
示例:按大陆计算的总人口和面积
指定MapInfo Professional可以聚合数据,那么可以计算世界中每个大陆的总人口和总面积。要创建带有以下信息的表:
要创建捕获此数据的表:
1、打开WORLD.TAB表,然后通过单击最大化按钮将其最大化显示。
2、在查询菜单上,单击SQL选择可显示“SQL选择”对话框,并执行以下操作:
3、在“从表”框中,从表下拉列表中选择WORLD。
4、在“选择列”框中,从列下拉列表中选择大陆,然后从聚合下拉列表中选择 COUNT(*)。
按空格键一次,然后输入列别名“COUNTRIES”,将此作为列别名。切记,必须用空格键将别名与其表达式分隔开。
注:大陆Count(*)列将在结果表中显示为COUNTRIES。
5、从聚合下拉列表选择SUM。
6、从列下拉列表中选择POPULATION。选择Population之后,光标将位于结束括号[)]的内部。使用右箭头键将其移到外部。
注:Sum(Population)创建一个将计算世界总人口的派生列。
7、按空格键一次,然后输入列别名“Total_Pop”。Sum(Population)列将在结果列表中显示为Total_Pop。
8、从聚合下拉列表选择SUM。
9、从函数下拉列表选择AREA。选择Area之后,光标将位于结束括号[)]的内部。使用右箭头键将其移到外部。
Sum(Area)创建一个将计算总面积的派生列。
10、按空格键一次,然后输入列别名“Total_Area”。
注:Sum(Area(obj,“sq mi”))列将在结果表中显示为Total_Area。
11、在“按列分组”框中,从列下拉列表中选择CONTINENT。
12、在“按列排序”框中,从列下拉列表中选择CONTINENT。
13、在“结果放入表”框中,输入POPULATION,以此作为该表的名称。
14、Count(*)计算表中的所有记录。然而,因为是按照大陆组合国家的,MapInfo Professional报告每个大陆中的国家数,并将其放在名为COUNTRIES(别名)的列中。
下图显示了结果查询表。
使用条件
在连接时使用的字段顺序没有什么必然联系。可以接受以下语法之一:
Select * from A,B where A.field1 = B.field1
Select * from A,B where B.field1 = A.field1
然而,切记在交换地理操作数的顺序后,地理运算符也要随之发生变化。以下语句将生成相同的结果:
Select * from states, cities where states.obj contains cities.obj
Select * from states, cities where cities.obj within states.obj
子句的顺序
连接子句的顺序与执行顺序没有必然联系。例如,以下都是有效子句:
Select * from Us_custg,States,City_125
where States.state = City_125.state and States.state = Us_custg.state
and Us_custg.order_amt > 10000
Select * from Us_custg,States,City_125
where States.state = City_125.state and States.state = City_125.state
and Us_custg.order_amt > 10000
Select * from Us_custg,States,City_125
where Us_custg.state = States.state and Us_custg.order_amt > 10000 and
States.state = City_125.state
错误处理
如果检测到将OR作为逻辑运算符的条件无效,那么MapInfo Professional将指出发生错误。通常只要MapInfo Professional找不到两个表之间进行的连接,就会显示此错误。例如,如果指定以下错误条件:
Select * from A,B where A.field1 = B.field1 or A.field1 = B.field2
将显示以下错误消息:
A和B之间没有指定的连接。Where子句中的连接条件无效
执行外连接
SQL外连接是指将较大表中的数据与较小表中的数据连接起来的过程,其中结果是在较大表中与较小表中匹配的记录相连接的所有记录。如果将此连接作为标准连接执行,那么将出现问题SQL选择”中的标准连接将生成只有匹配记录的表。您可能拥有没有匹配项的空字段。
例如,假设表包含建筑物中所有单元的列表。此外还有包含每个住户记录的表。每个表中都具有带有单元编号的字段。您的任务是生成包含所有单元及每个单元住户的表。一些单元将是空闲的,并且与住户字段没有匹配。
第一步是创建可以将单元与住户成功匹配的数据子集。
1、在查询菜单上,单击SQL选择。设置以下SQL查询:
2、单击确定。选择内容将显示在查询浏览窗口中。将此查询保存到基础表中。
3、在文件菜单上,单击另存副本为。此时将显示“另存副本为”对话框。为文件选择适当的目录,并将其命名为RESULT.tab。单击保存。
4、在文件菜单上,单击打开表,然后打开RESULT表。此表包括存在匹配的两个表中的所有记录。
5、从APARTMNTS表中选择与住房表中的记录不匹配的记录。在查询菜单上,单击SQL选择,然后设置以下SQL查询:
结果查询表是不在RESULT表中的所有单元的列表。要将这些记录包含在RESULT表中,必须进行附加。
6、在表菜单上,单击在表中添加行。将最后的查询表附加到RESULT表中。此操作将空闲单元的列表附加到入住单元的列表中。
使用Instr函数来查找数据
InStr函数用于查找较大字符串中的子字符串。此函数适用于搜索字符字段,以查找特定字符或字符组的位置。其还用于查找子字符串的出现情况。
例如,要选择POINTS表中的所有街道,该表在STREET列中包含单词“Main”,那么按照以下方式设置“SQL选择”语句:
在上面的示例中,如果InStr函数在Points表的STREET列中的任意位置找到单词“Main”,那么其将返回大于零的值(搜索字符串中“Main”第一个字母的位置)。
INSTR函数的语法如下:
其中:
例如,要在给定的文本字符串中查找单词“test”的位置,那么InStr函数的外观如下:INSTR(1,”This is a test of the Instr function “,”test”)
执行此语句之后,将返回值11。
注:如果搜索的字符串在较大的字符串中不存在,那么将返回值0。
从未嵌套在另一个表中的表选择记录
以下SQL语句用于基于两个表共用的字段从未嵌套在另一个表中的表选择记录。例如,如果现有一张表STATE1,并且要从不在CITY125中的STATE1选择所有记录。
1、在查询菜单上,单击SQL选择。
注:相应的语句语法如下所示:NOT columnname IN (SELECT columnname FROM secondtable)
2、此SQL语句生成在CITY125.tab中不存在的表STATE1.tab中所有记录的查询。
从表中选择偶数记录或奇数记录
表中的每个记录都拥有一个连续的记录编号或RowID。假设要从表中选择其他记录。最便捷的方式是通过RowID检查表。
要选择具有偶数记录数的记录,请执行以下操作:
1、在查询菜单上,单击SQL选择。
2、在“SQL选择”对话框中作出适当选择。
注:RowID是一个函数,不是Soils表中的列名。
3、要选择具有奇数记录数的记录,则在查询菜单上,单击SQL选择。
4、在“SQL选择”对话框中作出适当选择。
注:RowID是一个函数,不是Soils表中的列名。
5、单击确定。
查找列中的重复值
数据通常由很多不同的用户输入到表中。有时数据是重复的,或者在几条不同的记录中存在共用的信息。本节解释了如何查找表的给定列中与其他行共享值的所有行。通过执行两个SQL选择语句即可完成。
第一个SQL选择语句生成带有两列的查询表。第一列是数据列中所有唯一值的列表,第二列列出每个唯一值发生的次数。第二个SQL语句将每个数据列值与计数大于1的查询表中的所有行进行比较。
在下一个示例中,表EMPLOYEE拥有两列,即Id_Num和Name。要查找重复值,应执行两个SQL选择,修改所指的位置。
1、在查询菜单上,单击SQL选择可填充“SQL选择”对话框。
将数据列的名称替代为ID_Num,表名称替代为EMPLOYEE。“按列分组”框中的编号1将按照ID_Num(第一列)将行分组按列排序”中的2 Desc将基于count(*)字段中的值(第二列)按照降序排列记录。
此SQL选择语句返回带有两列的查询表。第一列包含至少由一个员工持有的每个身份证号。第二列包含拥有身份证的员工人数。将按照拥有ID编号(例如,计数)的员工人数对行进行排序。
2、在查询菜单上,单击SQL选择,然后填充该对话框。
此外,将EMPLOYEE更改为表的名称,将ID_Num更改为数据列的名称。
在此示例中,SQL语句返回一个查询表,该表包含EMPLOYEE中带有重复数据列值的所有行。条件从EMPLOYEE选择所拥有的身份证号与Count_By_ID查询表中ID编号之一相同的所有行。此子选择查找出现多次的所有身份证号。
计算与固定点的距离
在MapInfo Professional中,可以计算从一个点到另一个点的距离。本示例显示如何计算从固定点到地理编码的表中的每个点的距离,并将结果存储在另一个表中。
1、确定固定点的位置。要在地图上查找符号的位置,用选择工具双击符号。在本示例中,X值是-101.697209,Y值36.050036。
2、在查询菜单上,单击SQL选择,然后填充“SQL选择”对话框,将X和Y的值替换为上述值。与在上一个SQL查询一样,用表的名称替换EMPLOYEE,并用表中相关列的名称替换ID_Num。
3、单击确定。结果查询表包含姓和名称,以及名为DISTANCE的新列,该列记录固定位置(-101.697209,36.050036)和与表中各行关联的点之间的距离。
4、要将结果保存在永久性表中,在文件菜单上,单击将副本另存为,然后保存。
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn
文章转载自:慧都控件网