一、 一些操作
一些伪列
Rownum、level、:new、:old
ODI:数据集成工具
Sqlplus sys/orcl as sysdba管理员登录
Sqlplus / as sysdba
解锁:alter user soctt account unlock
修改密码:alter user scott identified by tiger;
Set feedback off 关闭回显
Set serveroutput on 服务输出
Set timing on 打开操作时间显示
Set linesize 23
Set pagesize 30
Drop table testable purge
导入脚本 @c:\sql.sql
Oracle 的事物由DML开始,由显示的commit提交或隐式的DCL结束
Oracle的回滚:显示rollback,隐式,系统掉电、宕机、非正常退出
二、 SQL
a) DML语句:(Data Manipulation Language)数据操作语言 select insert update delete;
b) DDL语句(Data Definition Language):数据定义语言 create database, create table, drop table
c) DCL(Data Control Language)语句:数据控制语言:commit,rollback
三、 概念
概念:
集群:多个实例操作同一个数据库
分布式:多个实例操作多个库
实例:
PGA:private grob area 私有区域
SGA:share prob area 共享区域
Client通过PGA传到SGA,SGA操作数据库。例如,insert到PGA,commit是从PGA调度到SGA。在共享区域中可闪回操作。
数据文件分为三部分:
数据文件 存放数据 .dbf
日志文件 存放日志 .log
控制文件 存放一些重要的进程 .CTL
创建一个用户,就应该给用户创建表空间,有了表空间才能在内存中占有一定的空间,用来操作数据库。
四、 查询
1. Spool命令:操作的结果记录在文件中。
2. Host cls:清屏
3. Select * from tab;类似mysql 的show tables.查看当前用户的表
4. Select * from tabs; 查看所有用户的表
5. Desc tabName,查看表结构
6. Set linesize xx :调正行的自读
7. Col colName from 99 :调整列宽
8. Set pagesize 14 设置页大小
9. Select distinct job from emp;
10. 虑空函数vnl(p1, p2): select ename,sal,sal*12,comm,sal*12+nvl(comm,0) from emp;
11. Null!=null错误,用is判断 select ename,empno,sal from emp where comm. is null
12. 使用别名:select sal as “工资” from emp; select sal “工资” from emp; select sal 工资from emp;
13. Distinct关键字的使用。不同的无重复的。
14. 连接符 concat(“张”,”孝祥”) select concat(‘a’,’b’) from dual; select ‘a’||’b’||’v’ from dual;
15. 虚表 dual。无任何意义,只是一张什么都没有的表
16. Col value for a30列宽
17. 日期格式:系统默认是17-11月 11年,修改默认格式 alert session set NLS_DATE_FORMAT=’yyyy-mm-dd’;
18. 查询数据字典:select * from v$nls_paramters
19. Select * from emp comm. Desc nulls last; 空值放入最后
20. 排序查询
多表查询
1. 迪卡尔积。数据太大。Select * d.* , e.* from dept d, emp e.;
2. 等值连接:先迪卡尔积,然后把字段相等的值过滤出来
Select d.*, e.* from dept d, emp e where d.deptno=e.deptno
3. 不等值连接:也需要进行迪卡尔积的操作
Select enam, sal, grade form emp, salgrade where emp,sal>salrade.losal and emp, sal<salgrade.hisal
4. 左外连接:当等值连接条件不成立时,等号左边的数据仍然显示
a) 左边信息显示,(+)写右边Select d.deptno, count(e.empno) from dept d, emp e where d.petno=e.deptno(+) group by d.deptno;
5. 右外连接:与左外连接相反
6. 自连接:把自己这张表看作是两张表进行操作,性能上表现出极大的问题。select e1.ename||’的老板板是’||e2.ename where e1.mgr=e2.empno;
7. 层次查询:解决大数据的自连接效率低的问题
a) 由自身上一次的查询与本次的查询进行对比。连接上一次的结果,根据root开始查找,让上一次的结果与这次的对比。
b) Select level, empno, ename, mgr from emp connect by prior empno=mgr sart with empno=7839 order by 1;
子查询
Having 的使用,如果左边(a=20)只能是字段名称,左边使用上面的字段
集合操作
交集 union
并集 intersect
差集 minus
函数:
1. 单行函数:
a) 操作数据对象
b) 接受参数,返回一个结果
c) 针对一个字段进行处理
d) 函数名称不区分大小写
1. 字符函数
a) LOWER:小写
b) UPPER:大写
c) Initcap:首字母大写
d) Concat:链接字符
e) Substr:截取字符串,参数1给定的字符串,2截取的位置,3截取的长度
f) Length和lengthb:长度函数,前者以字符为单位,后者为字节为函数
g) Instr函数:字串在父串中的位置
h) Lpad函数:左填充函数。第1个参数被填充的字符串,2填充完以后的长度,3填充的字符串
i) Rpad:右填充函数
j) Trim:去掉前后指定的字符。 Select trim(‘h’ from ‘hello worldh’) from dual;
k) Replace:替换函数。参数:1.原字符串,2被替换的字符,3替换字符
2. 数字函数
a) Round函数:四舍五入函数。参数1被操作的数字,2保留到小数点后的位数,可为正可为负,负数是操作小数点左边的保留位
b) Trunk:截取函数,1被截取的数字,2保留到小数点的后几位
c) Mod:求余函数
d) Sign:判断是否为正数
3. 日期函数
a) 获取系统默认的日期 select * from v$nls_parameters;
b) To_char(‘’,’yyyy-mm-dd’)把日期转换成字符串
c) Sysdate:系统日期 select to_char(sysdate,’yyyy-mm-dd hh24:mi:ss’) from dual;
d) 日期的加减:sysdate+1,不允许日期加日期
e) Months_between:计算两个日期之间的月数
f) Add_months:加上多少个月后的日期
g) Last_day:指定月份的最后一天
h) Next_day:下一个星期几的日期。参数1是你指定的日期,2是一个星期数
i) Round函数 四舍五入 按照一个月的中间值为参照 round(sysdate,’month’)
j) Trunc:截断 trunk(sysdate,’month’)
k)
4. 转换函数
a) 隐式转换 系统内部自动转换
b) 显式转换 调用函数进行转换
i. To_char:可以把日期转换成字符串,也可把数字转换成字符串
格式 含义
9 数字
0 零
$ 美元
L 本地货币符号
. 小数点
, 千位符
to_char(sal,’L9,999’)
ii. To_number:与字符串之间的转换
iii. To_date:把字符串转换成日期
5. 通用函数
a) Nvl虑空函数。1,被过虑的函数2,为空返回的
b) Nvl2
c) Nullif:比较相等不相等
d) Coalsesce:找到第一个不为空的值
6. 条件表达示
a) Case when else语句:select ename, case job when ‘president’ then sal+2000 when ‘manager’ then sal+1000 else sal+600 end 涨后工资 from emp;
b) Decode()函数:decode(job,’president’,sal+2000,’manager’,sal+1000,sal+600)
c)
2. 多行函数
1. 组函数 有虑空能力:表达式没有虑空能力 子查询没有虑空能力 组函数有虑空能力。处理多行返回一行。
a) Avg:求平均值,没有值的不算在内了。使用虑空即可
b) Sum:求和
c) Count
d) Min
e) Max
f) Group by:分组 select 后面跟的字段只有组函数,则不需要group by,这个时候是对整个表进行操作,如果select 后面跟的字段既有组函数,又有字段,则必须用group by。除了组函数的其他分组。
g) Having:如果出现group by语句,条件表达示一般用having来做。其意是,前面查出新表,having相当于在这张新表中以这个字段为条件进行条件判断
注意:rollup() 增强分组 break on deptno skip 2;
2.
DML注意
Delete from table 是清空一经表,而truncate table 是摧毁一张表
查询总结:
1. 单表
a) 算术表达示是不虑空的 如果不能保证这个字段不为空,则用nvl进行虑空
2. Order by
a) 可以跟一个字段 算术表达式最好跟别名
3. Group by
a) Select 后面跟组函数与字段一起需group by
4. Having:当分组以后,并且利用组函数计算出一个结果,然后对结果进行过虑
5. 子查询的位置:select后面、from后面、where后面、having 后面,除了group by后面不能跟了查询
视图
视图只能做查询
Create view emp_view as select * from emp with reead only;
序列
主键需要什么样的列:没有任何意义,唯一的
用途:
1. 用于生成主键
2. 自动生成值
3. 共享对象
Create sequences sequence1 start with 1 increment by 1 minvalue 1 || minvalue(1) maxvalue 1|| maxvalue(888888)int values()o dept
Insert into dept values(sequence1.nextval,’aaa’,’a’)
索引
因为要保持地址的边贯性,在insert、update、delete时,会导致地址的不连贯,这样就要维护oracle的索引,所以建立索引越多,oracle对索引的维护消耗的资源越大,所以建立索引要适量
Create index aa on emp(deptno)
面向过程化的SQL编程---PLSQL
如果需要多次操作,会占用session,PLSQL可避免上述问题
什么情况下用面向过程化编程:当操作数据特特别频繁,而且要求效率比较高的时候
面向协和化的编程分为:储存过程、储存函数、包、触发器
1、 语法格式
1. Declare ---变量声明
Begin
Dbms_output.put_line(‘aaa’)
Exception
End;
2. 变量类型char,varchar2,date,date,number,Boolean,long
3. 变量声明
i. Username char(15)
ii. Marred Boolean:=true
iii. Psal number(8,2)
iv. You_name emp.ename%type 引用变量类型
v. Emp_row emp%rowtype 记录类型变量,代表emp表中的某一行记录。
vi. Type 记录变量名 type emp_row is record(
var_no emp.empno%type,
var_name emp.ename%type
)
2、 If语句
1. If ...then..endif
2. If ...then..else .... end if
3. If ...then...elseif....then....endif
3、 循环语句
1. Loop exit when.....end loop
4、 光标(Cursor):能存放一个结果集,记录开型变量只能存放一行
1. Cursor相当于ResultSet
2. 用于存储返回多行的结果:cursor c1 is select ename from emp;
3. 打开光标:open c1;类似rs.next
4. 取一行光标的值:fetch c1 into ejob(取一行到变量中).类似rs.getString()
5. 关闭光标:close c1
5、 存储过程和存储函数
1. 概念
i. 相当于java的方法,组织结构的手段,
ii. 自身不能执行
2. 存储过程
i. 声明Create or replace xxx(empo in number) as begin xxxxxxx end;
ii. 调用 exec xxx() / xxx()
3. 存储函数
i. 声明 create or replace function avg_sal(dno number) return number as 定义变量 begin 语句 return xx end;
ii. 调用:与过程一样
6、 包
1. 声明包
i. 声明的时,可声明任何类型的变量、存储过程、存储函数
ii. 声明的包体必须实现所有的过程和函数
iii. create or replace package hello_package is procedure hello(); end hello_package;
2. 包体(实现):create or replace package body hello_package as procedure hello() as begin 过程体 end; end—包体的结束;
3. 注意:声明包中,存储过程中最少要一个输入参数
4. 调用:hello_package.hello(‘hellow world’);
7、 触发器
与表关联,能够保存,可在DML之前后触发
1. 语句触发器
2. 行触发器 for each row
Create or replace trigger updatsal
Befor update on emp
For each row
Begin
End;
8、 数据字典
1. 常用的数据字典
i. Dictionary表里有所有的数据字典表
ii. User_tables 当前用户下所有的表
iii. User_objects用户下所有的对象
iv. All_objects所能访问到的对象
v. User_tab_columns
vi.
vii. User_sequences
9、 闪回
1. 闪回是一个轻量级还原,不需要备份
2. 优点:恢复速度快
仅仅改变了数据的字段
3. 闪回表:恢复到过去的一个点或SCN时间点上
i. 一个时间对应一个SCN号 :timestamp_to_scn()
ii. 需要使用撤消(undo)表空间(做过的记录操作,UNDO存放闪回的信息):show parameter_undo
iii. 需要权限:flashback_table
4. Oracle的回收站
Drop table emp;
show
flashback table emp to before drop
5. 闪回版本查询
Select fid,fname,versions_operation,versions_starttime,
Versions_endtime
From flashback_table
Versions between timestamp minvalue and maxvalue
6. 闪回事务查询
Flashback_transaction_query
权限:Select any transaction
10、 用户管理
1. 用户必备
2. 用户创建
3. Sys和system
4. 认证方式
5. 权限
i. 权限的种类
ii. 权限的级联
6. 角色
更改表空间:Alter user xxx quota unlimited on users;
Grant create table to mary with admin option.让mary有赋权权限
11、 远程监听
一些测试代码:
/*
创建视图
1. 先得有权限
grant create view to scott;
*/
create view dept_emp
as
select d.deptno,e.ename, e.sal from dept d, emp e where e.deptno=d.deptno with read only
select * from DEPT_EMP
/*
创建索引,索引是为了提高性能,给某张表赋上连续的地址
*/
create index ab on emp(empno);
/******************************************************************************
PL/SQL编程:面向过程化编程
*******************************************************************************/
/*1.普通类型声明*/
select * from emp
declare
emp_no number;
emp_sal number;
begin
select empno, sal into emp_no, emp_sal from emp where empno=7839;
dbms_output.put_line(emp_no||' and sal : '||emp_sal);
end;
/*
2.引用类型声明
*/
declare
emp_no emp.empno%type;
emp_name emp.ename%type;
begin
select empno, ename into emp_no, emp_name from emp where empno=7839;
dbms_output.put_line(emp_no||'编号的名字是'||emp_name);
end;
/*
3.行类型
*/
declare
emp_row emp%rowtype;
begin
select * into emp_row from emp where empno=7839;
dbms_output.put_line(emp_row.empno||' '||emp_row.sal);
end;
/*
4. 记录型变量
*/
declare
type emp_row is record (
var_no emp.empno%type,
var_name emp.ename%type
);
var_emp emp_row;
begin
select empno, ename into var_emp from emp where empno=7839;
dbms_output.put_line('编号:'||var_emp.var_no||' 名字:'||var_emp.var_name);
end;
/*
循环与光标
*/
declare
cursor c is select ename from emp;--声明光标
var_ename emp.ename%type;
begin
open c;--打开光标
loop--循环
exit when c%notfound;--退出条件
fetch c into var_ename;--查询光标
dbms_output.put_line(var_ename);
end loop;--结束循环
close c;--关闭光标
end;
/*********************************************************
存储过程与存储函数:自身不能调用
*********************************************************/
/**
1、存储过程:可有输入与输出参数,不能有返回值
*/
create or replace procedure get_dept_avg_sal(dept_no in number,avg_sal out number )
as
begin
select avg(sal) into avg_sal from emp where deptno=dept_no;
dbms_output.put_line('所有员工的薪水平均为:'||avg_sal);
end;
--过程的使用
declare
avg_sal_out number;
begin
get_dept_avg_sal(10,avg_sal => avg_sal_out);
dbms_output.put_line(avg_sal_out);
end;
/**
2、存储函数:可有返回值
*/
create or replace function get_avg_sal(dept_no in number)
return number
as
avg_sal number;
begin
select avg(sal) into avg_sal from emp where deptno=dept_no;
return avg_sal;
end;
--调用函数
declare
a number;
begin
a:=get_avg_sal(10);
dbms_output.put_line(a);
end;
/**
包的使用
包可以声明任何变量、任何过程、任何函数
包体必须实现所有的函数和过程
包中声明的过程,过程中必须要有至少有一个参数
*/
--声明
create or replace package hello_package
as
procedure p_hello_world(dept_no in number);
end hello_package;
--包体
create or replace package body hello_package
as
procedure p_hello_world(dept_no in number)
as
begin
dbms_output.put_line(dept_no||'hello world');
end;
end;
--调用
declare
begin
hello_package.p_hello_world(1);
end;
/*
触发器,与表关联,可在DML之前后触发
分语句和行触发器
*/
/*语句触发器,一次执多行,只会触发一次*/
create or replace trigger updatedal
before update on emp
begin
dbms_output.put_line('update');
end;
/*行触发器,每一行,都会触发一次*/
drop trigger updatedal
create or replace trigger rowtrigger
before update on emp
for each row
begin
dbms_output.put_line('update this row');
end;
update emp set sal=sal+33
闪回操作:
--1.某个时间戳的数据
SQL> select timestamp_to_scn(to_timestamp('2012-02-14 11:00:00','yyyy-mm-dd HH:MI:SS')) as scn from dual;
scn
------
581256
create table emp_back as select * from emp as of scn 581256;
select * from t8 as of timestamp sysdate-(1/(24)); --1小时前的t8数据 ;
--2.drop后的恢复
drop table t8_back;
flashback table t8_back to before drop;