子查询转换成连接查询又可以分为两种情况,一种是不带聚合的子查询转换,另一种就是带有聚合函数的转换
一、不带聚合函数的子查询转换:
以下是一组测试数据:
- use mytest;
- drop table if exists jobs;
- CREATE TABLE jobs(
- employee varchar(30),
- title varchar(30)
- );
- drop table if exists ranks;
- CREATE TABLE ranks(
- title varchar(30),
- rank varchar(30)
- );
- drop table if exists salary;
- CREATE TABLE salary(
- rank varchar(30),
- payment int(11)
- );
-
- insert into jobs values('张三','经理'),('李四','总经理'),('王五','总经理助理');
- insert into ranks values('经理','三'),('总经理','一'),('总经理助理','二');
- insert into salary values('一',20000),('二',8000),('三',7000),('四',7000);
建立了三个表,分别是jobs员工工作表,记录了员工的工作,第二表ranks是岗位等级表,记录每一个工作岗位的等级,第三个表slary自然就是HR为每一个等级的定的薪资标准了。
现在要知道张三的工资是多少,就需要使用三张表才能得到数据,
使用子查询的方法如下:
- select payment from salary
- where rank=(
- SELECT rank from ranks
- where title=(
- SELECT title from jobs
- where employee='张三')
- );
转换为连接查询的步骤大致有如下几点:
1、使用表名或者表别名标记所有的列,如显jobs.employee 或者j.employee;
2、将几个子查询的From子名中使用的相同的表用同一个名字或同一别名;
3、将几个Form子句放在一起;
4、将Select及查询的列删除;
5、将第一个之后的Where替换成AND
最后得到如下结果:
- select payment from salary s,ranks r,jobs j
- where j.employee='张三'
- and j.title = r.title
- and s.rank = r.rank;
对于需要排除某些条件的查询,如查询岗位等级表中在薪资表中没有工资级别的等级:
- select salary.rank
- from salary
- where rank
- not in(select rank from ranks);
使用not in、exists、not exists不失为一种好方法,但同样可以转换成连接查询。如以上的查询可以转换为:
- select salary.rank
- from salary left join ranks
- on salary.rank=ranks.rank
- where ranks.rank is null;
二、带聚合函数的子查询向连接查询转换
如下测试数据,有一个订单表,记录了销售人员每天的销售记录,测试数据如下:
- DROP TABLE if exists orders;
- create table orders(
- customer varchar(30),
- whn date,
- totalitems int(11)
- );
- insert into orders values('jj','2010-10-10',5),
- ('jj','2010-10-11',3),
- ('jj','2010-10-12',1),
- ('aa','2010-10-10',5),
- ('bb','2010-10-10',8),
- ('cc','2010-10-10',10);
需要查询每一个销售员最高销售额的日期及销售额时,必然用的聚合函数MAX,以下是最容易想到的查询方式:
- select customer,whn,totalitems
- from orders o1 where o1.totalitems=(
- SELECT max(totalitems)
- from orders o2
- where o1.customer = o2.customer
- );
此时需要对每一行订单都要进行子查询,因此代码运行速度会很慢,并且老版本的MySQL还不支持子查询,只有一个表,要改成连接查询自然就是自连接了,这里我们需要使用Having子句,
- select o1.* from orders o1 join orders o2
- on(o1.customer=o2.customer)
- group by o1.customer
- having o1.totalitems=max(o2.totalitems
- );
分享到:
相关推荐
数据库子查询数据库子查询数据库子查询数据库子查询数据库子查询数据库子查询数据库子查询数据库子查询数据库子查询数据库子查询数据库子查询数据库子查询数据库子查询数据库子查询数据库子查询数据库子查询数据库子...
oracle笔记子查询,有子查询相关的知识点笔记和具体的案例代码!
Mybatis框架(子查询)
3.子查询及组合 4.数据控制、数据导入/导出、数据备份和恢复 实验1 SQL SEVER 2000的系统工具、使用交互方式建库、建表实验 实验目的和要求:了解SQL SEVER 2000的功能及组成,熟练掌握利用SQL SEVER 2000企业管理...
在相关子查询中,子查询的执行依赖于外部查询,即子查询的查询条件依赖于外部查询的某个属性值。 执行过程:;在相关子查询中,子查询的执行依赖于外部查询,而嵌套子查询中,子查询的执行不依赖于外部查询。 执行...
使用In的子查询.rar使用In的子查询.rar使用In的子查询.rar
子查询相关练习,子查询最好的文档。最好的文档有。
子查询是指一条SELECT语句作为另一条SELECT语句的一部分,外层的SELCT语句称为外部查询,内层的SELECT语句称为内部查询(或子查询).doc
在SQL语言中,当一个查询语句嵌套在另一个查询的查询条件之中时,称为子查询。
数据库连接查询、子查询、嵌套查询、汇总数据
sql 子查询应用 教你如何使用sql 子查询指令,含实例说明。
复杂相关子查询 动画版
关于电影公司的数据库设计建模 包括 select语句 子查询,语句嵌套等
Oracle经典教程3——子查询和常用函数
oracle中的子查询使用场合,种类,使用方法,错误排除
oracle表连接和子查询实例 所有的实例查询都包含在里面,不会担心笔试oracle子查询。
Hibernate 函数 ,子查询 和原生SQL查询。Hibernate 函数 ,子查询 和原生SQL查询
数据库的高级查询,子查询实例数据库的高级查询,子查询实例数据库的高级查询,子查询实例
第09章_子查询讲师:尚硅谷-宋红康(江湖人称:康师傅)【题目】#1.查询和Zlotkey相同部门的员工姓名和工资#2.查询工资比公司平均工资高的员工的员工号,
oracle子查询学习教案.pptx