iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Oracle!你必须要知道的Knowledge points
  • 718
分享到

Oracle!你必须要知道的Knowledge points

2024-04-02 19:04:59 718人浏览 安东尼
摘要

子查询 什么是子查询 当查询中的限制条件需要另一个查询提供时,我们可以把两个查询语句嵌套起来,提供条件的查询语句作为子查询。子查询,也叫内部查询,先于主查询执行,子查询的结果被用于主查询。子查询分为单行子查

子查询

什么是子查询

Oracle!你必须要知道的Knowledge points
当查询中的限制条件需要另一个查询提供时,我们可以把两个查询语句嵌套起来,提供条件的查询语句作为子查询。
子查询,也叫内部查询,先于主查询执行,子查询的结果被用于主查询。
子查询分为单行子查询、多行子查询和多列子查询,单行子查询作为判断条件时用单行运算符,多行子查询和多列子查询作为判断条件时用多行运算符。
单行运算符:>、=、>=、<、<>、<=
多行运算符:in、all、any

子查询可以嵌套在哪里

Where子句:作为非分组函数筛选判断的条件
From子句:将子查询的查询结果作为一张表来使用
Having子句:作为分组函数筛选判断的条件

子查询使用规范

子查询需要用括号括起来
当子查询放在from子句中时,是将查询到的结果作为一张表来使用,需给别名
单行子查询用单行运算符,多行子查询用多行运算符
子查询放在运算符右边

单行子查询

单行子查询返回一行一列,使用单行运算符进行连接

--显示和雇员7369从事相同工作并且工资大于雇员7876的雇员的姓名和工作。
select ename,job
from emp 
where job = (select job from emp where empno =7369)
and sal > (select sal from emp where empno = 7876);

--查询工资最低的员工姓名,岗位及工资(子查询中使用了分组函数)
select ename,job,sal
from emp
where sal = (select min(sal) from emp)

--查询部门最低工资比20部门最低工资高的部门编号及最低工资(子查询嵌套在having子句)
select  deptno,min(sal)
from  emp
group by deptno
having min(sal) > (select min(sal) from emp where deptno = 20 );

多行子查询

多行子查询返回一行或多行记录,使用多行运算符进行连接

--查询是经理的员工姓名、工资
select ename,sal
from emp
where empno in (select mgr from emp)

ANY的使用

表示和子查询的任意一行结果进行比较,有一个满足条件即可。

any:大于子查询结果的任意一个,即大于最小值即可。
<any:小于子查询结果的任意一个,即小于最大值即可。
=any:等于子查询结果的任意一个,即等一任意一个即可,相当于in。

Oracle!你必须要知道的Knowledge points

--查询部门编号不为10,且工资比10部门任意一名员工工资高的员工编号,姓名,职位,工资。
select empno,ename,job,sal
from emp
where deptno <> 10 and sal > any(select sal from emp where deptno = 10);

ALL的使用

表示和子查询的所有行结果进行比较,每一行必须都满足条件。

<all:表示小于子查询结果集中的所有行,即小于最小值
>all:表示大于子查询结果集中的所有行,即大于最大值。
= all :表示等于子查询结果集中的所有行,即等于所有值。

Oracle!你必须要知道的Knowledge points

--查询部门编号不为10,且工资比10部门所有员工工资低的员工编号,姓名,职位,工资。
select empno,ename,job,sal
from emp
where deptno <> 10 and sal > all(select sal from emp where deptno = 10);

多列子查询

在一个表达式内同时和子查询的多个列进行比较,即子查询返回的记录含多列
Oracle!你必须要知道的Knowledge points

--查询和1981年入职的任意一个员工的部门和职位完全相同员工姓名、部门、职位、入职日期,不包括1981年入职员工。
select ename,deptno,job,hiredate
from emp
where (deptno,job) in (select deptno,job from emp where to_char(hiredate,'YYYY') = '1981')
and to_char(hiredate,'YYYY') <> '1981';

Oracle!你必须要知道的Knowledge points

--查询和1981年入职的任意一个员工的部门或职位相同员工姓名、部门、职位、入职日期,不包括1981年入职员工
select ename,deptno,job,hiredate
from emp
where job in (select job from emp where to_char(hiredate,'YYYY') = '1981')
or deptno in (select deptno from emp where to_char(hiredate,'YYYY') = '1981')
and to_char(hiredate,'YYYY') <> '1981';

子查询中的空值

子查询结果中含有空值对主查询会有怎样的影响?
Oracle!你必须要知道的Knowledge points

--查询不是经理的员工姓名
select ename
from emp
where empno not in (select mgr from emp);

Oracle!你必须要知道的Knowledge points
子查询的结果中有一条空值,这条空值导致主查询没有记录返回,这是因为所有的条件和空值比较结果都是空值,因此无论什么时候只要空值
有可能成为子查询结果集合中的一部分,就不能使用 not in 运算符。
 
如果子查询的结果中包含空值,又想使用 not in 运算符该怎么办?

--查询不是经理的员工姓名
select ename
from emp
where empno not in (select nvl(mgr,0) from emp);     --使用nvl()函数去除空值影响

Oracle!你必须要知道的Knowledge points

在from子句中使用子查询

在from子句中使用子查询,相当于把子查询的查询结果作为一张表来使用,在使用时建议加上相应的别名

--查询比自己部门平均工资高的员工姓名,工资,部门编号,部门平均工资
select e.ename,e.sal,e.deptno,w.avgsal
from emp e,(select avg(sal) as avgsal deptno from emp group by deptno) w
where e.deptno = w.deptno and e.sal > w.avgsal;

ROWNUM

rownum是一个伪列,顾名思义,就是一个类似于表中的列,而实际并没有存储在表中的特殊列;
rownum的功能是在每次查询时,返回结果集的顺序号,这个顺序号是在记录输出时才一步一步产生的,第一行显示为1,第二行为2,以此类推。

select rownum.emp.* from emp;

Oracle!你必须要知道的Knowledge points
关于rownum需要知道的几点

  1. rownum是在记录输出时才生成,且总是从1开始
  2. rownum只能执行<、<=运算,不能执行>、>= 或区间运算between ... and ...
  3. rownum和order by一起使用时,因为rownum在记录输出时生成,而order by子句在最后执行,所以当两者一起使用时,需要注意rownum实际是已经被排了序的rownum

TOP-N查询

实现表中按照某个列排序,输出最大或最小的N条记录功能
Top-N语法
Oracle!你必须要知道的Knowledge points
ASC:升序排序,查询最小的N条记录
DESC:降序排序,查询最大的N条记录
Oracle!你必须要知道的Knowledge points

--查询入职日期最早的前5名员工姓名,入职日期。
select rownum,ename,hiredate
from (select ename,hiredate from emp order by hiredate)
where rownum <= 5;

Oracle!你必须要知道的Knowledge points

--查询工作在CHICAGo并且入职日期最早的前2名员工姓名,入职日期
select rownum,ename,hiredate
from (select ename,hiredate from emp
                 where deptno = (select deptno from dept where loc = 'CHICAGO')
                 order by hiredate)
where rownum <= 2;

Oracle!你必须要知道的Knowledge points

分页查询

利用ROWNUM的特性,可以实现数据库端的分页查询
语法格式
Oracle!你必须要知道的Knowledge points

--按照每页显示5条记录,分别查询第1页,第2页,第3页信息,要求显示员工姓名、入职日期、部门名称。
select b.*
from (select rownum rn,ename,hiredate,dname
                 from emp,dept
                 where emp.deptno = dept.deptno and rownum <=  1*5) b
where rn > (1-1)*5;

Oracle!你必须要知道的Knowledge points

select b.*
from (select rownum rn,ename,hiredate,dname
                 from emp,dept
                 where emp.deptno = dept.deptno and rownum <=  2*5) b
where rn > (2-1)*5;

Oracle!你必须要知道的Knowledge points

select b.*
from (select rownum rn,ename,hiredate,dname
                 from emp,dept
                 where emp.deptno = dept.deptno and rownum <=  3*5) b
where rn > (3-1)*5;

Oracle!你必须要知道的Knowledge points

排序后分页

Oracle!你必须要知道的Knowledge points
排序->rownum->select输出最后结果

--按照每页显示5条记录,分别查询工资最高的第1页,第2页,第3页信息,要求显示员工姓名、入职日期、部门名称、工资。
select *
from (select rownum rn,b.*
                 from (select ename,hiredate,dname,sal from emp,dept 
                           where emp.deptno = dept.deptno 
                           order by sal desc) b
                 where  rownum <= 1*5   )
where rn > (1-1) * 5;

Oracle!你必须要知道的Knowledge points

select *
from (select rownum rn,b.*
                 from (select ename,hiredate,dname,sal from emp,dept 
                           where emp.deptno = dept.deptno 
                           order by sal desc) b
                 where  rownum <= 2*5   )
where rn > (2-1) * 5;

Oracle!你必须要知道的Knowledge points

select *
from (select rownum rn,b.*
                 from (select ename,hiredate,dname,sal from emp,dept 
                           where emp.deptno = dept.deptno 
                           order by sal desc) b
                 where  rownum <= 3*5   )
where rn > (3-1) * 5;

Oracle!你必须要知道的Knowledge points

您可能感兴趣的文档:

--结束END--

本文标题: Oracle!你必须要知道的Knowledge points

本文链接: https://www.lsjlt.com/news/35837.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • oracle怎么查询当前用户所有的表
    要查询当前用户拥有的所有表,可以使用以下 sql 命令:select * from user_tables; 如何查询当前用户拥有的所有表 要查询当前用户拥有的所有表,可以使...
    99+
    2024-05-15
    oracle
  • oracle怎么备份表中数据
    oracle 表数据备份的方法包括:导出数据 (exp):将表数据导出到外部文件。导入数据 (imp):将导出文件中的数据导入表中。用户管理的备份 (umr):允许用户控制备份和恢复过程...
    99+
    2024-05-15
    oracle
  • oracle怎么做到数据实时备份
    oracle 实时备份通过持续保持数据库和事务日志的副本来实现数据保护,提供快速恢复。实现机制主要包括归档重做日志和 asm 卷管理系统。它最小化数据丢失、加快恢复时间、消除手动备份任务...
    99+
    2024-05-15
    oracle 数据丢失
  • oracle怎么查询所有的表空间
    要查询 oracle 中的所有表空间,可以使用 sql 语句 "select tablespace_name from dba_tablespaces",其中 dba_tabl...
    99+
    2024-05-15
    oracle
  • oracle怎么创建新用户并赋予权限设置
    答案:要创建 oracle 新用户,请执行以下步骤:以具有 create user 权限的用户身份登录;在 sql*plus 窗口中输入 create user identified ...
    99+
    2024-05-15
    oracle
  • oracle怎么建立新用户
    在 oracle 数据库中创建用户的方法:使用 sql*plus 连接数据库;使用 create user 语法创建新用户;根据用户需要授予权限;注销并重新登录以使更改生效。 如何在 ...
    99+
    2024-05-15
    oracle
  • oracle怎么创建新用户并赋予权限密码
    本教程详细介绍了如何使用 oracle 创建一个新用户并授予其权限:创建新用户并设置密码。授予对特定表的读写权限。授予创建序列的权限。根据需要授予其他权限。 如何使用 Oracle 创...
    99+
    2024-05-15
    oracle
  • oracle怎么查询时间段内的数据记录表
    在 oracle 数据库中查询指定时间段内的数据记录表,可以使用 between 操作符,用于比较日期或时间的范围。语法:select * from table_name wh...
    99+
    2024-05-15
    oracle
  • oracle怎么查看表的分区
    问题:如何查看 oracle 表的分区?步骤:查询数据字典视图 all_tab_partitions,指定表名。结果显示分区名称、上边界值和下边界值。 如何查看 Oracle 表的分区...
    99+
    2024-05-15
    oracle
  • oracle怎么导入dump文件
    要导入 dump 文件,请先停止 oracle 服务,然后使用 impdp 命令。步骤包括:停止 oracle 数据库服务。导航到 oracle 数据泵工具目录。使用 impdp 命令导...
    99+
    2024-05-15
    oracle
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作