⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mapinfo教学1.doc

📁 对于想学MapInfo的人来说
💻 DOC
📖 第 1 页 / 共 3 页
字号:
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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -