Mapinfo Sql语句查询方法

来源:互联网 发布:php pdo查询数据库 编辑:程序博客网 时间:2024/05/20 13:08

                                      Mapinfo   Sql语句查询方法

                                                                                                 ----曹恒

      

http://wenku.baidu.com/link?url=ZQL-R7MIF6KW2ZnvvREl7ykIhQ_cExSKLz_6S_PJItrFgjeClOb8lNiySvp4Xa1FkQsZDvn0Py4D9zGp7-C8KQEnaaCw8aHx-TknwnVgJbW

 

 

Select * from 基站 where 

objwithin (select  obj  from 折线 where sss="密集市区" )

下面的语句为子查询,子查询状态下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_RepCustomer

        这时mapinfo先按照销售代理、顾客进行分组。改查询结果中每个不同的顾客/销售代理组合都占一行。当某一特定顾客通过两个或者多个销售代理订货时,则该顾客与每个销售代理的业务都用一行来小计。各行先按照销售代理分组,对同一销售代理在按顾客来分组。

按照基站名称分组来计算,sumavg等等!!

MapInfo提供以下聚合函数:

    Count(*):计算一组中记录总数。它简单地使用*作参数,因为它应用到整条记录,而非某个特定字段。

    Sum(表达式):计算一组中所有记录的〈表达式〉总计值。

    Avg(表达式):计算一组中所有记录的〈表达式〉平均值。

    Max(表达式):找出一组中所有记录的〈表达式〉最大值。

    Min(表达式):找出一组中所有记录的〈表达式〉最小值。

 

设置过滤规则:

Select * from Site_List where Freq=”450MHz” and region=”FTR”

 

子查询:
使用子查询的原则

1.一个子查询必须放在圆括号中。

2.将子查询放在比较条件的右边以增加可读性。

子查询不包含ORDER BY 子句。对一个 SELECT 语句只能用一个 ORDER BY 子句,

并且如果指定了它就必须放在主SELECT 语句的最后。

ORDER BY 子句可以使用,并且在进行 Top-N 分析时是必须的。

3.在子查询中可以使用两种比较条件:单行运算符和多行运算符。


子查询的类型

单行子查询:从内SELECT 语句只返回一行的查询

多行子查询:从内SELECT 语句返回多行的查询


单行子查询

单行子查询是从内查询返回一行的查询。在该子查询类型中用一个单行操作符。幻灯片中列出了单行操作符。



显示那些job ID 与雇员141 相同的雇员。

SELECT last_name, job_id  FROM employees  

WHERE job_id =(SELECT job_id FROM employeesWHERE employee_id = 141);

SELECT last_name, job_id, salary FROM employees
     WHERE job_id = (SELECT job_id  FROM employees WHERE employee_id = 141)
AND salary > (SELECT salary FROM employees WHERE employee_id = 143);
显示job ID 与雇员141 相同,并且薪水 高于雇员143 的那些雇员。


注:外和内查询可以从不同的表中取得数据。


SELECT last_name, job_id, salary FROM employees
WHERE salary = (SELECT MIN(salary) FROM employees);

求所有人谁的工资最小。


SELECT department_id, MIN(salary) FROM employees GROUP BY department_id
HAVING MIN(salary) > (SELECT MIN(salary) FROM employees WHERE department_id= 50);
求每个部门的最小工资,但是要高于50号部门的工资。



SELECT employee_id, last_name FROM employees

WHERE salary = (SELECT MIN(salary) FROMemployees GROUP BY department_id);

 


问题出现在:单行子查询返回了多个查询值;改为in
应改为:
SELECT employee_id, last_name FROM employees
    WHERE salaryin (SELECT MIN(salary) FROM employees GROUP BY department_id);

SELECT last_name, job_id FROM employees
   WHERE job_id = (SELECT job_id FROMemployees WHERE last_name = 'Haas');
如果子查询返回的是零值,不会对主程序造成影响;

如果子查询返回的是空值,那么会影响主程序的返回值;

SELECT employee_id,
last_name
FROM employees
WHERE employee_id NOT IN
(SELECT manager_id
FROM employees)

SELECT employee_id,
last_name
FROM employees
WHERE employee_id NOT IN
(SELECT manager_id
FROM employees
WHERE manager_id IS NOT NULL)
放在select下的子查询的返回值必须是一个具体值,

from后面也可以加子查询;

having后面也可以加子查询;

order by后面也可以;


多列子查询适应于:成对比较;非成对比较。


SELECT employee_id, manager_id, department_id
FROM employees
WHERE (manager_id, department_id) IN
(SELECT manager_id, department_id
FROM employees
WHERE employee_id IN (178,174))
AND employee_id NOT IN (178,174);

输出:
176149 80

只有要查询的东西和你子查询返回的东西一一对应上了,你的查询才能成功。

如果有一个 对应不上那么你的查询不会成功。


非成对的子查询:

SELECT employee_id, manager_id, department_id
FROM employees
WHERE manager_id IN (SELECT manager_id
FROM employees
WHERE employee_id IN (174,141))
AND department_id IN (SELECT department_id
FROM employees
WHERE employee_id IN (174,141))
AND employee_id NOT IN(174,141);
输出:
144124 50
143 124 50
142 124 50
176 149 80
上面两个程序就是成对子查询和非成对子查询两者之间的区别。



如果我想去显示员工信息,要求:员工的工资高于本部门的平均工资。

SELECT a.last_name,
a.salary,
a.department_id
FROM employees a
WHERE a.salary >
(SELECT AVG(salary)
FROM employees b
WHERE b.department_id = a.department_id);

in line view(内联视图
)

SELECT a.last_name, a.salary,
a.department_id, b.salavg
FROM employees a, (SELECT department_id,
AVG(salary) salavg
FROM employees
GROUP BY department_id) b
WHERE a.department_id = b.department_id
AND a.salary > b.salavg;

 

最后,对于再选择有几点注意事项:

     在再选择中你可以使用在FromTable区中未列出的表.但是你必须把这些表列在你的再选择的From子句中。
      当再选择带有关键字”any”或”all”时,再选择必须并且只能返回一个列(一列的所有值)。下面的句例是无效的,因为它试图返回两个列(State_name和Pop_1990):
Any(Select state_name,pop_1990 from state)

     当再选择不带”any”、“all”或“in”时,再选择必须准确返回一个行的值(一个行的值,不能用or或者and。下面的例子是无效的,因为再选择返回了一组行:
obj within(Select obj from state where Pop_1990>2000000)

 

obj within any(select  obj from 折线 where  sss ="密集市区"or sss = "一般市区")

any可以使用判断语句,来用进行多重子选择。上例中,只能用any,不能用allall就是全部的意思,可以不用选择了。

 

within连接两个图形,生成如下表格,两个表格会根据obj的关系而互相连接起来。

 

如何解决区域包含问题:

    实际对象中,经常会遇到区域包蕴但是不能分离的情况,也就是大区域包含小区。当选中小区域时,大区域也被同时选中,无法单独选中小区域,解决的办法:

A:分割内区域,选中小区域时大区域不被选中

     1)、选中大区域,“对象---转为折线”并设置小区域为目标;

    2)、将原大区域的折线转换为区域;

     3)、“对象分割”,出现数据对话框时间,选择“无数据”,

   小区域被分割出来了。

B:第二次分割

     1)、选中大区域,设置为目标,在选中小区域,“对象---分割”。

 

 

区域分类,按照区域进行汇总,首先需要RFcon.objwithin _2G区域划分.obj让两个表连接起来,然后进行分类:

 

                                  

 

 

    Mapinfo   Sql语句查询方法

                                                                                                 ----曹恒

      

Select * from 基站 where 

objwithin (select  obj  from 折线 where sss="密集市区" )

下面的语句为子查询,子查询状态下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_RepCustomer

        这时mapinfo先按照销售代理、顾客进行分组。改查询结果中每个不同的顾客/销售代理组合都占一行。当某一特定顾客通过两个或者多个销售代理订货时,则该顾客与每个销售代理的业务都用一行来小计。各行先按照销售代理分组,对同一销售代理在按顾客来分组。

按照基站名称分组来计算,sumavg等等!!

MapInfo提供以下聚合函数:

    Count(*):计算一组中记录总数。它简单地使用*作参数,因为它应用到整条记录,而非某个特定字段。

    Sum(表达式):计算一组中所有记录的〈表达式〉总计值。

    Avg(表达式):计算一组中所有记录的〈表达式〉平均值。

    Max(表达式):找出一组中所有记录的〈表达式〉最大值。

    Min(表达式):找出一组中所有记录的〈表达式〉最小值。

 

设置过滤规则:

Select * from Site_List where Freq=”450MHz” and region=”FTR”

 

子查询:
使用子查询的原则

1.一个子查询必须放在圆括号中。

2.将子查询放在比较条件的右边以增加可读性。

子查询不包含ORDER BY 子句。对一个 SELECT 语句只能用一个 ORDER BY 子句,

并且如果指定了它就必须放在主SELECT 语句的最后。

ORDER BY 子句可以使用,并且在进行 Top-N 分析时是必须的。

3.在子查询中可以使用两种比较条件:单行运算符和多行运算符。


子查询的类型

单行子查询:从内SELECT 语句只返回一行的查询

多行子查询:从内SELECT 语句返回多行的查询


单行子查询

单行子查询是从内查询返回一行的查询。在该子查询类型中用一个单行操作符。幻灯片中列出了单行操作符。



显示那些job ID 与雇员141 相同的雇员。

SELECT last_name, job_id  FROM employees  

WHERE job_id =(SELECT job_id FROM employeesWHERE employee_id = 141);

SELECT last_name, job_id, salary FROM employees
     WHERE job_id = (SELECT job_id  FROM employees WHERE employee_id = 141)
AND salary > (SELECT salary FROM employees WHERE employee_id = 143);
显示job ID 与雇员141 相同,并且薪水 高于雇员143 的那些雇员。


注:外和内查询可以从不同的表中取得数据。


SELECT last_name, job_id, salary FROM employees
WHERE salary = (SELECT MIN(salary) FROM employees);

求所有人谁的工资最小。


SELECT department_id, MIN(salary) FROM employees GROUP BY department_id
HAVING MIN(salary) > (SELECT MIN(salary) FROM employees WHERE department_id= 50);
求每个部门的最小工资,但是要高于50号部门的工资。



SELECT employee_id, last_name FROM employees

WHERE salary = (SELECT MIN(salary) FROMemployees GROUP BY department_id);

 


问题出现在:单行子查询返回了多个查询值;改为in
应改为:
SELECT employee_id, last_name FROM employees
    WHERE salaryin (SELECT MIN(salary) FROM employees GROUP BY department_id);

SELECT last_name, job_id FROM employees
   WHERE job_id = (SELECT job_id FROMemployees WHERE last_name = 'Haas');
如果子查询返回的是零值,不会对主程序造成影响;

如果子查询返回的是空值,那么会影响主程序的返回值;

SELECT employee_id,
last_name
FROM employees
WHERE employee_id NOT IN
(SELECT manager_id
FROM employees)

SELECT employee_id,
last_name
FROM employees
WHERE employee_id NOT IN
(SELECT manager_id
FROM employees
WHERE manager_id IS NOT NULL)
放在select下的子查询的返回值必须是一个具体值,

from后面也可以加子查询;

having后面也可以加子查询;

order by后面也可以;


多列子查询适应于:成对比较;非成对比较。


SELECT employee_id, manager_id, department_id
FROM employees
WHERE (manager_id, department_id) IN
(SELECT manager_id, department_id
FROM employees
WHERE employee_id IN (178,174))
AND employee_id NOT IN (178,174);

输出:
176149 80

只有要查询的东西和你子查询返回的东西一一对应上了,你的查询才能成功。

如果有一个 对应不上那么你的查询不会成功。


非成对的子查询:

SELECT employee_id, manager_id, department_id
FROM employees
WHERE manager_id IN (SELECT manager_id
FROM employees
WHERE employee_id IN (174,141))
AND department_id IN (SELECT department_id
FROM employees
WHERE employee_id IN (174,141))
AND employee_id NOT IN(174,141);
输出:
144124 50
143 124 50
142 124 50
176 149 80
上面两个程序就是成对子查询和非成对子查询两者之间的区别。



如果我想去显示员工信息,要求:员工的工资高于本部门的平均工资。

SELECT a.last_name,
a.salary,
a.department_id
FROM employees a
WHERE a.salary >
(SELECT AVG(salary)
FROM employees b
WHERE b.department_id = a.department_id);

in line view(内联视图
)

SELECT a.last_name, a.salary,
a.department_id, b.salavg
FROM employees a, (SELECT department_id,
AVG(salary) salavg
FROM employees
GROUP BY department_id) b
WHERE a.department_id = b.department_id
AND a.salary > b.salavg;

 

最后,对于再选择有几点注意事项:

     在再选择中你可以使用在FromTable区中未列出的表.但是你必须把这些表列在你的再选择的From子句中。
      当再选择带有关键字”any”或”all”时,再选择必须并且只能返回一个列(一列的所有值)。下面的句例是无效的,因为它试图返回两个列(State_name和Pop_1990):
Any(Select state_name,pop_1990 from state)

     当再选择不带”any”、“all”或“in”时,再选择必须准确返回一个行的值(一个行的值,不能用or或者and。下面的例子是无效的,因为再选择返回了一组行:
obj within(Select obj from state where Pop_1990>2000000)

 

obj within any(select  obj from 折线 where  sss ="密集市区"or sss = "一般市区")

any可以使用判断语句,来用进行多重子选择。上例中,只能用any,不能用allall就是全部的意思,可以不用选择了。

 

within连接两个图形,生成如下表格,两个表格会根据obj的关系而互相连接起来。

 

如何解决区域包含问题:

    实际对象中,经常会遇到区域包蕴但是不能分离的情况,也就是大区域包含小区。当选中小区域时,大区域也被同时选中,无法单独选中小区域,解决的办法:

A:分割内区域,选中小区域时大区域不被选中

     1)、选中大区域,“对象---转为折线”并设置小区域为目标;

    2)、将原大区域的折线转换为区域;

     3)、“对象分割”,出现数据对话框时间,选择“无数据”,

   小区域被分割出来了。

B:第二次分割

     1)、选中大区域,设置为目标,在选中小区域,“对象---分割”。

 

 

区域分类,按照区域进行汇总,首先需要RFcon.objwithin _2G区域划分.obj让两个表连接起来,然后进行分类:

 

0 0