mapinfo重點(diǎn)難點(diǎn)講解

SQL查詢  重分區(qū) 無縫圖層  返回
    一、SQL查詢  
     
SQL Select的一般步驟:
1.打開你要查詢的表。你要查詢的表為基礎(chǔ)表(Base Table)
2.選擇Query>SQL Select,填寫SQL Select對(duì)話框滿足你需要的那些分。按擊OK,Mapinfo進(jìn)行查詢。
Mapinfo從你的基礎(chǔ)表中抽出數(shù)據(jù),把查詢結(jié)果保存在一個(gè)被稱為結(jié)果表的特殊臨時(shí)表中。結(jié)果表僅有滿足你的條件的行和列。結(jié)果表的默認(rèn)名是Selection(盡管你可以在SQL Select對(duì)話框的Info Table Named位置上指定一個(gè)不同的結(jié)果表名)。
注意:以下第三條暗示:結(jié)果表既反映在Browser窗口,也反映在Map窗口中,換句話說,可收查詢結(jié)果保存為另一個(gè)圖層。保存方法見下面的第5條。
3.如果你要看查詢結(jié)果,打開一個(gè)Map窗口或(和)一個(gè)Browser窗口。默認(rèn)的是MapInfo自動(dòng)以一個(gè)Browser窗口顯示結(jié)果表(除非你清除了SQL Select對(duì)話框中的Browser Results檢查盒)。
如果你的結(jié)果表被命名為Selection(默認(rèn)名),Browser窗就顯示一個(gè)不同的表名,例如Query1名Query2。這是因?yàn)槟銥g覽這個(gè)Selection表的瞬間,MapInfo對(duì)該表作了一個(gè)“快拍”,并命名這個(gè)快拍為Queryn(n是數(shù)字,1或更大)。MapInfo主要按快拍是因?yàn)?ldquo;Selection”是一個(gè)特殊的表名,每當(dāng)你選擇或不選擇某些行時(shí),Selection都在動(dòng)態(tài)變化。
在SQL Select對(duì)話框中,你可以為你的結(jié)果表輸入一個(gè)另外的名字(例如,你可以命名你的結(jié)果表為My-Query)。這就阻止了MapInfo把你的結(jié)果表重命名為Queryn。
4.MapInfo自動(dòng)選擇結(jié)果表中全部的行。這樣,在你執(zhí)行了SQL Select之后,你就能夠接著執(zhí)行選擇行的全套操作。例如,你可以(通過選擇Option>Region Style)對(duì)所有被選擇的行提供另一種充填色,或者你能夠Cut或Copy選擇的全部行。
通常,你對(duì)結(jié)果表所作的任何變化都會(huì)自動(dòng)作用于你的原始(基礎(chǔ))表。例如,如果你用SQL Select選擇了基礎(chǔ)表中的某些行,然后又從你的結(jié)果表中刪除了部分行,MapInfo就會(huì)從你的表中刪除相應(yīng)的行。但是,如果你查詢產(chǎn)生了小計(jì)(Subtotals),你可以改變這個(gè)結(jié)果表而不影響基礎(chǔ)表。
5.如果你要作一個(gè)結(jié)果表的永久備份,選擇File>Save As。
如果你你不執(zhí)行Save As存盤,該結(jié)果表將在你退出MapInfo時(shí)被刪除。
SQL Select對(duì)話框各區(qū)的填寫
Select Columns區(qū)
(1)利用這個(gè)區(qū)來指定在查詢表中將出現(xiàn)哪些列。例如查詢World表,可以指定Select Columns:Country,Population,Indust_Grwth,如果你要你的結(jié)果表有與你的原表相同的列組,那就在這個(gè)區(qū)輸入一個(gè)*號(hào)。
如果你要你的結(jié)果有一個(gè)與你的原表不同的列組,就要?jiǎng)h去這個(gè)*號(hào)并輸入由逗號(hào)分隔的列名(如下同)表達(dá)式列表。這個(gè)區(qū)能夠包括一個(gè)*號(hào)或者一個(gè)列表達(dá)式列表,但不能同時(shí)包括這兩種。要在你填Select Columns區(qū)之前填From Tables區(qū)。
如果你查詢涉及的不止一個(gè)有,各個(gè)列名之前必須有它的表名,二者之間用西文句號(hào)分隔。因此,如果你要執(zhí)行一個(gè)涉及兩個(gè)表的查詢,其中之一是Canada表,并且你要查詢包括該表的Population列,那么你必須用列表達(dá)式Canada.Population。當(dāng)你使用兩個(gè)或多個(gè)表時(shí),Columns下拉列表自動(dòng)把表名插到各個(gè)列名之前。
(2)只選擇部分列出現(xiàn)在結(jié)果表中是有用的,特別是你的原表有很多列而你僅需操作其中的少數(shù)列時(shí)(或許因?yàn)槠聊簧现荒芡瑫r(shí)顯示少數(shù)列)
(3)如何輸入一系列列名:
在From Tables區(qū)輸入一個(gè)表名,可用鍵盤打入,也可用鼠標(biāo)從Table下拉列表中選入。
用鼠標(biāo)在Select Columns區(qū)中按擊,使插入點(diǎn)出現(xiàn)在該區(qū)內(nèi)。
用退格鍵或刪除鍵刪去*號(hào)(如果其中有*號(hào)),Select Columns區(qū)能夠包含一個(gè)*號(hào)或者一串列名,但不能同時(shí)包含這兩種。
從對(duì)話框右邊的Columns下拉列表中選擇一個(gè)列名。MapInfo把這個(gè)列名Copy到Select Columns區(qū)。
如果你的查詢還包括另外一些列名,從下拉列表中選擇另外的一些列名。每當(dāng)你選擇另外的列名時(shí),MapInfo自動(dòng)插入逗號(hào)以分隔列名。
(4)計(jì)算某些列
SQL Select能夠計(jì)算出列(derived Columns)并把這些導(dǎo)出列存放到結(jié)果表中。導(dǎo)出列是MapInfo在中根據(jù)基礎(chǔ)表中已有的一個(gè)或多個(gè)列的內(nèi)容計(jì)算出的一個(gè)特殊的臨時(shí)列。
例如,你的表或許含有字段Purchases92或Purchases93(分別代表各顧客在1992和1993年購物的總金額)。如果你要你的查詢結(jié)果顯示一個(gè)Total Purchases列,表示各顧客1992和1993年合起來的購物金額,你可以在你的Select Colomns區(qū)內(nèi)包括一個(gè)導(dǎo)出列。在這個(gè)例子中,導(dǎo)出列應(yīng)該有這樣的形式:
Purchases 92 + Purchases 93
同樣,你可能有一個(gè)包含有字段Fname(代表顧客的第一名)和Lname(顧客的后名)的顧客信息表。如果你要你的結(jié)果表包括顧客的全名,你也可以在你的Select Columns區(qū)包括一個(gè)導(dǎo)出列,在這個(gè)例子中,導(dǎo)出列會(huì)有這樣的形式:
Fname + “” + Lname
為指定一個(gè)導(dǎo)出列,你就要在Select Columns區(qū)輸入一個(gè)表達(dá)式。一個(gè)導(dǎo)出列表達(dá)式是若干列名,操作符(例如+和-)和函數(shù)(例如Ucase$函數(shù),它把一個(gè)字串轉(zhuǎn)換為大寫的)的一個(gè)組合。
在指定導(dǎo)出列之前,你必須先在From Table區(qū)輸入一個(gè)或多個(gè)表名。
如何指定一個(gè)導(dǎo)出列表達(dá)式
按Select Columns區(qū),在該區(qū)出現(xiàn)插入點(diǎn)。
刪除區(qū)內(nèi)的*號(hào)
輸入一個(gè)列表達(dá)式。列表達(dá)式應(yīng)該包括一個(gè)或多個(gè)列名,如果表達(dá)式包括一個(gè)以上的列名,這個(gè)表達(dá)式一般包含操作符(例如+或-)來把多個(gè)列組合成為一個(gè)導(dǎo)出值。
有許多不同的函數(shù)和操作符能夠用于列表達(dá)式中。
如果需要為列表達(dá)式指定一個(gè)別名。指定別名的方法是:在列表達(dá)式后打一個(gè)空格,然后再打入用雙引號(hào)括起來的別名。
別名是可選的。如果你給了你的列表達(dá)式一個(gè)別名,那么,當(dāng)你以Browser窗口顯示結(jié)果表時(shí)別名就會(huì)出現(xiàn)在這個(gè)列的頂上。如果你沒指定別名,MapInfo會(huì)用表達(dá)式的內(nèi)容作為別名(例如“Fname+Lname”)。
如果需要,指定另外的列名或?qū)С隽斜磉_(dá)式。如果你輸入另外的列表達(dá)式,要輸入逗號(hào)以隔開不同的表達(dá)式。
下面的例子顯示一個(gè)執(zhí)行加法的導(dǎo)出列表達(dá)式,把兩個(gè)數(shù)字列的值加起來。這個(gè)例子假定Purchases92和Purchases93均為數(shù)字列:
Purchases92 + Purchases93
下一個(gè)例子顯示同樣的列表達(dá)式,附加上了一個(gè)可選的列別名(”Net_Purchases”):
Purchases92 + Purchases93 “Net_Purchases”
下一個(gè)例子顯示一個(gè)執(zhí)行除法的導(dǎo)出列表達(dá)式,把Poppulagion列的內(nèi)容除以一百萬:
Population/1000000 “Millions”
下一個(gè)例子顯示一個(gè)把兩個(gè)字串列組合起來的導(dǎo)出列表達(dá)式。這個(gè)例子假定Fname 和Lname都是字串列:
Fname+””+Lname “Full_name”
當(dāng)列是字串列時(shí),加操作符(+)執(zhí)行字串聯(lián)接而不是數(shù)字相加。因此,表達(dá)式Fname + “ “ + Lname產(chǎn)生一個(gè)由第一名緊跟空格再后跟一名組成的字串。
下一個(gè)例子顯示一個(gè)導(dǎo)出列表達(dá)式怎樣結(jié)合函數(shù)調(diào)用。Proper$函數(shù)操作一個(gè)字串值并返回一個(gè)有正常大寫的字串(僅第一字母大寫):
Proper$(Fname+””+Lname) “Full_name”
下一個(gè)例子顯示如何用Format$函數(shù)重新格式化數(shù)字列。一般,數(shù)字列都沒有包含逗號(hào),不幸的是,這使得讀大數(shù)有困難。下面的例子用Format$函數(shù)把逗號(hào)插入到Purchases93列中。這個(gè)例子假定Purchases93是一個(gè)數(shù)字列:
Format$(Purchases93,”$,#”) “Purchases_1993”,字串表達(dá)式“$,#”告訴Foramt$函數(shù)在列前顯示一個(gè)美元($)并在列內(nèi)插入逗號(hào)。
下一個(gè)例子顯示一個(gè)導(dǎo)出列怎樣計(jì)算基礎(chǔ)表中各行的地理面積:
Area(Obj,”sqkm”) “Net_Area”
Obj是一特殊的列名,代表與表中各行相聯(lián)系的地理對(duì)象。
Where Condition區(qū)
(1)通過行的排列順序聯(lián)接不同的表
如果兩個(gè)表沒有一個(gè)共同的列,你可以根據(jù)行的順序仍然能夠聯(lián)接這兩個(gè)表。如果你知道一個(gè)表的第一行與另一個(gè)表的第一行是相對(duì)應(yīng)的,并且,一般地說,如果你知道第一個(gè)表的第n行與第二個(gè)表的第n行是對(duì)應(yīng)的,那么你就可以通過引用一個(gè)名叫RowID的特殊列來聯(lián)接這兩個(gè)表。
RowID列含有一個(gè)整數(shù)值,代表著表中各行的行號(hào)。因此,任何表的第一行都有一個(gè)為1的RowID值,第2行有一個(gè)RowID值2,等等。
為了聯(lián)接兩個(gè)表,讓MapInfo一個(gè)表的第n行與另一個(gè)表的第n行匹配起來,就要指定一個(gè)Where Condition表達(dá)式,形如下:
TABLE_1.RowID=TABLE_2.RowID
(2)從地理上(用地理操作符)聯(lián)接不同的表
當(dāng)兩個(gè)表都有圖形對(duì)象時(shí),MapInfo能夠根據(jù)這些對(duì)象之間的空間關(guān)系聯(lián)接這兩個(gè)表。所以,即使你的表沒有一個(gè)共同的列,你也有可能聯(lián)接不同的表。
地理操作符允許你選擇某些對(duì)象,根據(jù)它們與另外的某個(gè)對(duì)象的空間關(guān)系。MapInfo有一個(gè)與地理操作符一起使用的特殊列名,“Obj”或“Object”。這個(gè)列名指的是與你的表相邊系的圖形對(duì)象。
地理操作符要放到所指定的對(duì)象之間,地理操作符從操作符(Operators)下拉列表中選取。
下表列出了地理操作符:
Contaions(含有)
Object A Contains Object B
(如果B的形心在A的邊界內(nèi)的某個(gè)位置上)
Contaions Entire(包含全部)
Object A Contains Entire Object B
(如果B的邊界全部在A的邊界內(nèi))
Within(在內(nèi))
Object A is Within Object B
(如果A的形心在B的邊界內(nèi)側(cè))
Entire Within(完全在內(nèi))
Objcte A is Entire Within Object B
(如果A的邊界全部在B的邊界內(nèi))
Intersects(相交)
Objcte A Intersects Object B
(如果它們至少有一個(gè)共同點(diǎn)或者它們中的一個(gè)完全在另一個(gè)內(nèi))
Contains與Within的比較是根據(jù)對(duì)象的形心,而Contains Entire與Entire Within的比較是根據(jù)整個(gè)對(duì)象。
如果A包括整個(gè)B,那么A肯定包含B,如果A完全在B內(nèi),那么A肯定在B內(nèi)。
MapInfo執(zhí)行簡(jiǎn)單的含有和在內(nèi)比較,比執(zhí)行完全含有和完全在內(nèi)要快。因此,除非你絕對(duì)相信某些對(duì)象是完全在另一些對(duì)象之內(nèi),否則你應(yīng)該使用Contains和Within而不用Contains Entire或Entire Within。
地理操作符提供了一種聯(lián)接表的方法。當(dāng)表中沒有你能建立起聯(lián)接的列時(shí),你可以用地理操作符(在Where Condition區(qū)內(nèi))指定聯(lián)接關(guān)系。如果你要執(zhí)行一個(gè)涉及一個(gè)Cities表和一個(gè)State表的兩表查詢,你可以用如下的表達(dá)式之一聯(lián)接兩個(gè)表:
Cities.Obj Within States.Obj
States.Obj Contains Cities.Obj
在任何一種情況下,MapInfo都能找到在各個(gè)州內(nèi)的全部城市,然后把代表一個(gè)城市的一個(gè)行與含有它的州的行聯(lián)系起來。用同樣的SQL查詢,你也能夠用集合功能來合計(jì)每個(gè)州的城市數(shù),或者以州為根據(jù)總結(jié)基于城市的數(shù)據(jù)。
當(dāng)你有Counties 表和一個(gè)Customers表時(shí),Counties是多邊形,Customers是點(diǎn),你可以用下列地理表達(dá)式之一指一個(gè)集合聯(lián)接:
Customer.obj Within County.obj
County.obj Contains Customer.obj
地理操作符與Subselects結(jié)合特別有用(見Perferming Subselects)
(3)聯(lián)接兩個(gè)或更多的表(根據(jù)共同字段)
一般,你是把你的資料貯存在幾個(gè)不同的表中,你有你自已的數(shù)據(jù)文件,你也可能有從MapInfo購買的各種統(tǒng)計(jì)資料的數(shù)據(jù)庫。SQL允許你建立關(guān)聯(lián)以便你把這些不同表中的資料接到一起,成為一個(gè)單獨(dú)的結(jié)果表。設(shè)想這樣一種情況:你有一個(gè)有人口統(tǒng)計(jì)交資料的Counties表(各個(gè)County按年齡段、種族和職業(yè)種類的人口數(shù)統(tǒng)計(jì)),你還可能有關(guān)于顧客訂單資料的數(shù)據(jù)庫。你想檢測(cè)一下這兩個(gè)表,看一定種類的訂單是否來自具有一定人口統(tǒng)計(jì)特征的Counties。或許你想根據(jù)訂單與人口的統(tǒng)計(jì)特征的組合選擇若干個(gè)Counties(縣)。要做到這一點(diǎn),你必須能夠聯(lián)接這兩個(gè)表。
假設(shè)Counties表含有縣名,同樣訂單表的一個(gè)列也含有訂單來源的縣名,這樣,兩個(gè)表都有一個(gè)共同的字段,即縣名。MapInfo能夠用這個(gè)共同的字段來聯(lián)接這兩個(gè)表。
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 對(duì)話框中,你用Where Condition區(qū)告訴MapInfo如何聯(lián)接這兩個(gè)表。在這個(gè)區(qū)內(nèi)填寫如下:
Select Columns: *
Frome Table: Counties,Order
Where Condition: Counties.Countyname=Order.county
表名(在From Tables區(qū))的順序是重要的。如果兩個(gè)表都含有Map對(duì)象,結(jié)果表將只含有排列在From Tables區(qū)中第一個(gè)表的Map對(duì)象。另外,當(dāng)查詢完成時(shí),MapInfo會(huì)自動(dòng)選擇列在From Tables區(qū)第一個(gè)表的部分或全部行。這樣,在前例中,MapInfo會(huì)選擇Counties表的部分或全部行。其結(jié)果也會(huì)包括從Orders表中拷貝來的數(shù)據(jù),但Orders表本身不會(huì)被選擇。
在Where Condition區(qū)中,列的順序必須與From Tables區(qū)中表的順序相匹配。在上例中,F(xiàn)rom Tables區(qū)把Counties表放到了Qoders表之前,因此,Where Condition區(qū)必須把Counties.CountiName列放在Orders.County列之前。如果顛倒這兩個(gè)表在From Tables區(qū)內(nèi)的順序,你也必須顛倒在Where Contition區(qū)內(nèi)列名的順序。
當(dāng)你聯(lián)接兩個(gè)表時(shí),結(jié)果表的行數(shù)取決兩個(gè)匹配的好壞。假定你有一個(gè)10000行的Order表,要把這個(gè)Order表與有50行的States表聯(lián)接。結(jié)果表可能有10000行之多。但是如果Orders表中的某些行沒有與States表中的行相匹配。結(jié)果表就會(huì)少于10000行。因此,如果Orders表中有400行無state名(或許由于數(shù)據(jù)輸入錯(cuò)誤),并且如果這個(gè)關(guān)聯(lián)是依賴State名,結(jié)果表就可能只有9600個(gè)行了。
當(dāng)SQL Select對(duì)話框聯(lián)接兩個(gè)表時(shí),你指定的如何聯(lián)接這兩個(gè)表的子句(Clause(s))必須放在Where Condition區(qū)內(nèi)的其它子名之前。
你可以用Update Column來修改SQL Select多表聯(lián)接的結(jié)果表。當(dāng)你要更新一個(gè)表中帶有另一個(gè)表的信息的一個(gè)列時(shí),你可以:
用SQL Select聯(lián)接這兩個(gè)表。
針對(duì)Selection表使用Update Column。
更新會(huì)自動(dòng)影響到相應(yīng)的基礎(chǔ)表。
(4)次選擇(Subselects)
MapInfo允許SQL Select中的再次選擇。再選擇是放在SQL Select對(duì)話框Where Condition區(qū)內(nèi)里面的一個(gè)選擇語句。MapInfo首先處理Subselects,然后用這個(gè)Subselects的結(jié)果去處理主要的SQL Select。
例如,假定你要選出1990年人口大于全國各州平均值的全部州。換句話說,如果平均州人口是5百萬,你要選出所有平均人口大于5百萬的州。在實(shí)行中,你要在Where Condition區(qū)中使用如下的過濾標(biāo)準(zhǔn):
Pop_1990>平均人口
然而,你并不知道那平均值是多少。但是,你知道MapInfo能夠用如下集合表達(dá)式計(jì)算出那個(gè)平均值:
Avg(Pop_199)
為了計(jì)算平均州人口,要在Where Condition區(qū)輸入一個(gè)再選擇(Subselect)。Where Condition區(qū)那時(shí)能夠比較對(duì)Pop_1990列再選擇的結(jié)果。要進(jìn)行那樣一種查詢,如下填寫SQL Select對(duì)話框。
Select Columns: *
From Table: States
Where Condition: Pop_1990>(Sekect Avg(Pop_1990) From States)
再選擇是在Where Condition區(qū)內(nèi),在>操作符之后。再選擇必須用園括號(hào)括起來。
最有用的再選擇包括一個(gè)Select子句,一個(gè)from子句和一個(gè)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的全部州的地理對(duì)象。然后主選擇語句設(shè)到被再選擇選中了的州內(nèi)全部城市。注意:主選擇語句用了一個(gè)地理操作符(Within)來做這個(gè)事情。
雖然前一查詢用兩個(gè)表,States表和Cities表,但Cities是出現(xiàn)From Tables區(qū)的僅有的表。這是因?yàn)樵谠龠x擇中使用了States。如果一個(gè)表僅僅是被用于再選擇內(nèi),那么這個(gè)表的表名不需要出現(xiàn)在From Tables區(qū)中。
在下一個(gè)例子中,我們選擇與田西納州相交的所有州,換言之,所有相鄰的州。
Select columns: *
From tables: states
Where conditions: obj Intersects(select obj from states where
state=”TN”
 
首先,MapInfo執(zhí)行再選擇:
Selectobj from states where state=”TN”
 
再選擇找到了代表田納西州的圖形對(duì)象。然后主Where condition找到了States表中與代表田納西州的圖形相交的全部對(duì)象。你可以用類似的查詢選擇與某給定街道相交的全部街道。
現(xiàn)考慮這個(gè)例子:
Select columns: *
From Tables: County
Where Condition: County.obj contains any(select obj from dealers)
這個(gè)查詢找到含有銷售商的所有縣。主Where condition有這樣的一個(gè)形式:
一個(gè)縣對(duì)象Contains一個(gè)經(jīng)銷商對(duì)象。
經(jīng)銷商對(duì)象組是由再選擇:Select obj from dealers產(chǎn)生的。MapInfo選擇代表含有經(jīng)銷商的各個(gè)縣對(duì)象的行。
最后,對(duì)于再選擇有幾點(diǎn)注意事項(xiàng):
在再選擇中你可以使用在From Table區(qū)中未列出的表.但是你必須把這些表列在你的再選擇的From子句中(如前面例子所示那樣)。
當(dāng)再選擇帶有關(guān)鍵字”any”或”all”時(shí),再選擇必須并且只能返回一個(gè)列。下面的句例是無效的,因?yàn)樗噲D返回兩個(gè)列(State_name 和Pop_1990):
Any(Select state_name,pop_1990 from state)
當(dāng)再選擇不帶”any”、“all”或“in”時(shí),再選擇必須準(zhǔn)確返回一個(gè)行的值。下面的例子是無效的,因?yàn)樵龠x擇返回了一組行:
obj within(Select obj from state where Pop_1990>2000000)
當(dāng)再選擇不用”any”、“all”或“in”時(shí),你不能在再選擇中使用Group by Columns子句。
你不能有嵌套的再選擇,即是說,每個(gè)Select語句你只能有一個(gè)再選擇。
設(shè)置過濾標(biāo)準(zhǔn)
一個(gè)過濾標(biāo)準(zhǔn)是一個(gè)邏輯表達(dá)式,它通常把一個(gè)列值與某個(gè)另外的值作比較。例如,以下的過濾標(biāo)準(zhǔn)用大于操作符(>)測(cè)試訂單金額列是否有大于100的值。
Where Condition:Order_Amount>100
如果一個(gè)查詢包含了上面這個(gè)Where Condition子句,MapInfo就只選擇那些訂單金額值大于100的行。
Where Condition區(qū)可以包含兩個(gè)或更多的邏輯表達(dá)式,但這些表達(dá)式必須被詞“And”或“Or”隔開。如果表達(dá)式是用詞And連接,MapInfo僅選擇那些兩個(gè)標(biāo)準(zhǔn)滿足的行。如果表達(dá)式是用Or連接,MapInfo就選擇滿足其中任何一個(gè)標(biāo)準(zhǔn)的行。
過濾標(biāo)準(zhǔn)可用于你的基礎(chǔ)表的任何一個(gè)列,不管你是否在Select Columns區(qū)中包括了這個(gè)列。
列可以用列名或列號(hào)來引用,列號(hào)指明是在Select Columns中已有的列的順序。
因此,“Col”和“col6”分別指第一和第六列,號(hào)之前必須有字母“Col”。
用SQL Select對(duì)話框的Where Condition區(qū)的基本目的可能是兩個(gè):行過濾和關(guān)聯(lián)。Where condition區(qū)服務(wù)于多個(gè)目的。在某些場(chǎng)合下,你可能要用一個(gè)Where condition表達(dá)式來過濾你的表,以便你只看到滿足一定標(biāo)準(zhǔn)的那些列。在一些場(chǎng)合下,你要利用Where condition區(qū)來指定一種關(guān)聯(lián),以便你的查詢能夠包括來自兩個(gè)或更多個(gè)表中的列。
注意:你不可以在Where condition區(qū)中使用集合函數(shù)(apgregate function)。
Order by Columns(按列排序)區(qū)
選擇升序和降序
默認(rèn),MapInfo是用升序排序一個(gè)表。如果你要用一個(gè)字符型字段進(jìn)行排序,升序意味著A出現(xiàn)在B之上,如此類推。如果你對(duì)一個(gè)數(shù)字型字段進(jìn)行排序,小的數(shù)值出現(xiàn)在大的數(shù)值之上。
為了以降序排序,以便大的數(shù)出現(xiàn)在小的數(shù)之上,要在Order By Columns區(qū)中的列名之后放一個(gè)詞desc。例如,你查詢World表,用如下的方式:
Order By Columnsopulation desc
是用Population對(duì)這個(gè)表排序,降序。
當(dāng)MapInfo執(zhí)行多級(jí)排序時(shí),各級(jí)排序有其自己的升/降序設(shè)置。這樣,下面的例子按State列執(zhí)行升序,然后按Population列執(zhí)行降序:
Select Columns: *
From Table: City_1K
Order By Columns: State,Population desc
在Order By Columns區(qū)中的列名句法:
在這個(gè)區(qū),你有兩種方法輸入一個(gè)列名:
輸入列的名字(例如前例中的列名state)
輸入列號(hào),這里的1代表排列在Select Columns區(qū)中的第一列,在數(shù)字之前不要打入“Col”。
如果你要用一個(gè)導(dǎo)出列進(jìn)行排序并且這個(gè)導(dǎo)出列有一個(gè)別名的話,你可以在Order By Columns區(qū)輸入這個(gè)別名。如果導(dǎo)出列沒有別名,就輸入列號(hào)(例如1)。
用Order By Columns字段對(duì)結(jié)果表排序
在SQL Select對(duì)話框中,利用Order By Columns區(qū),允許你對(duì)結(jié)果表的行進(jìn)行排序。排序影響到出現(xiàn)在Browser窗口中和各個(gè)行從頂?shù)降壮霈F(xiàn)的順序。如果你打算把Browser窗口作為一報(bào)告打印出來,你可能要對(duì)你的結(jié)果表進(jìn)行排序。
Order By Columns區(qū)是可選的,如果你留下這個(gè)區(qū)空著,結(jié)果表就不被排序。如果你在這在區(qū)輸入一個(gè)列名,MapInfo就根據(jù)那個(gè)列的內(nèi)容對(duì)結(jié)果表進(jìn)行排序。
實(shí)現(xiàn)多級(jí)排序
在Order By Columns指明多級(jí)排序的列名要用逗號(hào)隔開。依次為第一級(jí)、第二級(jí)…
 
Group By Columns區(qū)(按列分組)建立小計(jì)用
用Group By Columns區(qū)小計(jì)結(jié)果表
SQL Select對(duì)話框中Group By Columns區(qū)是可選的。如果你在這個(gè)區(qū)輸入一個(gè)或多個(gè)列名,結(jié)果表將含有這個(gè)表的小計(jì)(Subtotals),或集合信息。
注意:結(jié)果表變成了小計(jì)表,沒原始數(shù)據(jù),小計(jì)的依據(jù)是列值相同者。
當(dāng)你指定一個(gè)Group By Columns值時(shí),MapInfo查詢所指定的列,看那個(gè)列的那些行有相同的值。因此,結(jié)果你有一個(gè)顧客數(shù)據(jù)庫,并且你是按StateName列分組,MapInfo就會(huì)把所有California的顧客放列到另一個(gè)組,如此等等。MapInfo然后計(jì)算各組的集合信息(總合,均值等)。
為指定小計(jì)標(biāo)準(zhǔn):
1.在Group By Columns區(qū),輸入MapInfo將用來計(jì)算小計(jì)的列名或列號(hào)
例如:
如果你要在各個(gè)州的基礎(chǔ)上合計(jì)你的顧客表,輸入表示顧客所在的州的列名(例如StateName)到Group By Columns區(qū)
2.輸入同樣的列名(例如StateName)到Select Columns區(qū)。
3.在Select Columns區(qū)輸入一個(gè)或多個(gè)集合操作符(Sum,Count,Avg,Min,或Max)。記住,要用逗號(hào)分隔這些集合操作符。
輸入表達(dá)式Count(*)。(在Select Columns區(qū))
如果你要計(jì)算各州的全部銷售( Sales)合計(jì),輸入如Sum(Sales)之類的表達(dá)式。(這里的Sales是列名)。
在Select Columns區(qū)中,那些非集合函數(shù)基礎(chǔ)的所有列還必須在Group By Columns區(qū)列出。這些是MapInfo為了確定分組要檢測(cè)的列。這些列具有獨(dú)特?cái)?shù)據(jù)值的每一個(gè)組在查詢表中有一個(gè)單獨(dú)的行。導(dǎo)出列應(yīng)該用表示相對(duì)位置的編號(hào)指定,“1”、“2”、“5”分別代表第一、第二和第五列。
例如:
Select Columns: Month(sick_date),count(*)
From Toltes: sickdays
Group By Columns: 1
這個(gè)查詢告訴MapInfo,計(jì)算每一個(gè)有記錄的全部行數(shù)并生成一個(gè)按月分組的查詢表。結(jié)果表第月有一行,那個(gè)行有一個(gè)表示有多少人在那月生病的列。
在Group By Columns區(qū),你應(yīng)該按列名或列編號(hào)來引用列(1代表列在Select Columns區(qū)的第一個(gè)列)。當(dāng)你不使用聯(lián)接時(shí),你可以用正規(guī)的字段名。當(dāng)你用導(dǎo)出列的值分組時(shí),或者如果你聯(lián)接兩個(gè)表時(shí),你必須用列號(hào)代替列名。按號(hào)引用列時(shí),數(shù)字前不要加“Col”字樣。
你可以輸入一個(gè)以上的列到Group By Columns區(qū)。MapInfo首先按你列出的第一個(gè)列來對(duì)行進(jìn)行分組,在那些組中,MapInfo再按第二個(gè)列進(jìn)行再分組,以此類推。對(duì)于各個(gè)結(jié)果行,查詢表都含有基于集合函數(shù)的全部列的集合值。
(這里有一個(gè)問題,每一個(gè)結(jié)果行只能是一個(gè)集合函據(jù)的結(jié)果嗎?可否不同的列執(zhí)行不同的集合函數(shù)?)
注:在Select Columns區(qū)中,那些基于集合函數(shù)的列不能列入Group By Columns區(qū)內(nèi)。但是,Select Columns區(qū)中那些不是基于集合函數(shù)的每一個(gè)列應(yīng)該列入Group By Columns區(qū)內(nèi)。
Group By Columns的例子(按列分組的例子)
設(shè)想你有一顧客訂單表。表中的各個(gè)行代表一分單獨(dú)的訂單。表中有一個(gè)列含有接受訂單的銷售代表的名字,另一個(gè)列含有顧客的名字,再有一個(gè)列含有訂單金額(Amount).
對(duì)每個(gè)銷售代表,你想找出:
那個(gè)銷售代表接受的訂單數(shù)量
那個(gè)代表登錄的訂單平均金額
那個(gè)代表填寫的訂單的總金額
如下的SQL Select查詢產(chǎn)生所要求的結(jié)果:
Select Columns:Sales_Rep,count(*),average(Amount),sum(Average)
From tables: Order
Group By Columns:Seles_Rep(這意味著按銷售代表統(tǒng)計(jì))
注意:Group By Columns區(qū)和Select Columns區(qū)的三個(gè)集合操作符。Mapinfo要做的是:
1.找出對(duì)應(yīng)某一個(gè)銷售代表的全部行
2.計(jì)算行數(shù):Count(*)
3.計(jì)算這個(gè)銷售代表的定單的平均金額:Avg(Amount)
4.計(jì)算這個(gè)銷售代表的定單的總金額:Sum(Amount)
MapInfo對(duì)每一個(gè)銷售代表都要做這些工作,然后產(chǎn)生一個(gè)對(duì)每一個(gè)代表有一個(gè)單獨(dú)行的結(jié)果表。
集合操作符(Count,Avg和Sum)小計(jì)有相同銷售代表值的全部行的數(shù)據(jù)值。
考慮這樣一個(gè)SQL Select:
Select columns: Customer,Count(*),Avg(Amount),Sum(Amount)
From tables: Orders
Group By Columns: Customer
這是一個(gè)在體質(zhì)上與前一個(gè)相同的查詢,除了我們現(xiàn)在是按顧客分組而不是按銷售代表分組外,這個(gè)SQL Select找出訂單Count,Average和Sum是針對(duì)各個(gè)顧客的而不是銷售代表的。
下面的例子說明按多列分組:多重分組
Select olumns:Sales_Rep,Customer,Count(*),Avg(amount),Sum(Amount)
From tables: Orders
Group By Columns:Sales_Rep,Customer
在Group By Columns區(qū),我們指定了兩列名,在這種情況下,MapInfo首先按銷售代表組合行,然后再按顧客組合。這個(gè)查詢的結(jié)果表對(duì)應(yīng)于每一個(gè)不同的顧客棗銷售代表組合都有一個(gè)行。
當(dāng)某個(gè)顧客通過兩個(gè)或更多的銷售代表訂貨時(shí),那個(gè)顧客與第一個(gè)銷售代表做的生意都有一個(gè)行來總結(jié)。全部行首先是按銷售代表分組,然后,對(duì)于各個(gè)銷售代表,又按顧客分組。
集合函數(shù),MapInfo有下列集合函數(shù):
Count(*):計(jì)算一個(gè)組內(nèi)的記錄個(gè)數(shù),它僅用*作為其參數(shù)是因?yàn)樗m用于整個(gè) 記錄,而不是記錄中的某個(gè)特定字段。
Sum(表達(dá)式):計(jì)算一個(gè)組全部記錄表達(dá)式值的總和
Avg(表達(dá)式):計(jì)算一個(gè)組全部記錄表達(dá)式值的平均值
Max(表達(dá)式):找出一個(gè)組全部記錄表達(dá)式值中的最大值
Min(表達(dá)式):找出一個(gè)組全部記錄表達(dá)式值中的最大值
以上所述的表達(dá)式,最簡(jiǎn)單的情況是一個(gè)字段名(列名)。
關(guān)于From tables
這個(gè)區(qū)告訴MapInfo要查詢那些表,你必須在這個(gè)區(qū)最少輸入一個(gè)表名。如果你要MapInfo查詢兩個(gè)或更多的表,就要輸入用逗號(hào)分隔的一系列表名。
如果你在這個(gè)區(qū)輸入了兩個(gè)或兩個(gè)以上的表名,那么,你還必須在Where Condition區(qū)指定表達(dá)式來告訴MapInfo如何連系這些表。
如果你輸入了兩個(gè)表名,MapInfo自動(dòng)計(jì)算一個(gè)適當(dāng)?shù)腤here Condition表達(dá)式。但是如果你用了三個(gè)或更多的表名,你必須手工修改這個(gè)表達(dá)式。當(dāng)你按多表聯(lián)接時(shí),所有的表必須是基礎(chǔ)表。你不能把結(jié)果表(例如Qurey5)用于多表SQL Selec。
關(guān)于Where Condition區(qū)
這個(gè)區(qū)有不同的任務(wù),取決于你的查詢性質(zhì)。當(dāng)你查詢一個(gè)單表時(shí),該區(qū)是可選的(即不填也可)。如果你查詢涉及到連接兩個(gè)或多個(gè)表,你必須指定一個(gè)Where Condition表達(dá)式,那個(gè)表達(dá)式必須表明MapInfo應(yīng)該如何聯(lián)接這兩個(gè)表。
如果你愿意,你可以在該區(qū)輸入過濾標(biāo)準(zhǔn)。輸入過濾標(biāo)準(zhǔn)的方法是打入一個(gè)判斷真假的邏輯表達(dá)式。例如,當(dāng)你查詢World表時(shí),如果你只選擇人口大于5百萬的行,就要指定如下的Where Condition子句:
Where Condition:Population>5000000
這個(gè)區(qū)的數(shù)字中間不要打逗號(hào)。
關(guān)于Group by Columns區(qū)
這個(gè)區(qū)允許你小計(jì)你的結(jié)果表。如果你輸入一個(gè)列名(或被逗號(hào)分隔的一串列名)到該區(qū),MapInfo就小計(jì)你的查詢結(jié)果,并且只給你顯示出小計(jì)結(jié)果表,而不顯示你的表的每個(gè)行。
計(jì)算小計(jì)是一個(gè)兩步曲:
1.輸入一個(gè)(或一組)列名到該區(qū)
2.輸入同樣的列名和集合運(yùn)算器(諸如Sum或Count)到Select Columns區(qū)。Group by Columns區(qū)是可選的。如果你保留為空(默認(rèn)的),MapInfo將不計(jì)算小計(jì)。
關(guān)于Order by Columns區(qū)
這個(gè)區(qū)允許你對(duì)你的結(jié)果表進(jìn)行排序。如果你輸入一個(gè)(或被逗號(hào)分隔的一組)列名到該區(qū),MapInfo就以你輸入的列作為關(guān)鍵字對(duì)你結(jié)果表的行進(jìn)行排序。默認(rèn)是升序,A在B之上,小數(shù)在大數(shù)之上。降序可在列名后跟一個(gè)desc字。例如:
Order by Columnsopulation desc
該區(qū)是可選的,如果空著,結(jié)果表將不排序。
 
關(guān)于Into table Named區(qū)
這個(gè)區(qū)允許你命名結(jié)果表。默認(rèn)的結(jié)果表名是Selection。如果你要指定一個(gè)另外的名字,就把它打入該區(qū)。你輸入的表名不應(yīng)該是一個(gè)打開的表。如果你頻繁使用SQL Select,并且如果你用selection作為你的結(jié)果表名,你會(huì)以得到許多左上重疊的結(jié)果表(例如Query1,Query2,Query3等)告終。這些Queryn表不會(huì)造成任何傷害;然而,有的人就是不喜歡這大量打開的表。如果你要避免這大量打開的Queryn表,那你在該區(qū)輸入一個(gè)另外的表名就行了。例如你輸入表名Qresults:
Into Table Named:Qresults
然后再進(jìn)行的各個(gè)SQL操作就只用Qresults作為結(jié)果表名。這個(gè)方法,你只能得到一個(gè)結(jié)果表(Qresults),不管你進(jìn)行了多少次查詢。
 
關(guān)于Browse Results
如果你標(biāo)證了Browse Results檢查框,MapInfo自動(dòng)以一個(gè)Browser窗口顯示查詢結(jié)果。
 
關(guān)于Aggregates,Function,Operator等的下拉列表(略)
SQL Select的目的是什么?
它是一個(gè)多目的的查詢工具。用SQL選擇,你可以完成下列任務(wù)之一或全部:
過濾你的數(shù)據(jù),以便你只看到你感興趣的行和列
執(zhí)行關(guān)系連結(jié),把兩個(gè)或多個(gè)表組合成一個(gè)結(jié)果表
創(chuàng)建關(guān)系連結(jié),(根據(jù)已有列的內(nèi)容計(jì)算出新值的列)
按數(shù)據(jù)值或(和)字母順序排序你的數(shù)據(jù)
小計(jì)你的數(shù)據(jù),以便你只看到一個(gè)小計(jì)表,而不是整表
 
 
Select 的目的
Select允許你查詢你的數(shù)據(jù)庫,根據(jù)一定的準(zhǔn)則從一個(gè)表中選擇記錄和對(duì)象,并創(chuàng)建一個(gè)你以平面圖、表格瀏覽器或曲線圖方式來觀看的結(jié)果表。
Select對(duì)話框允許你指定查詢準(zhǔn)則
對(duì)話框各欄的填寫
Select records from Table選擇你要操作的表
That Satisfy在此打入你的查詢表達(dá)式,或者用鼠標(biāo)點(diǎn)Assist 鈕使顯示表達(dá)式對(duì)話框,這個(gè)對(duì)話框?qū)椭銟?gòu)成你的查詢表達(dá)式。
Store results in table(optional)
這個(gè)選項(xiàng)允許你命名保存查詢結(jié)果的臨時(shí)表。“Seltction”是默認(rèn)值。如果你選擇了“Selection”,MapInfo就命名這個(gè)表為Query1,Query2等。
Sort results by Column(optional)
當(dāng)你要查詢結(jié)果按某個(gè)列的值排序時(shí),選擇這里。默認(rèn)的是查詢不被排序。你可以通過使用Select并指定一個(gè)排序依據(jù)(但不能任何表達(dá)式)把一個(gè)表排列成某個(gè)需要的順序。MapInfo選擇表中所有的記錄并根據(jù)指定列中的值對(duì)它們進(jìn)行順序。
Assist
進(jìn)入你可以用以構(gòu)成查詢表達(dá)式的表達(dá)式對(duì)話框。
Browse results
這個(gè)盒默認(rèn)是標(biāo)記的。當(dāng)你需要你的查詢結(jié)果表時(shí),保留它被標(biāo)記。否則清除它。該表的命名是根據(jù)輸入到Store results in Table的標(biāo)記。
OK執(zhí)行查詢
 
 
用Select搞查詢
MapInfo有兩個(gè)通過查來選擇對(duì)象的命令:Select和SQL Select。Select是比較簡(jiǎn)單的,而SQL是功能更強(qiáng)的。
要作一個(gè)查詢:
1.選擇Query>Select,Select對(duì)話框顯示。
2.點(diǎn)Select records from table下拉列表,選擇要從中選擇記錄的表名。
3.在That Satisfy區(qū)內(nèi)打入你的查詢表達(dá)式,或者點(diǎn)Assist鈕顯示幫助你寫表達(dá)式的表達(dá)式對(duì)話框。
4.在Store Results in Table區(qū)內(nèi),為貯存你的查詢結(jié)果的臨時(shí)表打入一個(gè)名字,或者選Selection(默認(rèn)的表名)。如果選這個(gè)默認(rèn)的,MapInfo就把這個(gè)表命名為Query1,Query2等。
要按某個(gè)列的值對(duì)查詢結(jié)果排序(可選的)
5.點(diǎn)擊Sort results by Columns下位列表并選擇含有你要用以排序的列。
6.點(diǎn)擊OK
如果Browse Results檢查盒標(biāo)記,一個(gè)有你的查詢結(jié)果的Browser窗口就顯示出來。
你可以用這個(gè)Select命令加亮一個(gè)Map或一個(gè)Table中符合一定準(zhǔn)則的對(duì)象,并且創(chuàng)建一個(gè)你能瀏覽,成圖或作曲線圖的象任何別的Table一樣的結(jié)果表。
當(dāng)你正與一個(gè)Browse Window打交道時(shí),滿足查詢準(zhǔn)則的記錄都被加亮。
當(dāng)你正與一個(gè)Map打交道時(shí),所選對(duì)象的圖形對(duì)象都被加亮。
當(dāng)你同時(shí)既與一個(gè)map窗口又與一個(gè)Browse窗口交道時(shí),這些對(duì)象和記錄都是加亮的。
在所有情況下,都自動(dòng)建立起一個(gè)叫做Selection的工作表。這個(gè)表包括著查詢結(jié)果。你可以使用這個(gè)表作平面圖或曲線圖,像任何其它表一樣。
當(dāng)你用Select或SQL Select作查詢時(shí),從你的源表生成了臨時(shí)表。顯示在窗口中時(shí),這些表被命名為Query1,Query2等。關(guān)閉這些表就清除了它們,但不會(huì)影響你的源表。但是,如果你關(guān)閉了你的源表,所有相關(guān)的查詢表將被關(guān)閉并被清除。
為了保存一個(gè)查詢表的內(nèi)容,要用:
File>Save Copy AS
然后你可以關(guān)閉這個(gè)查詢表,有效地刪除它。以后要打開它就用通過Save Copy As建立表時(shí)的名字。
你可以把Update Column用于一個(gè)SQL Select多表聯(lián)接的結(jié)果表,前提是這個(gè)SQL Select沒有使用Group By子句。
要更新帶有另一表的信息的一個(gè)表中列,應(yīng)該:
用SQL Select連接這兩個(gè)表。
把Update Column用于其Selection表,更新將會(huì)自動(dòng)影響到相應(yīng)的基礎(chǔ)表。要得到字段值及字段名,可以為
Dim lay as MapXLib.Layer
lay=Map1.Layers(i)
那么得到第i個(gè)圖層的第i個(gè)DataSet的第i個(gè)字段的名稱就變成了:
Map1.Layers(i).DataSet(i).Fields(i).Name
得到Rowvalue為即得到字段的值為:
Map1.Layers(i).DataSets(i).Rowvalues(i).Item(i).value