SQL子查询

本文主要介绍SQL的子查询语句。

====================================================================================================================================

查询中嵌套查询的形式即为应用SQL子查询的形式。

 

<pre name="code" class="sql">SELECT table1.field1, table2.field2 FROM table1 NATURAL JOIN table2 WHERE field3 = (SELECT ……)
#上述形式即为使用了SQL的子查询功能 “SELECT table1.field1, table2.field2 FROM table1 NATURAL JOIN table2 WHERE field3 =”称为外层查询
#“(SELECT ……)”为内层查询
 
#当然如下形式也是子查询的应用
SELECT table1.field1, (SELECT ……) AS fied2 FROM table1 NATURAL JOIN table2;

  • 非关联子查询

若子查询可以独自运行,且不需要引用外层的查询结果,则该子查询为非关联子查询。

SELECT table1.field1, (SELECT field2 FROM table2) AS field2 FROM table1 NATURAL JOIN table2;
#该查询中,其子查询部分未引用和外层查询相关的内容,所以为非关联子查询

  • 关联子查询

关联子查询值内存查询的解析过程中需要引用外层查询的结果。

SELECT t1.field1, (SELECT field2 FROM t2) AS field2 FROM table1 AS t1 NATURAL JOIN table2 AS t2;
#该查询中,其子查询部分引用和外层查询相关的内容(“SELECT field2 FROM t2” t2是在外层查询里解析的),所以其为关联子查询。
#关联子查询通常用来寻找外层查询中不在关联结果中的项,常与“NOT EXISTS”搭配。
SELECT t1.field1, t2.field2 FROM table1 AS t1 NATURAL JOIN table2 AS t2 WHERE t1.field3 =/>/</<=/>=/NOT EXISTS/EXISTS (SELECT t2.field3 FROM t2) ;


### SQL 子查询使用指南与示例 SQL 子查询是指在一个 SQL 查询语句中嵌套另一个查询语句。子查询可以出现在 `SELECT`、`INSERT`、`UPDATE` 或 `DELETE` 语句中,通常用于提供动态数据或条件过滤。以下是一些常见的子查询用法及其示例。 #### 1. 基本子查询 基本子查询通常用于从表中检索单一值,并将其作为主查询的条件。 ```sql SELECT ename, sal FROM emp WHERE sal > (SELECT AVG(sal) FROM emp); ``` 上述查询返回所有薪资高于平均薪资的员工姓名和薪资[^1]。 #### 2. 相关子查询 相关子查询是指子查询依赖于外部查询中的列,每次执行外部查询时,子查询都会重新计算。 ```sql SELECT e.* FROM employees e WHERE salary > (SELECT AVG(salary) FROM employees WHERE dept_id = e.dept_id); ``` 此查询返回每个部门中薪资高于该部门平均薪资的员工信息[^2]。 #### 3. 内联视图子查询 内联视图子查询是将子查询的结果集作为虚拟表使用,通常用于排序或限制结果行数。 ```sql -- 获取按薪资排序的所有员工 SELECT ename, job, sal, rownum FROM (SELECT ename, job, sal FROM emp ORDER BY sal); -- 获取薪资最低的前5名员工 SELECT ename, job, sal, rownum FROM (SELECT ename, job, sal FROM emp ORDER BY sal) WHERE rownum <= 5; ``` 这些查询展示了如何通过子查询对结果进行排序和限制[^4]。 #### 4. 在 `HAVING` 子句中使用子查询 在聚合函数中使用子查询可以帮助实现更复杂的过滤条件。 ```sql SELECT deptno, job, AVG(sal) FROM emp GROUP BY deptno, job HAVING AVG(sal) > (SELECT sal FROM emp WHERE ename = 'MARTIN'); ``` 此查询返回所有平均薪资高于员工 MARTIN 薪资的部门及其职位。 #### 5. 子查询优化技巧 对于相关子查询,由于每次外部查询都会重新计算子查询,因此性能可能较差。可以通过索引优化或改写为连接查询来提高效率[^3]。 ```sql -- 使用连接查询替代相关子查询 SELECT e1.* FROM employees e1 JOIN (SELECT dept_id, AVG(salary) AS avg_salary FROM employees GROUP BY dept_id) e2 ON e1.dept_id = e2.dept_id WHERE e1.salary > e2.avg_salary; ``` ### 注意事项 - 子查询必须包含在圆括号中。 - 子查询可以返回单个值、一行或多行,但需要根据上下文正确使用。 - 对于复杂查询,建议使用索引或优化查询逻辑以提高性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值