Oracle入门第六天(下)——高级子查询
一、概述
主要内容:

二、子查询介绍
1.简单子查询(WHERE子查询)
SELECT last_name
FROM employees
WHERE salary >
(SELECT salary
FROM employees
WHERE employee_id = 149) ;
2.多列子查询

成对比较:
SELECT employee_id, manager_id, department_id
FROM employees
WHERE (manager_id, department_id) IN
(SELECT manager_id, department_id
FROM employees
WHERE employee_id IN (141,174))
AND employee_id NOT IN (141,174);
不成对比较:
SELECT employee_id, manager_id, department_id
FROM employees
WHERE manager_id IN (SELECT manager_id
FROM employees
WHERE employee_id IN (174,141))
AND department_id IN (SELECT department_id
FROM employees
WHERE employee_id IN (174,141))
AND employee_id NOT IN(174,141);
3.在FROM子句中使用子查询
SELECT a.last_name, a.salary,
a.department_id, b.salavg
FROM employees a, (SELECT department_id,
AVG(salary) salavg
FROM employees
GROUP BY department_id) b
WHERE a.department_id = b.department_id
AND a.salary > b.salavg;
4.单列子查询
在CASE中使用单列子查询
--问题:显式员工的employee_id,last_name和location。
--其中,若员工department_id与location_id为1800的department_id相同,
--则location为’Canada’,其余则为’USA’。
SELECT employee_id,last_name,
(CASE department_id
WHEN
(SELECT department_id FROM departments WHERE location_id = 1800)
THEN 'Canada'
ELSE 'USA'
END
) location
--(CASE
--WHEN department_id =
--(SELECT department_id FROM departments
--WHERE location_id = 1800)
--THEN 'Canada' ELSE 'USA' END) location
FROM employees
5.相关子查询
相关子查询就是每一次子查询都与外层主查询相关,
而非相关子查询就是每次都返回一致的结果,与主查询无关,例如只是提供类似一个固定的筛选条件

语法:

示例:
--问题:查询员工中工资大于本部门平均工资的员工的last_name,salary和其department_id
SELECT last_name,salary,department_id
FROM employees outer
WHERE salary >
(
SELECT AVG(salary)
FROM employees
WHERE department_id = outer.department_id
)
6.EXISTS操作符
--问题:查询公司管理者的employee_id,last_name,job_id,department_id信息
SELECT employee_id,last_name,job_id,department_id
FROM employees outer
WHERE EXISTS
(
SELECT 1
FROM employees
WHERE manager_id = outer.employee_id
)
NOT EXISTS同理
7.相关更新
使用相关子查询依据一个表中的数据更新另一个表的数据
语法:
UPDATE table1 alias1
SET column = (SELECT expression
FROM table2 alias2
WHERE alias1.column =
alias2.column);
示例:
UPDATE employees e
SET department_name =
(SELECT department_name
FROM departments d
WHERE e.department_id = d.department_id);
相关删除同理:
DELETE FROM employees E
WHERE employee_id =
(SELECT employee_id
FROM emp_history
WHERE employee_id = E.employee_id);
8.WITH子句
有点类似ODPS的CTE
使用 WITH 子句, 可以避免在 SELECT 语句中重复书写相同的语句块
WITH 子句将该子句中的语句块执行一次并存储到用户的临时表空间中
使用 WITH 子句可以提高查询效率
一般而言,可以用于UNION等操作,来提高可读性!
语法:
–针对一个别名
with tmp as (select * from tb_name) –针对多个别名
with
tmp as (select * from tb_name),
tmp2 as (select * from tb_name2),
tmp3 as (select * from tb_name3),
…
示例:
WITH TT
AS
(SELECT employee_id,salary FROM employees) SELECT * FROM TT
更多WITH示例,参考:https://www.cnblogs.com/linjiqin/archive/2013/06/24/3152667.html
Oracle入门第六天(下)——高级子查询的更多相关文章
- Oracle学习DayFour(高级子查询)
一.高级子查询 1.多列子查询 定义:主查询与子查询返回的多个列进行比较 多列子查询中的比较分为两种:成对比较:不成对比较 实例:查询与141号或174号员工的manager_id和departmen ...
- Oracle子查询之高级子查询
Oracle 高级子查询 高级子查询相对于简单子查询来说,返回的数据行不再是一列,而是多列数据. 1,多列子查询 主查询与子查询返回的多个列进行比较 查询与141号或174号员工的manager_id ...
- Oracle 学习笔记 14 -- 集合操作和高级子查询
Oracel提供了三种类型的集合操作:各自是并(UNION) .交(INTERSECT). 差(MINUS) UNION :将多个操作的结果合并到一个查询结果中,返回查询结果的并集,自己主动去掉反复的 ...
- Oracle-3 - :超级适合初学者的入门级笔记--用户权限,set运算符,高级子查询
上一篇的内容在这里第二篇内容, 用户权限:创建用户,创建角色,使用grant 和 revoke 语句赋予和回收权限,创建数据库联接 创建用户:create user xxx identified b ...
- Oracle系列八 高级子查询
子查询 子查询 (内查询) 在主查询执行之前执行 主查询(外查询)使用子查询的结果 多列子查询 主查询与子查询返回的多个列进行比较 多列子查询中的比较分为两种: 成对比较 问题:查询与141号或174 ...
- Oracle入门第三天(下)——子查询
一.子查询 1.子查询语法 SELECT select_list FROM table WHERE expr operator (SELECT select_list FROM table) 示例: ...
- ORACLE 多表连接与子查询
Oracle表连接 SQL/Oracle使用表连接从多个表中查询数据 语法格式: select 字段列表from table1,table2where table1.column1=table2.co ...
- oracle[insert 时报错: 单行子查询返回多行]
-- 错误的写法 insert into t_b_partner_vehicle(id, partner_id, vehicle_id) (seq_t_b_partner_vehicle.nextva ...
- Oracle 数据库基础学习 (六) 子查询
子查询在一个select中出现多个嵌套查询语句 1.在where子句中使用子查询(一般返回"单行单列" "单行多列" "多行单列"(可以提供 ...
随机推荐
- 转贴:如何学好C++语言.docx
不知道哪里转的.呵呵 抱歉 C++是最难的语言.这个世界上最难的编程语言可能非C++莫属了.你千万不要以为几天就可以学好C++,C++的学习曲线是相当BT的,你可以看看这篇文章.C++是一门很自由的语 ...
- pipenv
一. 1. 使用pip安装pipenv及其相关依赖 pip install pipenv 2. 将目录更改为包含你的Python项目的文件夹,并启动Pipenv cd my_project pipen ...
- metasploit 渗透测试笔记(基础篇)
0x00 背景 笔记在kali linux(32bit)环境下完成,涵盖了笔者对于metasploit 框架的认识.理解.学习. 这篇为基础篇,并没有太多技巧性的东西,但还是请大家认真看啦. 如果在阅 ...
- 1、关于python第三方工具操作xls和xlsx格式的excel文档选型的吐血经历
首先,最近看了python的一本书,其中第7章是关于文章操作的,就计划把python操作excel,word,txt,xml,html,json等格式的文档做个总结,并实现一些功能,但是,第一步就要把 ...
- Angular组件之间通讯
组件之间会有下列3种关系: 1. 父子关系 2. 兄弟关系 3. 没有直接关系 通常采用下列方式处理(某些方式是框架特有)组件间的通讯,如下: 1父子组件之间的交互(@Input/@Output/模板 ...
- Java中String直接复制和new String创建对象的区别以及equals和==的区别和效率对比
编程语言中的问题很多时候我们看似懂,实际不懂,因为很多时候看不到更多的情况,从而缺少对这些看不到的情况的认知和解释. 今天mark一下String和new String()的区别.其实很简单. Str ...
- monad重新理解
monad是高阶抽象类型: 包含类型构造器: monad抽象的核心是类型封装和类型转化(map). 实现monad的的类型必须实现(基础)类型的封装和类型转化的功能: 在此基础上实现其他的功能(基本依 ...
- 为什么 Category 不能增加成员变量-nonfragile
三.既然是 non-fragile ivars,为什么 Category 不能增加成员变量? 看过一些资料,理由并不是很让人信服.我觉得并不是做不到,只是现在没有做,现在不支持.我在 Opti ...
- webview综述
nWebView 是webkit最核心的一个view,WebView管理WebFrameView和WebFrame之间的交互,一个WebView对象绑定一个window,并且要求MainFrame加载 ...
- Python3安装scrapy框架步骤
Python3安装scrapy框架步骤 1. 安装wheel a) Pip install wheel 2. 安装lxml Pip install lxml 3. ...