当前位置:数据库 > Oracle >>

Oracle学习笔记(五)

Oracle学习笔记(五)
 
举例一个完整的数据库脚本 
--从此处开始复制,存成文件名为xxx.sql 
--先删除所有约束条件 
alter table xxx drop constraint.... 
--删除序列 
drop sequence xxx 
--删除视图 
drop view xxx 
drop view aaa.... 
--删除表 
drop table xxx..... 
--创建表 
create table xxx... 
--创建视图 
--创建序列 
--创建约束条件 
--增加基础数据 
 
 
DML操作 insert / update / delete 
事务(Transaction)处理语句:commit/rollback/savepoint 
DDL:create / drop / alter / truncate 
SQL>truncate table student; 
SQL>drop table student; 
 
 
其它数据库对象:视图/索引 
视图的本质-->sql查询语句 
--简单视图 
create view emp_10 
as select * from emp where deptno = 10; 
--复杂视图 
create view emp_sum 
as 
select deptno, sum(sal) sum_sal from emp 
group by deptno; 
 
create view emp_dept 
as 
select e.ename, d.dname 
from emp e join dept e 
on e.deptno = d.deptno; 
 
--索引index 
 
 
20110225 
--行内视图:查询语句出现在 from 后面 
--匿名视图 
select ename, sal  
from emp e join  
(select deptno, avg(sal) avgsal  
from emp group by deptno) a  
on e.deptno = a.deptno  
and e.sal > a.avgsal; 
 
--子查询:查询语句出现在条件中 
select ename, sal 
from emp 
where sal > (select sal from emp 
        where ename = 'SCOTT'); 
 
--伪列 rownum, rowid,oracle特有的概念 
select rownum,ename, sal from emp 
where rownum < 5; 
 
--第5条到第10条记录的获取方式 
--这种方式仅适用于oracle数据库 
select ename, sal 
from (select ename, sal, rownum rn 
      from emp )  
where rn between 5 and 10; 
 
--排名问题,Top-N分析 
--薪水最高的三个人,成绩最低的五个人 
--错误的例子: 
select ename, sal from emp  
where rownum <= 3 
order by sal desc; 
--正确的例子: 
select ename, sal from  
(select * from emp  
where sal is not null  
order by sal desc)where rownum <= 3; 
 
--序列Sequence 
--一种数据库对象.主要用于生成主键值. 
create sequence myseq_ning; 
--序列的两个伪列:nextval, currval 
--nextval获得序列的下一个值 
--currval获得序列的当前值 
--当序列建好以后,必须先执行nextval,才能执行currval. 
select myseq_ning.nextval from dual; 
select myseq_ning.currval from dual; 
 
create table mytable_ning(id number primary key, name varchar2(20)); 
 
insert into mytable_ning values(myseq_ning.nextval, 'chris'); 
 
select * from mytable_ning; 
 
--创建序列,起点是1000,步进是10 
create sequence mysequ_ning 
start with 1000 
increment by 10; 
 
user_objects; 
user_tables; 
user_sequences; 
user_views; 
... 
--获得openlab用户名下所有的对象种类. 
select distinct object_type from user_objects; 
 
--PL/SQL编程 
--匿名块 / 函数 / 过程 / 包 / 触发器 
--打开输出,sqlplus命令 
set serveroutput on 
 
declare 
v_count number := 0; 
begin 
select count(*) into v_count 
from emp; 
dbms_output.put_line('total num is '||v_count); 
end; 
 
 
begin 
dbms_output.put_line('Hello World'); 
end; 
 
[declare 
....] 
begin 
... 
[exception 
...] 
end; 
 
declare 
v_sal number := 0; 
begin 
select sal into v_sal 
from emp where ename = 'aaa'; 
dbms_output.put_line('sal is '||v_sal); 
exception  
when too_many_rows then 
dbms_output.put_line('too many rows!'); 
when no_data_found then 
dbms_output.put_line('no data!!'); 
when others then 
dbms_output.put_line('some error!'); 
end; 
 
0-1000   0% 
1001-2000 1% 
2001-3000 2% 
3001-5000 4% 
5001-.... 5% 
 
--函数 
create or replace function tax_ning( 
    v_sal number) 
    return number 
is 
    v_result number; 
begin 
    if (v_sal < 1000) then 
    v_result := 0; 
    elsif (v_sal < 2000) then 
    v_result := v_sal * 0.01; 
    elsif (v_sal < 3000) then 
        v_result := v_sal * 0.02; 
    else  
        v_result := v_sal * 0.04; 
    end if; 
    return v_result; 
end; 
--测试函数的使用 
select ename, sal, tax_ning 
 
(sal) from emp; 
 
--函数输入参数:deptno,输出参数:部门人数 
create or replace function emp_count( 
    v_deptno emp.deptno%type) 
    return number 
is 
    v_count number; 
begin 
    select count(*) into v_count  
    from emp where deptno = v_deptno; 
    return v_count; 
end; 
--测试 
select emp_count(10) from dual; 
 
 
--函数:必须返回数据,在sql语句中生效 
--过程:可以不返回数据,可以独立调用 
create or replace procedure myproc( 
    v_deptno emp.deptno%type) 
is 
    v_count number; 
begin 
    select count(*) into v_count  
    from emp where deptn
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,