FROM中子查询

 select e.ename,subq.loc
     from emp e,
      (select deptno,loc from dept where loc in('NEW YORK','DALLAS') ) subq
   where e.deptno=subq.deptno;
ENAME      LOC
---------- -------------
CLARK      NEW YORK
KING       NEW YORK
MILLER     NEW YORK
……
SQL> select ename,job,sal,rownum
    from (select ename,job,sal from emp order by sal)
     where rownum<=3;
ENAME      JOB              SAL     ROWNUM
---------- --------- ---------- ----------
SMITH      CLERK            800          1
JAMES      CLERK            950          2
ADAMS      CLERK           1100        3

 

《ps》 主要解决主查询中读取子查询中的列信息,类似  select aaa,bbb from A, B;

### 子查询的基本概念与分类 子查询是指在一个SQL查询语句中嵌套另一个查询语句,通常用于实现复杂的查询逻辑。子查询可以分为标量子查询、多行子查询、多列子查询以及相关子查询[^2]。标量子查询返回单个值,常用于比较操作;多行子查询返回多个值,通常用于`IN`、`NOT IN`等操作;多列子查询则返回多个列和多个行的结果;而相关子查询依赖于外部查询的值,通常在每一行上执行一次。 ### 子查询的使用方法 #### 非相关子查询示例 非相关子查询独立于外部查询,可以在任何上下文中执行。例如,查找高于公司平均工资的员工信息: ```sql SELECT employee_id, first_name, last_name, salary FROM employees WHERE salary > (SELECT AVG(salary) FROM employees); ``` 该查询通过内部子查询计算出平均工资,并作为条件用于外部查询筛选出高于平均工资的员工记录[^4]。 #### 相关子查询示例 相关子查询依赖于外部查询中的某个字段,以下是一个典型的示例,用于查找每个部门中工资高于该部门平均工资的员工: ```sql SELECT e.employee_id, e.first_name, e.last_name, e.salary FROM employees e WHERE e.salary > ( SELECT AVG(salary) FROM employees WHERE department_id = e.department_id ); ``` 在这个查询中,子查询根据外部查询中的`department_id`动态计算每个部门的平均工资,并用于筛选符合条件的员工记录[^1]。 ### 子查询与JOIN操作的对比 虽然子查询能够实现复杂的数据检索逻辑,但在某些情况下,使用`JOIN`操作可能更高效。例如,使用`INNER JOIN`替代子查询来查找相同的结果: ```sql SELECT e.employee_id, e.first_name, e.last_name, e.salary FROM employees e INNER JOIN ( SELECT department_id, AVG(salary) AS avg_salary FROM employees GROUP BY department_id ) dept_avg ON e.department_id = dept_avg.department_id AND e.salary > dept_avg.avg_salary; ``` 此查询通过派生表(子查询生成的临时表)与主表进行连接,实现了与相关子查询相同的功能,但可能具有更好的性能。 ### 优化子查询的策略 为了提升数据库查询效率,优化子查询是关键。以下是几个常见的优化策略: - **避免不必要的子查询**:如果可以通过简单的`JOIN`操作实现目标,则优先使用`JOIN`。 - **使用索引**:确保子查询涉及的字段已建立适当的索引,以加速数据检索。 - **限制结果集**:在子查询中使用`LIMIT`或`TOP`限制返回的行数,特别是在只需要一个值时。 - **缓存子查询结果**:对于重复使用的子查询,可以考虑将其结果存储到临时表中,避免多次执行相同的计算[^1]。 ### 实际开发中的应用技巧 在实际开发过程中,子查询常用于处理复杂的业务需求,例如: - **动态计算指标**:如计算当前用户的订单总数、平均消费金额等。 - **条件过滤**:基于其他表的数据动态筛选记录。 - **数据聚合**:结合`GROUP BY`和`HAVING`子句,实现更灵活的数据分析功能。 ### 拓展内容:子查询与窗口函数的对比 随着MySQL 8.0引入了窗口函数,一些原本需要子查询完成的任务现在可以通过窗口函数更高效地实现。例如,使用窗口函数计算每个部门的平均工资并筛选出高于平均工资的员工: ```sql SELECT employee_id, first_name, last_name, salary, AVG(salary) OVER(PARTITION BY department_id) AS avg_salary FROM employees HAVING salary > avg_salary; ``` 该查询使用`AVG()`窗口函数按部门分区计算平均工资,并在`HAVING`子句中直接用于筛选符合条件的员工记录,避免了使用相关子查询带来的性能开销[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值