当前所在位置:珠峰网资料 >> 计算机 >> Oracle认证 >> 正文
Oracle常用sql操作整理总结(3)
发布时间:2010/12/4 23:14:32 来源:城市学习网 编辑:ziteng

  3. 创建表的例子

  CREATE TABLE DEPT(

  EPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,

  DNAME VARCHAR2(14),

  LOC VARCHAR2(13)) ;

  CREATE TABLE region(

  ID number(2) NOT NULL PRIMARY KEY,

  postcode number default ‘0′ NOT NULL,

  areaname varchar2(30) default ‘ ‘ NOT NULL);

  4. 创建表时的命名规则和注意事项

  表名和字段名的命名规则:必须以字母开头,可以含符号A-Z,a-z,0-9,_,$,#

  大小写不区分

  不用SQL里的保留字, 一定要用时可用双引号把字符串括起来.

  用和实体或属性相关的英文符号长度有一定的限制

  注意事项:

  建表时可以用中文的字段名, 但最好还是用英文的字段名

  创建表时要把较小的不为空的字段放在前面, 可能为空的字段放在后面

  建表时如果有唯一关键字或者唯一的约束条件,建表时自动建了索引

  一个表的最多字段个数也是有限制的,254个.

  5. 约束名的命名规则和语法

  约束名的命名规则约束名如果在建表的时候没有指明,系统命名规则是SYS_Cn(n是数字)

  约束名字符串的命名规则同于表和字段名的命名规则

  6. 使用约束时的注意事项

  约束里不能用系统函数,如SYSDATE和别的表的字段比较

  可以用本表内字段的比较

  想在事务处理后, 做约束的检查

  SQL> alter session set constraints deferred.

  7. 由实体关系图到创建表的例子 s_dept

  前提条件:已有region表且含唯一关键字的字段id

  SQL> CREATE TABLE s_dept

  (id NUMBER(7)

  CONSTRAINT s_dept_id_pk PRIMARY KEY,

  name VARCHAR2(25)

  CONSTRAINT s_dept_name_nn NOT NULL,

  region_id NUMBER(7)

  CONSTRAINT s_dept_region_id_fk REFERENCES region (id),

  CONSTRAINT s_dept_name_region_id_uk UNIQUE(name, region_id));

  8. 较复杂的创建表例子

  SQL> CREATE TABLE s_emp (

  id NUMBER(7)   CONSTRAINT s_emp_id_pk PRIMARY KEY,

  last_name VARCHAR2(25)  CONSTRAINT s_emp_last_name_nn NOT NULL,

  first_name VARCHAR2(25),

  userid VARCHAR2 CONSTRAINT s_emp_userid_nn NOT NULL

  CONSTRAINT s_emp_userid_uk UNIQUE,

  start_date DATE DEFAULT SYSDATE,

  comments VARCHAR2(25),

  manager_id NUMBER(7),

  title VARCHAR2(25),

  dept_id NUMBER(7)   CONSTRAINT s_emp_dept_id_fk REFERENCES s_dept(id),

  salary NUMBER(11,2),

  commission_pct NUMBER(4,2)  CONSTRAINT s_emp_commission_pct_ck CHECK

  (commission_pct IN(10,12.5,15,17.5,20))

  );

  9. 通过子查询建表

  通过子查询建表的例子

  SQL>CREATE TABLE emp_41 AS SELECT id, last_name, userid, start_date

  FROM s_emp WHERE dept_id = 41;

  SQL> CREATE TABLE A as select * from B where 1=2;

  只要表的结构.

  10. 用子查询建表的注意事项

  可以关连多个表及用集合函数生成新表,注意选择出来的字段必须有合法的字段名称,且不能重复。

  用子查询方式建立的表,只有非空NOT NULL的约束条件能继承过来,

  其它的约束条件和默认值都没有继承过来.

  根据需要,可以用alter table add constraint ……再建立其它的约束条件,如primary key等.

  11. Foreign Key的可选参数ON DELETE CASCADE

  在创建Foreign Key时可以加可选参数:

  ON DELETE CASCADE它的含义是如果删除外键主表里的内容,子表里相关的内容将一起被删除.

  如果没有ON DELETE CASCADE参数,子表里有内容,父表里的主关键字记录不能被删除掉.

  12. 如果数据库表里有不满足的记录存在,建立约束条件将不会成功.

  13. 给表创建和删除同义词的例子

  SQL> CREATE SYNONYM d_sum

  2 FOR dept_sum_vu;

  SQL> CREATE PUBLIC SYNONYM s_dept

  2 FOR alice.s_dept;

  SQL> DROP SYNONYM s_dept;

  十、ORACLE里的数据字典

  1. 什么是数据字典?ORACLE的数据字典是数据库的重要组成部分之一,它随着数据库

  的产生而产生, 随着数据库的变化而变化, 体现为sys用户下所有的一些表和视图.

  2. 数据字典里存了以下内容:

  用户信息

  用户的权限信息

  所有数据对象信息表的约束条件统计分析数据库的视图等

  不能手工修改数据字典里的信息.

  3. 常用的数据字典

  Dictionary 存放所有数据表,视图,同义词名称和解释

  Dict_columns 数据字典里字段名称的和解释

  Dba_users 用户 Dba_tablespaces 表空间

  Dba_data_files 数据库的文件 Dba_free_space 空闲表空间

  Dba_rollback_segs 回滚段

  User_objects 数据对象 User_constraints 约束条件

  User_sequences 序列号 User_views 视图

  User_indexes 索引 User_synonyms 同义词

  Session_roles 用户的角色 User_role_privs 用户的角色权限

  User_sys_privs 用户的系统权限 User_tab_privs 用户的表级权限

  V$session 实时用户情况 V$sysstat 实时系统统计

  V$sesstat 实时用户统计 V$sgastat 实时SGA使用

  V$locked_object 实时锁 V$controlfile 控制文件

  V$logfile 日志文件 V$parameter 参数文件

  4. 数据字典的分类

  数据字典四大类别

  User_ 用户下所有数据库对象

  All_ 用户权限范围内所有的数据库对象

  Dba_ 所有的数据库对象

  V$Content$nbsp; 统计分析数据库的视图 赋于oem_monitor权限非DBA用户也可查询V$*视图

  5. 查询数据字典

  SQL> select * from dictionary where instr(comments,’index’)>0;

  SQL> select constraint_name, constraint_type,

  2 search_condition, r_constraint_name

  3 from user_constraints

  4 where table_name = ‘&table_name’; [NextPage]  十一. 控制数据

  1 、INSERT(往数据表里插入记录的语句)

  SQL> insert into 表名(字段名1, 字段名2, ……) values ( 值1, 值2, ……);

  SQL> insert into 表名(字段名1, 字段名2, ……) select (字段名1, 字段名2, ……)

  from 另外的表名 where 条件;

  可以用&标记变量的方法多次输入记录

  快速插入数据的方法, 一般用于大于128M的数据转移

  SQL> insert /*+ append */ into 表名

  select * from 另外的用户名 .另外的表名 WHERE 条件;

  SQL> commit;

  注意事项:

  用INSERT /*+ APPEND */ 的方法会对target_tablename产生级别为6的独占锁,

  如果运行此命令时还有对target_tablename的DML操作会排队在它后面,

  对OLTP系统在用的表操作是不合适的。

  2. 插入字符串类型的字段的注意事项:

  字符串类型的字段值必须用单引号括起来, 例如: ’GOOD DAY’

  如果字段值里包含单引号’ 需要进行字符串转换, 我们把它替换成两个 单引号’ ’

  字符串类型的字段值超过定义的长度会出错, 最好在插入前进行长度校验

  ‘’ 标记是NULL, user 标明当前用户

  日期字段的字段值可以用当前数据库的系统时间SYSDATE, 精确到秒

  用字符串转换成日期型函数TO_DATE(‘2001-08-01’,’YYYY-MM-DD’)

  TO_DATE( )还有很多种日期格式, 可以参看ORACLE DOC.

  年-月-日 小时:分钟:秒 的格式YYYY-MM-DD HH24:MI:SS

  NSERT时最大可操作的字符串长度小于等于4000个单字节,

  如果要插入更长的字符串, 请考虑字段用CLOB类型,

  方法借用ORACLE里自带的DBMS_LOB程序包.

  3、UPDATE (修改数据表里记录的语句)

  SQL> UPDATE 表名 SET 字段名1=值1, 字段名2=值2, …… WHERE 条件;

  如果修改的值N没有赋值或定义时, 将把原来的记录内容清为NULL,

  最好在修改前进行非空校验;

  值N超过定义的长度会出错, 最好在插入前进行长度校验.

  新功能,可以修改子查询后的结果集

  例子:SQL> update (select * from s_dept) set id=50 where id=60;

  4、DELETE (删除数据表里记录的语句)

  SQL> DELETE FROM 表名 WHERE 条件;

  注意:删除记录并不能释放ORACLE里被占用的数据块表空间.

  它只把那些 被删除的数据块标成unused.

  如果确实要删除一个大表里的全部记录, 可以用 TRUNCATE 命令, 它可以释放占用的数据块表空间

  SQL> TRUNCATE TABLE 表名;

  此操作不可回退.

  5、 SQL语句的分类

  数据定义语言(DDL):create、alter、drop(创建、修改结构、删除)(其他:rename)

  数据操纵语言(DML):insert、delete、select、update(增、删、查、改)(其他:truncate)

  数据控制语言(DCL):grant、revoke(授权、回收)、set role

  事务控制:commit、rollback、savepoint(其他:lock table、set constraint、set transaction)

  审计控制:audit、noaudit

  系统控制:alter system 会话控制:alter session

  其他语句:comment(添加注释)、explain plan、analyze、validate、call

  6、ORACLE里事务控制

  Commit 提交事务

  Rollback 回退事务

  Savepoint 设置断点, 在事务中标记位置, 事务结束, 断点释放

  事务结束的情况遇到commit或者rollback遇到DDL和DCL语句发现错误,如死锁用户退出

  SQL*PLUS系统重启或崩溃

  7. DML操作的注意事项

  以上SQL语句对表都加上了行级锁, 确认完成后,

  必须加上事物处理结束的命令COMMIT 才能正式生效,

  否则改变不一定写入数据库里.行级锁也未能得到释放.

  如果想撤回这些操作, 可以用命令 ROLLBACK 复原.

  在运行INSERT, DELETE 和 UPDATE 语句前最好估算一下可能操作的记录范围,

  应该把它限定在较小 (一万条记录) 范围内,. 否则ORACLE处理这个事物用到很大的回退段.

  程序响应慢甚至失去响应. 如果记录数上十万以上这些操作,

  可以把这些SQL语句分段分次完成, 其间加上COMMIT 确认事物处理.

  太过频繁的commit不好

  十二、改变表和约束条件

  1. 改变表的几种情况(1) 运行时会加表级锁

  改变表的名称

  SQL> RENAME 表名1 TO 表名2; SQL> ALTER TABLE 表名1 RENAME TO 表名2;

  在表的后面增加一个字段

  SQL> ALTER TABLE 表名 ADD 字段名 字段名描述

  [ DEFAULT expr ][ NOT NULL ][ ,字段名2 ……];

  修改表里字段的定义描述

  SQL> ALTER TABLE 表名 MODIFY 字段名1 字段名1描述 [ DEFAULT expr ][ NOT NULL ]

  [ ,字段名2 ……]; 记录为空时,可以减少字段长度,

  改变字段类型修改DEFAULT值只作用于修改后的INSERT和UPDATE的记录修改NOT NULL

  约束只对现存含非空记录的字段起作用

  1. 改变表的几种情况(2) 运行时会加表级锁

  删除表里的某个字段

  SQL> ALTER TABLE 表名 DROP 字段名;

  给表里的字段加上/禁止/启用约束条件

  SQL> ALTER TABLE 表名 ADD | DISABLE | ENABLE CONSTRAINT 约束名

  PRIMARY KEY (字段名1[,字段名2 ……]);

  SQL> ALTER TABLE 表名 ADD | DISABLE | ENABLE CONSTRAINT 约束名

  UNIQUE (字段名1[,字段名2 ……]);

  加唯一关键字或者唯一约束条件时自动建立索引

  说明:禁止唯一关键字和唯一约束时索引仍然存在,可以被使用.

  1. 改变表的几种情况(3) 运行时会加表级锁

  删除表里的约束条件

  SQL> ALTER TABLE 表名 DROP CONSTRAINTS 约束名 [CASCADE];

  会把约束相关的索引一起删除. CASCADE能同时删去外键的约束条件.

  把表放在或取出数据库的内存区

  SQL> ALTER TABLE 表名 CACHE;

  SQL> ALTER TABLE 表名 NOCACHE;

  改变表存储的表空间

  SQL> ALTER TABLE 表名 MOVE TABLESPACE 表空间名 ;

  注意: 如果被转移表空间的表含有索引, 表转移后索引变得不可用.

  我们要删除旧索引,建立新索引

  2. 删除表及表里的数据

  删除表

  SQL> DROP TABLE 表名 [CASCADE CONSTRAINTS];

  清空表里的记录

  SQL> TRUNCATE TABLE 表名;

  按时间清空日志表里的记录,使用重新命名的方法

  (应用程序可能有短暂出错, 可以选择在不繁忙的时间执行)

  按原来表A的建表语句创建新表A1,把表A重命名为A2(如果表A上有较频繁的DML操作,

  会对表加上行级锁,重命名过程用递归的方式循环做,直到DML操作结束,命名成功).

  把创建新表A1重命名为A

  历史记录表A2备份或删除

  3. 删除表后应该注意的问题

  删除表后把表里的索引一起删去.

  删除表后会结束基于它的悬而未决的事物

  删除表后根据表创建的views,synonym,stored procedure,stored function依然存在,

  但views,synonym变成非法的. 需要手工找出它们并删除

  如果用了CASCADE CONSTRAINTS会把与它相关的约束一起删除

  此操作不可回退

  4. 给表加注释

  加注释的语法

  SQL> COMMENT ON TABLE 表名 | COLUMN表名.字段名 IS ‘text‘

  加注释的例子

  SQL> comment on table s_emp is ‘Enployee information‘;

  SQL> comment on column s_emp.last_name is ‘‘;

  十三、创建序列号

  1. 创建序列号里各参数的解释

  SQL> CREATE SEQUENCE name [INCREMENT BY n]

  [START WITH n] [{MAXVALUE n | NOMAXVALUE}]

  [{MINVALUE n | NOMINVALUE}] [{CYCLE | NOCYCLE}]

  [{CACHE n | NOCACHE}]

  INCREMENT BY n 一次增长n 个数字

  NOMAXVALUE 缺省值10E+27

  NOMINVALUE 缺省值1

  NOCYCLE 不循环, 常用于唯一关键字

  CACHE n 在内存里缓存n个序列,出错回退时会丢失

  oracle8i里默认的n是20

  序列号的名称一般可以采用“表名_字段名”的命名规则

  2. 插入自动增长序列号字段的方法

  INSERT时如果要用到从1开始自动增长的数字做唯一关键字, 应该先建立一个序列号.

  CREATE SEQUENCE 序列号的名称 (最好是表名+序列号标记) INCREMENT BY 1 START WITH 1

  MAXVALUE 99999 NOCYCLE NOCACHE;

  其中最大的值按字段的长度来定,比如定义的自动增长的序列NUMBER , 最大值为999999

  INSERT 语句插入这个字段值为: 序列号的名称.NEXTVAL

  例子: SQL> insert into s_dept(id, name, region_id) values (s_dept_id.nextval, ‘finance’, 2);

广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved