mapinfo通過sql處理2

在再選擇中你可以使用在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:Population 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: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表,更新將會自動影響到相應的基礎表。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章