posts - 18,  comments - 1,  trackbacks - 0

*********************************
**  oracle 学习笔记第一天      **
**  author Ice Xu   (XuBin)    **
**  date  2006-10-30           **
***********************************
初始化表的位置:
cd $ORACLE_HOME/rdbms   cd demo     summit2.sql
这个角本可以初始化练习用的表
set  LANG = AMERICAN_AMERICA.US7ASCII
*********************************
我们目前使用的是oralce 9i   9201 版本

恢复练习表命令:
sqlplus  openlab/open123 @summit2.sql


登陆oracle的命令:
sqlplus   用户名/密码

show   user        显示当前登陆的身份.
set    pause on
set    pause off   分页显示.

oracle中默认日期和字符是左对齐,数字是右对齐
table or view does  not  exist ; 表或示图不存在

edit 命令用于自动打开vi修改刚修执行过的sql的命令。
修改方法二:
l  3 先定位到行    c   /旧串/新串

执行出错时,利用错误号来查错误:
!oerr ora 942  (装完系统后会装一个oerr工具,用于通过错误号来查看错

误的具体信息)

想在sql中执行unix命令时,把所有的命令前加一个!就可以, 或者host( 用

于从sql从切换至unix环境中去)

/*** 初次使用时注意  ****
运行角本时的命令:
先切换到unix环境下,cd $oracle_home   cd sqlplus  cd demo 下面有两

个角本建表语句。
@demobld.sql
sqlplus nanjing/nanjing @demobid.sql 直接运行角本,后面跟当前目录或

者是绝对路径

保存刚才的sql语句:   save 命令     第二次保存时要替换之前的角本

save 文件名   replace
把刚才保的sql重新放入  buffer中

spool  文件名
此命令会把所有的操作存在某个文件中去
spool off

练习1:查看s_emp表中员工的年工资
select  first_name  , salary*12  salary from s_emp;

给列起别名的命令:
利用关键字  as  或者用空格  "别名"  双引号内大小写敏感保持引号内容

原样输出,如果不加双引号时,默认为大写

拼接字段:
select   first_name||last_name  "employees"  from   s_emp ;
oracle中表达字符串用单引号来表达:
select first_name||' '||last_name  from   s_emp;(在两个字段之间拼接

一个空格)

查看当前用户所有的表:
练习2:(常用于批量更改数据)
set  echo off
spool  selecttab.sql;
select 'select * from ' || table_name ||' ; ' "table name " from

user_tables;
spool off;
set  head off(去除第一行)
set  feed off(去除最后一行)
练习3:(查出s_emp表中所有员工的一年的总收入)
select first_name , salary*12*( 1+nvl(commission_pct/100 , 0 ) ) "

year salary " from s_emp;
nvl函数 专用于处理空值的影响.

*******************************************************************

***************************************************************

下午:
column  定义格式化输出
column last_name  Heading   format a15;
column last_name;
column salary justify left format $99,999.00  ( 定义工资的显示形式

)

$ echo $LANG
zh_CN.hp15CN
$ echo $NLS_LANG
simplified chinese_china.zhs16cgbk

ORDER BY 排序  升序和降序   ASC  升序(默认)    DESC 降序
select * from s_emp  order by dept_id , salary desc  部门号升序,工

资降序
关键字distinct也会触发排序操作。

过滤操作:  where 子句
select * from s_emp  where dept_id=42;  查看部门号为42的所有员工
select * from s_emp  where salary>1000  查看工资高于1000的所有员工
select salary from  s_emp where first_name='Geroge'  找出名字为

Geroge的员工的工资数
select  table_name from  user_tables  where table_name='S_EMP';  查

某个具体表名时,表名的字符串必须要为大写

日期的默认的格式  DD-MON-RR(天-月-年)
BETWEEN  AND   在什么之间            NOT        BETWEEN      AND   

            注意区间:[  ]是一个闭区间
IN( LIST)      在某个集合中          NOT        IN         (list)

空值会有影响         (等于list其中任何一个就行,为提高效率常把比例

高的放在前面)
LIKE           模糊配置              NOT        LIKE             

通配比较
IS NULL        是空
AND
OR
NOT

练习4:(找出表名以S_开头的所有表)对于一些特殊字符,要用到escape转义,

并不是一定要用\,escape后面定义是什么字符为转义字符,那就用哪个字符
select  table_name from user_tables where  table_name like   'S\_%'

 escape '\';

当有多个条件时,要用逻辑运算符:AND OR
写对where语句:正确的数据类型判断、逻辑运算符

sql函数的作用:
sql函数的分类:单行函数、多行函数
单行函数: (dual   哑表 )
字符函数:
lower      转小写          select  lower('SQLPLUS')  from dual;-->

对纯字符串处理的时候
upper      转大写          select  upper('sqlplus')  from dual;
initcap    首字符大写      select  initcap('tarena') from dual;
concat     连接字符串      select  concat(first_name , last_name)  

from s_emp;等效于||
substr     求子串          select  substr('tarenasd0603' ,1,6) from

dual; (取前六个字符)   select substr('tarenasd0603',-2) from dual;

(取后两个字符)
length     求字符长度      select  length('tarena') from dual;
nvl        空值函数    两个参数的类型要匹配,统一的,表示:如果有,

则返回前面的参数,如果没有就返回后面的参数
eg:select first_name,salary from s_emp where lower(first_name)

='george';
select  first_name , substr(first_name , -2 ) from  s_emp;  (查出

s_emp表中所有用户名字的最后两个字符)
默认的是从左向右,如果是-2则表示从右向左数
练习5:   select   first_name  , salary  from s_emp   where  lower

(first_name)='george';

数值函数:
round 函数(四舍五入)   select  round(45.935, 2) from dual;   不带参

数时默认为0位小数
trunc 函数(截取,不管后面的数字)    select  trunc(45.995, 1) from

dual;
日期函数:DD-MON-RR ,默认不显示世纪、时、分、秒       日期格式敏感
世纪、年、月、日
sysdate 返回当前系统时间       select sysdate from dual;    
更改当前会话的设置格式:     
alter session set nls_date_format='yyyy mm dd hh24:mi:ss';
select  sysdate-1, sysdate+1, sysdate , sysdate+1 from dual;  注意

单位是以天为单位,也可以得到多少小时、多少分钟之后的时间
MONTHS_BETWEEN (DATE1 , DATE2 ) 求两个日期之前相差的月数
add_months(date , 4 ) 在 date上再添加4个月
select round(last_day(sysdate),'month') from dual;
select  next_day(sysdate,'FRIDAY') from dual ; 求这个日期的下一个

FRIDAY
last_day 求月的最后一天

round 函数:     select   round(sysdate, 'MONTH') from dual;     参

数可以为:  MONTH YEAR(看上半年还是下半年)  
select  trunc(last_day(sysdate)+1)  from  dual;
select  add_months(trunc(sysdate, 'MONTH'), 1 )  from  dual ;
关于日期的两种形式:

转换函数:
to_char显示日期:
从数字转化为char  to_char(date,'格式')
从日期转化为char           to_char(date,  'fmt' )            

select to_char(sysdate, 'yyyy mm dd hh24:mi:ss') from dual;
         

         

         

    select to_char(sysdate, 'fmyyyy mm

dd hh24:mi:ss') from dual;去掉前导名
                              select  to_char(sysdate ,'YEAR MONTH

dy
eg:查出三月分入职的员工:select first_name,start_date from s_emp

where to_char(start_date,'mm')='03';

to_date表达日期:
      字符转日期     select   to_date('2000 11 20', 'yyyy mm dd ') 

from dual;
                               select  round(to_date('10-OCT-06'

,'dd-mon-RR') ) from   dual;
to_number
      字符转数字
                            select to_number('10')  from  dual ;

day2


where 条件一定是根据某个字段来进行过滤操作.

多表连接操作:
两表没有任何关联时会产生迪卡尔机:
select   first_name , name  from    s_emp , s_dept;
等值连接:
练习一:查看员工的姓名和员工部门号:(要考虑到表中实际数据中空值的影响)
select   first_name ,   name from  s_emp e, s_dept  d where e.dept_id=d.id;同时起了别名
select   first_name ,   name from  s_emp e, s_dept  d where e.dept_id=d.id and e.first_name='George';具体到哪个人所在的部门

练习二:每个员工所在的部门和部门所在的地区
select first_name , name   from s_emp, s_dept,  s_region  where  s_emp.dept_id=s_dept.id and s_dept.region_id=s_region.id;
eg:select first_name,d.name,r.name
 from s_emp e,s_dept d,s_region r
 where e.dept_id=d.id and d.region_id=r.id;
等值连接:
练习三:找出每个员工和每个员工的工资级别
  select    a.ename , a.sal, b.grade from emp a , salgrade b  where a.sal between b.losal and b.hisal;
  select    a.ename , a.sal, b.grade from  emp a , salgrade b  where a.sal>=b.losal  and  a.sal<=b.hisal;
自连接:当一个表的插入行之间有了关系时就发生了(又名:内连接)
select   first_name   , manager_id   from  s_emp;
查出所有员工的部门领导的名称:( 这种sql会少一条记录,总经理没有被配置上)
select  e.first_name , m.first_name   from s_emp e , s_emp m  where   e.manager_id=m.id;
外连接:(防止空值时,用(+)的一方会模拟一条记录配置另一方)这就称为外连接,一个记录都不能少;
select  e.first_name , m.first_name   from s_emp e , s_emp m  where   e.manager_id=m.id(+);
+号放在哪边就表示在哪边补空,来跟对方来匹配,使得数据一个都不会漏掉,这个例子中的领导有可能会没有(最高领导就再没有领导了,所以就
方法领导的那边)
 标准写法:select e.deptno,d.name from emp e,dept d where e.deptno(+)=d.depton and e.depton is null;
查看员工分部的部门:
select  distinct(deptno) from emp ;
找出没有员工的部门:(很经典的一个例子,用外连接来解决的标准做法,这是一种方式)
第一步:
select     e.deptno , d.deptno  from emp e , dept d  where  e.deptno(+)=d.deptno;
第二步:
select     e.deptno , d.deptno  from emp e , dept d  where  e.deptno(+)=d.deptno   and   e.deptno is null;

组函数(group function):
group by  分组子句    对分组后的子句进行过滤还可以用having    条件  对分组后的条件进行过滤   where 是对记录进行过滤

avg(distinct | all )求平均值                            
count(distinct | all )统计
max(distinct | all ) 求最大值
min(distinct | all )求最小值
sum(distinct | all )  求和
(所有组函数会忽略空值 , avg   sum只能作用于数字类型)
求有提成员工的提成的平均值;
select    avg(nvl(commission_pct ,0 )  ) from s_emp;
有多少人有提成:
select  count( commission_pct ) from    s_emp ;
count(*)  用于统计记录数:
select   sum(commission_pct)/ count(*)   from     s_emp;
 员工分部在多少个不同的部门:count  默认为作all的动作
 select   count(dept_id)  from s_emp;
 select   count(distinct dept_id) from   s_emp;
 求各个部门的平均工资:group  by  子句也会触发排序
 select  dept_id ,  avg(salary) aa    from    s_emp    group by   dept_id   order by  aa ;
 select  dept_id ,  avg(salary) aa    from    s_emp    group by   dept_id    ;
 注意:group by 子句后面跟有条件只能是查询的结果中的字段,所以我们会人为在结果要加入一些group by  要用的字段
select   region_id , count(*)  from  s_dept 此句会有错
select   max(region_id)  , count(*) from       s_dept;  (强制语法上可以正确,但是不能保证结果也会正确)
求各个部门不同工种的平均工资:
select     dept_id , title,  avg(salary)  from s_emp   group   by dept_id , title  ;
哪些部门的平均工资比2000高:
select    dept_id,  avg(salary) aa  from s_emp   group by (dept_id)    having      avg(salary)>2000;
除了42部门以外的部门的平均工资:
select   dept_id  ,  avg(salary)   from  s_emp  group by (dept_id ) having    dept_id!=42;
select   dept_id  ,  avg(salary)   from  s_emp   where   dept_id!=42  group by (dept_id ) ;(此种sql效率要高,先过滤再计算)
where       单行函数。
having      组函数。
求各个部门的平均工资:
// 这样统计不详细
select    max(d.name) ,  avg (s.salary)   from   s_emp  s,  s_dept  d where    s.dept_id=d.id   group by    d.name; 
//****这问题很经典,为了过 oracle sql 语法关而写max(d.name)  ***
select   max(d.name)  , avg(e.salary)  , max(r.name)  from s_emp e,   s_dept  d ,   s_region  r  where  e.dept_id = d.id  and  d.region_id=r.id group  by   d.id ;

下午:
关于子查询:  Subqueries
找出所有员工中,工资最低的那个员工:( 利用子查询 )
select    first_name,  salary    from s_emp   where   salary = (  select  min(salary)  from s_emp)    ;
//这样写会出错姓名和工资不一致
select max(first_name),  min(salary)  from s_emp;(利用子查询可以解决)
子查询运行的顺序: 先运行子查询再运行主查询    子查询一般出现在运算符的右边
单值运算符:运算后面只能跟一个值
多值运算符:可以对两个以上的值进行操作
查询谁跟Smith干一样的活:
select   last_name from  s_emp  where last_name='Smith';
//下种写法可能还存在bug,没有考虑到数据的全面性,有潜在性问题
select  last_name  , title  from s_emp   where title =(  select   title  from s_emp  where  last_name='Smith'  )    and  last_name <> 'Smith'  ;
//这种写法才考虑的比较全面
select  last_name  , title  from s_emp   where title   in   (  select   title  from s_emp  where  last_name='Smith'  )    and  last_name <> 'Smith'  ;
使用子查询时应注意:  单行子查询返回多个结果时会有错误    single-row  subquery returns  more  than one value
查出哪些员工的工资比平均工资低:
select    *  from s_emp  where     salary   <  ( select  avg(salary)  from   s_emp)  ;
哪些部门的平均工资比32部门的平均工资要低:
第一步先查出各个部门的平均工资:
select  min(avg(salary  )  ) from   s_emp   group by  dept_id;
第二步再查出哪个部门的工资是最低的:
select    dept_id,  avg(salary)  from  s_emp   group by dept_id   having   avg(salary) =  (select  min(avg(salary)  ) from  s_emp  group by  dept_id ) ;

哪个部门里没有员工:
select   deptno  from    dept    where   deptno   not  in ( select     deptno    from   emp );
哪些人是普通员工:(用子查询形式来做)
select   *   from  s_emp   where   id  not    in (  select  manager_id   from   s_emp);

E--R图  实体关系图entity  relation 
开发流程先进行需求分析,进行系统设计,建表,再进行开发编码,测试最终产品上线试运行。
把软件设计模型转化为数据中的表,设计时要考虑性能的设计

第一范式:最简单的一种建方式,一张表只有一个主键。
第二范式:表的自连接存在原因,一张表,学生表中也有班级的信息。
第三范式:表连接存在的原因,两张表,其中一张表引用其它一张表。

约束:
为了保证数据的一致性,
primary key   (pk)  主键约束       不允许有重复和空值(唯一且非空)
foregin  key   (fk)   外键约束       两张表parent  table      child   table
unique  key   (uk)  唯一可以为空
not   null
数据库设计时的注意:
索引: 为了提高效率而设计的一种与业务无关的
考虑表点用的物理空间:
考虑表之间的关系:
一对多关系: 利用FK+PK实现,多的一方引用外键
一对一关系: 可以利用FK+UK实现,
多对多关系: 通过中间增加一个附加表来实现,附加表利用联合主键来实现,联合起来的主键唯一。


DDL语句:数据库定义语句:
table (表)
view(示图)
sequence(序列号)
index(索引)

创建表语句:
create    table    [schema].表名   (  字段名,   字段类型   约束条件);                    schema   默认就是当前用户,严格来访问表名完整的写法是schema.tablename
数据类型:
表名的命令规则: 首字母为字母,不得超过30个字符
char(size)                定长  不管是否达到最大宽度,都会点最大的宽度。
varchar2(size)         可变长   按实际的字节占用空间
number            所有的数字类型都称为number
number(n, m )  n------n位宽度   m-----小数点后的宽度
number(2,4)小数点后4 位,有效位2位    values(0.0099) 这样可以   values(0.01)这样出错
LONG    2GB   大文本一个表最我只允许定义一个LONG类型(不建议使用)
CLOB    大对象形式存放(在表里只存一个指针)
BLOB     存二进制大对象(声音,图像之类)

default   作用演示:
create  table   test(c1   number    default  10,     c2    number);


约束的演示:
主键约束的定义:
create table   test(c   number  primary key  );     列级约束
create table  test(c  number , primary key(c) )  ; 表级约束
create table   test( c1  number  constraints   pkc1  primary key );   此约束有名字:  pkc1
create table   test(c number , c2  number ,  primary key (c ,c1) )  ; 用表级约束可以实现联合主键

外键约束的定义:(先定义父表,再定义子表)
carete   table     parent(c1 number  primary key );
create   table    child  (c  number primary key ,   c2 number  references parent(c1));
或表级约束定义:
create   table  child( c number primary key ,  c2  number  , foreign key(c2)  references  parent(c1));

或表级约束定义:
create   table  child( c number primary key ,  c2  number  , foreign key(c2)  references  parent(c1));

on  delete   cascade  (及联删除,删除父表时子表也跟着删除)
on  delete   set   null  (及联删除父表时子表中引用的字段为null)


day3

不给约束起名字时,系统给约束起名时的规律为:数据库用户名_数字(约束名也不能重名)
定义一个约束的两种形式:
列级约束      表级约束

非空约束:
  not    null  (利用desc可能看到)primary key  自动具有非空约束的特点

primary key约束:
主键约束的定义:
第一种定义形式:
create table   test(c   number  primary key  );     列级约束
第二种定义形式:
create table  test(c  number , primary key(c) )  ; 表级约束
create table   test( c1  number  constraints   pkc1  primary key );   此约束有名字:  pkc1
create table   test(c number , c2  number ,  primary key (c ,c1) )  ; 用表级约束可以实现联合主键

foregin  key   (fk)   外键约束:
(先定义父表,再定义子表)
create   table     parent(c1 number  primary key );
create   table    child  (c  number primary key ,   c2 number  references parent(c1));
或表级约束定义:
create   table  child( c number primary key ,  c2  number  , foreign key(c2)  references  parent(c1));

check 约束:
create   table   test(c1   number  check(c1>1000));
此表中要求c1的值必须要大于1000 才为有效值 .  

怎么创建一个角本文件: xxx.sql结尾
 执行角本的方法:
 在sqlplus环境中执行:@filename.sql
 在shell环境中执行: sqlplus   nanjing/nanjing   @filename.sql

创建表的语法:
 create    table    表名 (   字段名    字段类型     约束类型(可选));
 利用已知表建一张新表:注会把非空约束带过来,其它约束要自己添加
 create  table s_emp_42    as select   *  from   s_emp     where   dept_id = 42;
只取要表结构,不想要表中数据的建表方式:
create table  s_emp_copy    as   select  *    from  s_emp   where   1=2;
(这是一个小技巧,在JDBC的学习中会用到 where 1=1 的形式,注意体会)

查看一张表的约束:( 查数据字典示图)
 desc  user_constraints;(这个数据字典中会查到相应的信息)
 select    constraint_name,  constraint_type    from   user_constraints  where   table_name='S_EMP';
 P   pk
 R   fk
 C   check
 U    UK
 V    这种只定义在示图中(with check  option 相当于组示图加了一个约束)
 O    也是出现在示图中
 非空约束和CHECK都是用C来表示

查看字段约束的方法:
 desc    user_cons_columns;
 select   column_name,  position  from    user_cons_columns    where   constraint_name='S_EMP_ID_PK' ;
 position 的含义:联合主键,约束名一样。
 user_constraints    user_cons_columns   两张表的约束名相等,表名相等,两张表一关联就可以查出所需的信息。

select  constraint_name , r_constraint_name  from user_constraints where  constraint_type='R'   and table_name='S_EMP' ;
数据库建立时,数据字典就会建好。
user_constraints; 自己拥有的
all_constraints;   你自己拥有的加上你可以访问的
dba_constraints  所有的

查看当前数据库数据字典的字典(这个示图很重要)
desc   dict;
select table_name form  dict where table_name like   '%cons%;

示图:
user_objects;           user_tables;
select  distinct   object_type  from user_objects;  

介绍事务的概念:
commit  提交,此时说明前面所有语句都成功执行
rollback 回退操作,此时会恢复至上一次提交时的状态。
savepoint 设置保存点

 注意   insert   into  后面可以跟子查询
insert into  s_emp_42   select *   from s_emp  where    dept_id =42;

UPDATE 修改字段值:
update   s_emp  set dept_id =10   where   id =2 ;
update  s_emp  set commission_pct =10  ;  没有where条件时说明是改表中所有的值.
注意:如有外键引用时常会出现外键引用值没有找到等错误?

delete  删除记录命令语法:
delete from   s_emp  where  dept_id=42;
delete form   s_emp ;      没有where条件时说明删除表中所有的值
注意:如有外键引用时,删除一张表时常会出现不能删除的情况,
原因一   是因为此时正在有人操作表中记录
原因二   此表有其他的表引用,没能设及联删除:
delete 删除一张大表时空间不释放,非常慢是因为占用大量的系统资源,支持回退操作,空间还被这张表占用着。
truncate table 表名  (删除表中记录时释放表空间)

DML 语句:
表级共享锁: 对于操作一张表中的不同记录时,互不影响
行级排它锁:对于一行记录,oracle 会只允许只有一个用户对它在同一时间进行修改操作
wait()   等到行级锁被释放,才进行数据操作
drop一张表时也会对表加锁,DDL排它锁,所以在删除一张表时如果当前还有用户操作表时不能删除表


alter table 命令用于修改表的结构(这些命令不会经常用):
增加约束:
alter table  表名 add   constraint  约束名  primary key  (字段);
解除约束:(删除约束)
alter  table 表名  drop  primary  key(对于主键约束可以直接用此方法,因为一张表中只有一个主键约束名, 注意如果主键此时还有其它表引用时删除主键时会出错)
alter  tbale   father   drop  primary key    cascade ;  (如果有子表引用主键时,要用此语法来删除主键,这时子表还存在只是子表中的外键约束被及联删除了)
alter table  表名 drop  constraint   约束名;
(怎样取一个约束名:1、人为的违反约束规定根据错误信息获取!
                                 2、查询示图获取约束名!)

alter  table   表名  disable    from   primary  key ;  (相当于把一个表的主键禁用)
alter  table   表名  enable    primary key ;(enable 时会自动去检查表的记录是不是符合要求,如果有脏数据时必须要先删除脏数据才可以 enable)

 

*******************************************************************

增加字段:
 alter  table   表名   add(字段字  字段类型)
删除字段:
 alter table    表名     drop(字段)
 alter tbale         表名    drop    column   字段 ; (8i 以后才支持)
给列改名:920才支持
 alter  table   表名   rename   column   旧字段名    to     新字段名;
修改字段
(此时应注意的问题,更改时要看具体值情况之间的转达换, 改为字符类型时,必须要为空)
 alter  table    表名     modify( 字段,类型)
更改表中的字段:
 update 表名   set     字段     =      值     where       条件
更改表名
 rename       旧表名           to     新表名           ;
删除表:
 trucate   table    表名:(表结构还在,数据全部删除,释放表所占的空间,不支持回退,常用删除大表)

 

关于oralce中产生序列(sequence):
create sequence   序列名alter system  flush   shared_pool;
(不带参数时默认为从1 开始每次递增 1,oracle中为了提高产生序列的效率一般一次性产生20个序列放入当前会话的序列池中备用以加快效率,序列会出现不连续的动作回退操作不会影响序列取值)
sequence 的参数:
 increment by  n 起始值,    start with  n 递增量, maxvalue  n 最大值,  minvalue n  最小值,cycle | no cycle 轮回,  cache n  绶存(第一次取时会一次取多少个id存起来)
查看   sequence 示图:
desc    user_sequences ;
select   sequence_name , cache_size , last_number  from  user_sequences   where   sequence_name  like 's_';
select  序列名.currval  from   dual    查看当前的序列数
select  序列名.nextval  from   dual    查看下一个序列数,它会自动给当前的序列加1
为列:nextval          currval
(开另一个session时取当前值不成功时,应该先取下一个值,再取当前值)
清空当前会话的内存:
alter system  flush   shared_pool;(执行此命令要有DBA权限,一般用户执行出错)
修改序列:(此命令不常用,只需了解就行不必深究)
alter  sequence  序列名  修改项;
删除序列sequence
drop  sequence 序列名;

创建示图: creating      views(属于了解知识)
desc  user_views;
select   text   from  user_views    where   view_name='TEST1_V1' ;
示图就相当于一条select 语句,定义了一个示图就是定义了一个sql语句,示图不占空间,使用view 不会提高性能,但是能简单化sql语句
(扩展知识: oracle  8i 以后的新示图)MV   物化视图(占存储空间,把select 结果存在一个空间,会提高查询视图,增强实时性,但是存在刷新问题, 主要应用在数据仓库中用要用于聚合表)
使用示图的好处:控制数据访问权限.
如何创建一个示图:
create   or replace   views   test_vi    as       select       *   from    test1   where c1=1;
此时往表test1(base   table  基表)中插入数据时:表中没能变化,示图中的数据发生改变
从示图中插数据时相对应的表会发生改变:
往示图中插数据时,会直接插进基表中,查看示图中的数据时,相当于就是执行创建时的select语句。
简单示图:能进行DML操作。
复杂示图:来源于多张表,不能执行DML操作。
关于rownum:
rownum  有个特点要么等于1 要么小于某个值, 不能直接等于某个值, 不能大于某个值。rownum常用于分页显示。
练习:查询出第5条数据和第10条数据之间:
 select   first_name , rnum    from   (  select   rownum   rnum    , first_name   from    s_emp  where rownum <=10 )     where rnum  between 5  and  10 ;

分面显示:
SELECT * FROM (SELECT a.*, rownum r FROM   S_EMP  a  WHERE r between 5  AND  10 );


练习:哪些员工的工资比本部门的平均工资高?
select   first_name  , salary   , avgsal     from  s_emp   e , ( select   dept_id  , avg (salary )   avgsal  from   s_emp  group  by dept_id )  a   where   e.dept_id =a.dept_id and e.salary > a.avgsal;
 在示图上加一个 with  check   option 就相当于给示图加上了约束
create    view    test_v  as  select   *  from   test  where c =1  with check option ;
同义词:相当于别名的作用(***只需了解***)系统自建的同义词:    user_tables
create  synonym    asd_s_emp   for    asd_0607.s_emp ;
目的就是为了给asd_0607_s_emp表起另一个代替的名称asd.s_emp;注意这个同义词只能自己使用;
create  public     synonym  p_s_emp  fro asd_0607.s_emp; 创建公共的同义词,但是要权限.
删除同义词:
drop  synonym    同义词名称

创建索引:  Creating    indexes(概念很重要对系统的性能影响非常大)
建索引的目的就是为了加快查询速度。
索引就相于一本的书的目录。索引点系统空间,属于表的附属物。删除一个表时,相对应的索引也会删除。truncate 表时索引结构在,但是数据不存在。
full   table    scan  全表扫描
用索引就是为了快速定位数据:(理解时就以字典的目录为例)
查看表的rowid:
select     rowid  , first_name    from  s_emp;
rowid 定义的信息有:  object   block  table
每条记录都有自己的rowid
索引由谁创建:用户,建索引后会使DML操作效率慢,但是对用户查询会提高效率,这就是我们建索引的最终目的,
创建一个索引:
create  index     索引名     on   表名 (  字段名);
create   insex testindex  on test(c1, c2);
哪些字段应该建索引:
经常要用where的子句的地方,所以要用索引.用不用索引,关键要看所查询的数据与所有数据的百分比,表越大,查询的记录越少,索引的效率最高.


替换变量:用&符号来定义替换变量支持交互性提示,对于字符性的数字,一定要写在单引号之间
set    verify on
set    verify off;
相当于开关变量,用于控制是否显示新旧的sql语句
select   id ,last_name  ,salary   from s_emp  where  title='&job_title';
更改交互的提示信息:
accept  p_dname prompt ' 提示信息';
定义变量:
define     p_dname='abc';

分页的实现语句:(可以正常运行)
  select   *   from  (  select   rownum   rnum  , a.*   from   (select * from s_emp) a  )     where rnum  between 5  and  10 ;

-------------------------------------------------------------------------------------------------------------------------
1、关于约束的知识:
primary key约束:
主键约束的定义:
第一种定义形式:
create table   test(c   number  primary key  );     列级约束
第二种定义形式:
create table  test(c  number , primary key(c) )  ; 表级约束
create table   test( c1  number  constraints   pkc1  primary key );   此约束有名字:  pkc1
create table   test(c number , c2  number ,  primary key (c ,c1) )  ; 用表级约束可以实现联合主键

foregin  key   (fk)   外键约束:
(先定义父表,再定义子表)
carete   table     parent(c1 number  primary key );
create   table    child  (c  number primary key ,   c2 number  references parent(c1));
或表级约束定义:
create   table  child( c number primary key ,  c2  number  , foreign key(c2)  references  parent(c1));

check 约束:
create   table   test(c1   number  check(c1>1000));
此表中要求c1的值必须要大于1000 才为有效值 .  
****************************************************************************
2、关于针对表操作的语法知识:
  创建表:
   create    table  表名   (    字段名1    类型   约束条件,   字段名2    类型    约束条件 );
 
 插入数据命令:
 方式一:(指定字段名插入数据)
  insert  into   表名  ( 字段名 )    values ( 数据);
 方式二:
  insert  into  表名   values(数据1,  数据2);

 修改数据:
 update   table   表名  set ( 字段名   数据, 字段名  数据);
****************************************************************************
3、关于alter table 命令知识:
alter table 命令用于修改表的结构(这些命令不会经常用):
增加约束:
alter table  表名 add   constraint  约束名  primary key  (字段);
解除约束:(删除约束)
alter  table 表名  drop  primary  key(对于主键约束可以直接用此方法,因为一张表中只有一个主键约束名, 注意如果主键此时还有其它表引用时删除主键时会出错)
alter  tbale   father   drop  primary key    cascade ;  (如果有子表引用主键时,要用此语法来删除主键,这时子表还存在只是子表中的外键约束被及联删除了)
alter table  表名 drop  constraint   约束名;
(怎样取一个约束名:
a、人为的违反约束规定根据错误信息获取!
b、查询示图获取约束名!)
alter  table   表名  disable    from   primary  key ;  (相当于把一个表的主键禁用)
alter  table   表名  enable    primary key ;(enable 时会自动去检查表的记录是不是符合要求,如果有脏数据时必须要先删除脏数据才可以 enable)
增加字段:
alter  table   表名   add(字段字,字段类型)
删除字段:
alter table    表名     drop(字段)
alter tbale         表名    drop    column   字段 ; (8i 以后才支持)
给列改名:920才支持
alter  table   表名   rename   column   旧字段名    to     新字段名;
修改字段
(此时应注意的问题,更改时要看具体值情况之间的转达换, 改为字符类型时,必须要为空)
alter  table    表名     modify( 字段,类型)
更改表中的字段:
update 表名   set     字段     =      值     where       条件
更改表名
rename       旧表名           to     新表名           ;
删除表:
trucate   table    表名:(表结构还在,数据全部删除,释放表所占的空间,不支持回退,常用删除大表)
****************************************************************************
4、关于oralce中产生序列(sequence)
create sequence   序列名alter system  flush   shared_pool;
(不带参数时默认为从1 开始每次递增 1,oracle中为了提高产生序列的效率一般一次性产生20个序列放入当前会话的序列池中备用以加快效率,序列会出现不连续的动作回退操作不会影响序列取值)
sequence 的参数:
 increment by  n 起始值,    start with  n 递增量, maxvalue  n 最大值,  minvalue n  最小值,cycle | no cycle 轮回,  cache n  绶存(第一次取时会一次取多少个id存起来)
查看   sequence 示图:
desc    user_sequences ;
select   sequence_name , cache_size , last_number  from  user_sequences   where   sequence_name  like 's_';
select  序列名.currval  from   dual    查看当前的序列数
select  序列名.nextval  from   dual    查看下一个序列数,它会自动给当前的序列加1
为列:nextval          currval
(开另一个session时取当前值不成功时,应该先取下一个值,再取当前值)
清空当前会话的内存:
alter system  flush   shared_pool;(执行此命令要有DBA权限,一般用户执行出错)
修改序列:(此命令不常用,只需了解就行不必深究)
alter  sequence  序列名  修改项;
删除序列sequence
drop  sequence 序列名;
****************************************************************************
5、创建示图: creating      views(属于了解知识)
示图就相当于一条select 语句,定义了一个示图就是定义了一个sql语句,示图不占空间,使用view 不会提高性能,但是能简单化sql语句
(扩展知识: oracle  8i 以后的新示图)MV   物化视图(占存储空间,把select 结果存在一个空间,会提高查询视图,增强实时性,但是存在刷新问题, 主要应用在数据仓库中用要用于聚合表)
使用示图的好处:控制数据访问权限.
如何创建一个示图:
create   or replace   views   test_vi    as       select       *   from    test1   where c1=1;
此时往表test1(base   table  基表)中插入数据时:表中没能变化,示图中的数据发生改变
从示图中插数据时相对应的表会发生改变:
往示图中插数据时,会直接插进基表中,查看示图中的数据时,相当于就是执行创建时的select语句。
简单示图:能进行DML操作。
复杂示图:来源于多张表,不能执行DML操作。
关于rownum:
rownum  有个特点要么等于1 要么小于某个值, 不能直接等于某个值, 不能大于某个值。rownum常用于分页显示。
练习:查询出第5条数据和第10条数据之间:
select   first_name  , rnum    from   (  select   rownum   rnum    , first_name   from   s_emp    where rownum <=10 )    where rnum  between 5  and  10;
练习:哪些员工的工资比本部门的平均工资高?
select   first_name  , salary   , avgsal     from  s_emp   e , ( select   dept_id  , avg (salary )   avgsal  from   s_emp  group  by dept_id )  a   where   e.dept_id =a.dept_id and e.salary > a.avgsal;
 关于同义词:
同义词:相当于别名的作用(***只需了解***)系统自建的同义词:    user_tables
create  synonym    asd_s_emp   for    asd_0607.s_emp ;
目的就是为了给asd_0607_s_emp表起另一个代替的名称asd.s_emp;注意这个同义词只能自己使用;
create  public     synonym  p_s_emp  fro asd_0607.s_emp; 创建公共的同义词,但是要权限.
删除同义词:
drop  synonym    同义词名称

****************************************************************************
6、创建索引:  Creating    indexes(概念很重要对系统的性能影响非常大)
建索引的目的就是为了加快查询速度。
索引就相于一本的书的目录。索引点系统空间,属于表的附属物。删除一个表时,相对应的索引也会删除。truncate 表时索引结构在,但是数据不存在。
full   table    scan  全表扫描
用索引就是为了快速定位数据:(理解时就以字典的目录为例)
查看表的rowid:
select     rowid  , first_name    from  s_emp;
rowid 定义的信息有:  object   block  table
每条记录都有自己的rowid
索引由谁创建:用户,建索引后会使DML操作效率慢,但是对用户查询会提高效率,这就是我们建索引的最终目的,
创建一个索引:
create  index     索引名     on   表名 (  字段名);
create   insex testindex  on test(c1, c2);
哪些字段应该建索引:
经常要用where的子句的地方,所以要用索引.用不用索引,关键要看所查询的数据与所有数据的百分比,表越大,查询的记录越少,索引的效率最高.


替换变量:用&符号来定义替换变量支持交互性提示,对于字符性的数字,一定要写在单引号之间
set    verify on
set    verify off;
相当于开关变量,用于控制是否显示新旧的sql语句
select   id ,last_name  ,salary   from s_emp  where  title='&job_title';
更改交互的提示信息:
accept  p_dname prompt ' 提示信息';
定义变量:
define     p_dname='abc';


posted on 2007-03-20 12:57 sunny 阅读(750) 评论(0)  编辑  收藏

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


网站导航:
 
<2007年3月>
25262728123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用链接

留言簿(1)

随笔分类

随笔档案

相册

收藏夹

朋友

搜索

  •  

最新评论

评论排行榜