|
|
|

MapInfo重点难点解说

一、SQL查询 SQL Select的一般过程:1.翻开你要查询的表。你要查询的表为根底表(Base Table)2.挑选Query>SQL Select,填写SQL Select对话框满意你需求的那些分。按击OK,Mapinfo进行查询。Mapinfo从你的根底表中抽出数据,把查询成果保存在...

作者:编程好望角来历:编程好望角|2006年12月14日
   一、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 Columnsopulation 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 Columnsopulation desc
该区是可选的,假如空着,成果表将不排序。
 
关于Into table Named区
这个区答应你命名成果表。默许的成果表名是Selection。假如你要指定一个其他的姓名,就把它打入该区。你输入的表名不该该是一个翻开的表。假如你频频运用SQL Select,而且假如你用selection作为你的成果表名,你会以得到许多左上堆叠的成果表(例如Query1,Query2,Query3等)告终。这些Queryn表不会形成任何损伤;可是,有的人便是不喜欢这很多翻开的表。假如你要防止这很多翻开的Queryn表,那你在该区输入一个其他的表名就行了。例如你输入表名Qresults:
Into Table Named:Qresults
然后再进行的各个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表,更新将会主动影响到相应的根底表。

本文摘自[编程好望角] http://www.myvc.net/list.asp?boardid=95
要得到字段值及字段名,能够为
Dim lay as MapXLib.Layer
lay=Map1.Layers(i)
那么得到第i个必威现金回扣层的第i个DataSet的第i个字段的称号就变成了:
Map1.Layers(i).DataSet(i).Fields(i).Name
得到Rowvalue为即得到字段的值为:
Map1.Layers(i).DataSets(i).Rowvalues(i).Item(i).value

上一篇:MapInfo自定义符号详解

下一篇:VC+MapX鹰眼完结