posts - 0, comments - 77, trackbacks - 0, articles - 356
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

oracle sql语句精讲

Posted on 2007-08-23 09:29 semovy 阅读(459) 评论(0)  编辑  收藏 所属分类: Oracle数据库方面
表 :建立表主要指定义下列信息:
     列定义
     完整性约束
     表所在表空间
     存储特性
     可选择的聚集
     从一查询获得数据
语法如下:
CREATE TABLE tablename (column1 datatype [DEFAULT expression] [constraint], column1 datatype [DEFAULT expression] [constraint], ……)
     例如:
     SQL> create table serv (serv_id number(10),serv_seq_nbr number(3))
2      tablespace data_bill;
视图
视图是一个逻辑表,它允许操作者从其它表或视图存取数据,视图本身不包含数据。视图所基于的表称为基表。
引入视图有下列作用:
     提供附加的表安全级,限制存取基表的行或/和列集合。
     隐藏数据复杂性。
     为数据提供另一种观点。
     促使ORACLE的某些操作在包含视图的数据库上执行,而不在另一个数据库上执行。
2.1分组视图
[例1]简单的分组视图
SQL> create or replace view dept_tot as
2 select a.dname dept,sum(b.sal) total_sal from scott.dept a,scott.emp b
3 where a.deptno=b.deptno group by a.dname;

查看已建立。
SQL> select * from dept_tot;

DEPT                   TOTAL_SAL
--------------               ---------
ACCOUNTING       8750
RESEARCH         10875
SALES                 9400
[例2]合计视图
[例]合计函数视图实例
SQL> create or replace view emp_no1 as
2 select deptno,sum(sal) 工资和,sum(comm) 总和
3 from scott.emp group by deptno;
SQL> select * from emp_no1;
DEPTNO   工资和     总和
--------- --------- ---------
    10     8750
    20   10875
30     9400     2200
索引
索引是种数据库对象。对于在表或聚集的索引列上的每一值将包含一项,为行提供直接的快速存取。在下列情况ORACLE可利用索引改进性能:
     按指定的索引列的值查找行。
     按索引列的顺序存取表。
语法:
create index <index_name> on <table_name(column1,column2…)>
[storage语句] [其它语句];
例如:
SQL> create index idx_serv_01 on serv(srev_id,serv_seq_nbr)
2   tablespace data_bill_idx
3   storage (initial 5m next 5m);
存储函数
语法:
create [or replace] function 函数名(参数1,参数2……) RETURN 类型 IS | AS
     [局部变量说明]
     BEGIN
           执行语句;
     END;
[例子]:
建立oracle 的函数
create or replace FUNCTION SumDeptSalary(dept_no in number)
return number is
    total number(11,2);
begin
select sum(sal) into total from emp where deptno=dept_no;
return(total);
end;
存储过程
语法:
create [or replace] procedure 函数名(参数1,参数2……) IS | AS
     [局部变量说明]
     BEGIN
           执行语句;
     END;
[例子]
过程的输入、输出参数的用例
create or replace procedure RaiseSalary(RaiseRate in number,empnum in number,
outname out varchar2,outsal out number) is
begin
update emp set sal=sal*(1+RaiseRate);
select ename into outname from emp where empno=empnum;
select sal into outsal from emp where empno=empnum;
end;
函数pl/sql 中的过程参数调用示例
set serveroutput on; //显示变量值的属性
declare name varchar2(10);sal number;
begin
RaiseSalary(0.05,7566,name,sal);
dbms_output.put_line(name);
dbms_output.put_line(sal);
end;:
查找系统时间

select sysdate from dual;
系统日期的格式转换
select to_char(sysdate,'MM/DD/YYYY HH:MM:SS AM') from dual;
分解日期
年 select to_char(sysdate,'year') from dual;
月 select to_char(sysdate,'mon') from dual;
月中第几日 select to_char(sysdate,'dd') from dual;
一年中的第几星期 select to_char(sysdate,'ww') from dual;
季度 select to_char(sysdate,'q') from dual;
一年中的第几天 select to_char(sysdate,'ddd') from dual;
查询时间
testdate1 date
select * from testdate where to_char(trunc(testdate1),'yyyy/mm/dd')='2001/04/09'
oracle 中使用trunc()函数把所有日期的时间值设置为12:00AM,消除sysdata中的时间
trunc()函数可进行时间加减
在select中日期相减得出天数
select trunc(sysdate)-trunc(hiredate) from emp where trunc(sysdate)-trunc(hiredate)>5000;
case 语句使用decode()函数替代

例如:select decode(deptno,10,'十',20,'二十',30,'三十') as chinesecode from emp;
            列名   值 表示值
decode列乘积的应用
decode(Yjtx.Lb,0,Yprckmx.Ypsl*Xmxx.Xmpzlbl,1,Yprckmx.Ypsl*Xmxx.Xmpzlbl,2,Yprckmx.Ypsl) as Ypsl
使用decode函数计算
select sum(decode(deptno,20,1))-sum(decode(deptno,30,1)) as d from emp;

伪列
伪列不是表中真正的列,只是特征与列相同
---currval和nextval伪列
currval和nextval伪列与序列联合使用。currval伪列返回被引用的序列的当前值;
nextval伪列增加序列的值,并返回序列的新值。只能用于select values 子句和set 子句
表中主键列增加流水值
insert into employee
values(emp_id_seq.nextval,'stanton bernard');
emp_id_seq为序列
---rownum伪列
rownum伪列指出从表中检索数据的次序。例如,值为1的rownum表明该记录是从表中检索的第一条记录。
rownum伪列最常见的用途是用于where子句。例如
select * from emp where rownum <10;
建立bh流水序列值
create sequence seqczyqx
start with 1
increment by 1
nocycle;
生成表中没有的列的方法
select 'testchar' as dd,sysdate deptno from emp,dual;
    字符值   列名
select 2342345234 as dd,sysdate deptno from emp,dual;
    数值     列名
________________________________________________________________________
返回字符串的一部分
select substr(ename,1,2) from emp;
-----------------------------------------------------------------------------------集合操作
select * from emp where deptno in(10,20);
-----------------------------------------------------------------------------------
在表中插入常量
insert into testdate select 1,sysdate,sysdate from dual;
-----------------------------------------------------------------------------------
在select中对多个变量赋值
SELECT SFBL ,DWBL into XMBL,DWBL FROM HZBL WHERE CFLBBM=CFLBBM AND HZLBBM=HZLBBM and Degree=Hzsf;
-----------------------------------------------------------------------------------
比较操作中的空问题
is null;is not null
使用nvl()函数
select count(*),nvl(comm_amt,0) from comm;
nvl函数用'0'值置换comm_amt表列中值为空的所有数据行
------------------------------------------------------------------------------
·      从另一张表改进得到
Sql语句:
Create Table <新表> As
  Select <列的列表> From <旧表>
  Where <约束条件>[可选]
·      拷贝表结构
  Create Table <表名> As
  Select <列的列表>From <旧表>
  Where 1=2

只有注册用户登录后才能发表评论。


网站导航: