Oracle 笔记

文章目录

  • Oracle Database的基本概念
  • NoSQL
    • 别名有三种模式
  • 空值
  • sqlplus
  • 变量定义
  • SQL优化
  • SQL执行计划
  • SQL的函数
    • 行转列函数
  • 条件表达式
    • Group by语句
  • 多表查询
  • 子查询
    • 相关子查询
  • 集合运算
  • SQL的类型
    • 闪回
    • 海量插入数据
    • DDL语句管理表
  • 约束
      • rowid 行地址
  • 视图
  • 序列
  • Oracle中的事务
  • 练习
      • 行数
    • 临时表
    • 标准表
    • 索引表
  • 触发器
  • 数据的完整性
  • 分布式数据库
  • PL/SQL编程语言

Oracle Database的基本概念

RDBMS关系型数据库管理系统
基于关系模型提出来的数据库
关系模型是用一个二维表,行和列的方式来保存数据的模型

NoSQL

Redis
Hadoop 相关的NoSQL数据库 HBase
Cassandra
MongoDB

Tomcat6以后支持集群

数据库集群防止内存块崩溃影响数据库的使用

Oracle集群:RAC real application cluster(实时应用集群)

集群的优点
Load Balance 负载均衡 每个机器均衡负载 减轻服务器压力
Fail Over失败迁移 事务在某个机器中断,可转移到集群中其他正常机器上执行

数据文件 dbf
多个数据文件(物理概念)组成的就是表文件逻辑概念()
控制文件 ctl
日志文件l og

OS进程
读写进程

SGA(system global area)
PAG(Process)

ORCL
用户

SCOTT 和 HR
一对多关系表

c /form/from
/执行上一条语句

ed将上一条语句放入编辑器
spool c:\data\导出.txt

spool off

别名有三种模式

Oracle 笔记_第1张图片

第一第二种没区别
第三种如果有特殊符号,数字或关键字要加双引号

distinct去掉重复记录
作用于后面所有的列

空值

包含表达式的空值为空
null永远!=null;
空值是无效的
如果集合中含有null,不能使用not in,但可以使用in
组函数如count(comm)会自动滤空,可以嵌套滤空函数来屏蔽它的滤空功能

sqlplus

SQL99标准
ANSI标准组织
select必须与from关联

与表无关的操作
select concat(‘Hello’,‘World’) from dual;
dual 伪表
select ‘Hello’ || ‘World’ from dual;

字符串:
可以是select列表中的一个字符,数字,日期
日期和字符只能在单引号中出现
每当返回一行时,字符创被输出一次

  • sql
    select
    insert
    update

一种语言,ANSI标准,关键字不能缩写
使用语句控制数据库中的表的定义信息和表中的数据

  • sqlplus
    desc:describe 查询表结构
    ed:edit
    c:change
    for:format -----------col ename format a8 col sal for 999
    col:column

一种环境
Oracle的特性之一,关键字可以缩写,命令不能改变数据库中数据的值,集中运行

mysql不区分字母的大小写,Oracle区分

Oracle日期格式
date 默认 DD -MM月 -RR

变量定义

Java:int a = 0;
PL/SQL:a number := 0;

声明转义字符
where ename like ‘%_%’ escape ‘’
where ename like ‘%a_%’ escape ‘a’

mysql开启事务 start transaction
Oracle自动开启事务

SQL优化

  1. SELECT子句中避免使用 *,选中用列名
  2. where解析顺序:从右往左
    eg:where condition1 and condition2
    把可能错误的条件放右边先查询,提高查询效率
  3. 尽量使用where语句(having 先分组后过滤,where先过滤后分组,先过滤后记录数少)
  4. 尽量使用多表查询 > 子查询(多次访问数据库)
  5. 尽量不要使用集合运算,集合越多效率越低(用roll up())

SQL执行计划

order by 作用于后面所有的列,先按照第一个列排序,在后面的列
desc只作用于离他最近的列

排序后将空值放最后:nulls last(Oracle中null值最大)

SQL的函数

lower转小写
upper转大写
initcap首字母大写
substr(a,b)从a中,第b位取
substr(a,b,c)从a中,第b位取,取c位
length字符数 lengthb字节数
instr(a,b)在a中查找b,找到返回下标,没找到返回0
lpad左填充rpad右填充
Oracle 笔记_第2张图片

trim,replace
Oracle 笔记_第3张图片

Oracle 笔记_第4张图片

Oracle 笔记_第5张图片

Oracle 笔记_第6张图片

sysdate当前系统时间
Oracle 笔记_第7张图片

通用函数
NVL(a,b)a为null的时候返回b,不为空返回本身
NVL2(a,b,c)a为空返回c,否则返回b
nullif(a,b)当a=b时,返回null,否则返回a

coalesce从左往右找到第一个不为空的值

行转列函数

wm_concat(column)

条件表达式

Oracle 笔记_第8张图片

Group by语句

在select列表中所有未包含在组函数中的列都有应该包含在group by子句中
而包含在group by子句中的列不必包含在select列表中
多个列的分组,先按照第一个列分组,如果相同,再第二个列分组,以此类推
where子句中不能使用组函数

group by增强
Oracle 笔记_第9张图片

多表查询

内连接诶
左外连接
where e.deptno=d.deptno(+)
右外连接
where e.deptno(+)=d.deptno

自连接
通过表的别名,将一张表视为多张表(不适合操作大表)

层次查询
level伪列
Oracle 笔记_第10张图片

Oracle 笔记_第11张图片

子查询

单行子查询:返回单行
子查询都可以转换成多表查询
注意的问题:

  1. 括号
  2. 合理的书写风格
  3. 可以在主查询的where select(只能是单行子查询) having from后面使用子查询
  4. 不可以在group by使用子查询
  5. 强调from后面的子查询
  6. 主查询和子查询可以不是同一张表,只要子查询返回的结果主查询可以使用即可
  7. 一般不在子查询中排序,但在top-n分析问题中,必须对子查询排序
  8. 一般先执行子查询,再执行主查询,但相关子查询例外
  9. 单行子查询只能是用单行操作符(=,>,<),多行子查询只能是用多行操作符(in,any,all)
  10. 子查询中的null (单行子查询不返回结果,多行子查询中,子查询返回结果为含null的集合则不能使用not in,可以使用in)

相关子查询

将主查询中的值,作为参数传给子查询的值

集合运算

select语句可以相加相减
union/union all 并集
intersect 交集
minus 差集

注意:

  1. 参与运算的各个集合必须列数相同,且类型相同
  2. 采用第一个集合作为最后的表头
  3. order by永远在后面
  4. 括号改变执行顺序
    Oracle 笔记_第12张图片

SQL的类型

  1. DML(Data Manipulation Language数据操作语言):select insert update delete
  2. DDL(Data Definition Language数据定义语言):create table,alter table,truncate table,drop table,create/drop view,sequence,index,synonym(同义词)
  3. DCL(Data Control Language数据控制语言):grant(授权) revoke(撤销权限)

Oracle 笔记_第13张图片
delete和truncate区别

  1. delete是逐条删除;truncate是先摧毁表,再重建表
  2. delete是DML(可以回滚),truncate是DDL(不可以回滚)(根本区别)
  3. delete 不会释放空间,truncate不会
  4. delete会产生碎片(插入记录从后往前,有一个指针(HWM:high water mark高水平线)指向下次insert的位置)删除的记录的位置不释放空间,不能保存新记录,影响查询效率

闪回

flashback
闪回删除
闪回数据归档
闪回表
闪回查询
闪回版本查询
闪回事务查询
闪回数据库

海量插入数据

  1. 数据泵(PLSQL程序)
    dbms_datapump(程序包)
  2. SQL*Loader
  3. 外部表

DDL语句管理表

create table name
(tid number,tname varchar2(20));

alter table name
add/drop/rename column

drop删除表进回收站(管理员没有回收站)
show recyclebin

约束

primary key主键约束
not null费控约束
unique唯一约束
foreign key外键约束(主表的外键必须是外表的主键)
check检查性约束

check检查性约束
Oracle 笔记_第14张图片

外键约束
foreign key references on delete cascade (删除主表时,级联删除表记录)
foreign key references on delete set null(将子表的相关依赖记录的外键的值置为null)选择

Oracle 笔记_第15张图片

rowid 行地址

Oracle 笔记_第16张图片

使用子查询创建表
create table name (column,column…)
as sequence(select * from emp where 1=2);假条件创建表结构,数据不拷贝;真条件把数据也拷贝

视图

视图是一个虚表
作用:简化复杂的查询只需要select
Oracle 笔记_第17张图片
with check option
with read only屏蔽DML操作
不建议对表中的数据进行修改

当视图定义中包含以下元素之一时,不能使用delete
组函数
group by子句
distinct关键字
rownum伪列

当视图定义中包含以下元素之一时,不能使用update
组函数
group by子句
distinct关键字
rownum伪列
列的定义为表达式

当视图定义中包含以下元素之一时,不能使用insert
组函数
group by子句
distinct关键字
rownum伪列
列的定义为表达式
表中非空的列在试图定义是未包括

序列

sequence
主要提供主键值
auto_increment

Oracle中的事务

起始标志:事务中的第一条DML语句
结束标志:提交:显示 commit 隐式 正常退出 DDL DCL
回滚:显示 rollback 隐式 非正常退出 掉电,宕机
DDL默认提交事务所以不能回滚

事务的撤销:
通过事务的保存点:savepoint a;rollback to savepoint a
通过闪回

隔离级别:
Read Commited(默认),Serializable,Read Only

练习

查询薪水排名前三
通过伪列rownum选出前三

行数

rownum使用注意:

  1. rownum永远按照默认的顺序生成,行号根据from的表顺序生成
  2. rownum只能是用< <=;不能使用> >(rownum永远从1开始)
    Oracle 笔记_第18张图片

例如分页查询中查询第二列记录,条件为55的条件可实现要求的条件
在这里插入图片描述

找到员工表中薪水大于本部门平均薪水的员工
Oracle 笔记_第19张图片

通过相关子查询
Oracle 笔记_第20张图片

通过每年入职的员工个数

Oracle 笔记_第21张图片

Oracle 笔记_第22张图片

临时表

  1. create global temporary table ****
  2. 排序是默认产生,行号按照原来表排列
    特点:当事务或者会话结束的时候,表中的数据自动删除(在Oracle数据库中事务提交成功以后,数据不一定会保存,临时表不会)

标准表

索引表

index
列创建目录—>索引
索引表(目录) rowid
Oracle 笔记_第23张图片
查询执行计划对比后,使用索引后查询cpu消耗更低,提高查询效率

单列索引

触发器

Oracle 笔记_第24张图片

基于值的审计

数据的完整性

分布式数据库

数据物理上被存放在网络的多个节点,逻辑上是一个整体(异地容灾)
每个数据库是一个集群
通过触发器和快照
分布操作

PL/SQL编程语言

面向过程,效率更高

格式
Oracle 笔记_第25张图片

cursor 游标名(参数 数据类型,参数名 数据类型…)is select 语句

你可能感兴趣的:(笔记)