《mapinfo sql语句查询方法-葵花宝典20080910》由会员分享,可在线阅读,更多相关《mapinfo sql语句查询方法-葵花宝典20080910(8页珍藏版)》请在金锄头文库上搜索。
1、 Mapinfo Sql 语句查询方法-曹恒Select * from 基站 where obj within (select obj from 折线 where sss=“密集市区“ )下面的语句为子查询,子查询状态下 from 不需要列两个表,只是在()内声明另外一个表即可。注:注: Mapinfo 允许允许 sql 选择中有子选择,子选择是被放在选择中有子选择,子选择是被放在“SQL 选择选择”对话框的对话框的“条件条件”语句语句Mapinfo 首先对子选择进行求值,接着使用子选择的求值首先对子选择进行求值,接着使用子选择的求值结果来对主结果来对主 sql 选择进行求值。子选择必须用括号
2、括起来,最有选择进行求值。子选择必须用括号括起来,最有用的例子如用的例子如: select 列列 from 表表 where 条件条件按列分组:按列分组:对查询的结果进行分组,并计算。对查询的结果进行分组,并计算。多重分组:多重分组:1. 按列分组示例按列分组示例 设想有一个顾客订单表。该表中每一行表示单个订单。表中一列包含订设想有一个顾客订单表。该表中每一行表示单个订单。表中一列包含订货销售代理的名字,另一列含有顾客名字,还有一列包含订货量。货销售代理的名字,另一列含有顾客名字,还有一列包含订货量。对每个销售代理,可找出:对每个销售代理,可找出: 该代理的订单数目。该代理的订单数目。 该代理
3、的平均订货量。该代理的平均订货量。 该代理的总订货该代理的总订货量。量。选择列选择列 sales_Rep,count(*),average(AMOUNT), sum(AMOUNT)从表从表 Orders 按列分组按列分组 Sales_Rep 按照多列分组:按照多列分组:选择列选择列 sales_Rep,count(*),average(AMOUNT), sum(AMOUNT)从表从表 Orders 按列分组按列分组 Sales_Rep ,Customer这时 mapinfo 先按照销售代理、顾客进行分组。改查询结果中每个不同的顾客/销售代理组合都占一行。当某一特定顾客通过两个或者多个销售代理订
4、货时,则该顾客与每个销售代理的业务都用一行来小计。各行先按照销售代理分组,对同一销售代理在按顾客来分组。按照基站名称分组来计算,按照基站名称分组来计算,sum,avg 等等!等等!MapInfo 提供以下聚合函数:提供以下聚合函数:Count(*):计算一组中记录总数。它简单地使用计算一组中记录总数。它简单地使用*作参数,因为它应用到整条记作参数,因为它应用到整条记 录,而非某个特定字段。录,而非某个特定字段。Sum(表达式表达式):计算一组中所有记录的:计算一组中所有记录的表达式表达式总计值。总计值。Avg(表达式表达式):计算一组中所有记录的:计算一组中所有记录的表达式表达式平均值。平均值
5、。Max(表达式表达式):找出一组中所有记录的:找出一组中所有记录的表达式表达式最大值。最大值。Min(表达式表达式):找出一组中所有记录的:找出一组中所有记录的表达式表达式最小值。最小值。 设置过滤规则:设置过滤规则:Select * from Site_List where Freq=”450MHz” and region=”FTR”子查询: 使用子查询的原则 1.一个子查询必须放在圆括号中。 2.将子查询放在比较条件的右边以增加可读性。 子查询不包含 ORDER BY 子句。对一个 SELECT 语句只能用一个 ORDER BY 子句, 并且如果指定了它就必须放在主 SELECT 语句的
6、最后。 ORDER BY 子句可以使用,并且在进行 Top-N 分析时是必须的。 3.在子查询中可以使用两种比较条件:单行运算符和多行运算符。 子查询的类型 单行子查询:从内 SELECT 语句只返回一行的查询 多行子查询:从内 SELECT 语句返回多行的查询 单行子查询 单行子查询是从内查询返回一行的查询。在该子查询类型中用一个单行操作符。幻灯片中 列出了单行操作符。 例 显示那些 job ID 与雇员 141 相同的雇员。 SELECT last_name, job_id FROM employees WHERE job_id =(SELECT job_id FROM employees
7、 WHERE 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,
8、 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 FR
9、OM employees WHERE salary = (SELECT MIN(salary) FROM employees GROUP BY department_id); 问题出现在:单行子查询返回了多个查询值;问题出现在:单行子查询返回了多个查询值; 应改为: SELECT employee_id, last_name FROM employees WHERE salary in (SELECT MIN(salary) FROM employees GROUP BY department_id); SELECT last_name, job_id FROM employees WHERE
10、 job_id = (SELECT job_id FROM employees 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 ma
11、nager_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
12、 WHERE employee_id IN (178,174) AND employee_id NOT IN (178,174); 输出:176 149 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 depa
13、rtment_id IN (SELECT department_id FROM employees WHERE employee_id IN (174,141) AND employee_id NOT IN(174,141); 输出:144 124 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
14、(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
15、.salary b.salavg;最后,对于再选择有几点注意事项:在再选择中你可以使用在 From Table 区中未列出的表.但是你必须把这些表列 在你的再选择的 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_19902000000)obj within any(select obj from 折线 where sss = “密集市区“ or sss = “一般市区“) 用用 any 可以使用判断语句,来用进行多重子选择。上例中,只能用可以使用判断语句,来用进行多重子选择。上例中,只能用 any,不能,不能 用用 all,all 就是全部的意思,可以不用选择了。就是全部的意思,可以不用选择了。用用 within 连接两个图