验证中...
片段 1 片段 2 片段 3 片段 4 片段 5
-- SCOTT
原始数据 复制代码
-- SCOTT
select * from emp;
--1.视图
--视图 可以DML操作?可以分简单视图,和复杂视图,
--简单视图:可以一张表。或者多张简单表连接,组成视图简单视图..简单视图如果不违反底层的原始表的约束,就可以DML操作 用with read only
--复杂视图;只要又聚合或者分组组成的视图组成复杂视复杂视图,不支持增删改查
--语法
create or replace view view_emp_dept03 as select emp.* ,dept.dname from emp left join dept on emp.deptno=dept.deptno;
select * from view_emp_dept03;
delete from view_emp_dept03 where empno=21;
-- 创建一个视图显示 雇员。部门。
create view view_static_count03 as select count(*)as count, deptno from emp group by deptno;
select * from view_static_count03 ;
-- 创建一个序列
--2.序列
-- orcle 没有自动增长的关键字。但是有序列可以实现自动增长
--create .... sequence ... sequence_emp
--sequence_emp.nextval
--sequence_emp.currval
-- select sys_guid() from dual;
create sequence sequence_emps03;
select sequence_emps03.nextval from dual;
insert into emp(emp.empno,emp.ename) values(sequence_emps03.nextval ,'李四');
select sequence_emps03.nextval from dual;
--3.索引(*)优缺点:1优点:查询速度快。2.缺点:占用物理空间。所以你不是越多越好.在数据量大并且频繁使用的列作为条件才更有效。数据量比较小索引反而 降低查询速率
-- 为了查询速度提高。通常建立表的时候,在(((频繁使用)))的列上建立索引,索引可以有效的大幅度的提高sql查询速度
-- 特别是数据量特别大的时候,由于建立表的时候 主键有默认的索引,所以说通过主键查询,速度非常的快,,,所以类似于书的目录
--索引也是数据,占用物理空间。通常分布在oracle索引段上,当数据库的记录U币教学爱哦的时候,不建议使用索引。数据量比较小的时候。索引反而降低sql查询速度
-- 如果在 十万到五十万之间不需要建立。如果没有索引就会全秒扫描,时间复杂度O(n).索引是sql查询的时候标自动使用。不需要手动适用
--但是需要手工建立索引
-- 语法:create ... index...index _name ...on表(列)
--索引类型
--1.B.Tree索引(默认索引
--2.位图索引。。。bitmap 适合在列的值参加欧诺个复性比较高的情况下(男,女)
--3.基于函数索引。如果对索引列进行函数操作,索引会实现爱哦。如果需要频繁函数索引 ,要为函数本身建立索引
-- 4.反向键。
select * from emp;
create index index_eno on EMPNO;
select * from emp where job ='lu'
CREATE INDEX comp_ind ON EMP();
-- sql优化
--如还有让你的查询sql语句更加合理有效的使用索引,进行优化
--1。避免使用*。。。*是所有列。而且需要解析
--2.使用别名
-- 3.where条件的顺序。多表连接时候。连接条件要写在where首位,或者紧跟在where之后,然后在and具体的条件
-- 把最大程度一次性
-- a] select .*.. from A,B where A.did=bid..and B.name='张三'
--4.避免在索引字段。进行函数操作
--5.like语句通常不使用索引。只有一种使用,就是右边模糊 。。。abc% 其他模糊不适用索引
--6.劲量不适用<> ..!=操作符
--7.在设计表的时候。索引段设置为 not null Btree索引
--8.使用Union.All代替Union(1.Union.All不去重复,2.Union去重复,合并行)
--使用Exists 代替In(注意,不同情况,不一定)数据量大用使用Exists。小用in
hr
原始数据 复制代码
--HR
select * from user_tables
select * from DEPARTMENTS
select * from job_history
select * from employees e where e.employee_id in (select employee_id from job_history )
select * from employees e where e.department_id in(10,20,30)
where
exists (--自语句 返回true
select employees_id from JOB_HISTORY h where h.employee_id=e.employee_id)
--PL/SQL编程
--组成PLSQL的基本单位,或者最小单位,匿名快
--语法 1.declare
--语法:
declare
v_number number :=2 ;--表示赋值
begin
v_number :=v_number+1;
dbms_output.put_line(v_number);
end;
--loop循环
begin
for v in 1..100 loop
dbms_output.put_line(v);
end loop;
end;
begin
for v in (select * from employees) loop
if v.salary>8000 then
dbms_output.put_line(v.salary||'高工资');
elsif v.salary>5000 and v.salary<8000 then
dbms_output.put_line(v.salary||'中等工资');
else
dbms_output.put_line(v.salary||'低工资');
end if;
end loop;
end;
--编写plsql 便利雇员信息
begin
for v in (select * from employees) loop
if v.salary>800 then
dbms_output.put_line(v.first_name||v.salary);
end if;
end loop;
end;
--变量的定义和赋值
declare
v_number number :=2 ;--表示赋值
begin
select sum(salary) into v_number from employees;
dbms_output.put_line(v_number);
end;
--
declare
v_number employees.salary%type ;--表示赋值,表示类型和雇员表的薪水类型一致
v_el employees%rowtype ;--表示更雇员表的一行数据类型一致
begin
select max(salary) into v_number from employees;
dbms_output.put_line(v_number);
end;
--求雇员表最低工资和人员名称
declare
v_name employees.first_name%type;
v_sal number;
begin
select min(salary),employees.first_name into v_number from employees;
dbms_output.put_line(v_number);
end;
--
declare
v_salary employees.salary%type;
v_name employees.first_name%type;
begin
select salary,employees.first_name into v_salary ,v_name from employees where employees.salary=
(select min(salary) from employees);
dbms_output.put_line(v.salary||v.name);
end;
--异常处理 others 相当于所有异常父类
declare
v_a number :=100;
v_b number :=10;
v_c number ;
v_salary number ;
money_not_enought exception; --自定义一个异常
begin
select max(salary) into v_salary from employees;
if v_salary >2000 then
raise money_not_enought ;--抛出一个异常
end if;
v_c :=v_a/v_b;
exception
when money_not_enought then --捕获异常
dbms_output.put_line('余额不足');
when others then
dbms_output.put_line(substr(sqlerrm,0,200)); --截取前两百个字符
end;
--pl编程 编写一个触发的plsql 如果除数和被除数 有一个是0 跑出一个操作数不能为0.如果运算过程出现异常
-- 控制台 显示未知异常,没有出现异常,正确输出结果
declare
v_x number :=100;
v_y number :=0;
v_z number ;
v_exception exception ;--自定义异常
begin
select max(salary) into v_z from employees;
if v_x=0||v_z=0 then
raise v_exception ;--抛出一个异常
end if;
v_z :=v_x/v_y;
exception
when v_exception then --捕捉异常
dbms_output.put_line('未知异常');
when others then
dbms_output.put_line(v_z); --截取前两百个字符
end;
--存储过程(业务非常复杂)
--是一个有名字,plsql快。存储过程。通过名字调用,类似于java中的方法,可以传参, 可以返回数据
--被调用之前,必须首先预编译,存储过程预编译在数据库段,是一个数据库对象
--存储过程是什么 ,是一个预编译的sql语句集,存储在数据库端,可以被java应用程序调用
--预编译速度相对于较快
--缺点:可移植性特别差
--创建一个存储过程 F8编译
create or replace procedure proc_thansfer(v_a in number ,v_b in number, v_c out number)
is
--定义变量
begin
v_c=v_a+v_b;
end;
sys
原始数据 复制代码
grant create view to scott
gistfile1.txt
原始数据 复制代码
--
create procedure proc_转账(对方账号,我方账号,我方密码,金额,转账消息)
is
账号不存在异常
密码错误异常
金额不足异常
begin
是否出异常
update account set money=money+金额 when 账号=对方账号
update account set money=money-金额 when 账号=我方账号
exception
when 账号不存在 then
insert into 错误日志(时间,谁转账,账号不存在)
commit;
when 金额不足异常 then
end;
gistfile2.txt
原始数据 复制代码
create or replace procedure proc_tran_money(@in_id,@out_id,123456789,10000,tran_money_message)
is
exception_a--账号不存在异常
exception_b--密码错误异常
exception_c--金额不足异常
begin
--是否存在异常
if is_exception then
dbms_output.put_line('是否存在异常')
end if;
update account set money=money+10000 when id=@in_id
update account set money=money-10000 when id=@out_id
insert into 插入交易记录(对方账号,我方账号,金额,转账时间,类型)
commit;
exception
when 账号不存在 then
insert into 错误日志(时间,谁转账,账号不存在)
commit;
when 金额不足异常 then
insert into 错误日志 (时间,谁转账,账户不存在)
commit;
whene other then
insert into 错误日志(时间,谁转账,账号不存在)
commit;
end;
as
declare @a int;
declare @flag int; --/转账成功标志
select @flag=0;
select @a=user_money from account where user_id=@out_id; --查询转出账号上的余额
if @a<@money --如果转账金额大于余额,则显示余额不足
print '余额不足';
else
begin
begin tran --/事务开始
update account set user_money =user_money-@money where user_id=@out_id; --修改转出账号金额-
update account set user_money=user_money+@money where user_id=@in_id; --修改转入账号金额+
select @flag=1;
if @flag=0
rollback --转账不成功,回滚操作,撤销修改
else
begin
commit --成功转账 提交事务
print '成功执行转账';
end
end
go

评论列表( 0 )

你可以在登录后,发表评论

搜索帮助