Oracle安装介质:
OracleInstanceClient
VirtualBox虚拟机/再安装扩展插件(才能使虚拟机和主机共享文件)
xxx.vdi文件.导入到VirtualBox虚拟机.
取消虚拟机使用硬件加速(这个功能必须在主机的BIOS)里面进行设置).
设置网络连接类型.
关闭虚拟机防火墙(主机和虚拟机之间通信).
创建共享文件夹.
网络映射驱动器设置共享文件夹.
安装Oracle数据库软件.
设置虚拟机的内存一般是主机内存的1/4.
Oracle11g数据库软件
客户端连接Oracle数据库:
例如:sqlplus scott/tiger@127.0.0.1:1521/orcl
Oracle Database 客户机
SQLDevloper Java开发可以在任何平台上使用.
PLSQLDevloper只能在window系统使用.
一个Oracle服务器:
是一个数据库管理系统(RDBMS).它提供开放的,全面的,近乎完整的信息管理.
是由一个Oracle数据库和多个实例组成.
Oracle存放数据库目录:
oradata
orcl
*.ctl控制文件,记录数据库的结构
*.dbf数据文件,存放数据.
*.log日志文件.
多个实例访问一个数据库,这就是Oracle数据库集群.
内存A(实例) |----------
|
内存B(实例) |---------- [Oracle数据库:Orcl,物理概念]
|
内存C(实例) |----------
项目集群:
TomcatA |
|
TomcatB |(prj.war) (MYSQL数据库)
|
TomcatC |
只要有tomcat可以访问MYSQL数据库.项目就可以正常运行.
集群(cluster)的优点:
1.Load Balance 负载均衡:减轻服务器压力.
2.Fail Over 失败迁移:提高系统的可靠性.
Oracle集群的专有名词,RAC : Real Application Cluster
Oracle内存中的实例如何操作硬盘上的数据库文件?
通过操作系统进程:
读
写
内存/实例
(PGA : Program Global Area) ---| -|
Oracle客户端 ------| (PGA) ---| --- (SGA : System Global Area) - (通过操作系统进程:读、写) -| (Oracle数据库:orcl)
(PGA) ---| -|
Oracle命令:
-- 清理屏幕数据
HOST CLS;
-- 查看当前用户
SHOW USER;
-- 查看当前用户下的表
SELECT * FROM TAB;
-- 查看表结构
DESC/DESCRIBE 表名;
查看行宽:SHOW LINESIZE;
设置行宽:SET LINESIZE 值;
-- 设置列宽:
COL/COLUMN 列名称 FOR/FORMAT a1(代表一个字符宽度)/9(代表一个数字宽度);
*** Oracle执行时间开关(默认关闭):SET TIMING ON|OFF(开启|关闭);
*** 别名 AS,给表起别名不能使用AS.
WHERE、HAVING后面的条件不能使用别名.
*** 查询一个值是否是空值:
SELECT * FROM ... WHERE comm IS [NOT] NULL;
*** Oracle中的滤空函数:
1.NVL(a,b):
当a的值为空的时候,返回b值,否则返回a值
2.NVL2(a,b,c):
表示当a为NULL的时候,返回c,否则返回b.
*** Oracle录屏命令:
开始:SPOOL txt文件路径;
结束:SPOOL OFF;
*** / 表示执行上一条SQL语句.
*** 修改错误SQL语句:
1.使用CHANGE/C命令
2.使用ED/EDIT命令
*** 在上一条SQL语句追加SQL语句:
使用A/APPEND命令:(至少要有两个空格)
*** SQL优化原则:
1.尽量使用列名代表*
2.Oracle判断WHERE条件的顺序:从右往左。
3.尽量使用WHERE代替HAVING.
4.理论上多表查询的效率优于子查询.
5.尽量不要使用集合运算.
*** SQL中的空值:
1.包含空值NULL的表达式结果都为NULL
2.NULL 永远不等于 NULL
3.查询的字段有空值,不可以使用NOT IN来查询.
4.NULL空值的排序,空值最大.在此排序后加上 NULLS LAST 以控制排序效果
5.分组函数在计算时会自动过滤掉空值.
解决:可以通过滤空函数来处理.
*** 伪表:DUAL
是Oracle管理员提供的伪表,存在仅仅是为了满足语法的要求.
*** 伪列:
LEVEL : 在层次查询中代表查询的深度.
ROWNUM : 行号,永远按照默认的顺序生成.
行号只能使用 < <= 符号不能只用 > >= 符号.
对于 = 等号只能使用 ROWNUM=1.
因为Oracle是行式数据库,只能每行读取.
ROWID:行地址,相当于一个指针,它表示指向到数据文件的位置.(*.dbf数据文件)
*** 临时表:
手动创建:CREATE GLOBAL TEMPORARY TABLE 表名(...);
ORDER BY 在排序的时候回自动创建.
临时表特点:
临时表当事务或会话结束的时候,表中的数据会自动删除.
*** SQL字符串连接:
1.连接函数:CONCAT('hello','world')
MYSQL:SELECT CONCAT('hello','world');
ORACLE:SELECT CONCAT('hello','world') FROM DUAL;
2.连接符: ||
*** 行转列函数:WM_CONCAT(...) 属于分组函数.
*** WHERE 子句中不能使用别名.
*** Oracle中去掉碎片:
1.ALTER TABLE 表名 MOVE;
2.先导出、再导入碎片就会被移除.
*** Oracle执行SQL脚本:
@SQL脚本路径
*** Oracle开启关闭操作数据的回显信息:
SET FEEDBACK ON(开,默认)|OFF(关);
Oracle查询语句:
SELECT [ALL/DISTINCT] * FROM ...
[ALL/DISTINCT]作用于所有列
*** 查询字符串类型大小写敏感.
*** 查询日期类型格式敏感.
Oracle数据库默认的日期格式:DD-MON-RR(日-月-年)
可以进行修改
*** Oracle查询日期格式:
SELECT * FROM V$NLS_PARAMETERS;
*** Oracle修改日期格式:
ALTER SESSION/SYSTEM SET NLS_DATE_FORMAT = 'yyyy-mm-dd';
*** 日期类型和日期类型之间只能进行减法运算.
*** Oracle连接数据库的三种认证方式:
密码认证.
sqlplus 用户名/密码@ip:端口号/数据库名
sqlplus 用户名/密码 as sysdba
主机认证.
sqlplus / as sysdba|system
全局认证.
比较运算符:
>大于 、 >=大于等于 、 <小于 、 <=小于等于 、!=(<>)不等于
BETWEEN ... AND ...
[NOT] IN
LIKE 'pattern(%_)' *** 模糊查询包含下划线的字符就需要转义:'\_'
IS [NOT] NULL
逻辑运算符:
AND 并且
OR 或
NOT 非
Oracle排序:ORDER BY子句:
ORDER BY 排序字段(列名、表达式、别名、序号(列的索引,从1开始)) ASC(升序,默认)|DESC(降序)
Oracle函数:
函数必须有返回值,但是可以没有参数.
单行函数:
1.字符函数:
LOWER 转小写
UPPER 转大写
INITCAP 首字母大写
CONCAT 连接函数 CONCAT(a,b)
SUBSTR 截取函数 SUBSTR(a,b,c);
表示从a中的b位置开始截取,取c位.
LENGTH(单位:字符)/LENGTHHN(单位:字节) 获取字符串大小
INSTR 查询函数,INSTR(a,b) 表示在a中查找b.
LPAD(左填充)/RPAD(右填充)
LPAD('abcd',10,'*') 、RPAD('abcd',10,'*')
TRIM 去除两端字符 TRIM(a FROM b)表示从b的两端去除包含a的字符串.
REPLACE 替换函数 REPLACE(a,b,c) 表示在a中出现的b字符使用c替换.
2.数字函数:
ROUND 四舍五入 ROUND(a,b)表示对数值a保留多少位小数.
TRUNC 截断
MOD 求余 MOD(a,b) 表示a对b求余.
3.日期函数:
TO_CHAR : TO_CHAR(a,b) 表示将a值按照b格式化为一个字符串.
例如:SELECT TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss') FROM DUAL;
MONTHS_BETWEEN 两个日期类型相差的月数.
ADD_MONTHS 向指定的日期中加上若干个月数.
NEXT_DAY 指定日期的下一个日期.
例如:SELECT NEXT_DAY(SYSDATE,'星期五') FROM DUAL;
NEXT_DAY的应用:每个星期一自动备份数据.
LAST_DAY 本月的最后一天.
ROUND 日期四舍五入.
ROUND(SYSDATE,'YEAR') , ROUND(SYSDATE,'MONTH')
TRUNC 日期截断.
TRUNC(SYSDATE,'YEAR') , TRUNC(SYSDATE,'MONTH')
4.转换函数:
隐式转换:Oracle系统自动完成.
源数据类型 --> 目标数据类型
VARCHAR2或CHAR NUMBER或DATE
NUMBER或DATE VARCHAR2
显示转换:
TO_CHAR-> <-TO_CHAR
NUMBER --- CHARACTER --- DATE
<-TO_NUMBER TO_DATE->
TO_CHAR : TO_CHAR(a,b) 表示将a值按照b格式化为一个字符串.
例如:SELECT TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss') FROM DUAL;
日期格式的元素:字符串和日期之间的转换。
YYYY
YEAR
MM
MONTH
DY
DAY
DD
hh24
mi
ss
数字格式的元素:字符串和数值之间的转换。
9 数字
0 零
$ 美元福
L 本地货币符号
. 小数点
, 千位符
5.通用函数:适用于任何数据类型,也适用于空值.
NVL(a,b) 表示当a为NULL的时候,返回b,否则返回a.
NVL2(a,b,c) 表示当a为NULL的时候,返回c,否则返回b.
NULLIF(a,b) 表示当a等于b的时候返回NULL,否则返回a.
COALESCE(a,b,...,n) 表示从左往右返回第一个不为空的值.
6.条件表达式:很实用.
CASE 表达式:属于SQL99语法.
CASE express
WHEN 值1 THEN 处理1
WHEN 值2 THEN 处理2
...
ELSE 默认处理
END
DECODE 函数:Oracle自己的语法.
DECODE(express,值1,处理1,...,值n,处理n,默认处理);
多行函数:分组函数
AVG 求平均值
COUNT 计数
MAX 取最大值
MIN 取最小值
SUM 求和函数
GROUP BY 子句:
求部门的平均工资大于2000的部门?
SELECT DEPTNO,AVG(NVL(SAL,0)) AS "平均工资"
FROM EMP
GROUP BY DEPTNO
HAVING AVG(NVL(SAL,0)) > 2000
ORDER BY "平均工资" DESC;
WHERE和HAVING的区别?
1.WHERE后面不能有分组函数.HAVING可以.
2.WHERE在查询数据进入内存之前过滤数据.
3.HAVING在查询数据进入内存之后过滤数据.
向上汇报:ROLL UP . GROUP BY语句的增强.
...GROUP BY ROLLUP(express1,express2,...)
*** BREAK ON DEPTNO SKIP 2 格式修饰.
BREAK ON NULL 取消格式修饰.
问题:
--------------------------------
DEPTNO JOB 工资总和
---------- --------- ----------
10 CLERK 1300
MANAGER 2450
PRESIDENT 5000
8750
20 CLERK 1900
ANALYST 6000
MANAGER 2975
10875
30 CLERK 950
MANAGER 2850
SALESMAN 5600
9400
29025
-------------------------------------------------
实现上面效果:
BREAK ON DEPTNO SKIP 2;
SELECT DEPTNO,JOB,SUM(SAL) AS "工资总和"
FROM EMP
GROUP BY ROLLUP(DEPTNO,JOB);
BREAK ON NULL;
多表查询:
笛卡尔集:是多表查询的基础.
多表查询的连接条件可以避免全部的笛卡尔集.
连接的类型:
Oracle连接类型 SQL99连接类型
等值连接 CROSS JOINS
不等值连接 NATURAL JOINS
外连接 USING CLAUSE
自连接 FULL OR TWO SIDED OUTER JOINS
(不)等值连接:
查询员工号、姓名、月薪、部门名称?
SELECT e.EMPNO,e.ENAME,e.SAL,d.DNAME
FROM EMP e,DEPT d
WHERE e.DEPTNO = d.DEPTNO;
外连接:
按照部门统计员工人数,显示部门号、部门名称、部门人数?
Oracle语法:
SELECT d.DEPTNO,d.DNAME,COUNT(e.EMPNO)
FROM DEPT d,EMP e
WHERE e.DEPTNO = d.DEPTNO(+)
GROUP BY d.DEPTNO,d.DNAME;
SQL99语法:
SELECT d.DEPTNO,d.DNAME,COUNT(e.EMPNO)
FROM DEPT d
LEFT JOIN EMP e
ON e.DEPTNO = d.DEPTNO
GROUP BY d.DEPTNO,d.DNAME;
自连接:通过表的别名,将同一张表视为多张表使用.
自连接不适合操作大数据的表.
当数据过大时,使用层次查询代替.
查询员工信息:员工的姓名 、 老板的姓名.
SELECT E1.ENAME 员工姓名, E2.ENAME 老板姓名
FROM EMP E1,EMP E2
WHERE E1.MGR = E2.EMPNO;
-----------------------------
员工姓名 老板姓名
---------- ----------
FORD JONES
SCOTT JONES
TURNER BLAKE
ALLEN BLAKE
WARD BLAKE
JAMES BLAKE
MARTIN BLAKE
MILLER CLARK
ADAMS SCOTT
BLAKE KING
JONES KING
CLARK KING
SMITH FORD
-----------------------
层次查询:
在层次查询当中,只能有一张表.
SELECT LEVEL,ENAME, MGR
FROM EMP
CONNECT BY PRIOR EMPNO = MGR
-- 如果是从根节点开始遍历:还可以换一个方式写.
-- START WITH MGR IS NULL
START WITH EMPNO = 7839 -- 从这个节点往下遍历.
ORDER BY 1;
子查询:
查询月薪比SCOTT员工高的员工信息?
SELECT *
FROM EMP
WHERE SAL > (SELECT SAL FROM EMP WHERE ENAME='SCOTT');
*** 写子查询注意的问题:
1.括号的使用.
2.合理的书写风格.
3.可以在主查询的 WHERE、 SELECT、 HAVING、 FROM 后面放置子查询.
(1)SELECT后面的子查询语句只能是单行子查询.
4.不可以在GROUP BY后放置子查询.
5.FROM 后面的子查询.
(1)子查询的结果作为主查询的数据源.
在已知的条件上增加新条件.
6.主查询和子查询可以是不同表,只要子查询返回的结果主查询可以使用即可.
7.一般不对子查询进行排序.但在TOP-N问题分析中,必须对子查询进行排序.
8.一般先执行子查询再执行主查询,但是相关子查询例外.
(1)相关子查询:
将主查询中的某些值作为参数传递给子查询,
9.单行子查询只能使用单行操作符,多行子查询只能使用多行操作符.
单行操作符:= 、 > 、 >= 、 < 、 <= 、 !=(<>)
多行操作符:IN 、 ANY:任何 、 ALL:全部
10.子查询中的NULL空值问题.
练习题:
1.找到员工工资最高的前三名,显示:序号、员工编号、姓名、月薪?
SELECT ROWNUM,E.*
FROM
(SELECT E.*
FROM EMP E
ORDER BY E.SAL DESC) E
WHERE ROWNUM <= 3;
*** 扩展:Oracle使用ROWNUM实现分页查询?
SELECT E.*
FROM
(SELECT ROWNUM R,E.*
FROM
(SELECT E.*
FROM EMP E
ORDER BY E.SAL DESC) E
WHERE ROWNUM <= high) E
WHERE E.R >= low;
pageNo : 当前页.
pageSize : 页大小.
lastNum : (pageNo - 1) * pageSize
low : lastNum + 1
high : lastNum + pageSize
2.找到员工表月薪大于本部门平均薪水的员工
显示:员工编号、姓名、月薪、部门平均月薪?
语法一:
SELECT E.DEPTNO,E.SAL,AVGE.AVGSAL
FROM EMP E,
(
SELECT E.DEPTNO,AVG(NVL(E.SAL,0)) AVGSAL
FROM EMP E
GROUP BY E.DEPTNO
) AVGE
WHERE E.DEPTNO = AVGE.DEPTNO
AND E.SAL > AVGE.AVGSAL;
语法二:
SELECT E.DEPTNO,E.SAL,(SELECT AVG(E1.SAL) AVGSAL FROM EMP E1 GROUP BY E1.DEPTNO HAVING E1.DEPTNO = E.DEPTNO) AS "DEPTAVGSAL"
FROM EMP E
WHERE E.SAL > (SELECT AVG(E1.SAL) AVGSAL FROM EMP E1 GROUP BY E1.DEPTNO HAVING E1.DEPTNO = E.DEPTNO);
3.统计每年入职的员工个数
显示:总数、年份1,年份2,...?
-- 计数思想.
集合运算:
1.并集:UNION [DISTINCT(默认)|ALL].
2.交集:INTERSECT.
3.减集:MINUS.
使用集合运算注意的问题:
1.参与集合运算的各个集合必须列数相同、列类型一致。
2.采用第一个集合的表头作为集合的表头。
3.ORDER BY 对集合排序写在最后。
4.使用括号。
Oracle中的表类型:
1.标准表
2.临时表
3.索引表
SQL的新增、修改、删除:
SQL类型:
1.DML(Data Manipulation Language 数据操作语言):
INSERT(增)、 UPDATE(改)、 DELETE(删)、 SELECT(查)
2.DDL(Data Definition Language 数据定义语言):
CREATE DROP TRUNCATE TABLE(二维表)
CREATE DROP VIEW(视图)
SEQUENCE(序列)
INDEX(索引)
SYNONYM(同义词)
3.DCL(Data Control Language 数据控制语言):
GRANT(授权)
REVOKE(撤销权限)
INSERT插入、新增操作:
语法:
INSERT INTO 表名[(列1,列2,...)] VALUES(值1,值2,...)[,(值1,值2,...)];
*** Oracle中的地址符 & 用法相当灵活.·
相当于PrepareStatement
用于新增:
INSERT INTO 表名[(字段列表)] VALUES(&column1,&column2,...);
用于查询:
SELECT * FROM &TABLENAME;
批处理:
创建一张表结构与EMP表结构相同.
CREATE TABLE EMP10 AS SELECT * FROM EMP WHERE 1=2;
将EMP表中的数据批量插入到EMP10表中?
INSERT INTO EMP10 SELECT * FROM EMP WHERE DEPTNO = 10;
思考:如何海量插入数据?
1.数据泵.
2.SQL*LOADER工具
3.使用外部表.
UPDATE更新:
语法:
UPDATE 表名 SET 字段=值(数值,子查询返回结果) WHERE ...
DELETE、TRUNCATE 删除:
DELETE和TRUNCATE的区别?
1.DELETE逐条记录删除,TRUNCATE先删除表,再重建表.
2.DELETE属于DML(可以回滚),TRUNCATE属于DDL(不可以回滚).
3.DELETE不会释放空间,TRUNCATE会释放空间.
4.DELETE会产生碎片,TRUNCATE不会产生碎片.
碎片的产生会影响查询效率.
5.DELETE可以闪回(FLASHBACK),TRUNCATE不可以闪回
Oracle碎片图解:
Oracle一张二维表中数据是从后往前存储.
--------------------------------------------
Oracle指针:
HWM(High Water Mark 高水位线)
---------------------------->
--------------------------------------------
*** DELETE操作的效率比TRUNCATE效率高.
原因:DELETE操作并不是真正的被删除,知识把数据换个地方存储.
UNDO表空间.
Oracle数据库事务:
Oracle属于自动开启事务.
1.起始标识:事务中的第一条DML语句.
2.结束标识:
(1)提交:
显示提交:COMMIT
隐式提交:EXIT(退出)、DDL、DCL
(2)回滚:
显示回滚:ROLLBACK [TO SAVEPOINT 保存点名称]
隐式回滚:非正常退出、掉电...
定义事务保存点:SAVEPOINT 保存点名称;
数据库的隔离级别:
SQL99提供的4种事务隔离级别:
1.READ UNCOMMITTED (读未提交数据):
允许事务读取未被其它事务提交的变更,脏读,不可重复读,幻读的问题都会出现.
2.READ COMMITTED (读已提交数据):
只允许事务读取其它事务提交的变更,可以避免脏读,但是不可重复读和幻读的问题会出现.
3.REPEATABLE READ (可重复读):
确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其它事务对这个字段进行更新,
可以避免不可重复读,但是幻读的问题任然存在.
4.SERIALIZABLE (串行化):
确保事务可以从一个表中读取相同行,在这个事务持续期间,禁止其它事务对该表进行
插入、新增和删除.所有的并发问题都可以避免.但是性能十分低下.
Oracle中有3种事务隔离级别:
1.READ COMMITTED(读已提交数据,默认)
2.SERIALIZABLE(串行化)
3.READ ONLY(只读)
创建和管理二维表:
创建表条件:
1.具有CREATE TABLE权限
2.有存储空间
创建表必须指定:
表名、列名、数据类型、数据类型大小
创建表:
1.CREATE OR REPLACE TABLE 表名 (
列名 数据类型 [数据约束],
...
);
2.CREATE OR REPLACE TABLE 表名[字段列表] AS (SubQuery);
操作表字段:
1.新增一个字段:
ALTER TABLE 表名 ADD 字段名 数据类型 [数据约束];
2.修改列属性:
ALTER TABLE 表名 MODIFY 字段名 新数据类型 [数据约束];
3.修改列名称:
ALTER TABLE 表名 RENAME COLUMN 原字段名 TO 新字段名;
4.删除一个字段:
ALTER TABLE 表名 DROP COLUMN 字段名;
修改表名:
RENAME 原表名 TO 新表名;
删除|清空表数据:
DELETE|TRUNCATE TABLE 表名;
删除表:
DROP TABLE 表名;
删除的表被放置到Oracle回收站中.
*** Oracle数据类型:
VARCHAR2(SIZE):可变长字符串.
CHAR(SIZE):定长字符串.
NUMBER(P,S):可变长数值.
DATE:日期型数据.
LONG:可变长字符数据,最大可达到2G.
CLOB:字符数据,最大可达到4G.
RAW AND LONG RAW:原始的二进制数据.
BLOB:二进制数据,最大可达到4G.
BFILE:存储外部的二进制数据,最大可达到4G.
ROWID:行地址.
*** 数据的完整性约束:
约束是表一级的限制.
如果存在依赖关系,约束可以防止删除错误数据.
约束的类型:
NOT NULL:非空约束
UNIQUE:唯一约束
PRIMARY KEY:主键约束
FOREIGN KEY:外键约束,
主表的外键必须是副表的主键.
CHECK:
GENDER VARCHAR2(1) CHECK(GENDER IN('0','1')),
SAL NUMBER(10,2) CHECK(SAL > 0)
*** 查看Oracle回收站:
SHOW RECYCLEBIN;
清空Oracle回收站:
PURGE RECYCLEBIN;
查看回收站表数据:
SELECT * FROM "回收站表名";
*** CONSTRAINT:使用 CONSTRAINT 对约束命名.
*** 字段 CONSTRAINT 外键名称 [FOREIGN KEY] REFERENCES 表名(字段列表)
ON DELETE SET NULL
ON UPDATE CASCADE
视图VIEW:
视图是一张虚表。
视图建立在已有的表基础之上。
视图的优点:
简化查询。
限制数据操作权限。
视图创建:
CREATE OR REPLACE VIEW 视图名
AS (SubQuery)
[WITH CHECK OPTION] [WITH READ ONLY];
*** 不建议通过视图对表进行修改.
删除视图:DROP VIEW 视图名;
SEQUENCE序列:
与AUTO_INCREMENT一样.
就是一个数组,事先放置到内存当中.
可以提高效率.
创建序列SEQUENCE:
CREATE SEQUENCE 序列名
[INCREMENT BY n]
[START WITH n]
[MAXVALUE n | NOMAXVALUE]
[MINVALUE n | NOMINVALUE]
[CYCLE | NOCYCLE] -- 数组是否循环
[CACHE n | NOCACHE]; --数组默认长度
操作指针从序列中取出数据:
CURRVAL : 存放序列的当前值.
NEXTVAL : 存放指针的下一个值.
取值:序列名.CURRVAL|NEXTVAL
序列在下列情况下会出现裂缝:
1.回滚
2.系统异常
3.多个表共用一个序列
如果不讲序列的值装入内存,可以使用
USER_SEQUENCES表查看序列的当前有效值.
修改序列:
ALTERE SEQUENCE 序列名
[INCREMENT BY n]
[START WITH n]
[MAXVALUE n | NOMAXVALUE]
[MINVALUE n | NOMINVALUE]
[CYCLE | NOCYCLE] -- 数组是否循环
[CACHE n | NOCACHE]; --数组默认长度
删除序列:
DROP SEQUENCE 序列名;
索引INDEX:
创建索引:
CREATE INDEX 索引名称 ON 表名(字段列表);
索引表由Oracle数据库自动维护.
删除索引:
DROP INDEX 索引名称;
删除索引必须拥有DROP ANY INDEX权限.
同义词SNYONYM:就是别名
可以代表任意的数据库对象.
创建同义词:
CREATE [PUBLIC] SNYONYM 同义词名称 FOR [用户名.]表|视图...
同义词的创建必须具有CREATE SNYONYM权限.
删除同义词:
DROP SNYONYM 同义词名称;
PLSQL程序设计:Oracle自创语法.
操作数据库的复杂逻辑.
类似使用Java Jdbc操作Oracle.
Oracle对SQL语言的扩展.执行效率高.
*** 开启|关闭Oracle的输出开关:SET SERVEROUTPUT ON|OFF(默认);
*** 查看Oracle PLSQL程序包 DESC|DESCRIBE 程序包名称;
*** 接收键盘输入:ACCEPT 地址名 PROMPT '提示语';
使用键盘输入值:&地址名
地址名存储的是输入值得地址名,这个地址保存了输入的值.
PLSQL语法格式:
DECLARE
-- 声明变量、光标、例外
BEGIN
-- 语句序列.
DBMS_OUTPUT.PUT_LINE('hello world!');
EXCEPTION
-- 例外处理语句.
END;
/
什么是PLSQL?
1.PLSQL(Procedure Language Structured Query Language).
2.PLSQL是Oracle对SQL语言的过程化扩展.
3.指在SQL命令语言中增加了过程处理语句(例如:分支、循环等),
使SQL语言具有过程处理能力.
PLSQL变量和常量:
变量语法格式:
变量名 数据类型 [:=初始值];
常量语法格式:
变量名 CONSTANT 数据类型 [:=初始值];
变量数据类型:
CHAR
VARCHAR
DATE
NUMBER
BOOLEAN
LONG
EMP.ENAME%TYPE 引用型变量
EMP%ROWTYPE 记录型变量
PLSQL条件语句:
语法格式:
IF 表达式1 THEN 处理语句1
ELSIF 表达式2 THEN 处理语句2
...
ELSIF 表达式n THEN 处理语句n
ELSE 另外处理语句
ENDIF;
循环语句:
1.
WHILE 表达式
LOOP
-- 循环体.
END LOOP;
*** 类似Java中的WHILE循环.
2.
LOOP
EXIT 表达式
-- 循环体
END LOOP;
*** 类似Java中的DO...WHILE循环.
3.
FOR 变量名 IN 表达式
LOOP
-- 循环体
END LOOP;
*** 类似Java中的FOR循环.
CURSOR光标|游标:
类似Java中的ResultSet.
声明光标CURSOR格式:
CURSOR 光标名称 [(参数名 数据类型[,参数名 数据类型]...)]
IS SELECT 语句(可以使用光标参数);
光标用于存储一个查询返回的多行数据.
操作光标:
打开光标:OPEN 光标名称[(参数值[,参数值]...)];
取一行光标值:FETCH 光标名称 INTO 变量;
关闭光标:CLOSE 光标名称;
光标的属性:返回TRUE|FALSE
%ISOPEN 是否开启
%ROWCOUNT 影响的行数.
%FOUND 找到
%NOTFOUND 未找到
使用方式:
光标名称+光标属性(返回TRUE|FALSE)
练习:
1.使用光标查询员工的姓名和月薪,并打印?
2.查询某个部门的员工信息?
例外EXCEPTION:
例外是程序设计语言提供的一种功能,
用来增强程序的健壮性和容错性.
*** Java程序中的例外EXCEPTION:
Java例外处理机制:向上抛出.
try{
...
}catch(Exception e1){
...
}catch(Exception e2){
...
}finally{
...
}
Oracle的系统定义异常:
NO_DATA_FOUND:未找到数据异常。
TOO_MANY_ROWS:SELECT ... INTO ... 语句匹配多行记录异常。
ZERO_DIVIDE:被零除异常。
VALUE_ERR:算术异常或转换异常。
TIME_OUT_RESOURCE:等待资源时发生超时异常。
Oracle用户自定义异常:
异常名称 EXCEPTION;
向EXCEPTION抛出异常:
RAISE 异常名称;
被零除异常问题?
SET SERVEROUTPUT ON;
DECLARE
PNUM NUMBER := 1;
VALUE_ONE EXCEPTION;
-- 1.自定义异常.
BEGIN
PNUM := 1/0;
IF PNUM = 1 THEN RAISE VALUE_ONE;
-- 2.抛出异常.
EXCEPTION
WHEN ZERO_DIVIDE
THEN DBMS_OUTPUT.PUT_LINE('系统出现异常!');
DBMS_OUTPUT.PUT_LINE('0不能作为被除数!')
WHEN VALUE_ERR
THEN DBMS_OUTPUT.PUT_LINE('算术或者转换异常!');
WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('未知异常!');
WHEN VALUE_ONE THEN DBMS_OUTPUT.PUT_LINE('值为1');
-- 3.处理异常.
END;
/
使用PLSQL处理Oracle数据库问题步骤:
1.需求分析
2.概要设计HIGH LEVEL DESIGN
详细设计LOW LEVEL DESIGN
3.编码CODING
4.测试TEST
5.上线APPLICATION
使用PLSQL处理Oracle问题考虑的问题:
1.SQL语句.
2.变量:初始值,如何得到
*** Java的垃圾回收机制不受Java代码的控制。
Java中System类下的gc()函数只是请求调用Java回收机制.
Java回收机制受虚拟机内存:-Xms100M -Xmx200M影响.
当Java的内存已满,Java会优先回收最近最少使用的垃圾.
OUT参数中使用游标:
*** 必须将存储过程放到程序包中.
创建包头:
CREATE [OR REPLACE] PACKAGE 包名 AS
TYPE empcursor IS REF CURSOR;
PROCEDURE queryEmpList(dno IN NUMBER,empList OUT empcursor);
END 包名;
创建包体:
CREATE [OR REPLACE] PACKAGE BODY 包名 AS
PROCEDURE 存储过程名称(dno IN NUMBER,empList OUT empcursor)
BEGIN
OPEN empList FOR SELECT * FROM EMP WHERE DEPTNO = dno;
END 存储过程名称;
END 包名;
触发器TRIGGER:
触发器是一个与表相关联的、存储的PLSQL程序.每当一个特定的
SQL操作语句(INSERT,UPDATE,DELETE)在指定的表上发出的时候,
数据库会自动的执行触发器中定义的语句序列.
触发器的类型:
1.语句级触发器:
在指定的操作语句之前或之后执行一次,
不管这条语句影响了多少行.
2.行级触发器(FOR EACH ROW):
触发语句作用的每一条记录都会被触发,在行级触发器中
使用 :old 和 :new 伪记录变量,识别值得状态.
创建触发器语法格式:
CREATE [OR REPLACE] TRIGGER 触发器名称
BEFORE|AFTER
INSERT|UPDATE|DELETE [OF 字段列表]
ON 表名
[FOR EACH ROW [WHEN(条件)]]
DECLARE
-- 声明变量.
BEGIN
-- 实现逻辑语句.
EXCEPTION
-- 例外处理语句.
END;
/
*** 触发器与伪记录变量的值:
触发语句 :old :new
INSERT 所有字段都是NULL空值 将要插入的数据
UPDATE 更新之前改行的值 更新改行后的值
DELETE 删除改行之前的值 所有的字段都是NULL空值
*** Oracle触发器中抛出异常,建议使用RAISE_APPLICATION_ERROR(errorCode,errorMessage)
函数抛出. errorCode错误代码范围:(-20999,-20000).
练习:
1.商品库存和订单问题?
2.复杂的安全性检查,禁止在非工作时间插入新员工信息?
非工作时间:
(1)周末
(2)上班前9.30,下班后6.30
3.数据确认,员工涨工资不能涨长越少?
*** 触发器总结:
触发器应用:
1.数据确认.
2.实施复杂的安全性检查.
3.做审计,跟踪表上所做的数据操作等.
Oracle数据库已经做了审计功能.
4.数据的备份和同步.
查询触发器、过程以及函数:
SELECT * FROM USER_TRIGGERS;
SELECT * FROM USER_SOURCE;
存储过程PROCEDURE和存储函数FUNCTION:
是指在数据库中供所有用户程序调用的子程序
叫存储过程、存储函数.
存储过程PROCEDURE和存储函数FUNCTION的最大区别:
存储函数可以通过RETURN返回结果.
创建存储过程:
CREATE [OR REPLACE] PROCEDURE 存储过程名称(形参列表)
AS
DECLARE
-- 声明变量.
BEGIN
-- 执行语句.
EXCEPTION
-- 例外处理语句.
END;
/
*** Oracle存储过程形式参数的定义
格式:形参名称 IN|OUT|INOUT 数据类型
调用存储过程:
1.EXECUTE/EXEC 存储过程名称;
2.在PLSQL中调用存储过程:
DECLARE
BEGIN
存储过程名称(实参列表);
END;
/
练习:
1.给指定的员工涨指定额外的工资?
存储函数FUNCTION:
函数(FUNCTION)是一个命名的存储程序,可以带参数,
并返回一个值,函数和过程的结构类似,但是必须有一
个RETURN子句,用于返回函数值.函数说明要指定函数
名称,结果值的类型,以及参数类型等.
Oracle创建存储函数:
CREATE [OR REPLACE] FUNCTION 函数名(形参列表)
RETURN 返回函数值的数据类型
AS
DECLARE
-- 声明变量.
BEGIN
-- 逻辑处理语句.
EXCEPTION
-- 异常处理语句.
END;
/
调用存储函数FUNCTION:
1.SELECT 函数名(实参列表) FROM DUAL;
2.PLSQL调用函数.
*** 什么时候使用存储过程,什么时候使用存储函数?
原则:如果只有一个返回值,使用存储函数,否则
使用存储过程.
*** 存储过程和存储函数中的形参类型IN和OUT:
一般来说,存储过程和函数的区别就是在于函数
可以有一个返回值,而存储过程没有.
但是存储过程和函数都可以通过OUT制定一个或
多个输出参数.我们可以利用OUT参数,在存储过
程和函数中实现返回多个值.
练习:
1.查询某个员工的姓名、月薪、职位?
数据字典DICTIONARY:
Oracle中的二维表:
1.基本表
描述数据库信息,只能由数据库
服务器进行修改.
2.用户表
用户自定义表.
Oracle数据字典总表:DICTIONARY.
数据字典命名规则:
前缀 说明
USER 用户自己的.
ALL 用户可以访问到的.
DBA 管理员视图.
V$ 性能相关的数据,动态性能视图.
USER_OBJECTS:
通过查询USER_OBJECTS可以确定当前用户创建的所有对象.
可以获取一下信息:
DATE CREATED -- 创建时间
DATE OF LAST MODIFICATION 最后一次修改时间.
STATUS(状态:VALID(有效) 、 INVALID(无效))
ALL_OBJECTS:
可以通过查询ALL_OBJECTS来确定当前用户能访问
的数据库对象.
数据库管理:
利用DBCA(Database Configuration Assistant)创建Oracle数据库:
在安装Oracle的时候可以选择安装ORCL数据库,
但是在真实的环境中,不要使用DBCA安装ORCL数据库.
Oracle安装文件下有Database Configuration Assistant插件.
Database Configuration Assistant功能:
创建数据库
配置数据库选项
删除数据库
管理模板
配置自动存储管理:ASM (Automatic Store Manage)
DBA:Database Administrator 数据库管理员
(DBA职责) 数据库管理任务:
1.评测数据库服务器硬件.
2.安装Oracle数据库软件.
3.规划数据库.
4.创建并打开数据库.
5.数据库备份.
6.注册用户.
7.实现数据库计划.
8.全库备份、增量备份.
9.调整数据库性能.
Database Configuration Assistant创建数据库步骤:
1.从以下列表中选择模板来创建数据库
2.填写数据库全名称和SID
3.使用Web版数据库管理工具.
4.设置密码.
Oracle初始化参数存储于SPFILE逻辑文件.
Oracle闪回FLASHBACK:
闪回解决的问题:
1.错误的删除了数据,并且COMMIT.
2.错误的删除了表 DROP TABLE.
3.如何获取表上的历史记录.
4.如何撤销一个已经提交的事务.
闪回的类型:
1.闪回表(FLASHBACK TABLE):
将表回退到过去的一个时间上.
2.闪回删除(FLASHBACK DROP):
操作Oracle的回收站.
3.闪回版本查询(FLASHBACK VERSION QUERY):
表上的历史记录.
4.闪回事务查询(FLASHBACK TRANSACTION QUERY):
获取一个操作UNDO_SQL,然后通过UNDO_SQL来撤销事务.
5.闪回数据库:
将数据库回退到过去的一个时间上.
6.闪回归档日志:
闪回操作最初出现在Oracle 9i中,最初只有第一种类型,
在10g版本中才增加后几个版本.
闪回的好处:
1.恢复中,闪回技术是革命性的进步.
2.传统的恢复技术缓慢.
它是整个数据库或者一个文件的恢复,不只是恢复损坏的数据.
在数据库日志中每个修改都必须被检查.
3.闪回的速度快.
通过行和事务把改变编入索引.
仅仅改变的数据会被恢复.
4.闪回的命令很容易.
没有复杂棘手的多步程序.
闪回表(Flashback Table):
闪回表,实际上是将表中的数据快速恢复到过去的一个焦点或者系统改变号SCN上,
实现表的闪回,需要设计到与撤销表空间相关的UNDO信息,通过SHOW PARAMETER UNDO
命令可以了解这些信息.
用户对表数据的修改操作,都记录在撤销表空间中,这为表的闪回提供了数据恢复
的基础,例如:某个修改操作在提交后被记录在撤销表空间中,保留时间为900秒,
用户可以在这900秒的时间内对表进行闪回操作,从而将表中的数据恢复到修改
之前的状态.
执行表的闪回,需要有Flashback Any Table 权限.
*** 使用系统管理员查看UNDO信息,
ALTER SYSTEM SET UNDO_RETENTION=1200 SCOPE=BOTH;
SCOPE : MEMORY|SPFILE|BOTH
-- 修改撤销表空间的时间.
*** 系统改变号SCN -- 和Oracle系统时间相对应.
SELECT TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss:mm') 时间,
TIMESTAMP_TO_SON(SYSDATE) SCN
FROM DUAL;
*** 开启表的行移动功能:ALTER TABLE 表名 ENABLE ROW MOVEMENT;
闪回表(Flashback Table)语法格式:
FLASHBACK TABLE [schema.]表名
TO
[BEFORE DROP [RENAME TO 表名]]
BEFORE DROP ->表示恢复到删除之前,
RENAME TO 表名 ->表示更换表名.
或[SCN 值]
表示将表闪回到这个系统改变号对应的时间点上.
或[TIMESTAMP 值]
表示将表闪回到这个时间点上.
[[ENABLE|DISABLE] TRIGGER]
ENABLE TRIGGER表示触发器恢复以后为enable状态,
默认则为disable状态.
问题:
如何获取离该操作最近的一段时间或SCN?
闪回表注意的问题:
1.系统表不能被闪回.
2.不能跨越DDL操作.
3.会被写入警告日志.
4.产生撤销和重做的数据.
闪回删除(Flashback Drop):
查看回收站:SHOW RECYCLEBIN;
清空回收站:PURGE RECYCLEBIN;
查看回收站中的表信息:
*** 使用RECYCLEBIN NAME 值作为表使用.
SELECT * FROM "RECYCLEBIN NAME";
*** 回收站只对表使用.
*** 管理员没有回收站.
执行闪回删除:
FLASHBACK TABLE 原表名|"RECYCLEBIN NAME"
TO BEFORE DROP [RENAME TO 新表名];
当回收站中有重复的表时?
通过表名将表从回收站还原,回收站默认还原
最新删除的表.
*** 当第二张同名表要还原的时候,需要重新命名表名.
闪回表和闪回删除小结:
1.闪回表:
SHOW PARAMETERS UNDO ---> 900秒
SCN 系统改变号.
执行闪回表:
行移动.
系统表不能闪回(数据字典)
不能跨越DDL操作.
如何获取离该操作最近的一个时间.
2.闪回删除:
Oracle回收站.
管理员没有回收站.
执行闪回删除.
通过表名或"RECYCLEBIN NAME" 闪回.
闪回同名的表.
闪回版本查询(FLASHBACK VERSION QUERY):
闪回版本查询,提供了一个审计行改变的查询
功能,通过它可以查找到所有已经提交了的行记录。
Flashback Version Query语法格式:
SELECT
字段列表
[,VERSIONS_OPERATOR,
VERSIONS_STARTTIME,
VERSIONS_ENDTIME,
VERSIONS_XID -- 事务号
]
FROM 表名
VERSION BETWEEN
[SCN|TIMESTAMP]
[express|MINVALUE]
AND
[express|MAXVALUE]
AS OF -- AS OF:表示恢复单个版本
[SCN|TIMESTAMP]
express;
-- BETWEEN ... AND ... :表示时间段.
FVQ->解决如何获取最近操作的时间或SCN?
闪回事务查询(Flashback Transaction Query):
闪回事务查询实际上是闪回版本查询的一个扩充,
通过它可以审计某个事务甚至撤销一个已经提交的事务.
实现闪回事务查询,需要先了解FLASH_TRANSACTION_QUERY视图,从该视图中可以获取事务的历史
操作记录,以及撤销语句(UNDO_SQL).
使用闪回事务查询,可以了解某个表的历史操作记录对应的一个撤销
SQL语句,如果想要撤销这个操作,就可以执行这个SQL语句.
Oracle的导入(import)导出(export):
*** 轻量级的备份和还原.
*** RMAN(Recovery Manager) 数据的备份.
export导出:
exp -help; 可以查看导出的数据文档.
exp导出的三种方式:
1.表方式:将指定表的数据导出.
exp scott/tiger@localhost:1521/orcl
file=d:/temp/a.dmp
log=d:/temp a.log
tables=emp,dept
2.用户方式:将指定用户的所有对象以及数据导出.
exp scott/tiger@localhost:1521/orcl
file=d:/temp/a.dmp
log=d:/temp a.log
3.全库方式:将数据库中的所有对象导入导出(管理员权限).
exp system/password@localhost:1521/orcl
file=d:/temp/a.dmp
log=d:/temp a.log
full=y
imp导入的三种方式:
1.表方式:将指定表的数据导入.
imp hr/hr@localhost:1521/orcl
file=d:/temp/a.dmp
log=d:/temp impa.log
tables=emp,dept
fromuser=scott touser=hr
commit=y
ignore=y
2.将指定用户的所有对象以及数据导入.
imp hr/hr@localhost:1521/orcl
file=d:/temp/a.dmp
log=d:/temp/ia.dmp
fromuser=scott touser=hr
commit=y
ignore=y
3.全库方式:将数据库中的所有对象导入(管理员权限).
imp system/password@1521/orcl
file=d:/temp/a.dmp
log=d:/temp/ia.dmp
full=y
commit=y
destory=y
管理方案(schema):
EM管理器的使用.
什么是方案?
11gOracle登录(enterprise manager)EM:
路径:
https://localhost:1158/em/
登录需要权限:SELECT_CATALOG_ROLE
*** 命令行切换用户:
CONN 用户名/密码 [AS SYSDBA(管理员)]
用户管理安全:
用户user:
1.创建一个用户:
CREATE USER 用户名 [PROFILE DEFAULT]
IDENTIFIED BY 密码 [ACCOUNT UNLOCK]
GRANT CONNECT TO 用户名;
2.删除用户:
DROP USER 用户名 [CASCADE(级联)];
一个Oracle用户具备:
(1)一个唯一的用户名.
(2)一个验证方法.
(3)一个默认表空间.
(4)一个临时表空间.
(5)一个用户概要文件.
(6)一个消费群.
(7)一个锁状态.
(8)每个表空间的配额.
(9)权限和角色.
角色role:
创建角色:
CREATE ROLE 角色名称;
赋予角色权限:
GRANT ... TO 角色名称;
权限privilege:
用户权限分类:
(1)系统权限system:
(2)对象权限object:
概要文件profile:
Oracle用户的认证方式:
1.password密码认证.
2.External外部认证(或主机认证),当前用户必须是管理员administrator.
外部认证方式优先于密码认证方式.
sqlplus / [as sysdba];
3.global全局认证方式(例如:生物认证方式(指纹,眼膜),token认证方式):
*** windows系统打开本地用户和组:lusrmgr.msc
*** Oracle预定义用户:
SYS(数据库拥有者):
拥有DBA权限.
拥有ADMIN OPTION的所有权限.
拥有startup,shutdown,以及若干维护ml.
拥有数据字典.
SYSTEM用户:
拥有DBA权限.
*** 这些用户并非用于常规操作.
*** 用户解锁:ALTER USER 用户名 ACCOUNT UNLOCK;
*** 用户修改密码:ALTER USER 用户名 IDENTIFIED BY 新密码;
*** 使用ADMIN OPTION 撤销系统权限(system privilege):
GRANT CREATE TABLE TO 用户名 WITH ADMIN OPTION;
REVOKE CREATE TABLE TO 用户名;-- 不会产生级联撤销.
*** 使用grant option 撤销对象权限:
撤销时会产生级联效果.
*** 用户创建表条件:
(1)有CREATE TABLE权限.
(2)有表空间.
给用户分配表空间:
ALTER USER 用户名 QUOTA UNLIMITED ON USERS;
*** 常用于创建一个普通用户语句:
CREATE USER 用户名 [PROFILE DEFAULT]
IDENTIFIED BY 密码 [ACCOUNT UNLOCK];
GRANT CONNECT,RESOURCE TO 用户名;
概要文件profile:
1.指定密码规则.
2.控制资源消费.
Oracle分布式数据库:
数据在物理上被存放在多个节点上,但是逻辑上是一个整体.
分布式数据库的独立性:
分布式数据的独立性是指用户不关心数据是如何分割和
存储,只需它关心需要什么数据.
数据库链路:DBLINK
数据库链路是单向的.
跨节点的数据创建及查询.
跨节点的数据更新.
定义数据库链路:
CREATE DATABASE LINK 所需要连接数据库的真实名称SID
CONNECT TO 所需要连接数据库的用户名
INDENTIFIED BY 所需要连接数据库的密码
USING [所需要连接数据库的服务命名];
*** Oracle数据库程序安装包下:
启动Oracle Net Manager 创建服务命名.
*** 创建数据库链路需要:CREATE DATABASE 权限.
分布式数据库的查询:
SELECT ENAME,DNAME
FROM DEPT,EMP@所需要连接数据库的真实名称SID
WHERE EMP.DEPTNO=DEPT.DEPTNO;
使用同义词给远端的数据库创建别名:
CREATE SYNONYM 同义词名称 FOR EMP@所需要连接数据库的真实名称SID;
分布式数据库的插入:
INSERT INTO EMP SELECT * FROM EMP@SID;
数据的复制:
CREATE TABLE EMP AS SELECT * FROM EMP@SID;
分布式数据库跨节点更新:
快照:
定义快照维护关系表的异步副本,
指在主表修改后的指定时间内刷新副本,
用于主表修改少,但查询频繁的表.
CREATE SNAPSHOT 表名
REFRESH START WITH SYSDATE
NEXT NEXT_DAY(SYSDATE,'MONDAY')
AS SELECT * FROM EMP@SID;
触发器:
利用触发器实现数据的同步.
CREATE [OR REPLACE] TRIGGER 触发器名称
BEFORE|AFTER
INSERT|UPDATE|DELETE [OF 字段列表]
ON 表名
[FOR EACH ROW [WHEN(条件)]]
DECLARE
-- 声明变量.
BEGIN
-- 实现逻辑语句.
EXCEPTION
-- 例外处理语句.
END;
/