oracle去重统计行数,学习Oracle的历程 (四)

前面,我们学习了在Oracle中学习了DML操作,可以我们添加数据、修改数据、删除数据,当我说到这里难免有大部分人觉得有点别扭,感觉缺少了点什么?

没错,作为编程的根本四要素之一,我们怎么只能去修改、添加、删除、而不去查看数据呢? 今天小喵学习了我们的Oracle中的DQL语句/操作.

DQL语句/操作 其体型对小苗来说是有点庞大了,得慢慢啃了!┭┮﹏┭┮

一 .  单表查询

在正式开始之前,我们先来回顾一下我们的DQL操作的标准语法吧!

select distinct * | 列名 as 别名, 列表2 as 别名2... | 聚合函数

from 表名 as 别名, 表名2 as 别名2 ,....

where 查询条件

group by 分组字段 having 分组条件

order by 排序字段 asc | desc,....

1. 简单查询

a4eb81f8dcd16a1f6f2c3c0cf7903afb.png

2. 去重和排序

c6245ba7ebef77e06c9692dd974d5e00.png

3.伪列

首先,我们需要知道  伪列是Oracle中独有,伪列也是真实存在的列,也是可以用来进行查询操作的,伪列只能用来查询,不能用来进行增删改操作.

1)rowid : 物理文件上唯一区别这条记录的唯一标识,表中的每一行在数据文件中都有一个物理地址,ROWID伪列返回的就是该行的物理地址。使用ROWID可以快速的定位表中的某一行。ROWID值可以唯一的标识表中的一行。

8266bd0287bbdc3617446ca1519158fc.png

2)rownum : 在查询的结果集中,ROWNUM为结果集中每一行标识一个行号,第一行返回1,第二行返回2,以此类推。通过ROWNUM伪列可以限制查询结果集中返回的行数。

注 : 当我们学习分页查询的时候需要用到此   列 (rownum)

9dae22a97c8a02bb9dc2f57d583c2bde.png

4.聚合统计

其实,Oralce的聚合统计是通过分组函数来实现的,这和MySQL一致.

1) 聚合函数

求和 : sum

b271ce997591df5ff59da5261731d999.png

求平均 : avg

6bde5c8cd450db846102041ee87da6b7.png

求 最大值 : max

c808f58c620d7fd9a28e797268adb570.png

求 最小值 : min

272cafc605327812b93e22b348721977.png

求 统计记录个数 : count

9701c3877403ca473afb66a630c0f6b4.png

2) 分组聚合 Group by

5c22614964e507b2ac46f2cf9806118c.png

3)分组后条件查询 having

1fb00b7aab282411d0d3d0369fb46634.png

这里解释一下having 和 where 的区别 :

1. having 是在分组后对数据进行过滤,

where 是在分组前对数据进行过滤

2. having 后面可以使用分组函数(统计函数),

where 后面不可以使用分组函数.

3. having 运算的字段,必须在select中出现,

where 运算的字段,无需在select中出现

二 .  连接查询

1) 笛卡尔积/交叉连接查询 : 两个表乘积,所有的数据最大集

-- 基本语法

select * from A,B;

注 : 笛卡尔积会存在错误的数据信息,因此通常我们会采用一下连接方式

2) 内连接查询  : 分为隐式内连接 和 显示内连接

隐式内连接 :

--基础语法

select * from A表 , B表 on 连接条件

--实例

select * from A a,B b where a.id = b.id;

显示内连接 :

--基础语法

select * from A表 inner join B表 on 连接条件

--实例

select * from A a inner join B b on a.id = b.id;

3) 外连接查询 : 分左外连接 和 右外连接

左外连接 :

查询左表 (A表)所有数据,如果条件成立,显示右表(B表)的数据,否则显示null

--基础语法

select * from A表 left outer join B表 on 连接条件

--实例

select * from A a left outer join B b on a.id = b.id;

右外连接 :

查询右表 (B表)所有数据,如果条件成立,显示左表(A表)的数据,否则显示null

--基础语法

select * from A表 right outer join B表 on 连接条件

--实例

select * from A a right outer join B b on a.id = b.id;

0eb819171ea8b412fb5e916235339b5f.png

三 .  子查询

1)子查询 : 将其他select的查询结果,作为select的查询条件. 子查询可以轻松解决很多疑难需求,但需要注意,子查询中,select关键字出现得越多,查询效率就越低

2) 单行子查询

926d2549a37871842a92f85e09c392ee.png

736cbd77ae9898a7eacad47fd1db03bf.png

3)多行子查询

03fda294920cb786ddeacb1999022670.png

0181ba3ef1cc25c1f81cdb7d8830b163.png

4) 嵌套子查询

顾名思义,在子查询中再次嵌入子查询

049cb35a03345cf0b422dd383ccfab62.png

5) 标量子查询

将子查询的结果作为主查询语句的显示结果 ,但 前提是子查询的结构必须返回单个的值.

791d66507d2b5c60ac97993b3bea1982.png

解谜 :

Oracle 中的dual表

Oracle中独有的最小的工作表,只有一行一列,具有某些特殊功用。

特性

1、Oracle提供的最小的表,不论进行何种操作(不要删除记录),它都只有一条记录——'X'。

例如:执行select * from dual,里面只有一条记录;执行insert into dual values('Y')后,再次查询dual表,仍然显示一条记录。

2、是sys用户下的一张内部表,所有用户都可以使用DUAL名称访问,无论什么时候这个表总是存在。

6)相关子查询

子查询需要依赖外部的主查询语句

8030e9ddfc7ae081af178a5150b991e7.png

四. 分页查询

1) 简单的分页

在Oracle中进行分页查询,我们需要用到 伪列 rownum (伪列上面有说哦!忘记的小伙伴可以拉回上面看看哦!) 和 嵌套查询 .

45c63c8fef968375f26e5552664e690b.png

在Oracle的分页中,因为rownum是在查询语句扫描每条数据是产生的,所以不能使用"大于"符号,只能使用"小于"或"小于等于",同时也不能直接只用"等于".

9a4cbf2faeffe5f333e676df1675e11b.png

2)基于排序的分页

在Oracle中因为 伪列 rownum 的产生是在表记录扫描时产生的,而排序是后进行的,排序时R已经生成,所以排序后R是乱的.

43e04628680a2cef448af080dbca620d.png

那我们该如何写呢?

很简单,我们只要再嵌套一层循环 (一共三层),让结果先排序,然后在对排序后的结果在生产rownum,这样就避免了排序后 R是乱序的问题了.

2df63fa2acc2c44b4ad1b9a8227699a1.png

今天到的分享就到这里了,

知识可能有点量大了,小伙伴们慢慢学就ok了,

最主要的是学精,学透彻哦!

(^_^)~喵~!!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值