Oracle

1.入门及基础语法

操作表结构的关键字:
drop:删除数据库
alter:增删改表中的列/字段,不操作记录的数据
————注意区分上下的关键字————
操作表数据的关键字:
增:insert
删:delete
改:update
查:select

  • 每条语句以英文分号“;”结尾
  • 分布式数据库系统是地理上分散而逻辑上集中的数据库系统

查看当前用户

select * from user_users;

查看所有用户

select * from dba_users;
select * from all_users;

创建用户并设置密码

create user cwl identified by 123456;

修改密码

alter user cwl identified by 123456;

用户解锁

alter user cwl account unlock;

赋予权限(grant)

赋予session权限

grant create session to cwl;

用户赋予创建表权限

grant create table to cwl

用户赋予创建表空间权限

grant unlimited tablespace to cwl

用户赋予访问任意表权限

grant select any table to cwl

用户赋予更新任意表权限

grant update any table to cwl

用户赋予管理员权限

grant dba to cwl 

撤销用户创建表权限

revoke create table from cwl

删除用户

DROP USER cwl

查看当前用户所有的权限

select * from dba_sys_privs where grantee='cwl'

2.数据类型及表操作

Oracle SQL语句由如下命令组成:

  • 数据定义语言(DDL),包括CREATE(创建)、ALTER(修改)、DROP(删除)等命令
  • 数据操纵语言(DML),包括INSERT(插入)、UPDATE(更新)、DELETE(删除)、SELECT(查询)等命令
  • 数据查询语言(DQL),包括基本查询语句、Order By子句、Group By子句等
  • 数据控制语言(DCL),GRANT(授权)命令、REVOKE(撤销)命令
  • 事务控制语言(TCL),包括COMMIT(提交)、SAVEPOINT(保存点)、ROLLBACK(回滚)命令

常见数据类型如下:
在这里插入图片描述

主键约束与唯一约束区别:

  • 主键约束(Primary Key):所有组成主键的列都不能包含空值
  • 唯一约束(Unique Constraint):如果唯一性约束由多列组成,其中的部分列可以包含空值

Oracle中不容许在相同列上既创建主键又创建唯一性约束

创建学生表

CREATE TABLE tb_student(
	sno NUMBER(10)  not null primary key,
	sname VARCHAR2(10) not NULL,
	sex VARCHAR2(10) not NULL,
	sage NUMBER(10) not NULL,
	enrolldate DATE,
	cno NUMBER(10) not NULL
)

在某用户下查询表名

select tname from tab

查询学生表tb_student的结构

SELECT* FROM USER_TAB_COLUMNS WHERE table_name='tb_student'

修改学生表tb_student中学号sno为stuid

ALTER TABLE tb_student RENAME COLUMN sno to stuid

修改学生表tb_student名称为tb_stu

ALTER TABLE tb_student RENAME to tb_stu

修改学生表tb_student性别sex的数据类型为varchar2(4)

alter table tb_student modify(sex varchar2(4))

约束(constraint)

禁用主键约束

alter table tb_student_info disable constraint pk_student_info

启用主键约束

alter table tb_student_info enable constraint pk_student_info

删除主健约束

alter table tb_student_info drop constraint pk_student_info

设置学生表tb_stu学号stuid为主键约束

ALTER TABLE tb_stu add constraint pk_stuid primary key(stuid)

设置学生表tb_stu学生姓名sname为唯一约束

alter table tb_stu add constraint uk_sname unique(sname)

设置学生表tb_stu学生性别sex只能输入男或女,检查约束

alter table tb_stu add constraint ch_sex CHECK(sex='男' or sex='女')

设置学生表tb_stu学生年龄age只能是6到60岁

alter table tb_stu add constraint ch_sage CHECK(sage>=6 and sage<=60)

设置学生表tb_stu班号cno为外键,references:参考

alter table tb_stu add constraint fk_cno foreign key(cno) references tb_stu(cno)

查看学生表tb_stu的外键约束,注意后面表名要大写,主键的type = ‘P’,唯一的type = ‘U’

select * from user_constraints c where c.constraint_type = 'R' and c.table_name = 'TB_STU'

3.DML操作、运算符操作和基本查询

  • 当对表进行增加、删除和修改操作后需要使用commit提交,数据才能真正更新到表中

向班级表tb_class中插入2条数据,当省略列名时,默认是表中的所有列名,列名顺序为表定义中列的先后顺序。值的数量和顺序要与列名的数量和顺序一致。值的类型与列名的类型一致,Oracle不能像SQL Server那样一个语句插入多条数据,只能一个语句插入一条数据

INSERT INTO tb_class VALUES(1,'计科一班');
INSERT INTO tb_class VALUES(2,'计科二班')

根据学生姓名修改学生年龄,语法结构:UPDATE表名SET列名1=值,列名2=值…WHERE条件

UPDATE TB_STU SET sage=30 WHERE SNAME='小D';
commit;

建表时的联合主键

create table tb_dept(  
	dept_id NUMBER not null , --部门id
	dept_name VARCHAR2(10) not null , --部门名称
	dept_date date not null,   --部门创建日期
	constraint pk_id_name primary key(dept_id ,dept_name )  --联合主键
);

另外一个删除关键字 truncate,其他的还有delete和drop

truncate table tb_dept 

在这里插入图片描述

算术运算符

select 3+5 from dual;	--dual为虚表,不存在
select 10/5 from dual;
select mod(20,5) from dual;	  --取余运算
select age+salary from tb_emp; 
select emp_name,salary*12 年薪 from tb_emp; 

查询不是研发部(102)所有员工三种方式

select  * from tb_emp where dept_id != 102
select  * from tb_emp where not dept_id=102
select  * from tb_emp where dept_id not in(102)

字符串的连接用双竖线(||)表示

select (emp_name|| sex) from tb_emp

去重 DISTINCT

select DISTINCT sex from tb_emp

为查询结果添加虚拟列

select EMP_ID as 编号,EMP_NAME as 姓名,'首义学院' as 学校  from TB_EMP

查询籍贯(nativeplace)为空的信息 null不能使用条件判断,只能使用is和not组合

select * from  TB_EMP where nativeplace is null

between and语句

select * from TB_EMP where age BETWEEN 10 and 30

in关键字, 在指定的范围内, 不连续的
查询101,105部门的员工

select * from TB_EMP where dept_id in(101,105)

查询不在101,105部门的员工

select * from TB_EMP where dept_id  not in(101,105)

like模糊查询

  • “_”代表一个字符
  • “%”代表多个字符

查询姓王名字只有一个字的员工

select * from TB_EMP where emp_name like '王_'

查询姓王名字的员工

select * from TB_EMP where emp_name like '王%'

排序

  • ASC 升序(默认)
  • DESC 降序

对部门编号为 20 或30的雇员,工资+佣金 进行升序排序,如果相同,则按姓名降序

select * from TB_EMP where age BETWEEN 20 and 30  ORDER BY salary ,emp_name desc

4.函数及高级查询

字符函数:
在这里插入图片描述
数字函数:
在这里插入图片描述

**查询时 普通列和聚合函数放在一块要分组,不然会报错**

日期函数:

当前日期

select sysdate,CURRENT_DATE  from  dual;

试用期3个月,转正日

select ADD_MONTHS(sysdate, 3) from  dual;

月份之差

select months_between(sysdate, to_date('2003-4-8','yyyy-mm-dd')) from  dual;

当月最后一天

select last_day(sysdate) from  dual;
select last_day(to_date('2023-2-8','yyyy-mm-dd')) from  dual;

下一个星期时间 星期日为第1天

select next_day(sysdate,7) "星期一" from  dual;

to_date(c,m) -> 字符串以指定格式转换为日期

select to_date('2023-4-8 14:00:00', 'yyyy-mm-dd hh24:mi:ss') from  dual;

to_char(d,m) -> 日期以指定格式转换为字符串

select to_char(sysdate, 'yyyy"年"mm"月"dd"日"') from  dual;

查询2020年入职的员工信息

select * from TB_EMP where to_char(HIREDATE,'yyyy') = '2020';

nvl 查询如果为空则显示规定的地址不详 如果地址为空,则显示地址不详

select  EMP_NAME, nvl(NATIVEPLACE,'地址不详') "地址" from TB_EMP;

decode(条件,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值) 类似于Switch

select  EMP_NAME, DECODE(DEPT_ID, 101, '人事部',102,'研发部',104,'财务部',105,'后勤部') from TB_EMP;

case when then else end 类似于Switch

select  EMP_NAME, (
	CASE DEPT_ID
	WHEN 101 then '人事部' 
	WHEN 102 then '研发部' 
	WHEN 104 then '财务部' 
	WHEN 105 then '后勤部' 
	else '市场部' END
) from TB_EMP;

分组 查询每个年级人数 对每字后面的列名进行分组,where可以省略
count(*)会忽略为空的行
分组时只能查询分组列和聚合函数列,否则会

select count(*),classNo from TB_STU group BY CLASSNO

查询年级人数大于等于2人的年级信息 HAVING 子句,为分组后的结果进行过滤

select count(0),classNo from TB_STU group BY CLASSNO having count(0) > 1

伪列

表中的每一行在数据文件中都有一个物理地址,ROWID伪列返回的就是该行的物理地址。使用ROWID可以快速的定位表中的某一行
在这里插入图片描述
在这里插入图片描述

子查询

查询大于这个平均工资的信息

select *  from  TB_EMP where salary > (select avg(salary) from TB_EMP)

查询等于这个编号的员工信息 in在指定范围内

select * from TB_EMP  where dept_id in (select dept_id from TB_DEPT where dept_name = '后勤部' or dept_name = '财务部' )

查询大于所有102部门员工的信息

select * from TB_EMP where salary > all(select salary from TB_EMP where DEPT_ID = 102)

连接查询

“+”:Oracle专用的联接符,在条件中出现在左边指右外联接,出现在右边指左外联接

语法1
select e.ename,e.job,e.sal,d.dname from emp e,dept d where e.deptno=d.deptno(+)//左外连接
select e.ename,e.job,e.sal,d.dname from emp e,dept d where e.deptno(+)=d.deptno//右外连接
语法2: select *  from1  inner join2 on(表连接条件)

5.数据库对象

  • 同义词:就是给数据库对象一个别名。
  • 序列:Oracle中实现增长的对象。
  • 视图:预定义的查询,作为表一样的查询使用,是一张虚拟表。
  • 索引:对数据库表中的某些列进行排序,便于提高查询效率。

序列

语法:

	create sequence 名称
	[start with 开始整数]
	[increment by 增长数]
	[maxvalue 最大值|默认最大值]
	[minvalue  最小值|默认最小值]
	[cycle|nocycle]
	[cache 缓存数|nocache]

为scott用户emp表创建同义词

CREATE SYNONYM myemp for SCOTT.EMP;

创建一个从1开始,默认最大值,每次增长1的序列,要求NOCYCLE,缓存中有30个预先分配好的序列号。

create sequence myseq
start with 1
INCREMENT by 1
nocycle
cache 30;

访问下一个序列

select myseq.nextval from dual; 

访问当前序列

select myseq.currval from dual; 

修改序列 最大值5,最小值2

alter sequence myseq
maxvalue 5
minvalue 2

向班级表中添加5条数据,班级编号必须使用序列生成

INSERT INTO tb_cla VALUES(seq_class.NEXTVAL, 'Class A');
INSERT INTO tb_cla VALUES(seq_class.NEXTVAL, 'Class B');
INSERT INTO tb_cla VALUES(seq_class.NEXTVAL, 'Class C');
INSERT INTO tb_cla VALUES(seq_class.NEXTVAL, 'Class D');
INSERT INTO tb_cla VALUES(seq_class.NEXTVAL, 'Class E');

视图

创建视图显示学号,姓名,年龄,班级名称

CREATE VIEW view_stu_info AS
SELECT s.stu_id, s.stu_name, s.age, c.class_name
FROM tb_stu s INNER JOIN tb_cla c ON s.class_id = c.class_id;

索引

类比于书本的目录,主要是为了提高查询效率

索引的类型: 普通索引、唯一索引、聚簇索引、位图索引、B树索引、函数索引

  • 每张表只能建一个聚簇索引,并且建聚簇索引需要至少相当该表120%的附加空间,以存放该表的副本和索引中间页

创建索引

创建普通索引,可以为多个字段同时创建索引

create index 索引名 on 表名(字段名1,字段名2,......,字段名n);

创建唯一索引,注意如果表中的列没有重复的值,才可以创建唯一索引

create unique index 索引名 on 表名(字段名1,字段名2,......,字段名n);

为姓名创建唯一索引

CREATE UNIQUE INDEX idx_name ON tb_stu(stu_name);

不要为表的主建创建索引,因为Oracle自动为表的主建字段创建唯一索引

创建位图索引

CREATE BITMAP INDEX index_name ON table_name(column_name);

创建函数索引

CREATE INDEX index_name ON table_name(function(column_name));

创建索引的同时指定表空间

CREATE INDEX index_name ON table_name(column_name) TABLESPACE tablespace_name;

删除索引

删除普通索引

drop index 索引名;

删除主键索引

alter table 表名 drop constraint 主键名;

修改索引

重建索引:重建索引可以减少硬盘碎片和提高数据库系统的性能

alter index 索引名 rebuild;

整理碎片:对索引的无用空间进行合并,减少硬盘碎片和提高数据库系统的性能

alter index 索引名 coalesce;

修改索引名

alter index 索引名 rename to 新索引名;

禁用索引

禁用索引:索引被禁用后,如果要启用,需要用rebuild重建

alter index 索引名 unusable;

6.表空间和事务

事务

事务概念: 事务是一系列操作组成的工作单元,该工作单元内的操作是不可分割的,即要么所有操作都做,要么所有操作都不做

事务的目的 是确保多个操作的一致性和完整性。在数据库中,事务通常用于保护数据的完整性和一致性,避免数据出现不一致的情况

事务必需满足ACID(原子性、一致性、隔离性和持久性)特性,缺一不可: 面试经常问

  • 原子性
    即事务是不可分割的最小工作单元,事务内的操作要么全做,要么全不做
  • 一致性
    在事务执行前数据库的数据处于正确的状态,而事务执行完成后数据库的数据还是处于正确的状态,即数据完整性约束没有被破坏;如银行转帐,A转帐给B,必须保证A的钱一定转给B,一定不会出现A的钱转了但B没收到,否则数据库的数据就处于不一致(不正确)的状态
  • 隔离性
    并发事务执行之间无影响,在一个事务内部的操作对其他事务是不产生影响,这需要事务隔离级别来指定隔离性
  • 持久性
    事务一旦执行成功,它对数据库的数据的改变必须是永久的,不会因比如遇到系统故障或断电造成数据不一致或丢失

在实际开发中数据库操作一般都是并发执行的,即有多个事务并发执行,并发执行常见问题如下:

  • 丢失更新
    两个事务同时更新一行数据,最后一个事务的更新会覆盖掉第一个事务的更新,从而导致第一个事务更新的数据丢失,这是由于没有加锁造成的
  • 脏读
    一个事务看到了另一个事务未提交的更新数据
  • 不可重复读
    在同一事务中,多次读取同一数据却返回不同的结果;也就是有其他事务更改了这些数据
  • 幻读
    一个事务在执行过程中读取到了另一个事务已提交的插入数据,即在第一个事务开始时读取到一批数据,但此后另一个事务又插入了新数据并提交,此时第一个事务又读取这批数据但发现多了一条,即好像发生幻觉一样

事务的隔离级别

当事务之间发生并发时有几个隔离级别:
在这里插入图片描述

 Oracle 默认的隔离级别是 read committed

Oracle 支持上述四种隔离级别中的两种:read committed和 serializable。除此之外, Oralce 中还定义 Read only和 Read write 隔离级别

事务控制commit

select * from TB_EMP
declare --声明
	emp_id TB_EMP.emp_id%type;--声明第一列为后面带%号列的数据类型
BEGIN
	insert into TB_EMP values(1009,'张俊阳','男',30,to_date('2023-1-15','yyyy-mm-dd'),5000,'首义学院',101);
	update TB_EMP set EMP_NAME='张无' where EMP_ID=1001;
	commit;  --提交
end;

事务控制rollback回滚

BEGIN
	insert into TB_EMP values(1010,'张洋洋','男',3,to_date('2023-1-15','yyyy-mm-dd'),5000,'首义学院',101);
	insert into TB_EMP values(1011,'张花花','女',2,to_date('2023-1-15','yyyy-mm-dd'),5000,'首义学院',101);
	rollback;  --回滚/撤销
end;

事务控制回滚点

BEGIN
	savepoint a;--设置一个存储的点
	insert into TB_EMP values(1010,'张洋洋','男',3,to_date('2023-1-15','yyyy-mm-dd'),5000,'首义学院',101);
	rollback to a;--回滚到a点
  insert into TB_EMP values(1011,'张花花','女',2,to_date('2023-1-15','yyyy-mm-dd'),5000,'首义学院',101);
  commit;
end;

事务关键词:

  • commit: 提交事务,对数据库的操作做持久的保存
  • rollback: 回滚事务 ,取消对数据库所作的任何操作
  • savepoint: 在事务中建立一个存储的点

锁机制

加锁是实现数据库并发控制的一个非常重要的技术

  • 排它锁(Exclusive Locks,即X锁,也叫写锁):当数据对象被加上排它锁时,其他的事务不能对它读取和修改,排他锁之间会互斥,只有一个事务能够持有排他锁
  • 共享锁(Share Locks,即S锁,也叫读锁):加了共享锁的数据对象可以被其他事务读取,但不能修改,共享锁之间不会互斥,多个事务可以同时持有共享锁
  • 表锁:当表被加上表锁时,其他的事务不能对它读取和修改
  • 行锁:当表中的行被加上行锁时,其他的事务不能对它读取和修改
  • 页级锁:当一个事务修改某一页数据时,会对该页加锁,其他事务可以同时对其他页进行修改。页级锁的粒度介于表级锁和行级锁之间

锁都可能会产生 死锁 问题

大型数据库应用系统存在并发机制,也就是说可能同时有多个会话访问同一个数据,这时可能不可避免出现死锁。
例如有两个事务A和B,如果事务A已经锁定了数据库对象A(数据库对象A可能是一张表或表中的几条记录)。如果事务B也已经锁定了数据库对象B(数据库对象B可能是一张表或表中的几条记录)。此时事务A再去申请锁定数据库对象B,而同时事务B再去申请锁定数据库对象A。两者互不相让,就产生了死锁。

在这里插入图片描述

为了解决或避免锁导致的并发性问题或死锁问题,可以采取以下措施:

  • 使用乐观锁:乐观锁是在事务提交时检查是否有冲突,认为对同一数据的并发操作不会总发生,属于小概率事件,不用每次都对数据上锁,也就是不采用数据库自身的锁机制,而是通过程序来实现。在程序上,我们可以采用版本号机制或者时间戳机制实现。读取的时候带版本号,写入的时候带着这个版本号,如果不一致就失败,乐观锁适用于多读的应用类型,因为写多的时候会经常失败。在数据库中添加version字段(列)
  • 使用悲观锁:悲观锁是在事务开始时就加锁,也是一种思想,对数据被其他事务的修改持保守态度,会通过数据库自身的锁机制来实现,从而保证数据操作的排它性。就是独占锁,不管读写都上锁了。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。在SQL语句后使用for update进行加锁锁定,更新完之后释放
  • 合理设计数据库结构,减少锁冲突的概率
  • 优化事务操作顺序:尽量减少事务持有锁的时间,避免长时间的事务操作。可以将事务拆分成多个较小的事务,尽快释放锁资源
  • 使用合适的隔离级别,合理使用索引

存储引擎

概念:

  • MySQL中的数据用各种不相同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎
  • 存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式
  • 存储引擎是MySQL数据库中的组件,负责执行实际的数据I/O操作
  • MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储

MySQL常用的存储引擎:

  • MylSAM

  • InnoDB

  • Memory

  • NDB

  • CSV

     注意:一个表只能使用一个存储引擎,一个库中不同的表可以使用不同的存储引擎。InnoDB是MySQL5.5版本后的默认存储引擎
    

特点和使用场景:

MyISAM:不支持事务和外键约束,占用空间较小,访问速度快,表级锁定,支持全文索引;适用于不需要事务处理、读多写少的系统、单独写入或查询的应用场景

InnoDB: 支持事务处理、外键约束、占用空间比MyISAM 大,支持行级锁定,5.5版本后支持全文索引,读写开发能力较好;适用于需要事务处理、读写频繁,一致性要求高,数据更新频繁的应用场景;适用于高并发读写的情况。它通过使用多版本并发控制(MVCC)来提高并发性能,并使用缓冲池来缓存磁盘上的数据,从而减少I/O操作

存储过程

  • 存储过程是一段预编译的SQL代码,可以在数据库服务器上执行。它通常用于封装复杂的查询逻辑,以提高性能并减少网络流量。存储过程可以通过参数传递数据,并可以接受输入和产生输出

示例:

CREATE PROCEDURE GetEmployeeName(IN employeeId INT, OUT employeeName VARCHAR(255))
BEGIN
    SELECT name INTO employeeName FROM employees WHERE id = employeeId;
END;

这个存储过程名为GetEmployeeName,它接受一个整数类型的参数employeeId作为输入,并将一个字符串类型的变量employeeName作为输出。在存储过程的主体中,使用SELECT语句从employees表中查询名字,并将结果赋值给employeeName变量。

要调用这个存储过程,可以使用CALL语句:

CALL GetEmployeeName(1, @name);
SELECT @name;

这里的1是作为输入参数传递给存储过程的员工ID,@name是一个用户定义的变量,用于接收存储过程的输出结果。通过SELECT语句可以查看存储过程返回的结果。

表空间

创建表空间, 2个文件10M和5M ,大小统一1M

create tablespace myspace
datafile 'D:\jing\oracledata\tablespace\test1.dbf' size 10M,
		'D:\jing\oracledata\tablespace\test2.dbf' size 5M
extent management local
uniform size 1M;

查看数据库所有表空间

select  tablespace_name,sum(bytes)/1024/1024 
from dba_data_files GROUP BY tablespace_name;

创建表空间ts3,自动扩展大小,最大值100M

create tablespace ts3
datafile 'D:\jing\oracledata\tablespace\ts3.dbf' size 50M
autoextend on next 10M
maxsize 100M;

扩充myspace表空间,在原来的基础大小上加

alter tablespace myspace
add datafile 'D:\jing\oracledata\tablespace\test3.dbf' size 10M 

删除表空间

DROP tablespace myspace; 

查看当前用户缺省(=默认的意思)的表空间

select username,default_tablespace
from user_users;

创建新用户xm,密码xm 设置默认表空间

create user xm  identified by xm
DEFAULT tablespace ts1

查询用户xm的用户表空间

select * from  dba_users;

创建表时指定表空间

create table tb_student(
	sno NUMBER primary key,
    sname VARCHAR2(20) not null,
	age NUMBER 
)
tablespace ts1;

为创建的索引指定表空间

create index ind_sname on tb_student(sname) tablespace ts1;

7.PLSQL入门

PLSQL概念: 之前学习的SQL没有流程控制,无法开发复杂的应用。Oracle PL/SQL语言(Procedural Language/SQL)是结合了结构化查询与Oracle自身过程控制为一体的强大语言,PL/SQL不但支持更多的数据类型,拥有自身的变量声明、赋值语句,而且还有条件、循环等流程控制语句

PLSQL的优点:

  1. 支持SQL: SQL是访问数据库的标准语言,通过SQL命令,用户可以操纵数据库中的数据。PL/SQL支持所有的SQL数据操纵命令、游标控制命令、事务控制命令、SQL函数、运算符和伪列。同时PL/SQL和SQL语言紧密集成,PL/SQL支持所有的SQL数据类型和NULL值。

  2. 支持面向对象编程: PL/SQL支持面向对象的编程,在PL/SQL中可以创建类型,可以对类型进行继承,可以在子程序中重载方法等。

  3. 更好的性能: SQL是非过程语言,只能一条一条执行,而PL/SQL把一个PL/SQL块统一进行编译后执行,同时还可以把编译好的PL/SQL块存储起来,以备重用,减少了应用程序和服务器之间的通信时间,PL/SQL是快速而高效的。

  4. 可移植性: 使用PL/SQL编写的应用程序,可以移植到任何操作系统平台上的Oracle服务器,同时还可以编写可移植程序库,在不同环境中重用。

  5. 安全性: 使用PL/SQL编写的应用程序,可以移植到任何操作系统平台上的Oracle服务器,同时还可以编写可移植程序库,在不同环境中重用。

    所有的PL/SQL程序都以块作为基本单位
    

SQL调优

SQL调优是一个通过修改和优化SQL语句来提高数据库性能的过程,主要还是减少查询次数
  1. 使用索引:确保表中常用的查询字段已经建立了索引,这样可以减少全表扫描的数量,提高查询效率
  2. 避免使用SELECT *:避免查询不必要的列,只选择需要的列,可以减少数据传输的开销
  3. 使用WHERE子句:尽量使用WHERE子句来过滤数据,这样可以减少查询的数据量
  4. 使用JOIN时慎重考虑:JOIN操作会消耗大量的CPU和内存资源,如果可能的话,尽量避免使用JOIN
  5. 避免使用子查询:子查询会增加查询的复杂度和执行时间,可以考虑使用JOIN或临时表来替代
  6. 慎用ORDER BY:ORDER BY操作会按照指定的列排序数据,如果不需要排序的话,尽量避免使用
  7. 优化分页查询:分页查询可以使用LIMIT和OFFSET关键字,但是如果没有合适的索引或者数据量太大,分页查询的性能会很差。可以考虑使用主键或唯一索引进行分页查询
  8. 避免使用通配符查询:使用LIKE语句的通配符查询(例如:SELECT * FROM table WHERE name LIKE ‘a%’)会扫描全表,性能非常差。可以考虑使用索引或者前置条件来过滤数据
  9. 使用批量插入和批量更新:批量插入和批量更新可以减少数据库交互的次数,提高性能。可以使用INSERT INTO SELECT、UNION ALL、UNION等SQL语句来实现批量插入和批量更新
  10. 使用EXPLAIN PLAN语句:使用EXPLAIN PLAN可以预估SQL语句的执行计划,根据执行计划找出性能瓶颈并进行优化
  11. 适当使用缓存:数据库缓存可以提高查询性能,可以通过适当调整缓存大小、使用合适的缓存策略和缓存技术来优化查询性能
  12. 优化事务管理:合理管理事务可以提高数据库性能。可以考虑合并多个操作为一个事务、使用合适的隔离级别和使用批量操作等方式来优化事务管理
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永不掉发的陳不錯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值