-- 一,oracle语句的分类: 4类:
DML -- data manage language -- insert delete update select
DDL -- data define language -- create user/table/constraint.... alter user/table/contraint.....
DCL -- data control language -- grant revoke
TCL -- transaction control language 事务控制语句 -- commit rollback 提交 回滚
-- 二,事务 ---多条DML语句构成的执行单元,它们可以整体提交(执行成功)或者回滚(撤销执行)
--DDL DCL TCL与事务无关,执行即成立。
--自动提交事务 --- 每条DML语句作为一个独立的事务,单独执行,单独提交。(jdbc默认)
Oracle事务分析:
--从上一个事务结束后的第一条DML起始
--事务的结束分4种情况:
--1,遇到commit,提交 --rollback,回滚
--2, 不正常关闭sqlplus ,单击关闭按钮 ,则回滚
--3,正常关闭sqlplus -- exit,quit,提交
--4,遇到了 DDL,DCL语句
一,视图
1,概念:--- 虚拟表,只有表的结构,没有数据,本质就是对一条sql语句的封装,对视图的查询,就是执行那条sql语句。
2,创建格式:
create view 视图名称 as select 语句;
--例:创建视图,查询工资高于2000 的所有员工
create or replace view view1 as select * from emp where sal>2000;
3,使用视图,当成一张表来用。
SQL> select * from view1;
本质就是执行了:select * from emp where sal>2000;
视图中没有数据,不存在与表的同步问题,尽量不要在视图中进行insert update delete,因为数据不完整,因为本质的操作仍然是对emp的操作。
4,修改视图:-- 就是删除重建
-- 查看2000元以上的员工的empno ename sal
create or replace view view1 as select empno,ename,sal from emp where sal>2000;
5,查看当前用户的视图:
SQL> select * from user_views;
6,删除视图
SQL> drop view view1;
7,视图的作用:
1)复杂sql语句的简化
例:查看每个部门的最高工资的员工信息
create or replace view view_maxsal as select * from emp where (deptno,sal) in (select deptno,max(sal) from emp group by deptno);
SQL> select * from view_maxsal;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30
7902 FORD ANALYST 7566 1981-12-3 3000.00 20
7839 KING PRESIDENT 1981-11-17 5000.00 10
SQL> select * from view_maxsal where job='MANAGER';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30
四,数据字典
-- 查询对象信息:
1,总表
select * from dictionary order by table_name;
2,select * from tab; --显示表与视图
--数据字典
select * from all_tables;-- 用户具备查看权限的表
select * from user_tables; -- 用户所拥有的表
3,select * from user_users;
select * from all_users;
select * from user_views;
select * from user_constraints;
select * from user_sequences;
select * from user_indexes;
select * from user_ind_columns;
select * from user_indexes a inner join user_ind_columns b on a.INDEX_NAME=b.INDEX_NAME;
6,查看当前用户的存储过程
select * from user_procedures;
七,自定义函数
1,函数有返回值; 存储没有返回值,但是有输出参数
2,格式
--声明格式
create or replace function 函数名(形参 类型,.....) return 返回值类型 is
--变量声明
begin
-- 函数体
return ....;
end;
九,触发器 ORACLE中的 触发器
--一,为什么要使用触发器
--存储过程的一种,是自动执行的存储过程,所以叫触发
--什么时候触发,在insert delete update 前后自动触发执行。
--用途 :用于加强约束条件,约束的补充。
--二,建立触发器的语法
格式:
create or replace trigger <触发器名>
after/before insert/update/delete on <表名>
for each row
when (条件)
begin
exception
end;
--例,
当表emp中加入员工的时候,如果这个员工的部门
在部门表中没有,则在部门表中dept插入该部门信息,
要求部门编号一定要大于77
create or replace trigger emptr
before insert on emp --insert语句触发
for each row --行级触发器
declare
n_count number;
begin
if :new.deptno > 77 then
select count(*) into n_count
from dept where deptno = :new.deptno;
--如果不存在就在部门表中加入该部门
if n_count = 0 then
insert into dept values (:new.deptno,'人事','北京');
end if;
end if;
end;
--触发语句
insert into emp(empno,ename,deptno) values(9004,'mike',50);--触发器后外键约束异常
insert into emp(empno,ename,deptno) values(3568,'tom222',88);-->70触发了触发器
select * from emp;
select * from dept;
commit;
DML -- data manage language -- insert delete update select
DDL -- data define language -- create user/table/constraint.... alter user/table/contraint.....
DCL -- data control language -- grant revoke
TCL -- transaction control language 事务控制语句 -- commit rollback 提交 回滚
-- 二,事务 ---多条DML语句构成的执行单元,它们可以整体提交(执行成功)或者回滚(撤销执行)
--DDL DCL TCL与事务无关,执行即成立。
--自动提交事务 --- 每条DML语句作为一个独立的事务,单独执行,单独提交。(jdbc默认)
Oracle事务分析:
--从上一个事务结束后的第一条DML起始
--事务的结束分4种情况:
--1,遇到commit,提交 --rollback,回滚
--2, 不正常关闭sqlplus ,单击关闭按钮 ,则回滚
--3,正常关闭sqlplus -- exit,quit,提交
--4,遇到了 DDL,DCL语句
一,视图
1,概念:--- 虚拟表,只有表的结构,没有数据,本质就是对一条sql语句的封装,对视图的查询,就是执行那条sql语句。
2,创建格式:
create view 视图名称 as select 语句;
--例:创建视图,查询工资高于2000 的所有员工
create or replace view view1 as select * from emp where sal>2000;
3,使用视图,当成一张表来用。
SQL> select * from view1;
本质就是执行了:select * from emp where sal>2000;
视图中没有数据,不存在与表的同步问题,尽量不要在视图中进行insert update delete,因为数据不完整,因为本质的操作仍然是对emp的操作。
4,修改视图:-- 就是删除重建
-- 查看2000元以上的员工的empno ename sal
create or replace view view1 as select empno,ename,sal from emp where sal>2000;
5,查看当前用户的视图:
SQL> select * from user_views;
6,删除视图
SQL> drop view view1;
7,视图的作用:
1)复杂sql语句的简化
例:查看每个部门的最高工资的员工信息
create or replace view view_maxsal as select * from emp where (deptno,sal) in (select deptno,max(sal) from emp group by deptno);
SQL> select * from view_maxsal;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30
7902 FORD ANALYST 7566 1981-12-3 3000.00 20
7839 KING PRESIDENT 1981-11-17 5000.00 10
SQL> select * from view_maxsal where job='MANAGER';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30
四,数据字典
-- 查询对象信息:
1,总表
select * from dictionary order by table_name;
2,select * from tab; --显示表与视图
--数据字典
select * from all_tables;-- 用户具备查看权限的表
select * from user_tables; -- 用户所拥有的表
3,select * from user_users;
select * from all_users;
select * from user_views;
select * from user_constraints;
select * from user_sequences;
select * from user_indexes;
select * from user_ind_columns;
select * from user_indexes a inner join user_ind_columns b on a.INDEX_NAME=b.INDEX_NAME;
6,查看当前用户的存储过程
select * from user_procedures;
七,自定义函数
1,函数有返回值; 存储没有返回值,但是有输出参数
2,格式
--声明格式
create or replace function 函数名(形参 类型,.....) return 返回值类型 is
--变量声明
begin
-- 函数体
return ....;
end;
九,触发器 ORACLE中的 触发器
--一,为什么要使用触发器
--存储过程的一种,是自动执行的存储过程,所以叫触发
--什么时候触发,在insert delete update 前后自动触发执行。
--用途 :用于加强约束条件,约束的补充。
--二,建立触发器的语法
格式:
create or replace trigger <触发器名>
after/before insert/update/delete on <表名>
for each row
when (条件)
begin
exception
end;
--例,
当表emp中加入员工的时候,如果这个员工的部门
在部门表中没有,则在部门表中dept插入该部门信息,
要求部门编号一定要大于77
create or replace trigger emptr
before insert on emp --insert语句触发
for each row --行级触发器
declare
n_count number;
begin
if :new.deptno > 77 then
select count(*) into n_count
from dept where deptno = :new.deptno;
--如果不存在就在部门表中加入该部门
if n_count = 0 then
insert into dept values (:new.deptno,'人事','北京');
end if;
end if;
end;
--触发语句
insert into emp(empno,ename,deptno) values(9004,'mike',50);--触发器后外键约束异常
insert into emp(empno,ename,deptno) values(3568,'tom222',88);-->70触发了触发器
select * from emp;
select * from dept;
commit;