技术员
Network change life, change t
- 积分
- 17879
 

|
Mapinfo重点及难点讲解(一)
SQL查询 重分区 无缝图层 返回
一、SQL查询
SQL Select的一般步骤:
1.打开你要查询的表。你要查询的表为基础表(Base Table)
2.选择Query>SQL Select,填写SQL Select对话框满足你需要的那些分。按击OK,Mapinfo进行查询。
Mapinfo从你的基础表中抽出数据,把查询结果保存在一个被称为结果表的特殊临时表中。结果表仅有满足你的条件的行和列。结果表的默认名是Selection(尽管你可以在SQL Select对话框的Info Table Named位置上指定一个不同的结果表名)。
注意:以下第三条暗示:结果表既反映在Browser窗口,也反映在Map窗口中,换句话说,可收查询结果保存为另一个图层。保存方法见下面的第5条。
3.如果你要看查询结果,打开一个Map窗口或(和)一个Browser窗口。默认的是MapInfo自动以一个Browser窗口显示结果表(除非你清除了SQL Select对话框中的Browser Results检查盒)。
如果你的结果表被命名为Selection(默认名),Browser窗就显示一个不同的表名,例如Query1名Query2。这是因为你浏览这个Selection表的瞬间,MapInfo对该表作了一个“快拍”,并命名这个快拍为Queryn(n是数字,1或更大)。MapInfo主要按快拍是因为“Selection”是一个特殊的表名,每当你选择或不选择某些行时,Selection都在动态变化。
在SQL Select对话框中,你可以为你的结果表输入一个另外的名字(例如,你可以命名你的结果表为My-Query)。这就阻止了MapInfo把你的结果表重命名为Queryn。
4.MapInfo自动选择结果表中全部的行。这样,在你执行了SQL Select之后,你就能够接着执行选择行的全套操作。例如,你可以(通过选择Option>Region Style)对所有被选择的行提供另一种充填色,或者你能够Cut或Copy选择的全部行。
通常,你对结果表所作的任何变化都会自动作用于你的原始(基础)表。例如,如果你用SQL Select选择了基础表中的某些行,然后又从你的结果表中删除了部分行,MapInfo就会从你的表中删除相应的行。但是,如果你查询产生了小计(Subtotals),你可以改变这个结果表而不影响基础表。
5.如果你要作一个结果表的永久备份,选择File>Save As。
如果你你不执行Save As存盘,该结果表将在你退出MapInfo时被删除。
SQL Select对话框各区的填写
Select Columns区
(1)利用这个区来指定在查询表中将出现哪些列。例如查询World表,可以指定Select Columns:Country,Population,Indust_Grwth,如果你要你的结果表有与你的原表相同的列组,那就在这个区输入一个*号。
如果你要你的结果有一个与你的原表不同的列组,就要删去这个*号并输入由逗号分隔的列名(如下同)表达式列表。这个区能够包括一个*号或者一个列表达式列表,但不能同时包括这两种。要在你填Select Columns区之前填From Tables区。
如果你查询涉及的不止一个有,各个列名之前必须有它的表名,二者之间用西文句号分隔。因此,如果你要执行一个涉及两个表的查询,其中之一是Canada表,并且你要查询包括该表的Population列,那么你必须用列表达式Canada.Population。当你使用两个或多个表时,Columns下拉列表自动把表名插到各个列名之前。
(2)只选择部分列出现在结果表中是有用的,特别是你的原表有很多列而你仅需操作其中的少数列时(或许因为屏幕上只能同时显示少数列)
(3)如何输入一系列列名:
在From Tables区输入一个表名,可用键盘打入,也可用鼠标从Table下拉列表中选入。
用鼠标在Select Columns区中按击,使插入点出现在该区内。
用退格键或删除键删去*号(如果其中有*号),Select Columns区能够包含一个*号或者一串列名,但不能同时包含这两种。
从对话框右边的Columns下拉列表中选择一个列名。MapInfo把这个列名Copy到Select Columns区。
如果你的查询还包括另外一些列名,从下拉列表中选择另外的一些列名。每当你选择另外的列名时,MapInfo自动插入逗号以分隔列名。
(4)计算某些列
SQL Select能够计算出列(derived Columns)并把这些导出列存放到结果表中。导出列是MapInfo在中根据基础表中已有的一个或多个列的内容计算出的一个特殊的临时列。
例如,你的表或许含有字段Purchases92或Purchases93(分别代表各顾客在1992和1993年购物的总金额)。如果你要你的查询结果显示一个Total Purchases列,表示各顾客1992和1993年合起来的购物金额,你可以在你的Select Colomns区内包括一个导出列。在这个例子中,导出列应该有这样的形式:
Purchases 92 + Purchases 93
同样,你可能有一个包含有字段Fname(代表顾客的第一名)和Lname(顾客的后名)的顾客信息表。如果你要你的结果表包括顾客的全名,你也可以在你的Select Columns区包括一个导出列,在这个例子中,导出列会有这样的形式:
Fname + “” + Lname
为指定一个导出列,你就要在Select Columns区输入一个表达式。一个导出列表达式是若干列名,操作符(例如+和-)和函数(例如Ucase$函数,它把一个字串转换为大写的)的一个组合。
在指定导出列之前,你必须先在From Table区输入一个或多个表名。
如何指定一个导出列表达式
按Select Columns区,在该区出现插入点。
删除区内的*号
输入一个列表达式。列表达式应该包括一个或多个列名,如果表达式包括一个以上的列名,这个表达式一般包含操作符(例如+或-)来把多个列组合成为一个导出值。
有许多不同的函数和操作符能够用于列表达式中。
如果需要为列表达式指定一个别名。指定别名的方法是:在列表达式后打一个空格,然后再打入用双引号括起来的别名。
别名是可选的。如果你给了你的列表达式一个别名,那么,当你以Browser窗口显示结果表时别名就会出现在这个列的顶上。如果你没指定别名,MapInfo会用表达式的内容作为别名(例如“Fname+Lname”)。
如果需要,指定另外的列名或导出列表达式。如果你输入另外的列表达式,要输入逗号以隔开不同的表达式。
下面的例子显示一个执行加法的导出列表达式,把两个数字列的值加起来。这个例子假定Purchases92和Purchases93均为数字列:
Purchases92 + Purchases93
下一个例子显示同样的列表达式,附加上了一个可选的列别名(”Net_Purchases”):
Purchases92 + Purchases93 “Net_Purchases”
下一个例子显示一个执行除法的导出列表达式,把Poppulagion列的内容除以一百万:
Population/1000000 “Millions”
下一个例子显示一个把两个字串列组合起来的导出列表达式。这个例子假定Fname 和Lname都是字串列:
Fname+””+Lname “Full_name”
当列是字串列时,加操作符(+)执行字串联接而不是数字相加。因此,表达式Fname + “ “ + Lname产生一个由第一名紧跟空格再后跟一名组成的字串。
下一个例子显示一个导出列表达式怎样结合函数调用。Proper$函数操作一个字串值并返回一个有正常大写的字串(仅第一字母大写):
Proper$(Fname+””+Lname) “Full_name”
下一个例子显示如何用Format$函数重新格式化数字列。一般,数字列都没有包含逗号,不幸的是,这使得读大数有困难。下面的例子用Format$函数把逗号插入到Purchases93列中。这个例子假定Purchases93是一个数字列:
Format$(Purchases93,”$,#”) “Purchases_1993”,字串表达式“$,#”告诉Foramt$函数在列前显示一个美元($)并在列内插入逗号。
下一个例子显示一个导出列怎样计算基础表中各行的地理面积:
Area(Obj,”sqkm”) “Net_Area”
Obj是一特殊的列名,代表与表中各行相联系的地理对象。
Where Condition区
(1)通过行的排列顺序联接不同的表
如果两个表没有一个共同的列,你可以根据行的顺序仍然能够联接这两个表。如果你知道一个表的第一行与另一个表的第一行是相对应的,并且,一般地说,如果你知道第一个表的第n行与第二个表的第n行是对应的,那么你就可以通过引用一个名叫RowID的特殊列来联接这两个表。
RowID列含有一个整数值,代表着表中各行的行号。因此,任何表的第一行都有一个为1的RowID值,第2行有一个RowID值2,等等。
为了联接两个表,让MapInfo一个表的第n行与另一个表的第n行匹配起来,就要指定一个Where Condition表达式,形如下:
TABLE_1.RowID=TABLE_2.RowID
(2)从地理上(用地理操作符)联接不同的表
当两个表都有图形对象时,MapInfo能够根据这些对象之间的空间关系联接这两个表。所以,即使你的表没有一个共同的列,你也有可能联接不同的表。
地理操作符允许你选择某些对象,根据它们与另外的某个对象的空间关系。MapInfo有一个与地理操作符一起使用的特殊列名,“Obj”或“Object”。这个列名指的是与你的表相边系的图形对象。
地理操作符要放到所指定的对象之间,地理操作符从操作符(Operators)下拉列表中选取。
下表列出了地理操作符:
Contaions(含有)
Object A Contains Object B
(如果B的形心在A的边界内的某个位置上)
Contaions Entire(包含全部)
Object A Contains Entire Object B
(如果B的边界全部在A的边界内)
Within(在内)
Object A is Within Object B
(如果A的形心在B的边界内侧)
Entire Within(完全在内)
Objcte A is Entire Within Object B
(如果A的边界全部在B的边界内)
Intersects(相交)
Objcte A Intersects Object B
(如果它们至少有一个共同点或者它们中的一个完全在另一个内)
Contains与Within的比较是根据对象的形心,而Contains Entire与Entire Within的比较是根据整个对象。
如果A包括整个B,那么A肯定包含B,如果A完全在B内,那么A肯定在B内。
MapInfo执行简单的含有和在内比较,比执行完全含有和完全在内要快。因此,除非你绝对相信某些对象是完全在另一些对象之内,否则你应该使用Contains和Within而不用Contains Entire或Entire Within。
地理操作符提供了一种联接表的方法。当表中没有你能建立起联接的列时,你可以用地理操作符(在Where Condition区内)指定联接关系。如果你要执行一个涉及一个Cities表和一个State表的两表查询,你可以用如下的表达式之一联接两个表:
Cities.Obj Within States.Obj
States.Obj Contains Cities.Obj
在任何一种情况下,MapInfo都能找到在各个州内的全部城市,然后把代表一个城市的一个行与含有它的州的行联系起来。用同样的SQL查询,你也能够用集合功能来合计每个州的城市数,或者以州为根据总结基于城市的数据。
当你有Counties 表和一个Customers表时,Counties是多边形,Customers是点,你可以用下列地理表达式之一指一个集合联接:
Customer.obj Within County.obj
County.obj Contains Customer.obj
地理操作符与Subselects结合特别有用(见Perferming Subselects)
(3)联接两个或更多的表(根据共同字段)
一般,你是把你的资料贮存在几个不同的表中,你有你自已的数据文件,你也可能有从MapInfo购买的各种统计资料的数据库。SQL允许你建立关联以便你把这些不同表中的资料接到一起,成为一个单独的结果表。设想这样一种情况:你有一个有人口统计交资料的Counties表(各个County按年龄段、种族和职业种类的人口数统计),你还可能有关于顾客订单资料的数据库。你想检测一下这两个表,看一定种类的订单是否来自具有一定人口统计特征的Counties。或许你想根据订单与人口的统计特征的组合选择若干个Counties(县)。要做到这一点,你必须能够联接这两个表。
假设Counties表含有县名,同样订单表的一个列也含有订单来源的县名,这样,两个表都有一个共同的字段,即县名。MapInfo能够用这个共同的字段来联接这两个表。
Countyname 1980人口,1990人口 Order# Customer County
Foster 1980人口,1990人口 478001 Franic Foster
Williamette 1980人口,1990人口 478002 James Foster
Mason 1980人口,1990人口 478003 Wick mason
Counties表 Order表
在SQL Select 对话框中,你用Where Condition区告诉MapInfo如何联接这两个表。在这个区内填写如下:
Select Columns: *
Frome Table: Counties,Order
Where Condition: Counties.Countyname=Order.county
表名(在From Tables区)的顺序是重要的。如果两个表都含有Map对象,结果表将只含有排列在From Tables区中第一个表的Map对象。另外,当查询完成时,MapInfo会自动选择列在From Tables区第一个表的部分或全部行。这样,在前例中,MapInfo会选择Counties表的部分或全部行。其结果也会包括从Orders表中拷贝来的数据,但Orders表本身不会被选择。
在Where Condition区中,列的顺序必须与From Tables区中表的顺序相匹配。在上例中,From Tables区把Counties表放到了Qoders表之前,因此,Where Condition区必须把Counties.CountiName列放在Orders.County列之前。如果颠倒这两个表在From Tables区内的顺序,你也必须颠倒在Where Contition区内列名的顺序。
当你联接两个表时,结果表的行数取决两个匹配的好坏。假定你有一个10000行的Order表,要把这个Order表与有50行的States表联接。结果表可能有10000行之多。但是如果Orders表中的某些行没有与States表中的行相匹配。结果表就会少于10000行。因此,如果Orders表中有400行无state名(或许由于数据输入错误),并且如果这个关联是依赖State名,结果表就可能只有9600个行了。
当SQL Select对话框联接两个表时,你指定的如何联接这两个表的子句(Clause(s))必须放在Where Condition区内的其它子名之前。
你可以用Update Column来修改SQL Select多表联接的结果表。当你要更新一个表中带有另一个表的信息的一个列时,你可以:
用SQL Select联接这两个表。
针对Selection表使用Update Column。
更新会自动影响到相应的基础表。
(4)次选择(Subselects)
MapInfo允许SQL Select中的再次选择。再选择是放在SQL Select对话框Where Condition区内里面的一个选择语句。MapInfo首先处理Subselects,然后用这个Subselects的结果去处理主要的SQL Select。
例如,假定你要选出1990年人口大于全国各州平均值的全部州。换句话说,如果平均州人口是5百万,你要选出所有平均人口大于5百万的州。在实行中,你要在Where Condition区中使用如下的过滤标准:
Pop_1990>平均人口
然而,你并不知道那平均值是多少。但是,你知道MapInfo能够用如下集合表达式计算出那个平均值:
Avg(Pop_199)
为了计算平均州人口,要在Where Condition区输入一个再选择(Subselect)。Where Condition区那时能够比较对Pop_1990列再选择的结果。要进行那样一种查询,如下填写SQL Select对话框。
Select Columns: *
From Table: States
Where Condition: Pop_1990>(Sekect Avg(Pop_1990) From States)
再选择是在Where Condition区内,在>操作符之后。再选择必须用园括号括起来。
最有用的再选择包括一个Select子句,一个from子句和一个Where子句,象下面这样:
Select某些列from某些表where某些条件存在。
考虑如下的SQL Select,它选择各州中人口大于4000000的全部城市:
Select Columns: *
From table: cities
Where Condition: obj within any(Select obj from states where Pop_1990>4000000)
再选择返回代表1990年人口大于400000的全部州的地理对象。然后主选择语句设到被再选择选中了的州内全部城市。注意:主选择语句用了一个地理操作符(Within)来做这个事情。
虽然前一查询用两个表,States表和Cities表,但Cities是出现From Tables区的仅有的表。这是因为在再选择中使用了States。如果一个表仅仅是被用于再选择内,那么这个表的表名不需要出现在From Tables区中。
在下一个例子中,我们选择与田西纳州相交的所有州,换言之,所有相邻的州。
Select columns: *
From tables: states
Where conditions: obj Intersects(select obj from states where
state=”TN”
首先,MapInfo执行再选择:
Selectobj from states where state=”TN”
再选择找到了代表田纳西州的图形对象。然后主Where condition找到了States表中与代表田纳西州的图形相交的全部对象。你可以用类似的查询选择与某给定街道相交的全部街道。
现考虑这个例子:
Select columns: *
From Tables: County
Where Condition: County.obj contains any(select obj from dealers)
这个查询找到含有销售商的所有县。主Where condition有这样的一个形式:
一个县对象Contains一个经销商对象。
经销商对象组是由再选择:Select obj from dealers产生的。MapInfo选择代表含有经销商的各个县对象的行。
最后,对于再选择有几点注意事项:
在再选择中你可以使用在From Table区中未列出的表.但是你必须把这些表列在你的再选择的From子句中(如前面例子所示那样)。
当再选择带有关键字”any”或”all”时,再选择必须并且只能返回一个列。下面的句例是无效的,因为它试图返回两个列(State_name 和Pop_1990):
Any(Select state_name,pop_1990 from state)
当再选择不带”any”、“all”或“in”时,再选择必须准确返回一个行的值。下面的例子是无效的,因为再选择返回了一组行:
obj within(Select obj from state where Pop_1990>2000000)
当再选择不用”any”、“all”或“in”时,你不能在再选择中使用Group by Columns子句。
你不能有嵌套的再选择,即是说,每个Select语句你只能有一个再选择。
设置过滤标准
一个过滤标准是一个逻辑表达式,它通常把一个列值与某个另外的值作比较。例如,以下的过滤标准用大于操作符(>)测试订单金额列是否有大于100的值。
Where Condition:Order_Amount>100
如果一个查询包含了上面这个Where Condition子句,MapInfo就只选择那些订单金额值大于100的行。
Where Condition区可以包含两个或更多的逻辑表达式,但这些表达式必须被词“And”或“Or”隔开。如果表达式是用词And连接,MapInfo仅选择那些两个标准满足的行。如果表达式是用Or连接,MapInfo就选择满足其中任何一个标准的行。
过滤标准可用于你的基础表的任何一个列,不管你是否在Select Columns区中包括了这个列。
列可以用列名或列号来引用,列号指明是在Select Columns中已有的列的顺序。
因此,“Col”和“col6”分别指第一和第六列,号之前必须有字母“Col”。
用SQL Select对话框的Where Condition区的基本目的可能是两个:行过滤和关联。Where condition区服务于多个目的。在某些场合下,你可能要用一个Where condition表达式来过滤你的表,以便你只看到满足一定标准的那些列。在一些场合下,你要利用Where condition区来指定一种关联,以便你的查询能够包括来自两个或更多个表中的列。
注意:你不可以在Where condition区中使用集合函数(apgregate function)。
Order by Columns(按列排序)区
选择升序和降序
默认,MapInfo是用升序排序一个表。如果你要用一个字符型字段进行排序,升序意味着A出现在B之上,如此类推。如果你对一个数字型字段进行排序,小的数值出现在大的数值之上。
为了以降序排序,以便大的数出现在小的数之上,要在Order By Columns区中的列名之后放一个词desc。例如,你查询World表,用如下的方式:
Order By Columns opulation desc
是用Population对这个表排序,降序。
当MapInfo执行多级排序时,各级排序有其自己的升/降序设置。这样,下面的例子按State列执行升序,然后按Population列执行降序:
Select Columns: *
From Table: City_1K
Order By Columns: State,Population desc
在Order By Columns区中的列名句法:
在这个区,你有两种方法输入一个列名:
输入列的名字(例如前例中的列名state)
输入列号,这里的1代表排列在Select Columns区中的第一列,在数字之前不要打入“Col”。
如果你要用一个导出列进行排序并且这个导出列有一个别名的话,你可以在Order By Columns区输入这个别名。如果导出列没有别名,就输入列号(例如1)。
用Order By Columns字段对结果表排序
在SQL Select对话框中,利用Order By Columns区,允许你对结果表的行进行排序。排序影响到出现在Browser窗口中和各个行从顶到底出现的顺序。如果你打算把Browser窗口作为一报告打印出来,你可能要对你的结果表进行排序。
Order By Columns区是可选的,如果你留下这个区空着,结果表就不被排序。如果你在这在区输入一个列名,MapInfo就根据那个列的内容对结果表进行排序。
实现多级排序
在Order By Columns指明多级排序的列名要用逗号隔开。依次为第一级、第二级…
Group By Columns区(按列分组)建立小计用
用Group By Columns区小计结果表
SQL Select对话框中Group By Columns区是可选的。如果你在这个区输入一个或多个列名,结果表将含有这个表的小计(Subtotals),或集合信息。
注意:结果表变成了小计表,没原始数据,小计的依据是列值相同者。
当你指定一个Group By Columns值时,MapInfo查询所指定的列,看那个列的那些行有相同的值。因此,结果你有一个顾客数据库,并且你是按StateName列分组,MapInfo就会把所有California的顾客放列到另一个组,如此等等。MapInfo然后计算各组的集合信息(总合,均值等)。
为指定小计标准:
1.在Group By Columns区,输入MapInfo将用来计算小计的列名或列号
例如:
如果你要在各个州的基础上合计你的顾客表,输入表示顾客所在的州的列名(例如StateName)到Group By Columns区
2.输入同样的列名(例如StateName)到Select Columns区。
3.在Select Columns区输入一个或多个集合操作符(Sum,Count,Avg,Min,或Max)。记住,要用逗号分隔这些集合操作符。
输入表达式Count(*)。(在Select Columns区)
如果你要计算各州的全部销售( Sales)合计,输入如Sum(Sales)之类的表达式。(这里的Sales是列名)。
在Select Columns区中,那些非集合函数基础的所有列还必须在Group By Columns区列出。这些是MapInfo为了确定分组要检测的列。这些列具有独特数据值的每一个组在查询表中有一个单独的行。导出列应该用表示相对位置的编号指定,“1”、“2”、“5”分别代表第一、第二和第五列。
例如:
Select Columns: Month(sick_date),count(*)
From Toltes: sickdays
Group By Columns: 1
这个查询告诉MapInfo,计算每一个有记录的全部行数并生成一个按月分组的查询表。结果表第月有一行,那个行有一个表示有多少人在那月生病的列。
在Group By Columns区,你应该按列名或列编号来引用列(1代表列在Select Columns区的第一个列)。当你不使用联接时,你可以用正规的字段名。当你用导出列的值分组时,或者如果你联接两个表时,你必须用列号代替列名。按号引用列时,数字前不要加“Col”字样。
你可以输入一个以上的列到Group By Columns区。MapInfo首先按你列出的第一个列来对行进行分组,在那些组中,MapInfo再按第二个列进行再分组,以此类推。对于各个结果行,查询表都含有基于集合函数的全部列的集合值。
(这里有一个问题,每一个结果行只能是一个集合函据的结果吗?可否不同的列执行不同的集合函数?)
注:在Select Columns区中,那些基于集合函数的列不能列入Group By Columns区内。但是,Select Columns区中那些不是基于集合函数的每一个列应该列入Group By Columns区内。
Group By Columns的例子(按列分组的例子)
设想你有一顾客订单表。表中的各个行代表一分单独的订单。表中有一个列含有接受订单的销售代表的名字,另一个列含有顾客的名字,再有一个列含有订单金额(Amount).
对每个销售代表,你想找出:
那个销售代表接受的订单数量
那个代表登录的订单平均金额
那个代表填写的订单的总金额
如下的SQL Select查询产生所要求的结果:
Select Columns:Sales_Rep,count(*),average(Amount),sum(Average)
From tables: Order
Group By Columns:Seles_Rep(这意味着按销售代表统计)
注意:Group By Columns区和Select Columns区的三个集合操作符。Mapinfo要做的是:
1.找出对应某一个销售代表的全部行
2.计算行数:Count(*)
3.计算这个销售代表的定单的平均金额:Avg(Amount)
4.计算这个销售代表的定单的总金额:Sum(Amount)
MapInfo对每一个销售代表都要做这些工作,然后产生一个对每一个代表有一个单独行的结果表。
集合操作符(Count,Avg和Sum)小计有相同销售代表值的全部行的数据值。
考虑这样一个SQL Select:
Select columns: Customer,Count(*),Avg(Amount),Sum(Amount)
From tables: Orders
Group By Columns: Customer
这是一个在体质上与前一个相同的查询,除了我们现在是按顾客分组而不是按销售代表分组外,这个SQL Select找出订单Count,Average和Sum是针对各个顾客的而不是销售代表的。
下面的例子说明按多列分组:多重分组
Select olumns:Sales_Rep,Customer,Count(*),Avg(amount),Sum(Amount)
From tables: Orders
Group By Columns:Sales_Rep,Customer
在Group By Columns区,我们指定了两列名,在这种情况下,MapInfo首先按销售代表组合行,然后再按顾客组合。这个查询的结果表对应于每一个不同的顾客棗销售代表组合都有一个行。
当某个顾客通过两个或更多的销售代表订货时,那个顾客与第一个销售代表做的生意都有一个行来总结。全部行首先是按销售代表分组,然后,对于各个销售代表,又按顾客分组。
集合函数,MapInfo有下列集合函数:
Count(*):计算一个组内的记录个数,它仅用*作为其参数是因为它适用于整个记录,而不是记录中的某个特定字段。
Sum(表达式):计算一个组全部记录表达式值的总和
Avg(表达式):计算一个组全部记录表达式值的平均值
Max(表达式):找出一个组全部记录表达式值中的最大值
Min(表达式):找出一个组全部记录表达式值中的最大值
以上所述的表达式,最简单的情况是一个字段名(列名)。
关于From tables
这个区告诉MapInfo要查询那些表,你必须在这个区最少输入一个表名。如果你要MapInfo查询两个或更多的表,就要输入用逗号分隔的一系列表名。
如果你在这个区输入了两个或两个以上的表名,那么,你还必须在Where Condition区指定表达式来告诉MapInfo如何连系这些表。
如果你输入了两个表名,MapInfo自动计算一个适当的Where Condition表达式。但是如果你用了三个或更多的表名,你必须手工修改这个表达式。当你按多表联接时,所有的表必须是基础表。你不能把结果表(例如Qurey5)用于多表SQL Selec。
关于Where Condition区
这个区有不同的任务,取决于你的查询性质。当你查询一个单表时,该区是可选的(即不填也可)。如果你查询涉及到连接两个或多个表,你必须指定一个Where Condition表达式,那个表达式必须表明MapInfo应该如何联接这两个表。
如果你愿意,你可以在该区输入过滤标准。输入过滤标准的方法是打入一个判断真假的逻辑表达式。例如,当你查询World表时,如果你只选择人口大于5百万的行,就要指定如下的Where Condition子句:
Where Condition:Population>5000000
这个区的数字中间不要打逗号。
关于Group by Columns区
这个区允许你小计你的结果表。如果你输入一个列名(或被逗号分隔的一串列名)到该区,MapInfo就小计你的查询结果,并且只给你显示出小计结果表,而不显示你的表的每个行。
计算小计是一个两步曲:
1.输入一个(或一组)列名到该区
2.输入同样的列名和集合运算器(诸如Sum或Count)到Select Columns区。Group by Columns区是可选的。如果你保留为空(默认的),MapInfo将不计算小计。
关于Order by Columns区
这个区允许你对你的结果表进行排序。如果你输入一个(或被逗号分隔的一组)列名到该区,MapInfo就以你输入的列作为关键字对你结果表的行进行排序。默认是升序,A在B之上,小数在大数之上。降序可在列名后跟一个desc字。例如:
Order by Columns:Population desc
该区是可选的,如果空着,结果表将不排序。
关于Into table Named区
这个区允许你命名结果表。默认的结果表名是Selection。如果你要指定一个另外的名字,就把它打入该区。你输入的表名不应该是一个打开的表。如果你频繁使用SQL Select,并且如果你用selection作为你的结果表名,你会以得到许多左上重叠的结果表(例如Query1,Query2,Query3等)告终。这些Queryn表不会造成任何伤害;然而,有的人就是不喜欢这大量打开的表。如果你要避免这大量打开的Queryn表,那你在该区输入一个另外的表名就行了。例如你输入表名Qresults:
Into Table Named results
然后再进行的各个SQL操作就只用Qresults作为结果表名。这个方法,你只能得到一个结果表(Qresults),不管你进行了多少次查询。
关于Browse Results
如果你标证了Browse Results检查框,MapInfo自动以一个Browser窗口显示查询结果。
关于Aggregates,Function,Operator等的下拉列表(略)
SQL Select的目的是什么?
它是一个多目的的查询工具。用SQL选择,你可以完成下列任务之一或全部:
过滤你的数据,以便你只看到你感兴趣的行和列
执行关系连结,把两个或多个表组合成一个结果表
创建关系连结,(根据已有列的内容计算出新值的列)
按数据值或(和)字母顺序排序你的数据
小计你的数据,以便你只看到一个小计表,而不是整表
Select 的目的
Select允许你查询你的数据库,根据一定的准则从一个表中选择记录和对象,并创建一个你以平面图、表格浏览器或曲线图方式来观看的结果表。
Select对话框允许你指定查询准则
对话框各栏的填写
Select records from Table选择你要操作的表
That Satisfy在此打入你的查询表达式,或者用鼠标点Assist 钮使显示表达式对话框,这个对话框将帮助你构成你的查询表达式。
Store results in table(optional)
这个选项允许你命名保存查询结果的临时表。“Seltction”是默认值。如果你选择了“Selection”,MapInfo就命名这个表为Query1,Query2等。
Sort results by Column(optional)
当你要查询结果按某个列的值排序时,选择这里。默认的是查询不被排序。你可以通过使用Select并指定一个排序依据(但不能任何表达式)把一个表排列成某个需要的顺序。MapInfo选择表中所有的记录并根据指定列中的值对它们进行顺序。
Assist
进入你可以用以构成查询表达式的表达式对话框。
Browse results
这个盒默认是标记的。当你需要你的查询结果表时,保留它被标记。否则清除它。该表的命名是根据输入到Store results in Table的标记。
OK执行查询
用Select搞查询
MapInfo有两个通过查来选择对象的命令:Select和SQL Select。Select是比较简单的,而SQL是功能更强的。
要作一个查询:
1.选择Query>Select,Select对话框显示。
2.点Select records from table下拉列表,选择要从中选择记录的表名。
3.在That Satisfy区内打入你的查询表达式,或者点Assist钮显示帮助你写表达式的表达式对话框。
4.在Store Results in Table区内,为贮存你的查询结果的临时表打入一个名字,或者选Selection(默认的表名)。如果选这个默认的,MapInfo就把这个表命名为Query1,Query2等。
要按某个列的值对查询结果排序(可选的)
5.点击Sort results by Columns下位列表并选择含有你要用以排序的列。
6.点击OK
如果Browse Results检查盒标记,一个有你的查询结果的Browser窗口就显示出来。
你可以用这个Select命令加亮一个Map或一个Table中符合一定准则的对象,并且创建一个你能浏览,成图或作曲线图的象任何别的Table一样的结果表。
当你正与一个Browse Window打交道时,满足查询准则的记录都被加亮。
当你正与一个Map打交道时,所选对象的图形对象都被加亮。
当你同时既与一个map窗口又与一个Browse窗口交道时,这些对象和记录都是加亮的。
在所有情况下,都自动建立起一个叫做Selection的工作表。这个表包括着查询结果。你可以使用这个表作平面图或曲线图,像任何其它表一样。
当你用Select或SQL Select作查询时,从你的源表生成了临时表。显示在窗口中时,这些表被命名为Query1,Query2等。关闭这些表就清除了它们,但不会影响你的源表。但是,如果你关闭了你的源表,所有相关的查询表将被关闭并被清除。
为了保存一个查询表的内容,要用:
File>Save Copy AS
然后你可以关闭这个查询表,有效地删除它。以后要打开它就用通过Save Copy As建立表时的名字。
你可以把Update Column用于一个SQL Select多表联接的结果表,前提是这个SQL Select没有使用Group By子句。
要更新带有另一表的信息的一个表中列,应该:
用SQL Select连接这两个表。
把Update Column用于其Selection表,更新将会自动影响到相应的基础表。
Mapinfo重点及难点讲解(二)
SQL查询 重分区 无缝图层 返回
二、重分区
1.什么是重分区(Redistricting)?
重分区是一些Map对象指派到某些组时,MapInfo自动计算各组对象的总数,并把这个总和显示在一个特殊的Browser窗口中。这个过程有的被称为Load-balance(平衡装载)。
当你进行重分区时,你要创建许多个分区。需要的准确分区数据取决于你的工作性质。对每一个区你可以指定一个独特的名字;例如,如果你要用四个分区来工作,你可以叫这些区为东北、西北和西南区。每一个区以一行出现在Direstricts Browser中。分区浏览器与其它浏览窗有几点不同:
你一次只能从分区浏览器中选择一个行,不能用Shift-Click来选择多行。
区浏览器中总有一个行是被选择的,你不能用Unselect All来取消一个行,那个行就成为了目标区(Target district)。这个目标区将会受到随后的重分区操作的影响。
只要你选择了一个目标区,你就可以通过选择Map对象的方法把这些Map对象指派到那个区。你可以用鼠标指定并按击的操作来选择对象,或者通过SQL Select之类的查询来选择。
当你选择Map对象时,MapInfo试探性地指派新选择的对象到目标区。然后MapInfo重新计算各区的总和,并把新的总和显示于区浏览器中。这时,你可以检查区浏览器中的内容以决定是否要把这些区指派作为永久性的。
为了取消试探性的区指派。取消Map对象即可。
为使试探性的分区指派成为永久的,应选择Redistrict > Assign Select Object。当你选择了Assign Select Object后,MapInfo就把这个目标区的名字存放到新选对象的各行中。例如,如果你指派了若干Map对象到西北区,那么MapInfo就把撐鞅睌放到各个对象行中。
各个分区有自已的充填线型和符号式样设置。当你指派一个Map对象到一个分区时,这个对象随后就以该区设置类型出现。所以,如果你选择实心兰色充填东北区,那么,你指派到这个东北区的对象也以实心兰出现。
重分区窗口命令
这个命令的目的是开始一个重分区操作,它建立一个你为分区的特殊表,然后把此表显示于一Browser窗口中。这个分区Browser,用于联系一个Map窗口,允许你进行重分区。你可以指派图对象到一个分区。
这个命令何时活化?
1一个Map窗口活化
2你尚未处在一个重分区操作中,3 否则要关掉分区Browser。
重新分区窗口对话框
源表:其下拉列表含有一系列表名。选择含有你愿意将其重分区的对象的表。例如,如果你的一个表含有顾客信息,你要把顾客指派到若干销售分区,那就从源表下拉列表中选择这个顾客表。
分区字段:分区字段下拉列表含有新选源表中的全部的表列。要从中选择出一个列来让MapInfo用以存放分区名。
特别注意,在重分区期间,MapInfo要自动重写该分区字段的内容,因此,你必须小心地选择一个分区字段。
要知道MapInfo会重写你选择的列的内容。如果你第一次进行重分区,你可能要加一个新列到你的表上,然后用这个新列作为分区列(字段)。为加一个新列到你的表上,选择Table > Maintenance > Table Structure。
MapInfo自动为分区列(字段)中新含的每一个值建立一个分区。例如,如果你选择含有电话(分)区(代)号(3位数)的分区列,MapInfo就对各个区号建立一个分区。如果你选择的分区列是一个空列,MapInfo就不自动建立任何分区,你必须人工建立分区。
一般来说,你不应该选择一个含有独特的值的列,如顾客名或序列号之类。你应该选择一个完全空的列,或者含有多行相同值的一个列。例如,你可以选择含有州名、县、邮政编码或电话区号的一个列。
可用字段,浏览字段
这两个字段列表是在一起工作的。前者含有一个列表达式列表。你可以移动这些列表达式的一部分或全部到后的列表中(注意:这里不是列名,是带Sum()、Pct()的集合表达式,另外还有Line、Fill等)。你移到浏览字段列表的各个列将出现在分区Browser中。
表达式可在两个字段表中移来移去,但浏览字段表中总有一个列移不掉,要剩下。
如果浏览字段表中含有表达式Count,分区Browser中就要显示出被指派到各个分区的Map对象的个数。
如果浏览字段表中含有表达式Fill,分区Browser就要显示出各个分区的充填图案样例。同样,Line和Symbol表达式允许你把线型和符号式样包括在分区Browser中。
集合表达式
可用字段表含有集合的列表达式。例如,如果你的源表中有一个称为撊丝跀的数字型列,其可用字段表中就会有Sum(Population)和Pct(Popilation)这两个项目。(Pct是Percent)。
如果你把Sum(Population)表达式移到了浏览字段表中,MapInfo就要计算属于一个分区的所有对象的列值总和。
如果你把Percent(列)表达式移入行浏览字段表中,MapInfo就要计算整个表这个列的列总和,然后计算出和个分区占总和的百分比。
Up and Down
这两个按钮允许你安排项目浏览字段一月中的上下顺序。这两个按钮只有在你从浏览字段表中选定了一个列之后才可用。
OK
当你选OK时,MapInfo构成一个叫做Districts的特殊表,并把这个表显示于一个Districts Browser中。只要这个分区Browser在屏幕上,你每次选择或者取消选择Map对象时MapInfo都要执行分区计算。
Redistrict menu(重分区菜单)
这个菜单要在重分区操作有郊时才出现,它包括如下命令(菜单项):
Add Dristrict
Options(引出一个Redistricter Options对话框)
Assign Selected Objects
Set Targer District From Map
Delete Target District
下面先讨论菜单命令,顺带说明对话框,最后总结为若干任务。
Add district
加一个新的分区到已有分区存在的Browser窗中。
该命令在重分区操作有效时活化。
选择Redistrict > Add District。
MapInfo创建一个新的分区并把它加到分区Browser的底部。MapInfo指定一个默认的名字如?FONT FACE="Times New Roman">District 7敻?飧鲂路智??/P>
要改变这个新分区的名字,只要用鼠标点出现在分区Browser中的名字,输入新的名字即可。
Assign Select Object
这个命令是用来永久性地把所有选择的Map对象指派给目标分区。
该分区只有当重分区操作有效并且有一个或多个Map对象被选择时才可用。
实际上为了使指派保存下去,有两个方法:
1 选Redistricting > Assign Selected Object或者
2 点击Main工具条上的Assign Selected Object按钮
当你选择了Assign Selected Object时MapInfo就把目标分区名放到每一个所选对象的行中。例如,假如你把若干对象指派给名为Northeast的一个分区,MapInfo就把Northeast放到每一个新选对象的行中。
注意:MapInfo开始有一个试探性地把所选对象指派给当前目标分区的过程,这种指派并不是永久的。
Set Target District From Map
这个命令的目的是使选择对象的区成为一个新的目标分区。该命令只是在重分区操作有效并且有一个Map对象被选择时活化。访问方法是:
选择Redistricting > Set Target District From Map
Delete Target District
这个命令的目的是删除当前指定的目标区的分区。该命令在重分区操作有效期活化。使用方法是:
选择Redistrict > Delete Target District属于这个目标区的所有对象都被重新指派给?FONT FACE="Times New Roman">Unassigned”分区(未指派的分区)。删除这个未每指派分区是不可能的。
Options
该命令用于进入Redistricter Options对话框。这个对话框允许你指定各分区的分类排序以用格线显示。
只要重分区操作有效,该命令就是活化的。
对话框说明如下:
Most Recently Used:允许你按最后用过的顺序显示各个分区
Alphaletical:允许你按字母顺序显示各个分区。当点击OK时分区Browser被排序并重新显示。
Unordered:允许你随机地显示各分区
Show Grid Lines:允许你开/关格线
Save as Default:允许你把这个显示顺序作为默认的顺序保存(存盘)
以下是文件另显的操作:
1 改变一个分区的充填色,2 方法是点击出现在分区Browse表窗口中的Brush样例。
3 改变一个分区的名4 字,5 方法是点击出现在Browse表窗中的分区名6 。
7 选择目标8 区
标证分区Browser窗中相应行的检查盒。或者,你可以用选择一个Map对象使分区Browser窗口活化,然后再选择Redistrict > Set Target District的方法来设置目标区。
9 组合一个分区的对象
一旦你完成你的分区,你就可以把和个分区的对象群组合成为一个对象。
为了组合一个分区的对象:
a. 选择Table > Combine Object Using Column,b. 这时显示一个对话框。
c. 从其Group Object By Column下拉表中选择你的分区列。
Combine Object Using Column能够组合的对象类型有一些限制。如果你的分区只含有区域那样的封闭对象,你可以组那些对象。
10 排序分区及格线显示,11 见Options对话框说明。
12 结束重分区操作,13 方法是关闭Browser窗口。
14 开始重分区操作,15 按以下步骤:
选择Windows > New Redistrict Window,出现New Redistrict Window对话框。
从源表(Sourse Table)下拉列表中选择含有你希望重分区的Map对象的表。
从分区字段(District Field)下拉列表中选择将用来存放分区名的列。
这里要注意列被重写的问题,第一次按重分区最好先给这个表加一空列。可用字段与浏览字段表是相同工作的。其中的列表达式不等于列名或字段名。
移动表达式到浏览字段表,或相反,方法是用》或《按钮。
注意:浏览字段表中的列是要出现在分区Browser中的。
Click Ok。
当你选择OK时,MapInfo构成一个叫做Districts的特殊表,并把这个表显示为Districts Browser。只要这个Districts Browser在屏上,每当你选择或取消选择Map对象时,MapInfo都要执行各种分区计算。
Mapinfo重点及难点讲解(三)
SQL查询 重分区 无缝图层 返回
三、无缝图层
1.关于无缝图层
使用或建立无缝图层的目的是为了把一组基础表当作对象象一个表那样来处理它们。
一个无缝图层允许你改变显示属性、应用或改变标注,或者同时对整个一组表使用层控制对话框。
你可以用Info工具获取信息,并且选择或浏览该层的任何一个基表。
基础表可以是任何一个正规的MapInfo表,但不能是注册的或未注册的栅格图象。
这个特征,当你要想为你联接的街道图或边界图之类显示一个夭量背景时特别有用。例如,你可以有一个由好几个县表组成的县边界的无缝图层。
2.建立/编译一个无缝图层
为了建立你自已的无缝图层,要运行无缝层管理程序,方法是:
⑴File>Run MapBasic Program
⑵Chose Seammr.mbx
这个管理程序会用信息提示你并建立你的无缝层。
如果你使用的是类型相同的、理想的是有相同的投影和相同的列数的表,你的无缝层将是最有用的。例如,你可以要你的无缝层包括好几个县,各个县以一个单独的基表存放,或者一条穿过好几个州的跨州公路,各段以一个单独的基表存放。
你每次对无缝层的结构作了编辑时,你都必须用无缝层管理程序重新编译它。
3.无缝层所具有的MapInfo性质
因为无缝层实际上是由几个表组成的,MapInfo对待它,与正规的MapInfo表稍微有一点不同。
对于一个无缝图层,你可以使用如处的MapInfo性质:
⑴Layer Control(层操作)
除了层操作对话框的Thematic Mapping之外,可用于你的无缝层。可以同时对一个无缝层(全部基表)进行加上,移去或重排序,或者设置显示,缩放或标注选择。但是你不能使你的无缝层成为可编辑的。
⑵Info Tool
获取指定对象在基表中的信息
⑶从无缝层选择多个对象,你只能选择处于同一个基表中的一组对象,按住Shift用选择工具来进行。如果你试图选择处于不同基表中的几个对象,MapInfo将只选择那些于一个基表中的对象。如果你用方框或半径选择工具选择跨越两个基表的区域,MapInfo就选择园心或多边形形心所在的表。
⑷Browse Table
一个指定的无缝表显示出一个Browser窗口,你会被提示选择一个基表。
当你不知它是无缝表进,让你选基表,你也不知道基表的名字,即不知道它是由那些表组成的。
4.打开一个无缝图层
MapInfo包括了几个样品无缝图,你也可以建立你自已的。
样品在data\usa\DC\seamless目录下。
用File>Open Table选择表名来打开。
实际上在该目录下并没有保存无缝表,而保留的是单个的基表。它们文件的最后一个字符为a、b、d或w。属于b、d、w的也一样。所以开始不是打开的问题,这里开始应该建立,名字自定。实际上,它们的主表在一级目录中。
无缝图的补充
在DC目录中:
1. DC_areas为一区域无缝图层(各分表的最后字母为a)
由\Seamless\Vaarlia.Tab
\Seamless\Dcwasha.Tab
\Seamless\Vaalexa.Tab
组成。
2. DC_bdys为一边界无缝图层,3. 由(各分表的最后字母为b)
由\Seamless\Dcwashb.Tab
\Seamless\Vaalexb.Tab
\Seamless\Vaarlib.Tab
组成。
4. DC_quad是一个图片的表,5. 它有同6. 名7. 的图片文件,8. 不9. 知与那一个表发生联系。
10. DC_strts是一个无缝图层(各分表的最后字母为d)
由\Seamless\Dcwashd.tab
\Seamless\Vaalexd.Tab
\Seamless\Vaalid.Tab
组成。
11. 5.DC_water是一个无缝图层由(各分表的最后字母为w)
由\Seamless\Dcwashw.tab
\Seamless\Vaalexw.tab
\Seamless\Vaarliw..tab
组成。
12. DC_zip是华盛顿特区的邮编表。
Dcwashs这个表包括了Dcwashs1和Dcwashs2两个表,Dcwashs和Dcwashs1可单独分别打开,各有Browser表。
Dcwashs2虽有只能打开Browser,这三个表的文件组成特殊,情况如下:
DCwashs.Tab、DCwashs1.dat、DCwashs1.ID、DCwash1.IND DCwash1.MAP、DCwash1.Tab、DCwash2.dat、DCwash2.IND、DCwash2.Tab
只有一个Map,三个表结构,两个数据表,S1的文件最齐全,S2只有Browser表,S的文件最不齐全,只有一个文件,但将其输出后再输入便会生成全部文件。
首先要注意,无缝图层外观看起来与任何其它Mapinfo表没有区别,但它们是由好几个表组成的。
每一个无缝图层的结构都包括各基表的路径加上一个默认为表名(别名)的描述。为了观看结构,要关闭无缝层再在一个Browse窗口中显示该无缝表。
5、打开和关闭无缝层
如果你需要纺织你的无缝层的结构,你必须关闭你的无缝图层。
为了关闭无缝层:
①选择Option>Show MapBasic Window
②打入Set Table 撐薹毂砻麛Seamless off(实际上不用这样,直接用管理程序就行了)。
在一个Browser窗口中显示该表的观察或编辑它的表结构。如果你编辑了表结构,你必须重新编译这个无缝层。
为了打开无缝层:
1 选择Option>Show MapBasic Window。
2 打入Set Table撐薹毂砻? ?FONT FACE="Times New Roman">Seamless On。
6、 无缝层表操作顺序的特殊性
MapInfo含有一个MapBasic 程序,即无缝层管理程序(Seammgr.mbx),它使你能够建立和管理无缝表。为了看到无缝表的组成,你必须把这个表的撐薹煨詳关掉,要按如下的顺序操作:
1 打开一个无缝表,2 如DCMetroA
3 运行无缝管理程序。
4 选择Tools>Seamless Manager>Turn Seamless off以关掉这个DCMetroA表的无缝属性。
5 选择Window>New Browser Window把这个表显示一个Browser中。
象普通表一样,无缝表也有行和列,每个行对应包括在该无缝表中的一个基表。无缝表的第一列含有(基表的)表名,第二列含有描述(descriptions),它是出现在用户介面中的。
第一列中的表名可以包括目录路径。如果你的基表与无缝表是在同一目录中,你可以省略目录路径,或者基表量在搜索目录路径上(它是在Directort Proferences对话框指定的)
无缝表中的每一行有一个图对象与之联系,正如在常规表中的行与对象的关联那样。但是无缝表中的对象并不是用以显示的。
无缝表中每个行有一个矩形对象,它为第一列中命名的表定义了最小矩形。当用户在Map窗口显示一个无缝层时,MapInfo把Map窗的当前范围与存放在这个表中最边界矩形相比较。必要时MapInfo只打开基表(即,当Map窗当前可视范围与表的最小边界矩形相交时)。
13. 无缝表的MapBasic句法
要把一个无缝表转换成一个常规表,使用Set Table语句。例如,如果你要编辑无缝表中的描述,你该发出如下语句:
Set Table DCMetroA Seamless off
然后在Browse窗口中编辑这个表的描述。
Call TableInfo(, TAB_INFO_SEAMLESS)用来测定一个表是不是无缝表。
CALL GetSeamlessSheet()用来显示一个提示用户从一个无缝表中选择一个基表的对话框。
14. 无缝表的限制
无缝表中所有的基表必须有相同的结构(即,相同的列数,相同的列名,等等)。
注意:有些MapInfo操作不能用于无缝表。例如:
你不能在一个无缝表中同时选择一个以上的基表。
MapBasic的Find语句不能搜索到整个的无缝表;Find语句一次只能操作一个基表。
你不能使一个无缝表在一个Map窗口内成为可编辑的。
你不能为一个无缝表建立专题图。
|
|