Oracle学习(六):子查询
1.知识点:能够对比以下的录屏进行阅读
SQL> --子查询所要解决的问题:问题不能一步求解
SQL> --查询工资比SCOTT高的员工信息
SQL> --(1)使用普通方法
SQL> --1. SCOTT的工资
SQL> select sal from emp where ename='SCOTT';
SQL> --2. 查询比3000高的员工
SQL> select *
2 from emp
3 where sal>3000;
SQL> --(2)使用子查询
SQL> select *
2 from emp
3 where sal > (select sal
4 from emp
5 where ename='SCOTT'); SQL> -- 注意的问题:
SQL> --1. 将子查询放入括号里
SQL> --2. 採用合理的书写风格
SQL> --3. 能够在主查询的where ,select 。from ,having后面。放置子查询
SQL> --4. 不能够在group by后面放置子查询
SQL> --5. 强调from后面放置子查询
SQL> --6. 主查询和子查询能够不是同一张表,仅仅要子查询返回的结果。主查询能够使用。就可以
SQL> --7. 一般不在子查询中使用order by;但在Top-N分析问题中。必须使用order by
SQL> --8. 一般先运行子查询,再运行主查询;但相关子查询除外
SQL> --9. 单行子查询仅仅能使用单行操作符;多行子查询仅仅能使用多行操作符
SQL> --10. 注意子查询中null SQL> --部分注意问题举例
SQL> --3. 能够在主查询的where select from having后面,放置子查询
SQL> --select
SQL> select ename,sal,(select job from emp where empno=7839) myjob
2 from emp; SQL> --5. 强调from后面放置子查询
SQL> --查询员工的姓名和薪水
SQL> select *
2 from (select ename,sal from emp); SQL> --6. 主查询和子查询能够不是同一张表。仅仅要子查询返回的结果,主查询能够使用,就可以
SQL> --查询部门名称为 SALES的员工信息
SQL> --子查询
SQL> select *
2 from emp
3 where deptno=(select deptno
4 from dept
5 where dname='SALES');
SQL> --多表查询
SQL> select e.*
2 from emp e,dept d
3 where e.deptno=d.deptno and d.dname='SALES';
SQL> --SQL优化: 假设子查询和多表查询都能够,理论上尽量使用多表查询 SQL> --多行操作符
SQL> --in :在集合中
SQL> --查询部门名称为SALES和ACCOUNTING的员工信息
SQL> select *
2 from emp
3 where deptno in (select deptno from dept where dname='SALES' or dname='ACCOUNTING');
SQL> --使用多表查询
SQL> select e.*
2 from emp e,dept d
3 where e.deptno=d.deptno and (d.dname='SALES' or d.dname='ACCOUNTING'); SQL> --any :和集合的随意一个值比較
SQL> --查询工资比30号部门随意一个员工高的员工信息
SQL> select *
2 from emp
3 where sal > any (select sal from emp where deptno=30);
SQL> --单行子查询的方法也能够解决问题
SQL>select *
2 from emp
3 where sal > (select min(sal) from emp where deptno=30) SQL> --all :和集合的全部值比較
SQL> --查询工资比30号部门全部员工高的员工信息
SQL> select *
2 from emp
3 where sal > all (select sal from emp where deptno=30);
SQL> --单行子查询的方法也能够解决问题
SQL> select *
2 from emp
3 where sal > (select max(sal) from emp where deptno=30) SQL> --多行子查询中null值问题
SQL> --集合中有null值不能使用not in,但能够使用in
SQL> --查询不是老板的员工信息
SQL> select *
2 from emp
3 where empno not in (select mgr from emp); --此查询没有结果,由于含有空值
SQL> --查询是老板的员工信息
SQL> select *
2 from emp
3 where empno in (select mgr from emp); --此查询结果正常
SQL> --原因:全部和空值比較的条件结果是空;
SQL> --使用not in方法的正确语句
SQL> select *
2 from emp
3 where empno not in (select mgr from emp where mgr is not null);
2.在Sqlplus下实际运行的结果录屏:
SQL> --查询工资比SCOTT高的员工信息
SQL> --1. SCOTT的工资
SQL> select sal from emp where ename='SCOTT'; SAL
----------
3000 SQL> --查询比3000高的员工
SQL> set linesize 120
SQL> col sal for 9999
SQL> select *
2 from emp
3 where sal>3000; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ----- ---------- ----------
7839 KING PRESIDENT 17-11月-81 5000 10 SQL> --子查询所要解决的问题:问题不能一步求解
SQL> select *
2 from emp
3 where sal > (select sal
4 from emp
5 where ename='SCOTT'); EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ----- ---------- ----------
7839 KING PRESIDENT 17-11月-81 5000 10 SQL> /*
SQL> 注意的问题:
SQL> 1. 将子查询放入括号里
SQL> 2. 採用合理的书写风格
SQL> 3. 能够在主查询的where select from having后面。放置子查询
SQL> 4. 不能够在group by后面放置子查询
SQL> 5. 强调from后面放置子查询
SQL> 6. 主查询和子查询能够不是同一张表,仅仅要子查询返回的结果。主查询能够使用,就可以
SQL> 7. 一般不在子查询中使用order by;但在Top-N分析问题中,必须使用order by
SQL> 8. 一般先运行子查询,再运行主查询;但相关子查询除外
SQL> 9. 单行子查询仅仅能使用单行操作符。多行子查询仅仅能使用多行操作符
SQL> 10. 注意子查询中null
SQL> */
SQL> --3. 能够在主查询的where select from having后面,放置子查询
SQL> --select
SQL> select ename,sal,(select job from emp where empno=7839) myjob
2 from emp; ENAME SAL MYJOB
---------- ----- ---------
SMITH 800 PRESIDENT
ALLEN 1600 PRESIDENT
WARD 1250 PRESIDENT
JONES 2975 PRESIDENT
MARTIN 1250 PRESIDENT
BLAKE 2850 PRESIDENT
CLARK 2450 PRESIDENT
SCOTT 3000 PRESIDENT
KING 5000 PRESIDENT
TURNER 1500 PRESIDENT
ADAMS 1100 PRESIDENT ENAME SAL MYJOB
---------- ----- ---------
JAMES 950 PRESIDENT
FORD 3000 PRESIDENT
MILLER 1300 PRESIDENT 已选择14行。 SQL> --5. 强调from后面放置子查询
SQL> --查询员工的姓名和薪水
SQL> select *
2 from (select ename,sal from emp); ENAME SAL
---------- -----
SMITH 800
ALLEN 1600
WARD 1250
JONES 2975
MARTIN 1250
BLAKE 2850
CLARK 2450
SCOTT 3000
KING 5000
TURNER 1500
ADAMS 1100 ENAME SAL
---------- -----
JAMES 950
FORD 3000
MILLER 1300 已选择14行。 SQL> --6. 主查询和子查询能够不是同一张表,仅仅要子查询返回的结果。主查询能够使用。就可以
SQL> --查询部门名称为 SALES的员工信息
SQL> select *
2 from emp
3 where deptno=(select deptno
4 from emp
5 where dname='SALES');
where dname='SALES')
*
第 5 行出现错误:
ORA-00904: "DNAME": 标识符无效 SQL> ed
已写入 file afiedt.buf 1 select *
2 from emp
3 where deptno=(select deptno
4 from dept
5* where dname='SALES')
SQL> / EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ----- ---------- ----------
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7900 JAMES CLERK 7698 03-12月-81 950 30 已选择6行。 SQL> select e.*
2 from emp e,dept d
3 where e.deptno=d.deptno and d.dname='SALES'; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ----- ---------- ----------
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7900 JAMES CLERK 7698 03-12月-81 950 30 已选择6行。 SQL> --SQL优化: 假设子查询和多表查询都能够,理论上尽量使用多表查询
SQL> host cls SQL> --多行操作符
SQL> --in :在集合中
SQL> --查询部门名称为SALES和ACCOUNTING的员工信息
SQL> select *
2 from emp
3 where deptno in (select deptno from dept where dname='SALES' or dname='ACCOUNTING'); EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ----- ---------- ----------
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7839 KING PRESIDENT 17-11月-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7900 JAMES CLERK 7698 03-12月-81 950 30
7934 MILLER CLERK 7782 23-1月 -82 1300 10 已选择9行。 SQL> select e.*
2 from emp e,dept d
3 where e.deptno=d.deptno and (d.dname='SALES' or d.dname='ACCOUNTING'); EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ----- ---------- ----------
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7839 KING PRESIDENT 17-11月-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7900 JAMES CLERK 7698 03-12月-81 950 30
7934 MILLER CLERK 7782 23-1月 -82 1300 10 已选择9行。 SQL> host cla SQL> host cls SQL> --any 和集合的随意一个值比較
SQL> --查询工资比30号部门随意一个员工高的员工信息
SQL> select *
2 from emp
3 where sal > any (select sal from emp where deptno=30); EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ----- ---------- ----------
7839 KING PRESIDENT 17-11月-81 5000 10
7902 FORD ANALYST 7566 03-12月-81 3000 20
7788 SCOTT ANALYST 7566 13-7月 -87 3000 20
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7934 MILLER CLERK 7782 23-1月 -82 1300 10
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ----- ---------- ----------
7876 ADAMS CLERK 7788 13-7月 -87 1100 20 已选择12行。 SQL> ed
已写入 file afiedt.buf 1 select *
2 from emp
3* where sal > (select min(sal) from emp where deptno=30)
SQL> / EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ----- ---------- ----------
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7788 SCOTT ANALYST 7566 13-7月 -87 3000 20
7839 KING PRESIDENT 17-11月-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7876 ADAMS CLERK 7788 13-7月 -87 1100 20
7902 FORD ANALYST 7566 03-12月-81 3000 20 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ----- ---------- ----------
7934 MILLER CLERK 7782 23-1月 -82 1300 10 已选择12行。 SQL> --all 和集合的全部值比較
SQL> --查询工资比30号部门全部员工高的员工信息
SQL> select *
2 from emp
3 where sal > all (select sal from emp where deptno=30); EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ----- ---------- ----------
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7788 SCOTT ANALYST 7566 13-7月 -87 3000 20
7839 KING PRESIDENT 17-11月-81 5000 10
7902 FORD ANALYST 7566 03-12月-81 3000 20 SQL> ed
已写入 file afiedt.buf 1 select *
2 from emp
3* where sal > (select max(sal) from emp where deptno=30)
SQL> / EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ----- ---------- ----------
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7788 SCOTT ANALYST 7566 13-7月 -87 3000 20
7839 KING PRESIDENT 17-11月-81 5000 10
7902 FORD ANALYST 7566 03-12月-81 3000 20 SQL> host cls SQL> --多行子查询中null值
SQL> --查询不是老板的员工信息
SQL> select * from emp; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ----- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7788 SCOTT ANALYST 7566 13-7月 -87 3000 20
7839 KING PRESIDENT 17-11月-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7876 ADAMS CLERK 7788 13-7月 -87 1100 20 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ----- ---------- ----------
7900 JAMES CLERK 7698 03-12月-81 950 30
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10 已选择14行。 SQL> select *
2 from emp
3 where empno not in (select mgr from emp); 未选定行 SQL> --查询是老板的员工信息
SQL> ed
已写入 file afiedt.buf 1 select *
2 from emp
3* where empno in (select mgr from emp)
SQL> / EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ----- ---------- ----------
7902 FORD ANALYST 7566 03-12月-81 3000 20
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7839 KING PRESIDENT 17-11月-81 5000 10
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7788 SCOTT ANALYST 7566 13-7月 -87 3000 20
7782 CLARK MANAGER 7839 09-6月 -81 2450 10 已选择6行。 SQL> select *
2 from emp
3 where empno not in (select mgr from emp where mgr is not null); EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ----- ---------- ----------
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7934 MILLER CLERK 7782 23-1月 -82 1300 10
7369 SMITH CLERK 7902 17-12月-80 800 20
7876 ADAMS CLERK 7788 13-7月 -87 1100 20
7900 JAMES CLERK 7698 03-12月-81 950 30 已选择8行。 SQL> spool off
Oracle学习(六):子查询的更多相关文章
- Oracle 数据库基础学习 (六) 子查询
子查询在一个select中出现多个嵌套查询语句 1.在where子句中使用子查询(一般返回"单行单列" "单行多列" "多行单列"(可以提供 ...
- 数据库Mysql的学习(六)-子查询和多表操作
)*0.05 WHERE card_id ='20121xxxxxx'; //子查询就是一个嵌套先计算子查询 SELECT * FROM borrow WHERE book_id =(SELECT b ...
- MySql学习(三) —— 子查询(where、from、exists) 及 连接查询(left join、right join、inner join、union join)
注:该MySql系列博客仅为个人学习笔记. 同样的,使用goods表来练习子查询,表结构如下: 所有数据(cat_id与category.cat_id关联): 类别表: mingoods(连接查询时作 ...
- Oracle02——oracle分页、子查询、集合运算、处理数据、创建和管理表和其他数据库对象
作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7289451.html --oracle分页(Pageing Query) select ...
- Oracle DB 使用子查询来解决查询
• 定义子查询 • 描述子查询可以解决的问题类型 • 列出子查询的类型 • 编写单行和多行子查询 • 子查询:类型.语法和准则 • 单行子查询: – 子查询中的组函数 – 带有子查询的HAVING ...
- Oracle with重用子查询
--with 重用子查询对于多次使用相同子查询的复杂查询语句来说,用户可能会将查询语句分成两条语句执行.第一条语句将子查询结果存放到临时表,第二条查询语句使用临时表处理数据.从 Oracle 9i 开 ...
- 彻底搞懂oracle的标量子查询
oracle标量子查询和自己定义函数有时用起来比較方便,并且开发者也常常使用.数据量小还无所谓.数据量大,往往存在性能问题. 下面測试帮助大家彻底搞懂标量子查询. SQL> create tab ...
- oracle ORA-01427: 单行子查询返回多个行
ORA-01427: 单行子查询返回多个行 前几天开发的同事反馈一个问题,说前台系统报出了ORA错误,希望我们能看看是什么原因.java.sql.SQLException: ORA-01427: si ...
- Esper系列(六)子查询、Exists、In/not in、Any/Some、Join
子查询 1 >= all (select salary from orderEvent.win:length_batch(5))"; 注意: 运行以上三个例句后的结果,刚开始让很费 ...
随机推荐
- 雷观(二十三)-IT互联网技术,不拼创新拼努力,特别低公平
上次发表"雷观(二十二)"是在2015年3月7日,一转眼,就快到了11月. 前段时间,终于狠下心来,写了本篇,第二十三啦. 小雷同志,要加油了~ 早日达到百篇雷观的里程碑~ ...
- NYOJ_75 日期计算 (推断这一天是这一年中的第几天)
题目地址 如题,输入一个日期,格式如:2010 10 24 ,推断这一天是这一年中的第几天. 分析: 官方给的最优答案用了for 和switch语句结合,十分巧妙. 代码 /* 如题,输入一个日期 ...
- android图片特效处理之锐化效果
这篇将讲到图片特效处理的锐化效果.跟前面一样是对像素点进行处理,算法是通用的. 算法原理: 一.简单算法:分别获取当前像素点和八个周围像素点的RGB值,先求出当前像素点的RGB值与八个像素点RGB值的 ...
- 一个发邮件的demo 用golang
一个比较成熟的第三方包用来发邮件,可以带图片 和附件,项目地址 : github.com/go-gomail/gomail 一个发邮件的demo 用golang 文件目录树: -d:\test\goe ...
- HDU 1007 Quoit Design 平面内最近点对
http://acm.hdu.edu.cn/showproblem.php?pid=1007 上半年在人人上看到过这个题,当时就知道用分治但是没有仔细想... 今年多校又出了这个...于是学习了一下平 ...
- (转)Tomcat文件详解
做web项目,最常用的服务器就是Apache的tomcat.虽然一直在用tomcat,但都是仅限在使用的阶段,一直没有深入学习过.想深入学习tomcat,首推的肯定是官网:http://tomcat. ...
- echarts统计图踩坑合集
1:折线图条的颜色修改 series : [ { name : 'SBP(收缩压)', type : 'line', itemStyle : { normal : { lineStyle:{ colo ...
- 洛谷 P1626 象棋比赛
P1626 象棋比赛 题目描述 有N个人要参加国际象棋比赛,该比赛要进行K场对弈.每个人最多参加两场对弈,最少参加零场对弈.每个人都有一个与其他人不相同的等级(用一个正整数来表示). 在对弈中,等级高 ...
- 计科1111-1114班第一次实验作业(NPC问题——回溯算法、聚类分析)
实验课安排 地点: 科技楼423 时间: 计科3-4班---15周周一上午.周二下午 计科1-2班---15周周一下午.周二晚上(晚上时间从18:30-21:10) 请各班学委在实验课前飞信通知大家 ...
- golang recover
package main import "fmt" func divideByZero() { // Use this deferred function to handle er ...