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

   这一节将讨论一下子查询更加复杂的应用,主要在于简化 SQL,从侧面提高性能,当然。。提高性能的地方有很多很多。。今天听了一场关于 Oracle 的性能调优的讲座,了解了 Oracle 性能、优化要注意的各个方面。虽然现在可能还遇不到那么复杂的问题,但是关于简化
SQL ,优化 SQL 还是目前可以做到并作为一个不断努力的地方。话不多说,通过几个例子先来讨论一下~(当然。。对于我这种菜鸟还是有难度的,各位大神多多谅解,多多包涵~)希望给大家一些有益的思考或借鉴~

一、子查询回顾

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

例:

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

结果如下

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

结果如下

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

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

不成对比较方式:

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

分析:

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

-- 查询 emloyee_id , manager_id , department_id

-- where 条件将 manager_id、department_id 限定

-- employee_id 不能为 149 或 176.

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

查询结果显示如下:

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

成对比较方式:sql如下

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

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

分析:

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

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

2、加上平均工资

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

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

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

那和 from 子句使用子查询有何关系呢?其实 departments 是一个真实存在的表,然而在平均工资查询时,我们可以通过 sql 语句来建立一个表,然后建立 employees 与
该表的连接关系,即可降低 sql 语句的冗余度。sql 语句如下和结果如下:

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

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

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

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

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

employees 表中信息

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

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

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

department_name 不存在于 employees 表中,

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

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

时间: 2024-08-25 12:14:08

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

Oracle 学习笔记 14 -- 集合操作和高级子查询

Oracel提供了三种类型的集合操作:各自是并(UNION) .交(INTERSECT). 差(MINUS) UNION :将多个操作的结果合并到一个查询结果中,返回查询结果的并集,自己主动去掉反复的部分. UNION ALL:将多个操作的结果合并到一个查询结果中,可是保留反复的内容. INTERSECT: 返回多个操作结果中同样的部分. MINUS:返回两个查询结果的差集,去掉反复的部分. 基本的语法格式为: SELECT * FROM  table_name 1 [union , union

彻底搞懂oracle的标量子查询

oracle标量子查询和自定义函数有时用起来比较方便,而且开发人员也经常使用,数据量小还无所谓,数据量大,往往存在性能问题. 以下测试帮助大家彻底搞懂标量子查询. SQL> create table a (id int,name varchar2(10)); Table created. SQL> create table b (id int,name varchar2(10)); Table created. SQL> insert into a values (1,'a1'); 1

SQL高级部分一(SET运算符 && 高级子查询)

一.SET运算符 将多个查询用 SET 操作符连接组成一个新的查询 select employee_id , department_id from emp01 union all --相当于两个集合相加, union A并B ,intersect ,A交B,MINUS 差集,A-B select employee_id , department_id from emp02 SET操作的注意事项 在SELECT 列表中的列名和表达式在数量和数据类型上要相对应 括号可以改变执行的顺序 ORDER B

[转]Oracle DB 使用子查询来解决查询

? 定义子查询 ? 描述子查询可以解决的问题类型 ? 列出子查询的类型 ? 编写单行和多行子查询 ? 子查询:类型.语法和准则 ? 单行子查询: – 子查询中的组函数 – 带有子查询的HAVING子句 ? 多行子查询 – 使用ALL或ANY运算符 ? 使用EXISTS运算符 ? 子查询中的空值 使用子查询解决问题 谁的薪金高于Abel 的薪金? 子查询: Abel 的薪金是多少? 主查询: 哪些雇员的薪金高于Abel 的薪金? 使用子查询解决问题 假设要编写一个查询来找出谁的薪金高于Abel 的

SQL语句面试题目:一般查询和高级子查询

几个表 employees 表: EMPLOYEE_ID              NUMBER(6) FIRST_NAME                VARCHAR2(20) LAST_NAME                 VARCHAR2(25) EMAIL                               VARCHAR2(25) PHONE_NUMBER       VARCHAR2(20) HIRE_DATE                  DATE JOB_ID 

高级子查询【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 3000 ANALYST SCOTT 4000 ANALYST 非成对比较: select enam

SQL高级子查询

一:编写子查询: 查询学生“章涵”的班级编号,然后在学生表查询出与“章涵”的班级编号相同的学生编号.姓名.和班级编号 1)select ClassID from studentinfo where studentname="章涵"://查询学生“章涵”的班级编号          select id,name,ClassID from studentinfo where ClassID=(select ClassID from studentinfo where studentname

ORACLE EXPDP IMPDP数据导入导出命令详解及同EXP IMP命令详细对比

ORACLE EXPDP IMPDP数据导入导出命令详解及同EXP IMP 命令详细对比 一.EXPDP IMPDP EXP IMP 可以实现 1.可以实现逻辑备份和逻辑恢复 2.可以在数据库用户之间移动对象 3.可以在数据库之间移动对象 4.可以实现表空间转移 二.EXPDP的命令详解 C:\Users\Administrator>20:42:32.90>expdp help=y Export: Release 11.2.0.1.0 - Production on 星期六 10月 10 09

Oracle创建表语句(Create table)语法详解及示例

Oracle创建表语句(Create table)语法详解及示例   创建表(Create table)语法详解1. ORACLE常用的字段类型ORACLE常用的字段类型有VARCHAR2 (size) 可变长度的字符串, 必须规定长度CHAR(size) 固定长度的字符串, 不规定长度默认值为1NUMBER(p,s) 数字型p是位数总长度, s是小数的长度, 可存负数最长38位. 不够位时会四舍五入.DATE 日期和时间类型LOB 超长字符, 最大可达4GCLOB 超长文本字符串BLOB 超长