`

Oracle数据库之SQL语句子查询

阅读更多
/*
====================================================================================================
-- 非关联子查询:单行子查询,多行子查询
--  非关联子查询就是位于SELECT、UPDATE、或DELETE语句中内部的查询语句
--子查询(内部查询)在执行主查询之前执行一次 (只执行1次), 然后主查询(外部查询)会使用该子查询的结果 遍历全部记录
-- -- Notice:子查询的结果有多个值,oracle会去掉重复的记录,再将结果返回给主查询
=====================================================================================================
*/

-- ===========单行子查询================================================================================
-- 子查询只返回一条记录.单行子查询 ,用 <> , < , >, <=, >=  , = 操作

--在WHERE 子句中使用子查询  
select ename,job from emp where empno = (select empno from emp  where mgr = 7902 );   
--分析:
	--1.先执行select empno from emp  where mgr = 7902(只执行1次)得到查询结果7369.
	--2. 再执行外部查询:select ename,job from emp where empno =7369. 得到最终结果.
	
 --使用分组函数的子查询
 select ename,job,sal from emp  where sal > (select avg(sal) from emp);
 -- from 后面的子查询
 select ename, job from (select * from emp where empno = 7369); 
 --单行子查询中的常见错误
        --子查询的结果返回多于一行
select empno,ename  from emp where sal =  (select sal from emp where deptno = 20); --error
		--子查询中不能包含ORDER BY子句,任何的排序在外部查询中完成
 select empno,ename from emp where sal > (select avg(sal) from emp order by empno); -- error
 select empno,ename from emp where sal > (select avg(sal) from emp)  order by empno; -- ok 
		--子查询内部没有返回行,如下语句可以正确执行,但没有数据返回
 select ename,job  from emp where empno = (select empno  from emp where mgr = 8000); --error未选定行

 -- ===========多行子查询================================================================================
 --子查询 结果返回多条记录给外部查询(同样执行1次),外部查询用in, any , all 处理
 -- 外部查询用in , any , all 处理之前必须用一个  =, <>, <, >, <= , >= 操作符.
 
 --查询每个部门中薪水最高的员工姓名
 select empno,ename,job from empwhere sal in  (select max(sal)  from emp group by deptno);
--分析:
-- 1.执行select max(sal)  from emp group by deptno ; 返回多条记录.
-- 2.执行select empno,ename,job from emp where sal in ( 从1中返回的多条记录进行一条一条的匹配 ) ;
 
 --查询每个部门中低于平均薪水的员工姓名 (any   任何一个)
 select empno,ename,job  from emp where sal < any	(select avg(sal) 	from emp	group by deptno);


 /*
====================================================================================================
-- 关联子查询:单行子查询,多行子查询
---- 子查询中使用了主查询中的某些字段,主查询每扫描一行都要执行一次子查询 

-- 关联子查询:(采用loop的方式进行)
-- 1.外部查询得到一条记录(从外部表中读取数据) 并将其传入到内部查询
-- 2.内部查询基于传入的值执行
-- 3.内部查询从其结果中把值传回到外部查询,
-- 外部查询使用这些值来完成其处理,若符合条件,外部表的那条记录就放入结果集中,
   -- 否则放弃(表示该记录不符合条件)
   
-- 4. 重复1-3 .直到把outer表中的所有记录判断一遍
=====================================================================================================
*/
    --查询工资高于同一部门的员工的部门号,姓名,工资
	select deptno,ename,sal from emp outer  where sal >(
				select avg(sal)from emp inner where inner.deptno = outer.deptno);
--分析:1. 取出外部outer的全部记录一条一条的传递给子查询(作为子查询的条件)
--        2.子查询根据外部查询的条件执行1次子查询
--  	3.直到外部记录全部遍历完为止,才返回最终的结果
-- 重点:主查询每扫描一行都要执行一次子查询 

 
 /*
====================================================================================================
 -- Exists:用来检查子查询返回行的存在性
 -- 执行过程:
-- 1.外部查询得到一条记录(从外部表中读取数据) 并将其传入到内部查询
-- 2.对inner表依次扫描,若根据条件存在一条记录与 outer表中的记录匹配,立即停止扫描,
		返回ture.立即停止扫描inner表.那么该outer 表中的记录放入结果集中,
		若扫描了全部记录,没有任何一条记录符合匹配条件,
		返回false, outer表的记录被过滤掉,不能出现在结果集中.
   
-- 3.重复步骤1-2.直至遍历完outer表中所有的记录
 
=====================================================================================================
*/
          

    --查询负责管理其它员工的员工记录(使用exists),即是领导的员工
select empno,ename from emp outer where exists
				(select empno from emp inner where inner.mgr = outer.empno);
				
--分析:
	-- 1. 把outer表中的1行记录的empno传进子查询select empno from emp inner where inner.mgr =xx中.
	-- 2.子查询进行全部数据的遍历,检查是否符合where条件的记录
	-- 3.如果存在,那么就把outer表中的该条记录放入结果集.
	--4.不存在,outer表中的该条记录 不放入结果集.
    -- 5.重复 1.- 4步,直到遍历完outer表中的全部记录,生成最终的结果集
	
-- Notice:exists只关心子查询有没有结果,并不需要返回值,所以上述语句调整为(返回常量):
 select empno,ename from emp outer where exists
				(select 1 from emp inner where inner.mgr = outer.empno);

 
 --========= not Exists 用Exists执行过程一样,not Exists表示子查询没有返回则把outer表放入结果集
  --查询不管理其它员工的职员(not exists),查询不是领导的员工
select empno,ename from emp outer where not exists
	(select empno from emp inner where inner.mgr = outer.empno)

 --分析:
	-- 1. 把outer表中的1行记录的empno传进子查询select empno from emp inner where inner.mgr =xx中.
	-- 2.子查询进行全部数据的遍历,检查是否符合where条件的记录
	-- 3.如果  不 存在,那么就把outer表中的该条记录放入结果集.
	--4.存在,outer表中的该条记录 不放入结果集.
    -- 5.重复 1.- 4步,直到遍历完outer表中的全部记录,生成最终的结果集
 
 
 --EXISTS 和NOT EXISTS 与IN 和NOT IN 的比较

 --       EXISTS与IN的不同:

  --          EXISTS只检查行的存在性,IN 要检查实际值的存在性(一般情况下EXISTS的性能高于IN)

  --      NOT EXISTS 和NOT IN 

   --        当值列表中包含空值的情况下,NOT EXISTS 则返回true,而NOT IN 则返回false.

 
 -- update 的子查询
 update emp set salary = (select avg(salary) from emp ) where deptno = 10;
 -- delete的子查询
 delete from emp where salary > (select avg(salary) from emp);


笔记:group by ... having 子句的用法:

select sum(salary) from emp group by deptno having deptno > 10;
或者
select sum(salary) from emp group by deptno having sum(salary) > 5000 ;

 

分享到:
评论

相关推荐

    SQL SERVER连接oracle数据库几种方法

    SQL SERVER 连接 Oracle 数据库几种方法 在实际开发中,我们经常需要在 SQL Server 中连接 Oracle 数据库,以便实现数据交换和集成。那么,如何在 SQL Server 中连接 Oracle 数据库呢?下面我们将介绍几种常见的...

    数据库开发 Oracle数据库 SQL开发教程 全套PPT课件 共20个章节.rar

    数据库开发 Oracle数据库 SQL开发教程 第02章 编写简单的查询语句(共34页).pdf 数据库开发 Oracle数据库 SQL开发教程 第03章 限制数据和对数据排序(共37页).pdf 数据库开发 Oracle数据库 SQL开发教程 第04章 ...

    oracle数据库导入到SQL server.docx

    "Oracle数据库迁移到SQL Server" 本文将详细讲解如何使用Microsoft SQL Server Migration Assistant for Oracle.exe(微软数据库迁移工具)将Oracle数据库迁移到SQL Server。该工具可以帮助用户快速、安全地将...

    shell连接oracle数据库执行SQL工具脚本-支持select+inset+update

    shell连接oracle数据库工具脚本:支持select/insert/update/delete 部署位置:/root/sysmonitor db:数据库文件夹 dbconfig.properties:数据库配置文件, dbConnectTest.sh:连接测试文件 dbExecurteSQL.sh:...

    oracle SQL查询工具

    oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具...

    oracle数据库sql练习题(含答案)

    oracle数据库sql练习题(含答案)用于练习增删改查操作。

    Oracle数据库导入到SqlServer步骤(图文篇)

    Oracle 数据库到 SqlServer 数据迁移步骤详解 Oracle 数据库到 SqlServer 的数据迁移是一项复杂的任务,需要经过多个步骤来完成。本文将详细介绍如何将 Oracle 数据库导入到 SqlServer 中。 Step 1-6: 数据源设置...

    oracle到sqlserver 跨库查询

    Oracle 到 SQL Server 跨库查询是指通过网关工具将数据从 SQL Server 数据库中抽取到 Oracle 数据库中。这个过程需要安装和配置网关软件,并进行相应的设置和配置。 一、网关软件安装 网关软件的安装是跨库查询的...

    oracle 数据库 scott.sql 范例表

    Oracle数据库是世界上最广泛使用的数据库管理系统之一,尤其在企业级应用中占据重要地位。"scott.sql"是一个典型的Oracle数据库示例脚本,它包含了著名的"SCOTT"用户的表和相关数据,这个用户是为了教学和演示目的而...

    Oracle数据库SQL练习

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其SQL语法是进行数据操作和查询的核心工具。本资料包针对Oracle数据库的SQL使用提供了丰富的练习资源,旨在帮助用户深入理解和熟练掌握SQL语言在Oracle环境...

    sql查询oracle时间段操作

    在SQL查询中对Oracle数据库进行时间段操作是一项关键技能,特别是在数据恢复和历史数据分析时。Oracle数据库提供了多种方式来处理时间范围的数据,包括SQL查询、闪回功能和快照。下面我们将详细探讨这些知识点。 ...

    通过ORACLE通用连接访问SQLServer数据库的方法

    这种方法主要依赖于Oracle数据库的异构服务功能,允许用户从Oracle环境中直接查询或操作其他类型数据库(如SQL Server)中的数据。接下来,我们将详细探讨实现这一连接的具体步骤与注意事项。 ### 一、配置ODBC数据...

    [自己开发]一款非常好用的抓取Oracle数据库SQL语句的工具

    Oracle SQL Profiler,自己设计算法写的一款非常好用的抓取Oracle数据库SQL语句的工具,可以再没有源码的情况下监控ORACLE数据库服务器的v$sqlarea视图抓取出从点击开始按钮到点击结束按钮期间执行过的SQL语句。...

    Oralce数据库SQL和pl_sql实例教程

    总的来说,Oracle数据库SQL和PL/SQL实例教程旨在帮助学习者深入理解这两种语言,提高数据库管理与开发的技能,从而在实际工作中更加高效地处理数据。通过详细的章节和实例,读者可以逐步熟悉并熟练运用SQL和PL/SQL...

    OraSQL 是一个 oracle 数据库 的sql 工具, 它通过 TCP/IP 协议直接连接到 oracle 数据库,不需要另外安装 oracle 客户端。

    OraSQL 是一个 oracle 数据库 的sql 工具, 它通过 TCP/IP 协议直接连接到 oracle 数据库,不需要另外安装 oracle 客户端。 OraSQL 完全免费。 主要功能: * Connect to Oracle 连接到 oracle 数据库,不需要...

    Oracle数据库sql语句 跟踪器

    Oracle数据库SQL语句跟踪器,通常被称为SQL Monitor,是一种强大的工具,用于监控和分析数据库中的SQL语句执行情况。在Oracle环境中,理解SQL语句的行为是优化数据库性能的关键。SQL Monitor提供实时视图,帮助DBA...

    Oracle数据库SQL和PL/SQL实例教程

    西安电子科技大学出版社出版的《Oracle数据库SQL和PL/SQL实例教程》将通过丰富的实例帮助读者理解和掌握这些概念。读者将学习如何编写高效的SQL查询,以及如何利用PL/SQL进行更复杂的业务逻辑处理。通过实例练习,...

    Oracle数据库课程设计医院系统数据库源代码.zip

    Oracle数据库课程设计医院系统数据库源代码。包含Java代码和SQL语句。源码中默认使用的数据库为运行的Oracle数据库 如需修改,在java源码/database.propertie中修改即可!Oracle数据库课程设计医院系统数据库源代码...

    ORACLE数据库SQL语句美化器

    对ORACLE-SQL进行一些布局优化,更新它的格式

    SQLserver2012链接Oracle数据库操作说明.docx

    通过上述步骤,我们可以实现 SQL Server 2012 与 Oracle 数据库之间的有效连接,并能够执行基本的数据查询操作。这对于需要在不同数据库平台之间交换数据的应用场景非常有用。同时,我们也需要注意维护系统的安全性...

Global site tag (gtag.js) - Google Analytics