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_Rep,Customer
这时mapinfo先按照销售代理、顾客进行分组。改查询结果中每个不同的顾客/销售代理组合都占一行。当某一特定顾客通过两个或者多个销售代理订货时,则该顾客与每个销售代理的业务都用一行来小计。各行先按照销售代理分组,对同一销售代理在按顾客来分组。
按照基站名称分组来计算,sum,avg等等!!
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,不能用all,all就是全部的意思,可以不用选择了。
用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_Rep,Customer
这时mapinfo先按照销售代理、顾客进行分组。改查询结果中每个不同的顾客/销售代理组合都占一行。当某一特定顾客通过两个或者多个销售代理订货时,则该顾客与每个销售代理的业务都用一行来小计。各行先按照销售代理分组,对同一销售代理在按顾客来分组。
按照基站名称分组来计算,sum,avg等等!!
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,不能用all,all就是全部的意思,可以不用选择了。
用within连接两个图形,生成如下表格,两个表格会根据obj的关系而互相连接起来。
如何解决区域包含问题:
实际对象中,经常会遇到区域包蕴但是不能分离的情况,也就是大区域包含小区。当选中小区域时,大区域也被同时选中,无法单独选中小区域,解决的办法:
A:分割内区域,选中小区域时大区域不被选中
1)、选中大区域,“对象---转为折线”并设置小区域为目标;
2)、将原大区域的折线转换为区域;
3)、“对象—分割”,出现数据对话框时间,选择“无数据”,
小区域被分割出来了。
B:第二次分割
1)、选中大区域,设置为目标,在选中小区域,“对象---分割”。
区域分类,按照区域进行汇总,首先需要RFcon.objwithin _2G区域划分.obj让两个表连接起来,然后进行分类: