




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Mapinfo
Sql语句查询方法Select*from
基站
where
objwithin(select
obj
from
折线
wheresss="密集市区")下面的语句为子查询,子查询状态下from
不需要列两个表,只是在()内声明另外一个表即可。
注:
Mapinfo允许sql选择中有子选择,子选择是被放在“SQL选择”对话框的“条件”语句
Mapinfo首先对子选择进行求值,接着使用子选择的求值结果来对主sql选择进行求值。子选择必须用括号括起来,最有用的例子如:select
列
from
表
where
条件多重分组:1.
按列分组示例设想有一个顾客订单表。该表中每一行表示单个订单。表中一列包含订货销售代理的名字,另一列含有顾客名字,还有一列包含订货量。
对每个销售代理,可找出:
①
该代理的订单数目。
②该代理的平均订货量。
③该代理的总订货量。
选择列sales_Rep,count(*),average(AMOUNT),
sum(AMOUNT)
从表
Orders
按列分组
Sales_Rep
按照多列分组:
选择列sales_Rep,count(*),average(AMOUNT),
sum(AMOUNT)
从表
Orders
按列分组
Sales_Rep
,Customer
这时mapinfo先按照销售代理、顾客进行分组。改查询结果中每个不同的顾客/销售代理组合都占一行。当某一特定顾客通过两个或者多个销售代理订货时,则该顾客与每个销售代理的业务都用一行来小计。各行先按照销售代理分组,对同一销售代理在按顾客来分组。按照基站名称分组来计算,sum,avg等等!!MapInfo提供以下聚合函数:
Count(*):计算一组中记录总数。它简单地使用*作参数,因为它应用到整条记录,而非某个特定字段。
Sum(表达式):计算一组中所有记录的〈表达式〉总计值。
Avg(表达式):计算一组中所有记录的〈表达式〉平均值。
Max(表达式):找出一组中所有记录的〈表达式〉最大值。
Min(表达式):找出一组中所有记录的〈表达式〉最小值。设置过滤规则:Select*fromSite_ListwhereFreq=”450MHz”andregion=”FTR”子查询:使用子查询的原则1.一个子查询必须放在圆括号中。2.将子查询放在比较条件的右边以增加可读性。子查询不包含ORDERBY
子句。对一个
SELECT
语句只能用一个ORDERBY
子句,并且如果指定了它就必须放在主
SELECT
语句的最后。ORDERBY
子句可以使用,并且在进行
Top-N
分析时是必须的。3.在子查询中可以使用两种比较条件:单行运算符和多行运算符。子查询的类型单行子查询:从内SELECT
语句只返回一行的查询多行子查询:从内SELECT
语句返回多行的查询单行子查询单行子查询是从内查询返回一行的查询。在该子查询类型中用一个单行操作符。幻灯片中列出了单行操作符。例显示那些jobID
与雇员
141
相同的雇员。SELECTlast_name,job_id
FROMemployees
WHEREjob_id=(SELECTjob_idFROMemployeesWHEREemployee_id=141);SELECTlast_name,job_id,salaryFROMemployees
WHEREjob_id=(SELECTjob_id
FROMemployeesWHEREemployee_id=141)ANDsalary>(SELECTsalaryFROMemployeesWHEREemployee_id=143);显示jobID
与雇员
141
相同,并且薪水
高于雇员143
的那些雇员。注:外和内查询可以从不同的表中取得数据。SELECTlast_name,job_id,salaryFROMemployeesWHEREsalary=(SELECTMIN(salary)FROMemployees);求所有人谁的工资最小。SELECTdepartment_id,MIN(salary)FROMemployeesGROUPBYdepartment_idHAVINGMIN(salary)>(SELECTMIN(salary)FROMemployeesWHEREdepartment_id=50);求每个部门的最小工资,但是要高于50号部门的工资。SELECTemployee_id,last_nameFROMemployeesWHEREsalary=(SELECTMIN(salary)FROMemployeesGROUPBYdepartment_id);问题出现在:单行子查询返回了多个查询值;应改为:SELECTemployee_id,last_nameFROMemployees
WHEREsalaryin(SELECTMIN(salary)FROMemployeesGROUPBYdepartment_id);SELECTlast_name,job_idFROMemployees
WHEREjob_id=(SELECTjob_idFROMemployeesWHERElast_name='Haas');如果子查询返回的是零值,不会对主程序造成影响;如果子查询返回的是空值,那么会影响主程序的返回值;只有要查询的东西和你子查询返回的东西一一对应上了,你的查询才能成功。如果有一个对应不上那么你的查询不会成功。非成对的子查询:SELECTemployee_id,manager_id,department_idFROMemployeesWHEREmanager_idIN(SELECTmanager_idFROMemployeesWHEREemployee_idIN(174,141))ANDdepartment_idIN(SELECTdepartment_idFROMemployeesWHEREemployee_idIN(174,141))ANDemployee_idNOTIN(174,141);输出:14412450143124501421245017614980上面两个程序就是成对子查询和非成对子查询两者之间的区别。如果我想去显示员工信息,要求:员工的工资高于本部门的平均工资。SELECTa.last_name,a.salary,a.department_idFROMemployeesaWHEREa.salary>(SELECTAVG(salary)FROMemployeesbWHEREb.department_id=a.department_id);inlineview(内联视图)SELECTa.last_name,a.salary,a.department_id,b.salavgFROMemployeesa,(SELECTdepartment_id,AVG(salary)salavgFROMemployeesGROUPBYdepartment_id)bWHEREa.department_id=b.department_idANDa.salary>b.salavg;最后,对于再选择有几点注意事项:
在再选择中你可以使用在FromTable区中未列出的表.但是你必须把这些表列在你的再选择的From子句中。
当再选择带有关键字”any”或”all”时,再选择必须并且只能返回一个列(一列的所有值)。下面的句例是无效的,因为它试图返回两个列(State_name
和Pop_1990):Any(Selectstate_name,pop_1990fromstate)
当再选择不带”any”、“all”或“in”时,再选择必须准确返回一个行的值(一个行的值,不能用or或者and)。下面的例子是无效的,因为再选择返回了一组行:objwithin(SelectobjfromstatewherePop_1990>2000000)objwithinany(select
obj
from
折线
where
sss="密集市区"orsss="一般市区")用any可以使用判断语句,来用进行多重子选择。上例中,只能用any,不能用all,all就是全部的意思,可以不用选择了。用within连接两个图形,生成如下表格,两个表格会根据obj的关系而互相连接起来。如何解决区域包含问题:
实际对象中,经常会遇到区域包蕴但是不能分离的情况,也就是大区域包含小区。当选中小区域时,大区域也被同时选中,无法单独选中小区域,解决的办法:A:分割内区域,选中小区域时大区域不被选中
1)、选中大区域,“对象---转为折线”并设置小区域为目标;
2)、将原大区域的折线转换为区域;
3)、“对象—分割”,出现数据对话框时间,选择“无数据”,
小区域被分割出来了。B:第二次分割
1)、选中大区域,设置为目标,在选中小区域,“对象---分割”。区域分类,按照区域进行汇总,首先需要RFcon.objwithin_2G区域划分obj让两个表连接起来,然后进行分类:1.二、表维护的操作表维护操作包括修改表结构、删除表、重命名表、压缩表等,其中表结构维护较为常用,往往出现在创建的表的数据结构与要求的表结构不一致时进行操作。通过表结构维护可以更新表中的字段名称、类型及字段长度等,具体操作步骤如下:<1>表[A]>>维护[M]>>表结构[T],打开”修改表结构”对话框。<2>根据要求,对应修改表结构中的字段、类型、宽度、增删字段、字段排序等。2.
三、删除表、重命名表、压缩表等操作往往用于进行冗余的数据表的删除、数据表的重命名及相关数据表的压缩等操作,具体操作步骤如下:<1>表[A]>>维护[M]>>表结构[T],打开”删除/重命名/紧缩表”对话框。<2>删除表、重命名表、压缩表等操作。3.
四、更新列的操作在进行物理网格或逻辑网格数据更新时,往往需要用到更新列操作,其主要是思路是,利用关系型数据库中表操作的原理,建立一张与Mapinfo中图层对应的数据表一致的表格,保持数据索引(关键值)的唯一性,将其导入并建立索引值的关联,对应更新需更新的表与源数据表中对应列的数据,即可批量更新相关数据表的了。具体操作步骤如下:<1>创建与Mapinfo中表格结构一致的导入表,并保持索引字段的唯一。以索引字段为关联字段,对应更新表格中的数据。<2>以索引字段(即关键字)建立联接,对应更新两张表。<3>以建立的联接为索引,从“数据来源表”中获取数据源,并对应更新“需更新的表”中的列。4.
五、在表中追加行的操作在表中追加行的思路与更新列的思路是类似的。具体操作步骤如下:<1>打开与需要“在表中添加行”字段一致的表。<2>表[A]>>向表中追加行[A]…,打开“在表中追加行”对话框。<3>选择数据来源,即“添加表”,并选择需要添加到哪个表。SQLSelect的一般步骤:1.打开你要查询的表。你要查询的表为基础表(BaseTable)2.选择Query>SQLSelect,填写SQLSelect对话框满足你需要的那些分。按击OK,Mapinfo进行查询。Mapinfo从你的基础表中抽出数据,把查询结果保存在一个被称为结果表的特殊临时表中。结果表仅有满足你的条件的行和列。结果表的默认名是Selection(尽管你可以在SQLSelect对话框的InfoTableNamed位置上指定一个不同的结果表名)。注意:以下第三条暗示:结果表既反映在Browser窗口,也反映在Map窗口中,换句话说,可收查询结果保存为另一个图层。保存方法见下面的第5条。3.如果你要看查询结果,打开一个Map窗口或(和)一个Browser窗口。默认的是MapInfo自动以一个Browser窗口显示结果表(除非你清除了SQLSelect对话框中的BrowserResults检查盒)。如果你的结果表被命名为Selection(默认名),Browser窗就显示一个不同的表名,例如Query1名Query2。这是因为你浏览这个Selection表的瞬间,MapInfo对该表作了一个“快拍”,并命名这个快拍为Queryn(n是数字,1或更大)。MapInfo主要按快拍是因为“Selection”是一个特殊的表名,每当你选择或不选择某些行时,Selection都在动态变化。在SQLSelect对话框中,你可以为你的结果表输入一个另外的名字(例如,你可以命名你的结果表为My-Query)。这就阻止了MapInfo把你的结果表重命名为Queryn。4.MapInfo自动选择结果表中全部的行。这样,在你执行了SQLSelect之后,你就能够接着执行选择行的全套操作。例如,你可以(通过选择Option>RegionStyle)对所有被选择的行提供另一种充填色,或者你能够Cut或Copy选择的全部行。通常,你对结果表所作的任何变化都会自动作用于你的原始(基础)表。例如,如果你用SQLSelect选择了基础表中的某些行,然后又从你的结果表中删除了部分行,MapInfo就会从你的表中删除相应的行。但是,如果你查询产生了小计(Subtotals),你可以改变这个结果表而不影响基础表。5.如果你要作一个结果表的永久备份,选择File>SaveAs。如果你你不执行SaveAs存盘,该结果表将在你退出MapInfo时被删除。SQLSelect对话框各区的填写
SelectColumns区
(1)利用这个区来指定在查询表中将出现哪些列。例如查询World表,可以指定SelectColumns:Country,Population,Indust_Grwth,如果你要你的结果表有与你的原表相同的列组,那就在这个区输入一个*号。如果你要你的结果有一个与你的原表不同的列组,就要删去这个*号并输入由逗号分隔的列名(如下同)表达式列表。这个区能够包括一个*号或者一个列表达式列表,但不能同时包括这两种。要在你填SelectColumns区之前填FromTables区。如果你查询涉及的不止一个有,各个列名之前必须有它的表名,二者之间用西文句号分隔。因此,如果你要执行一个涉及两个表的查询,其中之一是Canada表,并且你要查询包括该表的Population列,那么你必须用列表达式Canada.Population。当你使用两个或多个表时,Columns下拉列表自动把表名插到各个列名之前。(2)只选择部分列出现在结果表中是有用的,特别是你的原表有很多列而你仅需操作其中的少数列时(或许因为屏幕上只能同时显示少数列)(3)如何输入一系列列名:在FromTables区输入一个表名,可用键盘打入,也可用鼠标从Table下拉列表中选入。用鼠标在SelectColumns区中按击,使插入点出现在该区内。用退格键或删除键删去*号(如果其中有*号),SelectColumns区能够包含一个*号或者一串列名,但不能同时包含这两种。从对话框右边的Columns下拉列表中选择一个列名。MapInfo把这个列名Copy到SelectColumns区。如果你的查询还包括另外一些列名,从下拉列表中选择另外的一些列名。每当你选择另外的列名时,MapInfo自动插入逗号以分隔列名。(4)计算某些列SQLSelect能够计算出列(derivedColumns)并把这些导出列存放到结果表中。导出列是MapInfo在中根据基础表中已有的一个或多个列的内容计算出的一个特殊的临时列。例如,你的表或许含有字段Purchases92或Purchases93(分别代表各顾客在1992和1993年购物的总金额)。如果你要你的查询结果显示一个TotalPurchases列,表示各顾客1992和1993年合起来的购物金额,你可以在你的SelectColomns区内包括一个导出列。在这个例子中,导出列应该有这样的形式:Purchases92+Purchases93同样,你可能有一个包含有字段Fname(代表顾客的第一名)和Lname(顾客的后名)的顾客信息表。如果你要你的结果表包括顾客的全名,你也可以在你的SelectColumns区包括一个导出列,在这个例子中,导出列会有这样的形式:Fname+“”+Lname为指定一个导出列,你就要在SelectColumns区输入一个表达式。一个导出列表达式是若干列名,操作符(例如+和-)和函数(例如Ucase$函数,它把一个字串转换为大写的)的一个组合。在指定导出列之前,你必须先在FromTable区输入一个或多个表名。如何指定一个导出列表达式按SelectColumns区,在该区出现插入点。
删除区内的*号
输入一个列表达式。列表达式应该包括一个或多个列名,如果表达式包括一个以上的列名,这个表达式一般包含操作符(例如+或-)来把多个列组合成为一个导出值。
有许多不同的函数和操作符能够用于列表达式中。如果需要为列表达式指定一个别名。指定别名的方法是:在列表达式后打一个空格,然后再打入用双引号括起来的别名。
别名是可选的。如果你给了你的列表达式一个别名,那么,当你以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是一特殊的列名,代表与表中各行相联系的地理对象。WhereCondition区
(1)通过行的排列顺序联接不同的表如果两个表没有一个共同的列,你可以根据行的顺序仍然能够联接这两个表。如果你知道一个表的第一行与另一个表的第一行是相对应的,并且,一般地说,如果你知道第一个表的第n行与第二个表的第n行是对应的,那么你就可以通过引用一个名叫RowID的特殊列来联接这两个表。RowID列含有一个整数值,代表着表中各行的行号。因此,任何表的第一行都有一个为1的RowID值,第2行有一个RowID值2,等等。为了联接两个表,让MapInfo一个表的第n行与另一个表的第n行匹配起来,就要指定一个WhereCondition表达式,形如下:TABLE_1.RowID=TABLE_2.RowID(2)从地理上(用地理操作符)联接不同的表当两个表都有图形对象时,MapInfo能够根据这些对象之间的空间关系联接这两个表。所以,即使你的表没有一个共同的列,你也有可能联接不同的表。地理操作符允许你选择某些对象,根据它们与另外的某个对象的空间关系。MapInfo有一个与地理操作符一起使用的特殊列名,“Obj”或“Object”。这个列名指的是与你的表相边系的图形对象。地理操作符要放到所指定的对象之间,地理操作符从操作符(Operators)下拉列表中选取。下表列出了地理操作符:Contaions(含有)ObjectAContainsObjectB(如果B的形心在A的边界内的某个位置上)ContaionsEntire(包含全部)ObjectAContainsEntireObjectB(如果B的边界全部在A的边界内)Within(在内)ObjectAisWithinObjectB(如果A的形心在B的边界内侧)EntireWithin(完全在内)ObjcteAisEntireWithinObjectB(如果A的边界全部在B的边界内)Intersects(相交)ObjcteAIntersectsObjectB(如果它们至少有一个共同点或者它们中的一个完全在另一个内)Contains与Within的比较是根据对象的形心,而ContainsEntire与EntireWithin的比较是根据整个对象。如果A包括整个B,那么A肯定包含B,如果A完全在B内,那么A肯定在B内。MapInfo执行简单的含有和在内比较,比执行完全含有和完全在内要快。因此,除非你绝对相信某些对象是完全在另一些对象之内,否则你应该使用Contains和Within而不用ContainsEntire或EntireWithin。地理操作符提供了一种联接表的方法。当表中没有你能建立起联接的列时,你可以用地理操作符(在WhereCondition区内)指定联接关系。如果你要执行一个涉及一个Cities表和一个State表的两表查询,你可以用如下的表达式之一联接两个表:Cities.ObjWithinStates.ObjStates.ObjContainsCities.Obj在任何一种情况下,MapInfo都能找到在各个州内的全部城市,然后把代表一个城市的一个行与含有它的州的行联系起来。用同样的SQL查询,你也能够用集合功能来合计每个州的城市数,或者以州为根据总结基于城市的数据。当你有Counties表和一个Customers表时,Counties是多边形,Customers是点,你可以用下列地理表达式之一指一个集合联接:Customer.objWithinCounty.objCounty.objContainsCustomer.obj地理操作符与Subselects结合特别有用(见PerfermingSubselects)(3)联接两个或更多的表(根据共同字段)一般,你是把你的资料贮存在几个不同的表中,你有你自已的数据文件,你也可能有从MapInfo购买的各种统计资料的数据库。SQL允许你建立关联以便你把这些不同表中的资料接到一起,成为一个单独的结果表。设想这样一种情况:你有一个有人口统计交资料的Counties表(各个County按年龄段、种族和职业种类的人口数统计),你还可能有关于顾客订单资料的数据库。你想检测一下这两个表,看一定种类的订单是否来自具有一定人口统计特征的Counties。或许你想根据订单与人口的统计特征的组合选择若干个Counties(县)。要做到这一点,你必须能够联接这两个表。假设Counties表含有县名,同样订单表的一个列也含有订单来源的县名,这样,两个表都有一个共同的字段,即县名。MapInfo能够用这个共同的字段来联接这两个表。Countyname1980人口,1990人口
Order#CustomerCountyFoster1980人口,1990人口
478001FranicFosterWilliamette1980人口,1990人口
478002JamesFosterMason1980人口,1990人口
478003WickmasonCounties表
Order表
在SQLSelect
对话框中,你用WhereCondition区告诉MapInfo如何联接这两个表。在这个区内填写如下:SelectColumns:*FromeTable:Counties,OrderWhereCondition:Counties.Countyname=Order.county表名(在FromTables区)的顺序是重要的。如果两个表都含有Map对象,结果表将只含有排列在FromTables区中第一个表的Map对象。另外,当查询完成时,MapInfo会自动选择列在FromTables区第一个表的部分或全部行。这样,在前例中,MapInfo会选择Counties表的部分或全部行。其结果也会包括从Orders表中拷贝来的数据,但Orders表本身不会被选择。在WhereCondition区中,列的顺序必须与FromTables区中表的顺序相匹配。在上例中,FromTables区把Counties表放到了Qoders表之前,因此,WhereCondition区必须把Counties.CountiName列放在Orders.County列之前。如果颠倒这两个表在FromTables区内的顺序,你也必须颠倒在WhereContition区内列名的顺序。当你联接两个表时,结果表的行数取决两个匹配的好坏。假定你有一个10000行的Order表,要把这个Order表与有50行的States表联接。结果表可能有10000行之多。但是如果Orders表中的某些行没有与States表中的行相匹配。结果表就会少于10000行。因此,如果Orders表中有400行无state名(或许由于数据输入错误),并且如果这个关联是依赖State名,结果表就可能只有9600个行了。当SQLSelect对话框联接两个表时,你指定的如何联接这两个表的子句(Clause(s))必须放在WhereCondition区内的其它子名之前。你可以用UpdateColumn来修改SQLSelect多表联接的结果表。当你要更新一个表中带有另一个表的信息的一个列时,你可以:用SQLSelect联接这两个表。
针对Selection表使用UpdateColumn。
更新会自动影响到相应的基础表。(4)次选择(Subselects)MapInfo允许SQLSelect中的再次选择。再选择是放在SQLSelect对话框WhereCondition区内里面的一个选择语句。MapInfo首先处理Subselects,然后用这个Subselects的结果去处理主要的SQLSelect。例如,假定你要选出1990年人口大于全国各州平均值的全部州。换句话说,如果平均州人口是5百万,你要选出所有平均人口大于5百万的州。在实行中,你要在WhereCondition区中使用如下的过滤标准:Pop_1990>平均人口然而,你并不知道那平均值是多少。但是,你知道MapInfo能够用如下集合表达式计算出那个平均值:Avg(Pop_199)为了计算平均州人口,要在WhereCondition区输入一个再选择(Subselect)。WhereCondition区那时能够比较对Pop_1990列再选择的结果。要进行那样一种查询,如下填写SQLSelect对话框。SelectColumns:*FromTable:StatesWhereCondition:Pop_1990>(SekectAvg(Pop_1990)FromStates)再选择是在WhereCondition区内,在>操作符之后。再选择必须用园括号括起来。最有用的再选择包括一个Select子句,一个from子句和一个Where子句,象下面这样:Select某些列from某些表where某些条件存在。考虑如下的SQLSelect,它选择各州中人口大于4000000的全部城市:SelectColumns:*Fromtable:citiesWhereCondition:objwithinany(SelectobjfromstateswherePop_1990>4000000)再选择返回代表1990年人口大于400000的全部州的地理对象。然后主选择语句设到被再选择选中了的州内全部城市。注意:主选择语句用了一个地理操作符(Within)来做这个事情。虽然前一查询用两个表,States表和Cities表,但Cities是出现FromTables区的仅有的表。这是因为在再选择中使用了States。如果一个表仅仅是被用于再选择内,那么这个表的表名不需要出现在FromTables区中。在下一个例子中,我们选择与田西纳州相交的所有州,换言之,所有相邻的州。Selectcolumns:*Fromtables:statesWhereconditions:objIntersects(selectobjfromstateswherestate=”TN”首先,MapInfo执行再选择:Selectobjfromstateswherestate=”TN”再选择找到了代表田纳西州的图形对象。然后主Wherecondition找到了States表中与代表田纳西州的图形相交的全部对象。你可以用类似的查询选择与某给定街道相交的全部街道。现考虑这个例子:Selectcolumns:*FromTables:CountyWhereCondition:County.objcontainsany(selectobjfromdealers)这个查询找到含有销售商的所有县。主Wherecondition有这样的一个形式:一个县对象Contains一个经销商对象。经销商对象组是由再选择:Selectobjfromdealers产生的。MapInfo选择代表含有经销商的各个县对象的行。最后,对于再选择有几点注意事项:在再选择中你可以使用在FromTable区中未列出的表.但是你必须把这些表列在你的再选择的From子句中(如前面例子所示那样)。
当再选择带有关键字”any”或”all”时,再选择必须并且只能返回一个列。下面的句例是无效的,因为它试图返回两个列(State_name和Pop_1990):
Any(Selectstate_name,pop_1990fromstate)当再选择不带”any”、“all”或“in”时,再选择必须准确返回一个行的值。下面的例子是无效的,因为再选择返回了一组行:
objwithin(SelectobjfromstatewherePop_1990>2000000)当再选择不用”any”、“all”或“in”时,你不能在再选择中使用GroupbyColumns子句。
你不能有嵌套的再选择,即是说,每个Select语句你只能有一个再选择。
设置过滤标准一个过滤标准是一个逻辑表达式,它通常把一个列值与某个另外的值作比较。例如,以下的过滤标准用大于操作符(>)测试订单金额列是否有大于100的值。WhereCondition:Order_Amount>100如果一个查询包含了上面这个WhereCondition子句,MapInfo就只选择那些订单金额值大于100的行。WhereCondition区可以包含两个或更多的逻辑表达式,但这些表达式必须被词“And”或“Or”隔开。如果表达式是用词And连接,MapInfo仅选择那些两个标准满足的行。如果表达式是用Or连接,MapInfo就选择满足其中任何一个标准的行。过滤标准可用于你的基础表的任何一个列,不管你是否在SelectColumns区中包括了这个列。列可以用列名或列号来引用,列号指明是在SelectColumns中已有的列的顺序。因此,“Col”和“col6”分别指第一和第六列,号之前必须有字母“Col”。用SQLSelect对话框的WhereCondition区的基本目的可能是两个:行过滤和关联。Wherecondition区服务于多个目的。在某些场合下,你可能要用一个Wherecondition表达式来过滤你的表,以便你只看到满足一定标准的那些列。在一些场合下,你要利用Wherecondition区来指定一种关联,以便你的查询能够包括来自两个或更多个表中的列。注意:你不可以在Wherecondition区中使用集合函数(apgregatefunction)。OrderbyColumns(按列排序)区选择升序和降序默认,MapInfo是用升序排序一个表。如果你要用一个字符型字段进行排序,升序意味着A出现在B之上,如此类推。如果你对一个数字型字段进行排序,小的数值出现在大的数值之上。为了以降序排序,以便大的数出现在小的数之上,要在OrderByColumns区中的列名之后放一个词desc。例如,你查询World表,用如下的方式:OrderByColumns:Populationdesc是用Population对这个表排序,降序。当MapInfo执行多级排序时,各级排序有其自己的升/降序设置。这样,下面的例子按State列执行升序,然后按Population列执行降序:SelectColumns:*FromTable:City_1KOrderByColumns:State,Populationdesc在OrderByColumns区中的列名句法:在这个区,你有两种方法输入一个列名:输入列的名字(例如前例中的列名state)
输入列号,这里的1代表排列在SelectColumns区中的第一列,在数字之前不要打入“Col”。
如果你要用一个导出列进行排序并且这个导出列有一个别名的话,你可以在OrderByColumns区输入这个别名。如果导出列没有别名,就输入列号(例如1)。用OrderByColumns字段对结果表排序在SQLSelect对话框中,利用OrderByColumns区,允许你对结果表的行进行排序。排序影响到出现在Browser窗口中和各个行从顶到底出现的顺序。如果你打算把Browser窗口作为一报告打印出来,你可能要对你的结果表进行排序。OrderByColumns区是可选的,如果你留下这个区空着,结果表就不被排序。如果你在这在区输入一个列名,MapInfo就根据那个列的内容对结果表进行排序。实现多级排序在OrderByColumns指明多级排序的列名要用逗号隔开。依次为第一级、第二级…GroupByColumns区(按列分组)建立小计用用GroupByColumns区小计结果表SQLSelect对话框中GroupByColumns区是可选的。如果你在这个区输入一个或多个列名,结果表将含有这个表的小计(Subtotals),或集合信息。注意:结果表变成了小计表,没原始数据,小计的依据是列值相同者。当你指定一个GroupByColumns值时,MapInfo查询所指定的列,看那个列的那些行有相同的值。因此,结果你有一个顾客数据库,并且你是按StateName列分组,MapInfo就会把所有California的顾客放列到另一个组,如此等等。MapInfo然后计算各组的集合信息(总合,均值等)。为指定小计标准:1.在GroupByColumns区,输入MapInfo将用来计算小计的列名或列号例如:如果你要在各个州的基础上合计你的顾客表,输入表示顾客所在的州的列名(例如StateName)到GroupByColumns区2.输入同样的列名(例如StateName)到SelectColumns区。3.在SelectColumns区输入一个或多个集合操作符(Sum,Count,Avg,Min,或Max)。记住,要用逗号分隔这些集合操作符。输入表达式Count(*)。(在SelectColumns区)如果你要计算各州的全部销售(Sales)合计,输入如Sum(Sales)之类的表达式。(这里的Sales是列名)。在SelectColumns区中,那些非集合函数基础的所有列还必须在GroupByColumns区列出。这些是MapInfo为了确定分组要检测的列。这些列具有独特数据值的每一个组在查询表中有一个单独的行。导出列应该用表示相对位置的编号指定,“1”、“2”、“5”分别代表第一、第二和第五列。例如:SelectColumns:Month(sick_date),count(*)
FromToltes:sickdaysGroupByColumns:1这个查询告诉MapInfo,计算每一个有记录的全部行数并生成一个按月分组的查询表。结果表第月有一行,那个行有一个表示有多少人在那月生病的列。在GroupByColumns区,你应该按列名或列编号来引用列(1代表列在SelectColumns区的第一个列)。当你不使用联接时,你可以用正规的字段名。当你用导出列的值分组时,或者如果你联接两个表时,你必须用列号代替列名。按号引用列时,数字前不要加“Col”字样。你可以输入一个以上的列到GroupByColumns区。MapInfo首先按你列出的第一个列来对行进行分组,在那些组中,MapInfo再按第二个列进行再分组,以此类推。对于各个结果行,查询表都含有基于集合函数的全部列的集合值。(这里有一个问题,每一个结果行只能是一个集合函据的结果吗?可否不同的列执行不同的集合函数?)注:在SelectColumns区中,那些基于集合函数的列不能列入GroupByColumns区内。但是,SelectColumns区中那些不是基于集合函数的每一个列应该列入GroupByColumns区内。GroupByColumns的例子(按列分组的例子)设想你有一顾客订单表。表中的各个行代表一分单独的订单。表中有一个列含有接受订单的销售代表的名字,另一个列含有顾客的名字,再有一个列含有订单金额(Amount).对每个销售代表,你想找出:那个销售代表接受的订单数量
那个代表登录的订单平均金额
那个代表填写的订单的总金额
如下的SQLSelect查询产生所要求的结果:SelectColumns:Sales_Rep,count(*),average(Amount),sum(Average)Fromtables:OrderGroupByColumns:Seles_Rep(这意味着按销售代表统计)注意:GroupByColumns区和SelectColumns区的三个集合操作符。Mapinfo要做的是:1.找出对应某一个销售代表的全部行2.计算行数:Count(*)3.计算这个销售代表的定单的平均金额:Avg(Amount)4.计算这个销售代表的定单的总金额:Sum(Amount)MapInfo对每一个销售代表都要做这些工作,然后产生一个对每一个代表有一个单独行的结果表。集合操作符(Count,Avg和Sum)小计有相同销售代表值的全部行的数据值。考虑这样一个SQLSelect:Selectcolumns:Customer,Count(*),Avg(Amount),Sum(Amount)Fromtables:OrdersGroupByColumns:Customer这是一个在体质上与前一个相同的查询,除了我们现在是按顾客分组而不是按销售代表分组外,这个SQLSelect找出订单Count,Average和Sum是针对各个顾客的而不是销售代表的。下面的例子说明按多列分组:多重分组Selectolumns:Sales_Rep,Customer,Count(*),Avg(amount),Sum(Amount)Fromtables:OrdersGroupByColumns:Sales_Rep,Customer在GroupByColumns区,我们指定了两列名,在这种情况下,MapInfo首先按销售代表组合行,然后再按顾客组合。这个查询的结果表对应于每一个不同的顾客棗销售代表组合都有一个行。当某个顾客通过两个或更多的销售代表订货时,那个顾客与第一个销售代表做的生意都有一个行来总结。全部行首先是按销售代表分组,然后,对于各个销售代表,又按顾客分组。集合函数,MapInfo有下列集合函数:Count(*):计算一个组内的记录个数,它仅用*作为其参数是因为它适用于整个
记录,而不是记录中的某个特定字段。Sum(表达式):计算一个组全部记录表达式值的总和Avg(表达式):计算一个组全部记录表达式值的平均值Max(表达式):找出一个组全部记录表达式值中的最大值Min(表达式):找出一个组全部记录表达式值中的最大值以上所述的表达式,最简单的情况是一个字段名(列名)。关于Fromtables这个区告诉MapInfo要查询那些表,你必须在这个区最少输入一个表名。如果你要MapInfo查询两个或更多的表,就要输入用逗号分隔的一系列表名。如果你在这个区输入了两个或两个以上的表名,那么,你还必须在WhereCondition区指定表达式来告诉MapInfo如何连系这些表。如果你输入了两个表名,MapInfo自动计算一个适当的WhereCondition表达式。但是如果你用了三个或更多的表名,你必须手工修改这个表达式。当你按多表联接时,所有的表必须是基础表。你不能把结果表(例如Qurey5)用于多表SQLSelec。关于WhereCondition区这个区有不同的任务,取决于你的查询性质。当你查询一个单表时,该区是可选的(即不填也可)。如果你查询涉及到连接两个或多个表,你必须指定一个WhereCondition表达式,那个表达式必须表明MapInfo应该如何联接这两个表。如果你愿意,你可以在该区输入过滤标准。输入过滤标准的方法是打入一个判断真假的逻辑表达式。例如,当你查询World表时,如果你只选择人口大于5百万的行,就要指定如下的WhereCondition子句:WhereCondition:Population>5000000这个区的数字中间不要打逗号。关于GroupbyColumns区这个区允许你小计你的结果表。如果你输入一个列名(或被逗号分隔的一串列名)到该区,MapInfo就小计你的查询结果,并且只给你显示出小计结果表,而不显示你的表的每个行。计算小计是一个两步曲:1.输入一个(或一组)列名到该区2.输入同样的列名和集合运算器(诸如Sum或Count)到SelectColumns区。GroupbyColumns区是可选的。如果你保留为空(默认的),MapInfo将不计算小计。关于OrderbyColumns区这个区允许你对你的结果表进行排序。如果你输入一个(或被逗号分隔的一组)列名到该区,MapInfo就以你输入的列作为关键字对你结果表的行进行排序。默认是升序,A在B之上,小数在大数之上。降序可在列名后跟一个desc字。例如:OrderbyColumns:Populationdesc该区是可选的,如果空着,结果表将不排序。关于IntotableNamed区这个区允许你命名结果表。默认的结果表名是Selection。如果你要指定一个另外的名字,就把它打入该区。你输入的表名不应该是一个打开的表。如果你频繁使用SQLSelect,并且如果你用selection作为你的结果表名,你会以得到许多左上重叠的结果表(例如Query1,Query2,Query3等)告终。这些Queryn表
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年光电子器件及激光器件项目发展计划
- DB31∕T 478.26-2019 主要工业产品用水定额及其计算方法 第26部分:原水及自来水制水厂行业(原水、自来水)
- 2025年光电测沙仪项目建议书
- 保健食品知识培训课件
- 物流系统分析 课件 任务六 理解物流系统的优化原理
- 2023年北京卷高考真题数学试卷
- 高效解决办公设备使用常见问题
- 协议离婚手续办理流程
- 2025年鹤壁货运从业资格证考试题库答案
- 名雅居营销策划书
- 中央2025年全国妇联所属在京事业单位招聘93人笔试历年参考题库附带答案详解
- 广州2025年广东广州市番禺区小谷围街道办事处下属事业单位招聘5人笔试历年参考题库附带答案详解
- CentOS 7系统配置与管理(Linux 试题库) 习题答案 (杨海艳 第2版)
- 手机直连卫星的可用频率分析
- 2025年春新人教版历史七年级下册课件 第16课-明朝的对外关系
- 施工单位工程质量自评报告三篇
- 《家畜环境卫生学》课件
- 2025年碳化硅(SiC)市场分析现状
- 2024年湖南高速铁路职业技术学院高职单招数学历年参考题库含答案解析
- 2024年沙洲职业工学院高职单招语文历年参考题库含答案解析
- 2024年广东省《辅警招聘考试必刷500题》考试题库【学生专用】
评论
0/150
提交评论