Mapinfo Sql语句查询方法-葵花宝典20080910.doc_第1页
Mapinfo Sql语句查询方法-葵花宝典20080910.doc_第2页
Mapinfo Sql语句查询方法-葵花宝典20080910.doc_第3页
Mapinfo Sql语句查询方法-葵花宝典20080910.doc_第4页
Mapinfo Sql语句查询方法-葵花宝典20080910.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Mapinfo Sql语句查询方法 -曹恒Select * from 基站 where obj within (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 employees 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, 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) 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 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 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); 输出: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 department_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 (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;最后,对于再选择有几点注意事项: 在再选择中你可以使用在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连接两个图形,生成如下表格,两个表格会根据obj的关系而互相连接起来。如何解决区域包含问题: 实际对象中,经常会遇到区域包蕴但是不能分离的情况,也就是大区域包含小区。当选中小区域时,大区域也被

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论