Oracle学习笔记

举一隅不以三隅反,则不复也。

安装Oracle数据库

  • 参考博客:https://blog.csdn.net/ychgyyn/article/details/85880038

安装Oracle

Oracle数据库账户管理

预定义sys账户

  • 系统管理员,拥有最高权限
  • 默认解锁
  • 授予了DBA角色
  • 具有admin option的所有权限
  • 具有启动、关闭和某些维护命令时需要的账户
  • 拥有数据字典
  • 拥有自动工作量资料档案库(AWR)
  • 使用as sysdba字句连接(任何具有SYSDBA权限的用户均可通过使用as sysdba连接到sys账户)

预定义system账户

  • 本地管理员,次高权限
  • 默认解锁
  • 授予了DBA角色

预定义scott账户

  • 普通用户,密码默认为 tiger
  • 默认未解锁,安装时手动解锁,一般不直接用系统账户

使用sys账户登录报错

  • 问题描述:使用sys账户登录oracle数据库报错 ORA-28009: connection as SYS should be as SYSDBA or SYSOPER

  • 解决方案:

请输入用户名:sys as sysdba
请输入口令:xxx

常用的系统权限

  • 系统权限: 对于数据库的权限
    在这里插入图片描述
    在这里插入图片描述

常用的对象权限

  • 对象权限: 操作数据库对象的权限
    在这里插入图片描述
    在这里插入图片描述

授权

创建用户

CREATE USER scott IDENTIFIED BY tiger;
  • 用户登录至少需要create session权限
    在这里插入图片描述

授予权限

GRANT privilege [, privilege...] TO user [, user| role, PUBLIC...];

-- 开发需要的权限
GRANT create session, create table, create sequence, create view, create procedure TO scott;

创建用户表空间

  • 用户拥有create table权限之外,还需要分配相应的表空间才可开辟存储空间用于创建的表
ALTER USER scott QUOTA UNLIMITED ON users

创建角色

create role manager;

为角色赋予权限

grant create session,create table to manager;

将角色赋予用户

grant manager to scott;
-- boom!!!
grant dba to zhangsan;

修改密码

ALTER USER scott IDENTIFIED BY lion;

分配对象权限

  • 不同的对象具有不同的对象权限
  • 对象的拥有者拥有所有权限
  • 对象的拥有者可以向外分配权限
GRANT	object_priv [(columns)]
ON		object
TO		{user|role|PUBLIC}
[WITH GRANT OPTION];
-- WITH GRANT OPTION 使得被分配的用户有再分配该权限的权利
-- public是想数据库中所有用户分配权限
grant select on tableA to userA,userB;
grant insert,update on userA.tableA to userB;

回收对象权限

REVOKE {privilege [, privilege...]|ALL}
ON	  object
FROM   {user[, user...]|role|PUBLIC}
[CASCADE CONSTRAINTS];
-- 使用 WITH GRANT OPTION 子句所分配的权限同样被收回
REVOKE  select, insert ON departments FROM scott;

查看权限分配情况

在这里插入图片描述

数据类型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

序列

-- 创建序列
create sequence INR_REQUIRMENT_SQUENCE
    INCREMENT BY 1 -- 每次加几个
    START WITH 1 -- 从1开始计数
    NOMAXVALUE -- 不设置最大值
    NOCYCLE -- 一直累加,不循环
    CACHE 10;

-- 获取序列的下个值
select INR_REQUIRMENT_SQUENCE.nextval from dual;
-- 获取序列的当前值
select INR_REQUIRMENT_SQUENCE.currval from dual;

create sequence seq_test1
increment by 2
start with 3
minvalue 10
maxvalue 100
cycle
cache 5;

-- 修改序列
alter sequence seq_test1;
-- start with不能修改

在这里插入图片描述

  • 将序列值装入内存可提高访问效率

索引

  • 自动创建: 在定义 PRIMARY KEY 或 UNIQUE 约束后系统自动在相应的列上创建唯一性索引
  • 手动创建: 用户可以在其它列上创建非唯一的索引,以加速查询
create index 索引名称 on 表名(列名)
-- 创建普通索引
create index idx_name on t_index_test(name);
-- 创建唯一索引
create unique index idx_id on t_index_test(id);
-- 创建复合索引
create unique index idx_id_name on t_index_test(id,name);

同义词

  • 别名!
create [public] sysnonym 别名 for object
object可以表示表,视图,序列

-- 创建表的同义词
create synonym test1test1 for test1;

视图

  • 简单视图:单表、没有聚合函数;改视图也会修改原表数据
  • 带检查约束的视图:with check option
  • 只读视图:with read only
  • 先有视图后建表:create force view xxx
  • 多表查询的视图,键保留表:在视图中把主键保留下来的那个表,只能update键保留表的字段
  • 分组聚合统计的视图:只读,无法修改
  • 物化视图:真实表的副本,create materialized view

存储函数

create function myFunc(参数名 参数类型,参数名 参数类型)
return 结果变量数据类型
is
    变量声明部分;
begin
    逻辑部分;
    return 结果变量;
    [exception]
        异常处理部分
end

存储过程

  • 存储函数有返回值,且必须返回,存储过程没有返回值
  • 存储函数可以在select中直接使用,而存储过程不能,过程多数是被应用程序所调用
  • 存储函数一般是是封装一个查询结果,而存储过程一般是封装一段事务
-- 参数模式 IN(default),OUT, IN OUT
create procedure myProc(参数名 参数类型,参数名 参数类型)
is/as
    变量声明部分;
begin
    逻辑部分;
    [exception]
    异常处理部分
end

伪列

  • 伪列:建表时自动加上的,常见有rowid, rownum
  • rownum关系运算只能是<,≤
-- 伪列ROWID是一个物理地址,长这样:AAAUxeAAEAAAAIOAAA
select ROWID from test1;

-- 伪列ROWNUM是一个结果集的序号,从1开始
SELECT ROWNUM from test1;

-- 同时使用伪列和其他字段必须给表起别名
select ROWID, ROWNUM, t1.* from test1 t1;

分页

-- 前10条数据
select rownum,t.* from test t where rownum<=10;

-- 简单查询的分页
select t.* from (select rownum r,t.* from test t) where r<=20 and r>10;

-- 排序后的分页
select ttt.* from (select rownum r,tt.* from (select * from test t order by usernum desc) tt) ttt where r<=20 and r>10;

数据库表元数据

-- 查看当前用户拥有的表
select table_name from user_tables;

-- 查看所有用户的表
select table_name from all_tables;

-- 查看当前用户下某表所有字段
select * from user_tab_columns where TABLE_NAME='某表名称';

-- 查看所有用户的某表所有字段
select * from all_tab_columns where TABLE_NAME='某表名称';

-- 查看当前用户下所有表注释
select * from user_tab_comments;

-- 查看所有用户的表注释
select * from all_tab_comments;

- 查看当前用户下某表所有字段注释
select * from user_col_comments where TABLE_NAME='某表名称'-- 查看所有用户的某表所有字段注释
select * from all_col_comments where TABLE_NAME='某表名称'

备份

整库导入导出

# 在命令行操作
exp system/密码 file=文件名 full=y
# 如果不指定文件名,默认为EXPDAT.DMP
imp system/密码 full=y file=文件名

按用户导入导出


# 在命令行操作
exp system/密码 owner=用户名aaa file=fae.dmp
imp system/密码 file=fae.dmp fromuser=用户名aaa

按表导入导出

# 在命令行操作
exp 用户名/密码  file=xxx tables=t1,t2
imp 用户名/密码 file=xxx tables=t1,t2

导入导出指定用户的指定表

在这里插入图片描述
在这里插入图片描述

各种函数

trunc

-- 只取日期部分
select trunc(sysdate) from dual; 
-- 截取月,即本月第一天   
select trunc(sysdate,'mm') from dual;  
-- 截取年,即今年第一天
select trunc(sysdate,'yyyy') from dual;  

find_in_set

  • find_in_set是mysql中的函数,参考博客
create function find_in_set(arg1 in varchar2,arg2 in varchar)
return number is Result number;
begin
select instr(','||arg2||',' , ','||arg1||',') into Result from dual;
return(Result);
end find_in_set;

uuid

select sys_guid() from dual;

nvl、nvl2

  • 空值处理函数
-- 第一个参数xxx不为NULL时,返回第一个参数,否则返回第二个参数
select nvl(xxx,233) from dual;

-- 判断第一个参数yyy的值,不为NULL时返回第二个参数,为NULL时返回第三个参数的值
select nvl2(xxx,3545,4645) from dual;

decode

  • decode(判断值,值1,翻译值1,值2,翻译值2,…,缺省值)
  • 条件取值,可以没有缺省值
select decode(sex, '0','男','1','女','未知') from xxx

分析函数

-- 值相同,排名相同,序号跳跃
select rank() over(order by score desc), t.* from exams t;

-- 值相同,排名相同,序号连续
select dense_rank() over(order by score desc), t.* from exams t;

-- 返回连续的排名,无论值是否相等
select row_number() over(order by score desc), t.* from exams t;

-- 利用分析函数实现分页
select * from (select row_number() over(order by score desc) rownumber, t.* from exams t) where rownumber <=20 and rownumber>10;

语法杂记

  • insert update delete要commit
  • delete可以rollback,truncate不能rollback
  • delete可能产生碎片,不释放空间
  • truncate是摧毁表结构,再重建表结构
  • varchar是定长字符串,varchar2是不定长字符串
  • 分页查询:SELECT * FROM Persons WHERE ROWNUM <= 5
  • concat函数只能接受两个参数,要连续拼接多个字符串可以用 ||
  • 别名:紧跟列名,也可以在列名和别名之间加入关键字‘AS’,别名使用双引号,以便在别名中包含空格或特殊的字符并区分大小写
  • 日期和字符只能在单引号中出现
  • 变量赋值使用 := 符号
  • DUAL 是一个‘伪表’,可以用来测试函数和表达式
  • 通配符转义:可以使用 ESCAPE 标识符 选择‘%’和 ‘_’ 符号
  • having 是对聚合统计后的结果进行筛选
  • 集合运算:union all 可重复 union 不重复
  • case when then
select (case sex when '0' then '男' when '1' then '女' else '未知' end) from xxx
  • 创建DB Link
create public database link 数据库链接名称
 
connect to 远程数据库用户名 identified by 远程数据库密码  
 
using '远程数据库IP:端口/实例名';

注:部分图片来自尚硅谷网课

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值