高级子查询【weber出品必属精品】
多列子查询
where条件中出现多列与子查询进行比较
多列子查询分为:成对比较和非成对比较
成对比较:
SQL> select ename,sal,job from emp where (deptno,job) in(select deptno,job from emp where ename='SCOTT'); ENAME SAL JOB
------ ----- ---------
FORD ANALYST
SCOTT ANALYST非成对比较:
select ename,sal,job from emp
where deptno=(select deptno from emp where ename='SCOTT')
and job = (select job from emp where ename='SCOTT') ENAME SAL JOB
------ ----- ---------
SCOTT ANALYST
FORD ANALYST- 标量子查询表达式
标量子查询是从一行中返回一列值的子查询
标量子查询可用于:
1. DECODE 和CASE的条件和表达式部分
2. 除了GROUP BY之外的所有SELECT语句
CASE表达式中使用标量子查询:CASE表达式可以实现if --then-- else的功能
SQL> select employee_id,last_name,(
case
when department_id=(select department_id from departments where location_id=)
then 'CANDA' else'USA' end ) location
from employees; EMPLOYEE_ID LAST_NAME LOCAT
----------- ------------------------- -----
OConnell USA
Grant USA
Whalen USA
Hartstein CANDA
Fay CANDA
Mavris USA
Baer USA
Higgins USA
Gietz USA
King USA
Kochhar USA
.......................
107 rows selected. - ORDER BY子句中使用标量子查询
SQL> select ename,sal,deptno from emp order by (select dname from dept where emp.deptno=dept.deptno); ENAME SAL DEPTNO
---------- ---------- ----------
CLARK
KING
MILLER
JONES
FORD
ADAMS
SMITH
SCOTT
WARD
TURNER
ALLEN
JAMES
BLAKE
MARTIN rows selected. - 相互关联的子查询
相互关联子查询用于行-执行-行的处理主查询的每一行子查询都要执行一次:通俗的说就是,主查询--->子查询--->主查询。就是这个执行顺序。
---从emp表中查询 薪水大于 部门平均薪水 的用户名,部门编号和薪水,没有大于的则不会被显示出来。
select ename,deptno,sal
from emp outer
where sal>(select avg(sal) from emp inner where outer.deptno=inner.deptno ); ENAME DEPTNO SAL
------ ------ -----
ALLEN
JONES
BLAKE
SCOTT
KING
FORD - 再举一个相互关联的例子
---查询至少换了两次工作的员工---
SQL> select employee_id,last_name,job_id from employees e where <=(select count(*) from job_history j where e.employee_id=j.employee_id); EMPLOYEE_ID LAST_NAME JOB_ID
----------- ------------------------- ----------
Whalen AD_ASST
Kochhar AD_VP
Taylor SA_REP - 使用EXISTS
EXISTS 检测子查询中行的存在性
1.如果值存在于子查询中:
终止在子查询中的查找
条件返回TRUE2.如果值不存在于子查询中:
条件返回FALSE
继续在子查询中的查找---示例:查找是领导的员工
SQL> select empno,ename from emp outer where exists(select mgr from emp inner where outer.empno=inner.mgr); EMPNO ENAME
---------- ----------
JONES
BLAKE
CLARK
SCOTT
KING
FORD rows selected.另一种写法:
SQL> select empno ,ename from emp where empno in(select mgr from emp); EMPNO ENAME
---------- ----------
JONES
BLAKE
CLARK
SCOTT
KING
FORD rows selected. - 我们来做另一个实验:查找不是领导的员工,也就是最基层的员工了。
SQL> select empno,ename from emp outer where not exists (select from emp inner where outer.empno=inner.mgr); EMPNO ENAME
---------- ----------
SMITH
ALLEN
WARD
MARTIN
TURNER
ADAMS
JAMES
MILLER rows selected.
---这里解释一下:not exists里的整数1的作用,只要是个整数即可,‘abc’字符串也可以。 - 关联UPDATE
使用相互关联的子查询更新一个表的行基于另外一个表的行
SQL> create table e as select * from emp; 表已创建 SQL> alter table e add dname varchar2(); 表已更改。 SQL> desc e
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
EMPNO NUMBER()
ENAME VARCHAR2()
JOB VARCHAR2()
MGR NUMBER()
HIREDATE DATE
SAL NUMBER(,)
COMM NUMBER(,)
DEPTNO NUMBER()
DNAME VARCHAR2() SQL> select * from e; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO DNAME
----- ------ --------- ----- -------------- ----- ---------- ------ ----------
SMITH CLERK -12月-
ALLEN SALESMAN -2月 -
WARD SALESMAN -2月 -
JONES MANAGER -4月 -
MARTIN SALESMAN -9月 -
BLAKE MANAGER -5月 -
CLARK MANAGER -6月 -
SCOTT ANALYST -4月 -
KING PRESIDENT -11月-
TURNER SALESMAN -9月 -
ADAMS CLERK -5月 -
JAMES CLERK -12月-
FORD ANALYST -12月-
MILLER CLERK -1月 - 已选择14行。 SQL> select * from dept; DEPTNO DNAME LOC
------ -------------- -------------
ACCOUNTING NEW YORK
RESEARCH DALLAS
SALES CHICAGO
OPERATIONS BOSTON SQL> update e set dname=(select dname from dept d where e.deptno=d.deptno); 已更新14行。 SQL> commit; 提交完成。 SQL> select * from e; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO DNAME
----- ------ --------- ----- -------------- ----- ---------- ------ ----------
SMITH CLERK -12月- RESEARCH
ALLEN SALESMAN -2月 - SALES
WARD SALESMAN -2月 - SALES
JONES MANAGER -4月 - RESEARCH
MARTIN SALESMAN -9月 - SALES
BLAKE MANAGER -5月 - SALES
CLARK MANAGER -6月 - ACCOUNTING
SCOTT ANALYST -4月 - RESEARCH
KING PRESIDENT -11月- ACCOUNTING
TURNER SALESMAN -9月 - SALES
ADAMS CLERK -5月 - RESEARCH
JAMES CLERK -12月- SALES
FORD ANALYST -12月- RESEARCH
MILLER CLERK -1月 - ACCOUNTING - 相互关联的DELETE
使用相互关联的DELETE删除一个表的行基于另外一个表的行
SQL> conn hr/hr
已连接。 SQL> create table emp as select * from employees; 表已创建。 SQL> select * from tab; TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
REGIONS TABLE
COUNTRIES TABLE
LOCATIONS TABLE
DEPARTMENTS TABLE
JOBS TABLE
EMPLOYEES TABLE
JOB_HISTORY TABLE
EMP TABLE
EMP_DETAILS_VIEW VIEW 已选择9行。 SQL> delete emp where exists(select employee_id from job_history where emp.employee_id=employee_id); 已删除7行。 SQL> roll - WITH子句
使用WITH子句, 在复杂查询中如果相同的查询块多次出现,可以重复使用
WITH子句将结果存放到用户的临时表空间中
WITH子句提高了性能
select dname,sum(sal) from emp e,dept d where e.deptno=d.deptno
group by dname
having sum(sal) >(select sum(total_sal)/count(*)from (select dname,sum(sal) total_sal from emp e,dept d where e.deptno=d.deptno group by dname)) - 使用with子句
with
dept_costs as(select dname,sum(sal) total_sal from emp e,dept d where e.deptno=d.deptno
group by dname),
avg_costs as (select sum(total_sal)/count(*) avg_sal from dept_costs)
select * from dept_costs where total_sal>(select avg_sal from avg_costs)
order by dname
高级子查询【weber出品必属精品】的更多相关文章
- 全世界最详细的图形化VMware中linux环境下oracle安装(一)【weber出品必属精品】
安装流程:前期准备工作--->安装ORACLE软件--->安装升级补丁--->安装odbc创建数据库--->安装监听器--->安装EM <前期准备工作> 安装 ...
- 全世界最详细的图形化VMware中linux环境下oracle安装(二)【weber出品必属精品】
<ORACLE 10.2.05版本的升级补丁安装> 首先我们解压 $ unzip p8202632_10205_LINUX.zip 解压后我们会发现多出了个文件夹,他是:Disk1,进入D ...
- 使用DML语句【weber出品必属精品】
DML语句包含以下语法: INSERT:往一个表中增加新行 DELETE:从一个表中删除掉现有的行 UPDATE:更改一个表中现有的行 INSERT语句语法:INSERT INTO TABLE(COL ...
- 数据库对象(视图,序列,索引,同义词)【weber出品必属精品】
视图视图的定义:视图就是一个查询的别名为什么使用视图限制数据的存取 SQL> conn /as sysdba 已连接. SQL> grant create view to scott; 授 ...
- 静默安装ORACLE【weber出品必属精品】
安装配置系统环境安装linux ,所有服务都不选择,只是选择安装开发工具,不要安装防火墙(当然也可以在后面关闭) 打开终端,执行如下命令,检查安装包,没有的都要安装 make, glibc, liba ...
- 集合运算符之全集、交集、补集【weber出品必属精品】
集合的概念 与数学中的全集.交集.补集的概念是一样的 常用的集合运算符 集合运算符的作用:把两个查询构造为一个联合查询 1. 全集:求连个查询的全集 union all:将两个查询的所有数据全部列出, ...
- ORACLE SQL单行函数(二)【weber出品必属精品】
11.dual:虚表,任何用户都可以使用,表结构如下: SQL> desc dual Name Null? Type -------------------------------------- ...
- ORACLE SQL单行函数(三)【weber出品必属精品】
16.L:代表本地货币符,这个和区域有关.这个时候我们想来显示一下人民币的符号:¥ $ vi .bash_profile ---写入如下内容: export NLS_LANG='SIMPLIFIED ...
- 创建存储过程和函数【weber出品必属精品】
一.什么是存储过程和函数 1. 是被命名的pl/sql块 2. 被称之为pl/sql子程序 3. 与匿名块类似,有块结构: 声明部分是可选的(没有declare关键字) 必须有执行部分 可选的异常处理 ...
随机推荐
- 解决iOS中tabBarItem图片默认颜色的问题(指定代码渲染模式为以原样模式的方式显示出来)
解决iOS中tabBarItem图片默认颜色的问题(指定代码渲染模式为以原样模式的方式显示出来) 解决办法:指定图片的渲染模式(imageWithRenderingMode为:UIImageRende ...
- javascript各种专业名词
刚开始学javascript经常看到各种专业名词,在此整理一下个人的学习笔记: 直接量 直接量——就是程序中直接使用的数据值,如:88 //数字(String)"hello world ...
- php简单的爬虫
爬虫的原理是分析下载的页面,找出其中的连接,然后再下载这些链接,对链接再进行更深层次的递归,周而复始.在数据存储方面,先存储到redis里面,再有redis 写入到mysql,这样可以减轻mysql写 ...
- MySQL跨表更新字段 工作记录
工作中遇到两表查询,从user表中获取用户唯一id字段 写入到另外一张qiuzu表中的uid字段中; 二者可以关联起来的只有用户的手机号码tel字段; 了解需求后数据量稍多,不可能一个一个的手动修改 ...
- HTML&CSS基础学习笔记1.18-表格的边框
今天的内容比较简单~来看看HTML里表格的边框是怎么设置的吧 表格的边框 前面为了方便观察表格单元格的情况,我们给<table>加了border属性.<table>的borde ...
- 使vim中Syntastic支持C++11
安装好Syntastic后发现不支持c++11,会提示错误incompatible with c++98,解决方法如下: .vimrc中加入: let g:syntastic_cpp_compiler ...
- 文件操作IO流
fopen 打开文件或者生成文件 getc 向文件中读取一个字符 putc 向文件中写入一个字符 fgets 向文件中读取字符串 参数可以设置获取多少个字符串 fputs 向文件中写入字符串 不自动添 ...
- “声控”APP
“声控”APP 编者:本文为携程机票研发部技术专家祁一鸣在携程技术微分享中的分享内容,关注携程技术中心微信公号ctriptech,获知更多一手干货. [携程技术微分享]是携程技术中心推出的线上公开分享 ...
- Chrome下的语音控制框架MyVoix.js使用篇(二)
上一篇博文中,初步介绍了MyVoix.js的基本功能,这次我们将演示一个完整的实例. 先上代码 <!DOCTYPE HTML> <html> <head> < ...
- 伟福与Keil的比较--51汇编提高篇
[写在前面] 本文适合有一定汇编水平的人(了解大半的汇编语句,能区分全角与半角符号,能够独立编写流水灯.数码管等程序),传授51单片机的汇编语言经验.如果您发现不少指令不知道意思,请从网上搜索入门教程 ...