ORACLE数据库---子查询
来源:互联网 发布:阿里云数据同步 编辑:程序博客网 时间:2024/06/06 09:03
ORACLE子查询
全篇重点
一.概念
当一个查询是另一个查询的条件时.称之为子查询.
说明: 主查询的条件要啥,子查询返回的结果就要是啥
二.分类
所有的子查询必须在()中编写代码.子查询分为以下三类:
1.单列子查询:返回一列记录
2.单行子查询:返回一行记录
3.多行子查询:返回多行记录
4.多列子查询:返回多列记录
三.语法
SELECT select_list FROMtable
WHERE expression operator (SQLstatement) ;
参数说明:
1.expression 条件列
2.comparison 比较运算
3.SQL statement 子查询语句
4.operator运算符,有如下几种情况:
(1)comparison (SQL statement) ;
(2)comparison
{ANY | ALL |SOME} (SQLstatement);
{NOT} IN (SQL statement);
{NOT} EXISTS (SQL statement);
注意:子查询中不能ORDER BY分组语句。应该先处理子查询,再处理父查询。
(一)单行子查询(简单嵌套查询)
1.概念
子查询的返回值只能是一行或零行,且子查询跟随在 =、!=、<、<=、>、>= 之后.
2.语法
SELECT select_list
FROM table
WHERE expression comparison (SQL statement) ;
4.范例
(1)要求查询出比7654工资要高的全部雇员的信息
SELECT * FROM emp
WHERE sal>(SELECT salFROM empWHERE empno='7654');
(2)要求查询出工资比7654高,同时与7788从事相同工作的全部雇员信息
分析:两个条件
SELECT * FROMemp
WHERE sal>(SELECT salFROMemp WHERE empno=7654)
AND job=(SELECT jobFROM empWHERE empno=7788);
(3)要求查询出工资最低的雇员姓名,工作,工资
分步:
a.求出最低工资
SELECTMIN(sal)FROM emp;
b.以最低工资为条件,进行下一步查询
SELECT * FROMempWHERE sal=(SELECTMIN(sal)FROMemp);
(4)思考:要求查询出:部门名称,部门员工数,部门平均工资,部门的最低收入雇员的姓名,需要两张表关联:dept,emp
分步:
a.如果想要求出每个部门的员工数量,及平均工资,则肯定要使用分组统计,按deptno进行分组.
SELECTdeptno,COUNT(empno),AVG(sal)
FROMemp
GROUP BY deptno;
b.但是如果想要查出来部门的名称,则需要与dept表进行关联
SELECT d.dname,ed.c,ed.a
FROM dept d,(
SELECT deptno,COUNT(empno) c,AVG(sal) a
FROM emp GROUP BY deptno) ed
WHERE d.deptno=ed.deptno;
c.求出部门的最低收入雇员的姓名
SELECT d.dname, ed.c, ed.a, e.ename
FROM dept d,(
SELECT deptno,COUNT(empno) c,AVG(sal) a,
MIN(sal) mins
FROM emp
GROUP BY deptno) ed , emp e
WHERE d.deptno=ed.deptno AND e.sal=ed.mins;
(二)多行子查询
1.概念:
多行子查询可以返回单列多行的数据. 在这种多行子查询中,必须使用多行运算符IN ,ANY ,ALL来判断,而不能使用单行运算符. 使用多行运算符可以执行与一个或多个数据的比较操作。
2.在Oracle系统中,可以使用的多行比较运算符包括:
IN:等于列表中的任何一值
ANY与子查询返回的每一个值进行比较
ALL与子查询返回的所有值进行比较
详细说明:
(1) IN NOTIN
只要主查询中列或运算式是在(不在)子查询所得结果列表中的话,则主查询的结果为我们要的数据.
(等于列表中的任何一值)
范例:求出每个部门的最低工资的雇员信息
SELECT * FROMemp
WHERE sal IN(SELECTMIN(sal)FROM empGROUPBY deptno);
(2) ANY
ANY运算符表示与子查询中的每一个值进行比较。这时,需要将单行比较运算符与该运算符组合起来使用与单行比较运算符组合之后,所使用的ANY运算符结果如下:
1.=ANY:与IN功能完全一样
SELECT * FROMemp
WHERE sal =ANY(SELECTMIN(sal)FROM empGROUPBY deptno);
2.>ANY:比()内最小的值要大
SELECT * FROMemp
WHERE sal >ANY(SELECTMIN(sal)FROM empGROUPBY deptno);
3.<ANY:比()内最大的值要小
SELECT * FROMemp
WHERE sal <ANY(SELECTMIN(sal)FROM empGROUPBY deptno);
(3) ALL
对于ALL运算符而言,与单行比较运算符组合之后,所使用的ANY运算符结果如下:
1.>ALL:比最大的值要大
SELECT * FROMemp
WHERE sal >ALL(SELECTMIN(sal)FROM empGROUPBY deptno);
2.<ALL:比最小的值要小
SELECT * FROMemp
WHERE sal <ALL(SELECTMIN(sal)FROM empGROUPBY deptno);
四.补充
(一)多列子查询
1.概念
进行成对比较
2.语法:
略
3.范例:
(1)略
SELECT * FROMemp
WHERE(sal,NVL(comm,-1))IN (SELECT sal,NVL(comm,-1)FROM emp
WHEREdeptno=20);
(2)查询工资为部门最高的记录
SELECT *FROM scott.emp
WHERE(sal,job) IN (SELECT MAX(sal),job FROMscott.emp GROUP BY job);
- ORACLE数据库---子查询
- 【Oracle数据库】子查询
- 【Oracle数据库】高级子查询
- Oracle数据库 -- 子查询篇
- Oracle数据库学习---子查询
- Oracle数据库之SQL子查询详解
- Oracle数据库之SQL语句子查询
- Oracle数据库(六)子查询
- Oracle数据库之SQL子查询详解
- Oracle数据库知识梳理---续(子查询)
- Oracle数据库高级查询(一)子查询
- 数据库入门速成---ORACLE (03) 子查询 / DML / TCL / DDL
- Oracle数据库多重子查询嵌套的坑
- Oracle数据库的关联父键和子键查询
- Oracle数据库中的子查询,判断符In、any、all
- 47.Oracle数据库SQL开发之 子查询——子查询的类型
- 48.Oracle数据库SQL开发之 子查询——编写单行子查询
- 51.Oracle数据库SQL开发之 子查询——编写关联子查询
- 关于获取chromium最新源代码的几点疑惑
- 深搜 城堡
- 浅析Java匿名内部类在Android事件响应中的应用
- LeetCode 225. Implement Stack using Queues
- iOS模拟器中修改textField键盘类型为中文输入和键盘弹出方法
- ORACLE数据库---子查询
- 复制的虚拟机 ,找不到网卡eth0了,可能会有其他网卡生效,设置eth0生效
- 接收广播BroadcastReceiver
- java程序中修改properties原始文件
- Eclipse中使用maven构建SpringMVC
- python 类
- 利用JitPack发布Android开源库
- iOS二维码扫描,你需要注意的两件事
- 基于最小二乘法的曲线拟合的C++代码的实现