Oracle常用sql语句(三)之子查询

子查询

子查询要解决的问题,不能一步求解

分为:

  • 单行子查询
  • 多行子查询

语法:

	SELECT select_list
	FROM table
	WHERE expr operator (SELECT select_list
						 FROM   table);
  • 子查询(内查询)在住查询之前一次执行完成
  • 子查询的记过被主查询使用(外查询)

注意:
1.括号
2.合理的书写风格
3.可以在住查询的 WHERE SELECT HAVING FROM 后面使用子查询
4.不可以在GROUP BY 后面使用
5.强调FROM后面的子查询
6.主查询和子查询可以不是同一张表;只用子查询返回的结果,主查询可以使用即可
7.一般不在子查询中排序;但在top-n分析问题中
8.一般先执行子查询,在执行主查询;但相关子查询例外
9.单行子查询只能使用单行操作符;多行子查询只能使用多行子查询
10.子查询中的null:单行的子查询,多行子查询

解释:

  • 5、强调from后面的子查询
    查询员工信息:员工号 姓名 月薪
SELECT
	* 
FROM
	( SELECT empno, ename, sal FROM emp );

查询员工信息:员工号 姓名 月薪 年薪

SELECT
	* 
FROM
	(
SELECT
	empno,
	ename,
	sal,
	sal * 12 annsal 
FROM
	emp)
  • 6、主查询和子查询可以不是同一张表;只有子查询返回的结果 主查询可以使用 即可
    查询部门名称是SALES的员工
SELECT
	* 
FROM
	emp 
WHERE
	deptno = ( SELECT deptno FROM dept WHERE dname = 'SALES' );
  • 7.一般不在子查询中排序;但在top-n分析问题中

– 找到员工表中工资最高的三名员工

SELECT
	empno,
	ename,
	sal 
FROM
	( SELECT * FROM emp ORDER BY sal DESC ) 
WHERE
	ROWNUM < 4
  • 8.一般先执行子查询,在执行主查询;但相关子查询例外

相关子查询:

  • 找到员工表中薪水大于本部门平均薪水的员工
-- 一般方法
SELECT
	e.ename,
	e.sal,
	e.deptno,
	d.avgsal 
FROM
	emp e,
	( SELECT deptno, AVG( sal ) avgsal FROM emp GROUP BY deptno ) d 
WHERE
	e.deptno = d.deptno 
	AND e.sal > d.avgsal
 
-- 相关子查询
SELECT
	empno,
	ename,
	sal,
	( SELECT avg( sal ) FROM emp WHERE deptno = e.deptno ) avgsal 
FROM
	emp e 
WHERE
	sal > (SELECT avg( sal ) 
		   FROM  emp 
		   WHERE deptno = e.deptno)
  • 10.子查询中的null
    in关键字中可以有null
    not in 中有null就会查不到数据原因如下
  • not in 等同于 <>ALL

集合运算

这里写图片描述

INTERSECT(交集),返回两个查询共有的记录。

UNION ALL(并集),返回各个查询的所有记录,包括重复记录。

UNION(并集),返回各个查询的所有记录,不包括重复记录。

MINUS(补集),返回第一个查询检索出的记录减去第二个查询检索出的记录之后剩余的记录。

注意的问题:
1、参与运算的各个集合必须列数相同 且类型一致(列数不够可以用,to_number(null)、to_char(null)等去填充
2、采用第一个集合作为最后的表头
3、order by永远在最后
4、括号,改变执行顺序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值