oracle 查询最难,Oracle(四)--> 高级子查询(多例详解难度高,实在不信进来看~)...

5268f80b9b1e01f982625ef6fac83ca1.png

一、子查询回顾

子查询是嵌套在 SQL 语句中的另一个 SELECT 语句

cd3c3095bc726e1d795f6a67b82adbad.png

clipboard.png

例:

1、查询工资大于148号员工工资的员工信息(只能为单列查询,否则报错)

7485e79a3904bf7ff7310d8ca5edb14e.png

clipboard.png

结果如下

5690b7d6fb25e9483fb6517a3f129caa.png

clipboard.png

2、查询 Last_name 为 grant 的 manager 的信息

5654e6e4fffbb7d1885a24fe187778de.png

clipboard.png

结果如下

clipboard.png

2d27bd1c9c9ed03eab3cc3d41642bd92.png

二、多列子查询( 将返回多个结果用 in )

1、例:查询 employee_id 为 149 号或 176 号员工的 manager_id 和 department_id 相同的其他员工的 emloyee_id , manager_id , department_id。

不成对比较方式:

employees 表中 employee_id 、 department_id 、 manager_id 的数据如下

57bc782250173c0da2f03586a0eaf135.png

clipboard.png

分析:

1)首先应该写出以下图中的内容

84023a5f00e711e0ea53d902df7477a2.png

clipboard.png

-- 查询 emloyee_id , manager_id , department_id

-- where 条件将 manager_id、department_id 限定

-- employee_id 不能为 149 或 176.

2)之后将 manager_id 和 department_id 的 sql 语句填上即可,当然此时最好将 "" 改为 in。

c40230757e3d4f906c09f2bcc692ddc2.png

clipboard.png

查询结果显示如下:

33df968b654ad9c39dae725a8a546cd1.png

clipboard.png

我们发现上述查询中有两个部分出现多次,于是我们应该通过多列子查询使得 sql 语句更加简洁。

成对比较方式:sql如下

clipboard.png

5ac020b522f81673464470f585fe1f6a.png

2、在 from 子句中使用子查询

例:返回比本部门平均工资高的员工的 last_name,department_id,salary 及平均工资

分析:

1、首先我们讨论一下没有平均工资的情况该如何写。

5657c53d79b00c61f05092df42e469eb.png

clipboard.png

-- 要注意的地方在于部门号要一致(本部门)

2、加上平均工资

290d8064daeaddb671e62caaeb0e790b.png

clipboard.png

通过加入一个 select 查询进行平均工资的查询,也要保证为本部门,查询结果如下

clipboard.png

dc74a8d3dd65b5b5546116ee3899ae19.png

那么如何在 from 子句中使用子查询呢?

首先,这里用到了与多表连接类似的方式。多表连接怎么用?看一眼下面的例子即可:

069cd311f23fd3471f236964c636fb2b.png

clipboard.png

那和 from 子句使用子查询有何关系呢?其实 departments 是一个真实存在的表,然而在平均工资查询时,我们可以通过 sql 语句来建立一个表,然后建立 employees 与

该表的连接关系,即可降低 sql 语句的冗余度。sql 语句如下和结果如下:

clipboard.png0841eca9aec797ba140d31ca19c3c1b3.png

clipboard.png

可以发现这样的查询结果与之前的结果是一致的,但是冗余度大大降低,但是思路要清晰,难度较大。

3f87536ccaac0111a9fd5fb25a865b4e.png

三、单列子查询表达式:是在一行中只返回一列的子查询

-----------------------------------------------------------------------------------------

例:显示员工的 employee_id,last_name,和 location。其中,若员工的 department_id 与 location_id 为 1800 的 department_id 相同,则 location 为 ‘CANADA‘,其余为 ‘USA‘。

分析:若..则.. 条件语句:case..when..then..end,sql 及 返回结果如下

686ddf77560925e6ff667c3b904cc892.png

790996fb21ee014127e0b4188c2f76b2.png

clipboard.png

employees 表中信息

clipboard.png

6751c9131768a6167f5a7d5a4a877c62.png

departments 表中信息(仅有一个 ID 对应)

6bdfed90b1e2a546773bab16d63e4836.png

clipboard.png

-----------------------------------------------------------------------------------------------------

例:查询员工的 employee_id 和 last_name,要求按照员工的 department_name 排序

e55e08c017202a7e165f40e483ee61c5.png

clipboard.png

department_name 不存在于 employees 表中,

每次查询一个员工时,都会找到对应的 name ,然后跟已有排好序的 name 进行对比,如果靠前就往前排,靠后则往后排,故此连接条件必须存在。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Oracle(四)--> 高级子查询(多例详解难度高,实在不信进来看~)

标签:子查询   单列子查询

1428d0e076c3959ab11d28a39bc84fab.png

5268f80b9b1e01f982625ef6fac83ca1.png

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:http://blog.csdn.net/qq_21394609/article/details/48086679

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值