Oracle基础学习笔记
最近找到一份实习工作,有点头疼的是,有阶段性考核,这...,实际想想看,大学期间只学过数据库原理,并没有针对某一数据库管理系统而系统的学习,这正好是一个机会,于是乎用了三天时间学习了一下Oracle数据的相关内容,以下是我总结的一些知识点,有错误的地方请及时通知我改正。
一、Oracle 10g的安装
首先安装我就不载这里赘述了,可以参考这篇博客进行安装。
https://blog.csdn.net/qq_33458228/article/details/80447199
值得一提的是在安装中有一个错误:在安装服端时,没有注意,其默认的端口为1521,而安装客户端时,将端口设置成1530,进行测试,结果测试失败。这个问题的解决参考https://www.cnblogs.com/ShaYeBlog/p/7866707.html。
二、sqlplus基础命令
我这里只总结了一些常用的命令。
- win+r 输入sqlplus 或者在 cmd中输入sqlplus;
- 用户名+回车+密码(不可见),用户名/密码(可见);
- show user显示当前登录用户;
- conn 用户名[/密码](选填)切换登录用户, AS SYSDBA以超级管理员身份登录;
- clear SCR 清理屏幕;
- SET LINESIZE NUM(数字)设置每行显示的数据长度,SET PAGESIZE NUM(数字) 设置每页显示的长度;
- edit word 打开本机编辑器,@word 执行sql脚本 ,@绝对路径 执行sql脚本;
- host 调用本地计算机的命令;
- select * from tab; 查看数据表
- DESC 表名称; 查看表结构。
三、SQL基础(DQL)
(1)关系型数据库标准
- 包含:DML(数据操作语言:crud)
- DDL(数据定义语言),DCL(数据控制语言)
(2)简单查询操作
- SELECT [DISTINCT] *| 列名称[别名] ,(可以有多个)| 数据计算 FROM 数据表[别名];
(FROM 子句确定要查询的数据来源, DISTINCT 消除重复数据行的显示(所有内容才消除),’*’ 数据表中所有列的数据); - 常量:字符串用单引号’’,数字直接是写,Oracle中字符串靠左对齐,数字靠右对齐,为常量追加别名 别名不用加单引号,用 || 拼接字符串 之后只有一列;
(3)限定查询
- WHERE 子句常用的几种判断符号,关系运算(>、<、>=、<=、=、<>、!=、BETWEEN..AND、IN、LIKE、IS NULL;
- Oracle 中数据区分大小写的;BETWEEN..AND 可以判断任何数据类型;
- IS NOT NULL 优于 NOT IS NULL;
- LIKE 进行模糊匹配:“_”匹配任意一位字符,“%”匹配0位1位或者多位字符,LIKE可以用于多种数据类型,’%%’效率差比起简单查询;
- in (筛选种子),注意:NOT IN 之中出现有null,是程序的问题,如果发现有null,那么就不进行查询,也不返回任何内容,所以NOT IN 中一定不能出现null;
- [ORDER BY 排序字段 [ASC(默认升序) | DESC],排序字段 [ASC | DESC],..... ],WHERE 在ORDER BY(所有)之前,ORDER BY 最后执行,可以使用SELECT 别名。
(4)多表查询
- 笛卡尔积,当数据量很高的时候,多表查询会产生庞大的计算量;
- SQL1999标准
1)、交叉连接 CROSS JOIN 简单的将数据表关联在一起,而后会产生笛卡尔积 ;
2)、自然连接 NATURAL JOIN 内连接 ,自动找到同名的字段采用内连接的模式消除笛卡尔积 USING 设置要进行关联的字段,on 设置关联条件;
3)、外连接 : 有三类外连接 (LEFT OUTER JOIN)、(RIGHRT OUTER JOIN)、(FULL OUTER JOIN);
4)、内连接:等值连接,在之前进行判断的时候都会使用一些条件得到的相应的数据信息; - Oracle语法
外连接:数据表记录的全部显示,有三类,左外(字段=字段(+))、右外(字段(+)=字段)、全外连接; - 集合操作:[UNION | UNION ALL | MINUS | INTERSECT] 都用于查询结果。
UNION运算 将集合结果整合在一起使用,但是相同的部分不显示,UNION ALL 将集合结果保存在一起显示,重复部分也显示;
MINUS运算:差集运算 ;
INITERSECT 运算:返回俩个查询中的相同部分,交集。
(5)分组统计函数
- COUNT()、SUM()、AVG()、MIN()、MAX()
- COUNT(表中没有记录,统计结果是0而不是null,null 和 0 只是在数据库层面上有所反应,如果在程序的执行之中,null发现接受的类型是整数,自动变成0;
- COUNT() 三种用法,COUNT(*)统计数据表中的行数,COUNT(字段)如果有null 则不统计,COUNT(DISTINCT 字段)统计去除重复
- 分组的默认前提:列上存在有重复,非绝对 [GROUP BY 分组字段,分组字段]
- 分组操作的定义要求:在编写没有编写GROUP BY,这时SELECT 子句中能够出现统计函数只能表示对整表进行统计操作(整表分为一组),在使用GROUP BY查询之中,SELECT 子句中只能出现分组字段和统计函数,其他字段不允许出现;在分组查询的时候,统计函数允许嵌套,但是此时的SELECT 子句之中不能够出现任何字段,包括分组字段
- SQL执行顺序 先执行WHERE 在执行SELECT ,所以WHERE 中执行统计函数会报错,HAVING 分组后筛选。
- HAVING和WHERE区别,
WHERE:是在GROUP BY分组前使用,表示要对分组的数据进行筛选,不允许使用统计函数,
HAVING:在GROUP BY之后筛选,可以使用统计函数,分组操作不只可以用GROUP BY 也可以用集合操作。 - 子查询:常出现位置 WHERE子句 当子查询返回单行单列、多行单列、单行多列;HAVING子句 子查询返回单行单列并且需要进行统计操作的时候;FROM 子句:子查询返回多行多列(表)可以在FROM子句中出现,按照表的形式处理; SELECT子句 子查询返回单行单列,子查询为了解决查询的性能问题。WHERE 子句作用,是限制数据表中的数据行的显示,所以一般做数据筛选;IN 、ANY(三种 =ANY 与IN操作一样 >ANY 比最小的要大 <ANY 壁比最大的要小)、ALL(所有内容 俩种 >ALL 比集合最大的要大 <ALL 比集合最小的要小)看查询要求。
- EXISTS运算 (根据子查询是否有数据的形式来判断条件是否成立的运算符 特征 只是简单的判断是否有数据返回,而并不关心返回的具体数据内容)
- IN 与EXISTS区别 :
IN需要明确的进行数据的判断,也就是说子查询之中返回数据的内容要参与运算。
EXISTS 不需要参考具体的返回内容,其只是依靠是否有数据返回来判断条件是否成立。
(6)Oracle函数
- 格式 返回数据类型 函数名称(数据|类型名称)
- 返回数据类型
字符串VARCHAR2,数字NUMBER,日期DATE , - 常用字符串函数:转大写函数UPPER(数据 | 列),
转小写 LOWER(数据 | 列),
首字母大写 INITCAP(数据|列),
字符串长度LENGTH(数据 | 列),
截取字符串 SUBSTR(数据|列,截取点[,长度]),
替换 REPLACE (数据|要替换的数据 | 列,替换数据),使用Oracle中的虚拟表验证函数,表名为 dual;在最初系统设计的时候,把用户名使用UPPER变为大写,解决用户名大小写不统一的问题; - 常用数值函数:ROUND(数据 | 列[,保留小数位])
四舍五入,TRUNC (数据 | 列 [,保留小数位])
数据截取,MOD(数据 | 列,数据|列):求余数。
四、Oracle SQL
(1)数据更新操作
- 数据更新操作SQL中分为三种 增加(INSERT)、修改(UPDATE)、删除 (DELETE)。
- 数据增加: 【推荐】完整语法 INSERT INTO 表名称(列名称,列名称,..) VALUES(内容1,内容2,...) 内容 字符串 用‘’单引号声明,数字 直接编写,日期 可以使用SYSDATE 自定义使用TO_DATE()转换。不设置某些字段,增加的时候不设置具体的字段内容 (推荐),或者将字段内容写成null。
INSERT INTO VALUES(内容1,内容2,...) - 数据修改:UPDATE 表名称 SET 字段1=内容1,字段2=字段2,...[WHERE(更新条件s)],当没写更新条件时对所有所有数据行进行更新,加上条件,满足之前限定查询那样各种运算符和子查询。实际开发中不会更新全部的表记录,都要加WHERE。
- 删除操作 :(尽可能少用,没有成熟的系统支持数据删除)
DELETE FROM 表名称 [WHERE 删除条件(s)]删除所有数据不设置WHERE
在实际项目中删除操作,数据的删除分两种:物理删除(直接使用DELETE语句舌体删除干净),逻辑删除(在表中设置一个逻辑位)。在实际开发中,都使用逻辑删除,所谓删除只是一个更新处理。
(2)数据伪列
- 伪列指的的是不存在表中的列,但是该列又可以直接使用。
- ORACLE中俩个重量级的伪列ROWNUM(开发中非常常用)、ROWID(数据库分析);
- ROWNUM 行号 显示行号 追加ROWNUM 会自动做一个数据增长列 从1开始,不固定,根据结果自动生成。查询第一行 ,查询前N行(只能)。
- 数据的分页显示[重点]
SELECT *
FROM(
SELECT 查询字段,查询字段,...,ROWNUM rn
FROM 数据表
WHERE ROWNUM<=currentPagelineSize) temp
WHERE temp.rn>(currentPage-1)lineSize;
其中currentPage描述的是当前所在页,而lineSize描述的每页显示的数据行数 。 - ROWID:指的是数据行的唯一的编号,该编号通过硬盘的存储而来的,结构组成 数据的对象编号+数据的文件编号+数据保存的文件块编号+数据保存的行号。
- 面试题:现在有一张数据表,由于某些原因在表设计初期没有设计到位,导致在数据表之中存在有大量的完全重复数据,现在要求删除里面重复数据(不是删除,重复的保留一个,假设保留最初增加的一个),如何实现?
首先查询出所有应该被保留的数据(被保留的数据一定是最早增加的),最早的数据的ROWID一定是最小的,可以采用分组的形式处理(每种数据最小的ROWID),既然已经知道了每行数据最小的ROWID,那么可以直接进行删除处理,保留最小的ROWID即可。(极端用法)
(3)Oracl事务处理
- 事务处理是关系型数据库的最大特征,保证数据完整性,要么全成功,要么全失败,造成性能瓶颈。
- 事务控制原理:数据库与Session ,在每一个Session之中都拥有属于自己的独立操作
- ACID(原子性Atomicity、一致性Consistency、隔离性Isolation、持久性Durability)一个用户一个用户的更新,每个用户的更新彼此独立(谁也不妨碍)
- commit 与 rollback
Commit 指的是所有操作要求进行提交(真正进行数据更新);
Rollback 如果发现数据操作操作产生问题的时候就需要进行回滚熟路,回滚到上一次的提交点; - ORACLE中对事物的支持控制本身是提供有一个事物的缓冲区,用户所发出的所有的更新操作并不是直接立刻反应到数据库中,(也可以设置关闭事物,这样所有的更新操作会立刻提交反应大数据库当中),用户更新没问题commit,有问题rollback。
- 事务锁:对于一行数据当A用户正在进行更新操作,用户一定无法进行更新,B用户等待A用户commit或者rollback的时候称为锁。在进行锁定的时候除了使用更新操作也可以使用查询模式;
SELECT * FROM table WHERE param = param FOR UPDATE; 查询锁 当前行被锁定。
(4)数据表的创建与管理
- 数据表的定义属于SQL-DDL范畴,不受到事务的控制,只有DML操作才受到事务控制,在ORACLE 中:如果当前事物未提交,并且发生了DDL操作,所有未提交的事物将会自动提交,在实际开发中,数据表的创建要么在系统定义好的同时设置,或者最简单的方式就是进行关闭服务维护。
- 常用的数据类型
VARCHAR2(n) 200个字以内的数据用此类型
NUMBER: 直接编写NUMBER表示的就是数字(小数或者是整数)
|-NUMBER(n):表示最多n位整数;
|-NUMBER(n,m):m表示个小数位,n-m的整数位。
DATE ORACLE中DATE类型是包含有时间数据的,而其他数据库的DATE只有日期。
CLOB 描述大文本数据(4G)
BLOB 描述二进制的数据(4G) - 创建数据表
CREATE TABLE 表名称(
列名称 数据类型 [DEFAULT 默认值],
列名称 数据类型 [DEFAULT 默认值],
...
列名称 数据类型 [DEFAULT 默认值]
); - 表的复制
CREATE TABLE 表名称 AS 子查询;为了数据快速查询,可以采用此模式。
SELECT * FROM table WHERE 1==2 复制表结构 编写一个绝对不可能满足的查询条件 - 修改表名称
开发中不建议修改表名称。只有ORACLE 中提供,数据字典:指的是数据库会自动进行相关数据对象的纪录。所谓的数据字典可以理解位一张系统维护的数据表,当用户创建一张数据表之后,用户所关注的是CREATE TABLE 的语法,在数据库中会自动的将这个表的名称以及表的相关信息都保存在一张系统维护的数据表中。表的更新就是数据字典的信息修改,该数据字典一定要由系统维护,所以用户不具备系统维护,修改数据字典只能够采用一系列的命令完成。ORACLE数据字典 有三类 USER_:用户具有的数据字典信息,DEA_:数据库系统管理员具有的数据字典信息,ALL_*:用户和管理员都可以访问的数据字典信息。
RENAME 表名称 TO 新表名称; - 截断表
表的删除并不释放所有的资源,截断表。表被截断,该表中所有资源将被彻底释放 , rollback 无法恢复。
TRUNCATE TABLE 表名称; - 删除表
表一旦被删除之后默认情况下(大部分情况下是无法进行恢复的)
语法 DROP TABLE 表名称;
在ORACLE 10g 之前 如果要是进行数据表删除,那么直接该表的信息全被删除了。10g开始 提供恢复的机制。
语法 DROP TABLE 表名称 PURGE;(彻底删除) - 闪回操作
10g开始 提供恢复的机制,当进行删除数据表操作生成长串表名称,这就是属于FlashBack(闪回)技术,相当于回收站的功能。
查看回收站 SHOW RECYCLEBIN(不稳定)
通用的 可以采用数据字典:
SELECT object_name,original_name,droptime
FROM user_recyclebin;
恢复删除表
FLASHBACK TABLE 表名称 TO BEFORE DROP;
删除回收站的表;PURGE TABLE 表名;
清空回收站: PURGE RECYCLEBIN; - (8)表结构修改
追加表数据列
ALTER TABLE 表名称 ADD (列名称 数据类型 [DEFAULT默认值]...)
修改表数据列
ALTER TABLE 表名称 ADD MODIFY(列名称 数据类型 [DEFAULT默认值]...) - 删除表数据列
AlTER TABLE 表名称 DROP COLUMN 字段名称 ; - 数据库对象(DDL)操作只有三类语法:
CREATE 对象类型 对象名称
DROP 对象类型 对象名称
ALTER 对象类型 对象名称
五、约束的创建与管理
(1)约束的定义及分类
- 约束是保证数据完整性的一种手段,而后根据功能约束一共分为六种,其中
一种成为数据类型的约束。 - 非空约束(NOT NULL、NK):保证数据表中的某一个字段的内容不允许为null;
- 主键约束(PRIMARY KEY、PK): 非空约束 + 唯一约束;ONSTRAINT 约束名称 PRIMARY KEY(数据项,...)多个主键都相同才算重复
- 检查约束(CHECK、CK):设置一些判断条件,而后满足条件的数据允许更新。CHECK( 逻辑条件 )
- 外键约束(FOREIGN KEY、FK):设置父子表之间的约束关系。
CONSTRAINT 约束名 FOREIGN KEY(数据项) REFERENECES 表明(数据项);
(2)约束规则
- 先删除子表,后删除主表 不然无法删除。互为父子,删不了。则用 DROP TABLE member CASCADE CONSTRAINT;不管不顾删除。
- 对于数据的记录在默认情况下,必须先删除父表中的记录,而后才能删除子表中的记录,缺点,删除父表中的信息 先删除所有相关信息 ,很麻烦,外键设置级联操作。
- 在外键设置 后追加ON DELETE CASCADE 级联删除
在外键设设置 后追加ON DELETE SET NULL 级联更新, 是否使用级联并没有明确要求,要看业务需求需求。 - 满足约束条件的数据才能够被更新处理(才能被保存在数据库中)
约束越多,数据库性能越差。单机版可适当完善约束,集群(高性能)主要主键约束。 - 唯一约束 最加 UNIQUE 字段 (null不在唯一约束限定中)
实际上所有的约束在oracle数据库之中都会成为一个个独立的数据库对象,如果没有为约束设置对象的名字,那么会由系统自动的分配一个唯一的名称进行该对象的标注。所以如果要查看约束的基本信息要查看数据字典。 - SELECT * FROM user_constraints; 查看约束与对应数据表
SELECT * FROM user_cons_columns; 查看约束
设置约束名称 CONSTRAINT 名称 UNIQUE(数据项) 放便排查错误。方便维护; - 设置约束:在以后任何的系统数据库设计的时候,当你的数据表创建完成后一定要将约束同时建立完整,并且不要进行约束的变更。
- 语法ALTER TABLE 表名称 ADD CONSTRAINT 约束名称 约束类型(字段);
ALTER TABLE 表名称 ADD CONSTRAINT 语法只能追加非空以外的约束。
追加非空约束必须修改表结构的方式完成:
ALTER TABLE 表名称 MODIFY(字段 类型 NOT NULL);
删除表名称:
ALTER TABLE 表名称 DROP CONSTRAINT 约束名称;
六、Oracle序列
- 所谓序列本质上指的就是自动增长列的配置实现。
ORACLE 开始到 11g 没有自动增长列的设置,他所提供的是一种手工的控制序列的模式来实现自动增长列(自己手工控制)。 - 用户想要进行序列的创建,可用如下语法:
CREATE SEQUENCE 序列名称
[START WITH 开始值]
[INCREMENTY BY ]
[MAXVALUE 最大值 | NOMAXVALUE]
[MINVALUE 最小值 | NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE 缓存个数 | NOCACHE]
默认情况
开始值(START WITH): 1;
步长(INCREMENTY BY):1;
最大值:NOMAXVALUE;
最小值:1;
非循环序列:NOCYCLE;
缓冲个数为20个:CACHE 20;
序列信息保存在数据字典中。SELECT * FROM user_sequences;
使用序列
序列名称.nextval 获取下一个增长值,也就是说当前内容加上步长。
序列名称.currval 获取序列当前的内容;
|- 一定要先调用 序列名称.nextval 后才可以调用序列名称.currval,不然会出现“序列尚未定义的错误”;
根据数据字典里面可以发现序列最后一次的内容使用了“LAST_NUMBER”来表示,增长是利用 “步长 * 缓存个数 ”,在oracle数据库里面为了防止每一次都频繁的进行计算,所以帮助用户做缓存处理。提高操作性能,一旦数据库停掉,可能产生跳号。
结合到数据表中,只能利用增加语句进行操作。
INSERT INTO 表名(字段1,字段2,...) VALUES(序列名.nextval,数据1,...);
修改序列的默认值, CTEATE SEQUENCE 序列名 追加 设置
七、Oracle同义词
- Dual 是sys的用户表
- 数据库之中有一个模式的概念(SCHEMA),每一张数据包的全名实际上就是“schema.table”,对于模式最初的时候是要用户单独创建的,后来设计者们觉得这样的设计比较复杂,将模式与用户名的概念结合在一起了,所以现在的模式基本上指的是用户名。也就是说对于emp而言,完整的表名称:scott.emp。
- 发现不同用户之间要进行数据表访问的时候需要追加用户名,但是为什么scott访问scott访问dual表的时候没有设置这个用户名呢?
- 之所以允许这样的访问就是因为dual属于sys.dual的同义词。所以在ORACLE中的同义词的主要目的是为了方便不同用户的数据表的访问,并且如果想要创建同义词都要具备有管理员的权限完成。
- 将scott.emp 的数据表创建为emp的同义词。
语法: CREATEA [PUBLIC] SYSONYM 同义词名称 FOR 用户名.表名称; - 将同义词创建完成之后就可以直接利用同义词的名称进行访问 ;
这个时候所创建的同义词只能够由sys一个用户使用,因为其不是公共同义词,如果一个同义词要被所有的用户访问,则在创建前要追加一个PUBLIC。
删除同义词 DROP SYNONYM emp;
同义词只是ORCALE数据库支持的技术。
八、视图的定义与使用
- 视图的定义:它的主要功能是封装复杂的查询语句,也就是说利用视图就可以实现数据的复杂查询操作。如果要想创建视图,采用如下语法:
CREATE [OR REPLACE] VIEW 视图名称 AS 子查询
[WITH CHECK OPTION] [WITH READ ONLY]; - 如果说你现在的项目里面提供有开发视图,如果使用 CREATE OR REPLACE 表示该视图如果不存在,则创建,如果存在则用新的sql替换。
Scott之前有创建视图的权限,之后的版本权限被剥削了。
重新授权
CONN sys/sys AS SYSDBA;
GRANT CREATE VIEW TO scott;
查询视图: SELECT * FROM myview; - 在实际之中数据表的查询都是比较复杂的,所以在一些传统的技术开发中,视图的数量超过表的数量。随着现在的一些开的发(很难找到所谓的专业的数据库开发人员了),这样一来,所有编写复杂语句的工作又都回到程序员身上了,所以很多程序员为了代码修改放便,都不再使用视图了。
- 对于视图而言,支持的功能还是很多的(很多的功能想用,自己写替代的触发器),视图是一个查询结果,并不表示真是的数据,所以理论上视图是不应该被修改的,如果默认情况下如果不进行任何的配置,视图中的数据是允许修改的(简单的情况下)。
- 修改视图中的数据并且影响了原始的数据,最关键的是修改的字段为视图的创建条件字段,很明显这样的作法不合理,所以为了保证创建字段的内容不被改变,这个时候可以考虑使用一个子句 [WITH CHECK OPTION]。其他字段依然可以允许用户修改,但是视图之中并不是真实的数据,所以为了保证视图不可更改,建议追加 [WITH READ ONLY] 配置为只读视图。
强烈建议都采用只读模式。
删除视图: DROP VIEW myview;
九、Oracle索引
- 在数据库里面索引是一种相对提升数据库查询性能的技术手段。
限定查询,观察查询处理过程,通过管理员账户启动轨迹追踪器进行浏览;
切换到管理员账户:CONN sys/sys AS SYSDBA;
打开执行追踪器:SET AUTOTRACE ON;
执行限定查询:SELECT * FROM WHERE 条件; - 默认情况下数据执行时采用的全表扫描(逐行扫描)。数据量很大,执行的速度一定很慢。
解决方案,“排序”,数据库里对于不查询的数据的排序方案就是将其行程一颗树,排列形式:取第一个数为根节点,而后比根节点小的数据放在左边,比根节点大数放在右边。
经过排序之后会发现如果要是以本树的形式进行查询,则查询的数据量会有所减少,则连带的查询性能也会得到提升。 - 在数据库之中对于索引的创建有两种形式:
当数据列上使用了主键约束或唯一约束的时候自动创建索引。
自己手工明确一个查询的字段,手工创建索引。
CREATE INDEX scott.emp_sal_ind ON scott.emp(sal);
虽然使用索引提升了性能,但是索引并不是真的100%进行性能提升,索引实现的关键是在于整个数据库之中索引树的维护,如果没有这颗树,那意味着索引将无法使用,但是这棵树采用的是指定的索引字段才转换的树,如果该字段上的内容频繁修改,那么就将有大量的内存和性能浪费在了这颗树的维护上,那么反而会造成性能的下降,索引只是一种相对的手段,而选择建立的索引的字段也要根据实际的情况有所调整。
十、用户管理
- SQL语句有三个方面:DML、DDL、DCL。其中DCL指的是数据库的控制语言,也就是说进行权限控制的处理操作,在DCL中,主要有两个语法:GRANT(授权)、REVOKE(回收)。如果要想正常的去使用DCL还是要结合用户来完成,而用户在数据库之中被称为对象。
- 要进行用户的维护,那么一定要采用管理员账户登录,本次使用sys登录:
CONN sys/sys AS SYSDBA;
创建用户 CREATE USER dog IDENTIFIED BY wangwang ;
打开新的sqlplus客户端进行用户的登录,但是此时会发现出现如下提示信息:ORA-01045:user DOG lacks CREATE SESSION privilege; - 现在只是一个普通的dog用户,但是这个dog用户并没有任何的权限,本次缺少的CREATE SESSION 的权限。表示用户无法创建SESSION(无法登录);
将session权限授权给DOG,GRANT CREATE SESSION TO DOG;
然后dog用户就可以进行登录操作,进行序列与数据表的创建,
CREATE SEQUENCE 、CREATE TABLE 权限不足。
ORACLE里提供了俩个角色(每个角色包含多个权限):CONNECT、RESOURCE,最简单的做法是将这俩个角色授予dog用户:GRANT connect,resource TO dog;
授权完成之后如果想要使用,则要重新登录。 - 一旦有了用户的产生之后那么也会出现一些用户的维护:
重置用户密码:ALTER USER dog IDENIFIED BY wangwang;
让密码失效:ALTER USER dog PASSWORD EXPIRE;
锁定用户:ALERT USER dog ACCOUNT LOCK;
解锁用户:ALERT USER dog ACCOUNT UNLOCK; - 如果现在不同用户之间要进行访问,那么必须具有其他用户的对象权限,而对象权限一共有四种:SELECT、INSERT、UPDATE、DELETE。
将scott.emp表的SELECT、INSERT权限授予dog用户:
GRANT SELECT,INSERT ON scott.emp TO dog; - 对象权限的回收:
REVOKE SELECT,INSERT ON scott.emp FROM dog;
回收角色:
REVOKE connect,resource FROM dog;
回收连接的权限:
REVOKE CREATE SESSION FROM dog;
这个时候dog没有任何权限了,那么此用户也不再需要了,则可以进行用户的删除: DROP USER dog CASCADE; 用户有可能有各种对象的创建,所以删除的时候一定要将这些遗留的内容一起删除掉。
十一、数据库备份
- 数据库管理员(DBA),对于这一职业工程师其最主要的工作就是进行数据备份与灾难恢复的。如果发生了一些外在的因素,那么就必须可以及时的恢复数据执行。数据库的运行之中为了保证出现灾难之后可以及时恢复,那么也就需要进行数据的备份。
- 数据的导入与导出
数据导出:
现在假设将所有的数据导出到:D:\backup 目录之中,建立一个目录
D: -> mkdir backup -> cd backup
执行导出命令 exp;
|-输入要导出数据的用户名 : scott/scott
|-设置导出的文件名称,默认为导出文件“EXPDAT.DMP”
|-导出全部数据表:U(将该用户下的表都导出)
数据导入:
执行“imp”指令:
|-导入文件:EXPDAT.DMP - 数据库冷备份
数据库的冷备份是一种较为全面的数据库的备份处理模式,利用数据库冷备份操作可以保证所有的数据都是归档数据。要进行归档备份,就必须清楚数据库的存储结构。 - ORACLE数据库是以文件的形式存储的,也就是说在一块磁盘上会划分出不同的文件区,而每个文件区可以保存相应的数据。对于表空间的理解,如果将图书比喻为一张数据表,那么表空间就好比图书架,整个的文件就是图书馆,一个城市有多种图书馆。
- 进行如下几个重要的文件备份:
备份控制文件,控制整个Oracle数据库的服务信息,通过“v$controlfile”获得。
备份重做日志文件,通过“v$logfile”数据字典获得。
数据文件:保存真实的数据信息,通过“v$datafile”数据字典获得;
核心配置文件(pfile):整个Oracle核心参数。
使用sys账户进行登录:
Conn sys/sys AS SYSDBA
查看控制文件的路径:
SELECT * FROM v$controlfile;
查看日志文件的路径:
SELECT * FROM v$logfile;
查看数据文件的路径:
SELECT * FROM v$datafile;
查看pfile文件路径:
Show parameter pfile;
关闭Oracle的服务(立即执行):
SHUTDOWN IMMEDIATE
将之前记录好的路径文件都拷贝到其他的磁盘上去;
恢复Oracle数据库的实例:startup;
前提要求:允许关闭服务,也就是说如果你现在进行的是一些企业内网的项目开发,可以,如果是7*24小时运行的服务器,那么就应该需要进行热备份。热备份最简单的方法就是建立主从关系。
十二、数据库设计范式
- 核心本质在于设计出方便扩展,并且存储精准数据结构,并且可以有效的满足于程序开发的需求。从另外的一个层次来讲,数据库设计没有模式,核心:保证数据有效存储,保证查询性能。
- 第一设计范式
设计要求:数据表中的每个字段不可再分
注意:
中国姓名就是姓名,国外分为姓(firstname)、名(lastname);
在设计的时候应该尽可能使用数据库支持的几种数据类型(字符串、数字、日期、大文本),不要将日期拆分出来 - 第二设计范式
设计原则:数据表中不存在非关键字段对任意一候选关键字段的部分函数依赖。所以对第二范式有俩层理解:
函数关系:字段间的函数关系 A*B = C
函数依赖:不同的字段可以得到相同或者不同的结果。
无法确认主键,数据冗余(重复),数据更新麻烦 - 第三设计范式
设计原则:数据表之中不存在非关键字段对任意一候选关键字段的传递函数依赖。实际上传递的函数依赖就好比层级关系一样。
第一范式就是单表设计原则,第二范式就是多对多关系,第三范式一对多关系。
实际的原则:打破范式的约束,使用冗余字段。
## 后记
笔记做得可能很糟糕,层次可能有些混乱。水平有限,我会继续努力的。
Oracle还有一个大的内容是PL/SQL,看了一小部分,怎么说呢,相当于学一门新的语言,但是感觉不怎么通用,我这里就没有再很深入的学习了。
BE GEEK ARTIST