6、oracle数据库下查询操作

ORACLE下查询操作

针对数据库操作最多的就是数据查询,这里分享一个我常用的方法,看到需求后,先确定查询范围,就是需要查询哪些表;之后确定查询条件;最后写出查询的字段。

ORACLE中之前说过有两个伪列ROWID和ROWNUM,用来标识唯一的一条记录。

1.基本查询

对数据查询最简单的也就是单表查询了,查询使用的语法是:

SELECT [COLS] FROM [TABLE] [WHERE][CONDITION]

平常查询时,一定会有条件,也就是使用到where关键字,之后接条件,这里的条件可以看之前的一篇文章【查询基础】。

这里针对单表查询,介绍一下分页的逻辑,oracle中没有mysql中的关键字limit,所以oracle中数据分页查询需要借助ROWNUM,具体如下:

-- 通用的分页SQL

SELECT * FROM
(SELECT b.*,ROWNUM r FROM
(SELECT * FROM emp) b WHERE ROWNUM <=(pageSize*pageIndex)) t
WHERE t.r > (pageSize*(pageIndex-1))

-- 具体分页SQL实例
SELECT * FROM
(SELECT b.*,ROWNUM r FROM
(SELECT * FROM emp) b WHERE ROWNUM <=12) t
WHERE t.r > (8)

2.连接查询

以下均以两张表连接查询为例

2.1 内连接

查询两张表符合条件的记录的交集

select * from emp,dept where emp.deptno=dept.deptno;

select * from emp inner join dept on emp.deptno=dept.deptno;
select e.ename,d.dname from emp e INNER JOIN d USING(deptno);

2.2 左外连接

将符合条件的左表中的所有数据查询出来,关联着右表中的数据,有则关联显示数据,无则显示null,两种写法

select e.name,d.name from emp e left join dept d on条件

或者是

select e.ename,d.name from emp e,dept d
where d.deptno = e.deptno(+)
order by d.dname;

不可以在使用外连接的情况下使用in关键字

2.3 右外连接

将符合条件的右表中的所有数据查询出来,关联着左表中的数据,有则关联显示数据,无则显示null,两种写法

select e.name,d.name from dept d right join emp e on条件;

或者是

select e.ename,d.name from emp e,dept d
where d.deptno(+) = e.deptno
order by d.dname;

2.4 自连接

就是给自己取个别名,然后当作两个表连接,自连接中可以使用外连接。

3.子查询

3.1 基础子查询

子查询可以简单的理解为一个查询的结果,作为另一个查询的条件,注意在子查询中不能使用order by关键字,排序必须在父查询中进行。如果子查询返回的结果是多行,而其父查询中使用的是比较运算符,将会出现错误。当内部select语句给外部的select语句返回一行或多行,在父查询中可以使用in,any,all等关键字。如下例子:

select deptno,sal from emp

where (deptno,sal) in (select deptno,min(sal) from emp group by deptno);

3.2 关联子查询

关联子查询指的是子查询引用与父查询相关的一列或多列,子查询需借助父查询,父查询也需借助子查询。此关联子查询可用exists关键字来实现如下例子:

-- 直接写关联子查询
select empno,ename,sal,deptno from emp outers
where sal >
(select avg(sal) from emp inners where inners.deptno=outers.deptno);
-- 使用exists操作符实现子查询

select empno,ename,sal,deptno from emp outers
where exists
(select avg(sal) from emp inners where inners.deptno=outers.deptno);

3.3 子查询应用

一般子查询经常用在from关键字和where关键字之后,如下两个例子:

-- 在where之后用

select * from emp where sal>(select avg(sal) from emp)

-- 在from之后用

select ename,dname from
(select * from emp e,dept d where e.deptno=d.deptno)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值