oracle 分页学习练习三!重点

此篇主要是学习oracle的分页查询,在很多情况下的时候,总感觉oracle的分页比较麻烦,一下子没有摸透。这样的话就会导致你在面试的时候失败。那么,在面试的时候,oracle的分页是必须要问的,必须要考的,切记!这个一定要会!

  1. select * from ( select t.*, rownum RN from TABLE_NAME t ) where RN > 0 and RN <= 15
    1 语句解析:注意这里的t 是一个别名,也称为伪表名,rn(rn名字可以自定义,但大家都默认是这样的写法)表于行,这个也是必须要的。那表查询出的结果就是按照行号1到15的数据
  2. select * from ( select t.*, rownum RN from TABLE_NAME t ) where RN between 1 and 15
  3. 以下是这个是业务场景:表A共100条记录,将其为页20页,如何取第二页的记录
    .SELECT * FROM (SELECT t.*,ROWNUM rn FROM emp t) WHERE rn>5 and rn<=10;
    分析:个人认为,100条记录的话,分20页,那这样每页就是5条,那么第二页的数据就是6-10
分页查询格式1
在查询的最外层控制分页的最小值和最大值。查询语句如下:

[sql] view plain copy

 在CODE上查看代码片派生到我的代码片
SELECT * FROM   
(  
SELECT A.*, ROWNUM RN   
FROM (SELECT * FROM TABLE_NAME) A   
)  
WHERE RN BETWEEN 21 AND 40  

分页查询格式2

[sql] view plain copy

 在CODE上查看代码片派生到我的代码片
SELECT * FROM   
(  
SELECT A.*, ROWNUM RN   
FROM (SELECT * FROM TABLE_NAME) A   
WHERE ROWNUM <= 40  
)  
WHERE RN >= 21  

分页查询格式3
考虑到多表联合的情况,如果不介意在系统中使用HINT的话,可以将分页的查询语句改写为:

[sql] view plain copy

 在CODE上查看代码片派生到我的代码片
SELECT /*+ FIRST_ROWS */ * FROM   
(  
SELECT A.*, ROWNUM RN   
FROM (SELECT * FROM TABLE_NAME) A   
WHERE ROWNUM <= 40  
)  
WHERE RN >= 21  

效率问题
对比这两种写法,绝大多数的情况下,第2个查询的效率比第1个高得多。
这是由于CBO优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第2个查询语句,第二层的查询条件WHERE ROWNUM <= 40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。

3.3.3.ROWID的作用(这个在面试的时候被问到了很多次!!!)主要是考察到了rowid这个关键词
这里列举两个常见的应用:
去除重复数据。–面试题—注意细节!
在plsql Developer中,加上rowid可以更改数据。

关于主键和rowid的区别:
相同点:为了标识唯一一条记录的。
不同点:
主键:针对业务数据,用来标识不同的一条业务数据。
rowid:针对具体数据的,用来标识不同的唯一的一条数据,跟业务无关。
需求:删除表中的重复数据,要求保留重复记录中最早插入的那条。(DBA面试题)
–查看rowid
SELECT t.*,ROWID FROM emp t;

–需求:删除表中的重复数据,要求保留重复记录中最早插入的那条。(DBA面试题)

-准备测试表和测试数据:
--参考建表语句如下:
-- Create table
create table test
(
  id   number,
  name varchar2(50)
)
;
--插入测试数据
INSERT INTO TEST VALUES(1,'xiaoming');
INSERT INTO TEST VALUES(2,'xiaoming');
INSERT INTO TEST VALUES(3,'xiaoming');
COMMIT;
SELECT * FROM TEST ;
--通过rowid,剔除重复xiaoming,保留最早插入的xiaoming
SELECT t.*,ROWID FROM TEST t;
--删除的的时候,可以先查询你要删除的东东
SELECT  t.*,ROWID FROM TEST t WHERE ROWID > (SELECT MIN(ROWID) FROM TEST);
DELETE FROM TEST t WHERE ROWID > (SELECT MIN(ROWID) FROM TEST);

--语句有缺点:条件不足,会只保留一条数据,误删其他数据
--重新插入测试数据
INSERT INTO TEST VALUES(1,'xiaoming');
INSERT INTO TEST VALUES(2,'xiaoming');
INSERT INTO TEST VALUES(3,'xiaoming');
INSERT INTO TEST VALUES(4,'Rose');
INSERT INTO TEST VALUES(5,'Rose');
COMMIT;
--剔除重复数据
SELECT * FROM TEST WHERE ROWID NOT in(SELECT MIN(ROWID) FROM TEST GROUP BY NAME);
DELETE TEST WHERE ROWID NOT in(SELECT MIN(ROWID) FROM TEST GROUP BY NAME);

注意:删除重复记录一定要小心,万一你的条件有问题,就会删错数据.建议删除之前,可以先用查询查一下,看是否是目标数据。
数据一旦删除恢复比较麻烦,但可以恢复,采用日志回滚。一般不要轻易用。

4.2.1.批量插入
语法:
INSERT INTO table VALUES–单条插入语法
INSERT INTO table SELECT 查询语句–批量插入语法(主要用于将一张表中的数据批量插入到另外一张表中)

【示例】需求:将dept表中部门名称不为空的数据都插入到test表中
–需求:将dept表中部门”名称”不为空的数据都插入到test表中
INSERT INTO TEST(ID,NAME) SELECT deptno,dname FROM dept;–select的结果必须能插入到目标表中。(字段个数要对应、字段类型要对应)
INSERT INTO TEST SELECT deptno,dname FROM dept ;–必须前后字段对应
–非法使用批量插入
INSERT INTO TEST SELECT deptno,dname,loc FROM dept ;

4Delete—-这个也是重点!已经在 面试中被问了很多次了!!!!
4.3.1.Delete和truncate区别-面试题
delete逐条删除,truncate先摧毁表,再重建 。
最根本的区别是:delete是DML(可以回滚,还能闪回),truncate是DDL(不可以回滚 ,后面的所事务会讲回滚)
Delete不会释放空间,truncate会(当确定一张表的数据不再使用,应该使用truncate)
delete会产生碎片,truncate不会。
友情提示:面试经常会被问道。

6.1.什么是数据库对象?
数据库对象,是数据库的组成部分,有表(Table )、索引(Index)、视图(View)、用户(User)、触发器(Trigger)、存储过程(Stored Procedure)、图表(Diagram)、缺省值(Default)、规则(Rule)等。
这里写图片描述

6.2.表的命名规则和命名规范
表名和列名的基本规范如下:

【扩展】
另外,每个公司都有自己特有的命名规范,比如,要求所有的数据库对象都要加上一个前缀,用于快速识别对象的类别。
比如表的命名:
t_person :存放个人信息的表。
t_crm_person:存放客服子系统模块的人员信息表。
视图的命名:
v_person:用来查询人员信息的视图。

命名规范的作用:
良好的命名规范便于识别和管理,对于系统开发和维护都有很大的帮助。
使用工具的提示功能也更容易快速定位到所需要的对象。

1.索引INDEX
1.1.索引的概念特性和作用
概念:
简单的说,相当于一本书的目录。(数据库中的索引相当于字典的目录(索引)),它的作用就是提升查询效率。
特性:
一种独立于表的模式(数据库)对象, 可以存储在与表不同的磁盘或表空间中。
索引被删除或损坏, 不会对表(数据)产生影响, 其影响的只是查询的速度。
索引一旦建立, Oracle 管理系统会对其进行自动维护, 而且由 Oracle 管理系统决定何时使用索引. 用户不用在查询语句中指定使用哪个索引。
在删除一个表时, 所有基于该表的索引会自动被删除。
如果建立索引的时候,没有指定表空间,那么默认索引会存储在哪个表空间.会存储在所属用户默认的表空间.
作用:
通过指针(地址)加速Oracle 服务器的查询速度。
提升服务器的i/o性能(减少了查询的次数);

1.6.索引的创建场景
索引不是万能!
以下情况可以创建索引:
列中数据值分布范围很广
列经常在 WHERE 子句或连接条件中出现
表经常被访问而且数据量很大
下列情况不要创建索引:
表很小
列不经常作为连接条件或出现在WHERE子句中
表经常频繁更新(看需求,如果表经常不断的再更新,Oracle会频繁的重新改动索引,反而降低了数据库性能。但如系统日志历史表,就必须增加索引,效率超高)

面试题:
1. 索引的作用是什么?
主要是提高查询效率,减少磁盘的读写,从而提高数据库性能。
2. 创建索引一定能提高查询速度么?
未必!得看你创建的索引的合理性。
3. 索引创建的越多越好么?
不是!索引也是需要占用存储空间的,过多的索引不但不会加速查询速度,反而还会降低效率。

3.PLSQL编程注意那么这个是oracle专门自己独有的,像navicat 小金鱼等工具是不支持编写的,只有plsql工具支持。那么对于程序猿,如果能掌握是更好,不能掌握也没有关系,毕竟又不是专业的DB数据员。
3.1.概念和目的
什么是PL/SQL?
PL/SQL(Procedure Language/SQL)
PLSQL是Oracle对sql语言的过程化扩展
指在SQL命令语言中增加了过程处理语句(如分支、循环等),使SQL语言具有过程处理能力。

为什么要学习plsql?
1.将sql逻辑写在db层,效率更高—-数据库处理数据更专业,还不需要网络数据交换。
2.为存储过程、函数等打下基础,前提是学会plsql

3.3.程序结构
PL/SQL可以分为三个部分:声明部分、可执行部分、异常处理部分。
[declare]
声明部分(变量、游标、例外)
begin
逻辑执行部分(DML语句、赋值、循环、条件等)
[exception]
异常处理部分(when 预定义异常错误 then)
end;
/

最简单的PL/SQL:
Begin
Null;
End;
/
注意:在SQLPLUS中,PLSQL执行时,要在最后加上一个 “/”

5.存储过程
5.1.概念作用
存储过程:就是一块PLSQL语句包装起来,起个名称
语法上:相当于plsql语句戴个帽子。
相对而言:单纯plsql可以认为是匿名程序。

存储作用:
1,在开发程序中,为了一个特定的业务功能,会向数据库进行多次连接关闭(连接和关闭是很耗费资源)。这种就需要对数据库进行多次I/O读写,性能比较低。如果把这些业务放到PLSQL中,在应用程序中只需要调用PLSQL就可以做到连接关闭一次数据库就可以实现我们的业务,可以大大提高效率.
2,ORACLE官方给的建议:能够让数据库操作的不要放在程序中。在数据库中实现基本上不会出现错误,在程序中操作可以会存在错误.(如果在数据库中操作数据,可以有一定的日志恢复等功能.)
提示:
plsql是存储过程的基础。
java是不能直接调用plsql的,但可以通过存储过程这些对象来调用。

6.触发器
6.1.概念和作用
数据库触发器是一个与表相关联的、存储的PL/SQL程序。每当一个特定的数据操作语句(Insert,update,delete)在指定的表上发出时,Oracle自动地执行触发器中定义的语句序列。
解释:
首先,它也是一段plsql程序。
然后,它是来触发与表数据操作相关的(insert,update,delete)。
然后,在进行表数据操作的时候,会自动触发执行的一段程序。

换句话说:触发器就是在执行某个操作(增删改)的时候触发一个动作(一段程序)。

猜你喜欢

转载自blog.csdn.net/qq_30764991/article/details/80669637