oracle中子查询
定义,就是指查询中嵌套查询。
子查询可以出现在很多位置,比如: 当列、当表、当条件等
语法:
SELECT (子查询)
FROM (子查询)
WHERE (子查询)
GROUP BY 子句
HAVING (子查询)
ORDER BY 子句
注:子查询要用括号括起来。
如:
-- 找出与Ben同一个部门的员工
--第一步:先找出Ben所在的部门
select dept_id from s_emp where first_name = 'Ben';
--第二步:找出该部门的所有员工
select first_name from s_emp where dept_id = 数值
--第三步:
select first_name from s_emp where dept_id =(select dept_id from s_emp where first_name = 'Ben') and first_name != 'Ben';
如:
-- 查询出顾客名及他拥有的订单数
--第一步:
select c.name,订单数 from s_customer c;
--第二步:订单数
select c.name,count(o.id) from s_ord o right join s_customer c on o.customer_id = c.id group by c.name;
--第三步:合并
select c.name,(select count(*) from s_ord o where o.customer_id = c.id) from s_customer c;
select c.name,count(o.id) from s_ord o
right join s_customer c on o.customer_id = c.id
group by c.name;
-- 查询出部门名及此部门的员工数。 [使用子查询]
select c.name,(select count(*) from s_emp e where e.dept_id = c.id) from s_dept c;
-- 查询出工资超过公司平均工资 的员工.
--第一步
select avg(salary ) from s_emp
--第二步
select first_name from s_emp where salary >第一步
--3合并
select salary,(select avg(salary) from s_emp),first_name from s_emp where salary > (select avg(salary) from s_emp) ;
-- 查询部门平均工资超过公司平均工资的部门
select e.dept_id,avg(salary) 部门平均工资,d.name
from s_emp e join s_dept d on e.dept_id=d.id
group by e.dept_id,d.name
having avg(salary)>(select avg(salary) from s_emp);
子查询分类
1. 无关子查询
是指子查询中没有使用外部查询所定义的变量/别名。
2. 相关子查询
是指子查询中要使用外部查询所定义的变量/别名。