Oracle数据更新,表结构,约束

Oracle数据更新,表结构,约束

数据插入

insert into 表名称[(列名称1,列名称2,…)] values (值1,值2…);

字符串:使用单引号声明,例如:‘sasda’;

数字:直接编写,例如:100;

日期:当前日期(sysdate)、使用to_date()转换

范例:使用完整格式:

insert into myemp(empno,sal,job,comm,ename,mgr,hiredate,deptno) values(8888,6666,'清洁工',10,'张三',7369,TO_DATE('1992-2-21','yyyy-mm-dd'),40);

数据更新

要针对于数据表中的数据修改的时候可以使用如下的语法完成

update 表名称 set 字段1 = 值 ,字段2 = 值,…[where 更新条件(s)];

在使用更新的时候,where子句里面的内容可以使用in,between…and,like等进行限定查询。

范例:
将Allen的工资修改为SCOTT的工资

update myemp set sal=(
	select sal from emp where ename = 'SCOTT')
where ename = 'ALLEN';

范例:
将低于公司平均工资的雇员工资上涨20%

  • 先找到公司的平均工资 select avg(sal) from emp;
  • 更新工资信息 update emp set emp = emp*1.2 where sal < (select avg(sal) from emp);

对于软件而言,判断效率的方式就两个:时间复杂度、空间复杂度。

软件的性能运行方式无外乎只有两种:以时间换控空间、以空间换时间。

总结:以后只要是写更新操作,不可能不写WHERE字句。

数据删除

delete from 表名称 [where 删除条件(s)]

事务处理

总结:

  1. 只有更新操作才会存在事务处理,DDL不支持事务处理,而且在ORACLE里面,如果发生DDL操作,所有未提交的事务都会被自动提交。

  2. 两个重要事务处理命令:Commit,RollBack.

数据伪列

  • rownum

取出第一行记录:select rownum *from emp where rownum =1;只能是数字1。
取出前N行记录:select rownum *from emp where rownum <= N;
取出6到10行记录:

select * from(
	select * rownum  rn from emp where rownum <= 10)temp
where temp.rn > 5;

分页语法

select * from(
	select 列,,,,rownum rn
	from 表名称,表名称,,,
	where rownum <=(currentpage*linesize)order by,,,,)temp
where temp.rn >(currentpage-1)*linesize
  • rowid

整理去重SQL(留最早出入的数据):

Delete from mydept where ROWID not in (
    select MIN(ROWID) --max(ROWID)表示留最后出入的数据
    from mydept
   	group by deptno,dname,loc);

表的创建与管理(常用数据类型)

常见的数据类型
因为数据表就属于各种类型第一个集合,所以要想创建属于自己的数据表,那么就要先清楚常见的数据类型:

  1. VARCHAR2(n) 表示字符串,其中n表示最大长度,一般保存长度比较小的内容可以使用此类型(200个字以内的内容都建议使用VARCHAR2(n)
  2. NUMBER(n,m) NUMBER(n):表示整数数据,最多不能超过n个长度。
    NMBERE(n,m):表示小数位占m位,而整数位占n-m位
  3. DATE 保存日期时间数据
  4. CLOB 大文本数据,最多可以保存4G的文字
  5. BLOB 二进制数据,最多可以保存4G的内容

创建表

创建表的语法

CREATE TABLE 表名称(列名称 类型 【DEFAULT】);

可以在表中创建多个列名称要用,隔开。

创建一个表:

CREATE TABLE member(
	mid            NUMBER,
	name           VARCHAR2(50)    DEFAULT'无名氏',
	age            NUMBER(3),
	birthday       DATE   		   DEFAULT SYSDATE,
	note           CLOB
);

为表重命名

所谓表重命名,本质上就是更新一下数据字典中的相应信息。但是数据字典信息是由ORACLE自己维护,此信息修改必需由oracle命令完成,不可以直接update。

命令格式:rename [oldTable] to [newTable]

  • 用户级别的数据字典:user_*开头
  • 管理员级别数据字典:dba_*开头
  • 全级别:all_*开头

表的截断

要清除表的一张数据表的记录,执行DELETE操作,但是在使用DELETE的时候严格来讲,表所占用的资源(约束、索引)并不会被立刻释放掉。

可以rollback,之后在查发现数据还在。

如果想要将数据表所占的全部资源清空,就需要用截断表的操作。

语法是:TRUNCATE TABLE 表名称;

表的复制

复制表的语法(严格来说这是根据子查询返回的结构在创建数据表,并且将子查询中的数据保存到新的数据表中)

CREATE TABLE 表名称 AS子查询

创建一张只包含有10部门雇员信息的数据表

CREATE TABLE aaa AS SELECT * FROM emp WHERE deptno=10;

创建一张空表

CREATE TABLE emp_20190512 AS SELECT * FROM emp WHERE 1=2; --因为1永远不等于2,所以会产生一张emp的空表,不加where条件就是全部数据和表结构复制为另一张表(备份表)

表的删除

数据表的删除操作,严格来讲是属于对象的删除,于是语法是 DROP TABLE 表名称;

删除表

DROP TABLE aaa;

数据表的删除操作是比数据删除更为可怕的事情,所有几乎的数据库都不会提供全部删除表的命令。

闪回技术

如果用户执行了DROP TABLE命令,队数据库来说就是表被删除了。

从oracle10g开始引入了闪回(Flash back)技术,这个技术和windows的回收站很像。

当执行数据表删除后并不会立马就真的删了,而是先将数据表保存在回收站中,为了标记出回收站里的内容不是空的,就在表的数据字典上提供
有“BIE”开头的内容。

查看回收站:SHOW RECYCLEBIN;

修改表结构

修改表中数据列,语法:

ALTER TABLE 表名称 MODIFY(
	列名称 类型 【DEFAULT 默认值】,
列名称 类型 【DEFAULT 默认值】,...);

将name的长度修改成20,默认值设置为无名氏

ALTER TABLE member MODIFY(name VARCHAR2(20) DEFAULT '无名氏');

删除列,语法

ALTER TABLE DROP COLUMN 列名称;

删除sex列

ALTER TABLE member DROP COLUMN sex;

约束

共6中约束。关键字:CONSTRAINT

1、非空约束:NOT NULL;

示例:1、创建约束:name varchar2(8) NOT NULL;;
	2、添加非空约束:ALTER TABLE 表名 MODIFY 字段 NOT NULL;;
	3、删除非空约束:ALTER TABLE 表名 MODIFY 字段 NULL;。
异常信息:ORA-01400:无法将NULL插入("登录用户"."用户表名"."表字段")。

2、唯一约束:UNIQUE;

示例:phone number(11) UNIQUE; 或 phone number(11);CONSTRAINT uk_phone UNIQUE (phone);
注意:NULL值(如果允许为NULL)不会受到字段唯一约束限制;
异常信息:ORA-00001:违反唯一约束条件(登录用户.约束对象名 | 登录用户.自定义约束别名(uk_phone)
	(约束对象可通过数据字典"user_constraints"查看所属表;
	可通过数据字典"user_cons_columns"所属表的字段:SELECT * FROM user_cons_columns;)
)。

3、主键约束(唯一约束 + 非空约束):PRIMARY KEY;

唯一主键示例:id number(11) PRIMARY KEY; 或 CONSTRAINT pk_id PRIMARU KEY (id);
复合主键示例:CONSTRAINT pk_id_name PRIMARU KEY (id, name);
异常信息:同“唯一约束”或“非空约束”异常。

4、检查约束:CHECK;

示例:CONSTRAINT ck_age CHECK (age BETWEEN 0 AND 250);
注意:检查约束是一个个进行过滤的,并发量大情况下,影响性能。
异常信息:查询详情时,同“唯一约束”相同。

5、外键约束:FOREIGN KEY;

示例:CONSTRAINT fk_xid FOREIGN KEY (子表字段) REFERENCES 主表名 (主表字段) [ON DELETE 级联关系(可选)];
注意:子表数据范围,受主表数据的影响。
限制:1、在删除主表前,一定要先删子表。(A、B两表互设外键时,就会遇到无法删除的情况,可用强制删除表:DROP TABLE 表名 CASCADE CONSTRAINT;。强制删除的表会进入Oracle“回收站”);
	2、子表外键关联的主表字段,必须设置为主键约束或唯一约束;
	3、主表中的数据,在子表中存在外键数据,那么主表的这条数据不允许别删除(可设置级联关系删除)。
设置外键的级联关系:1、级联删除:CONSTRAINT fk_xid FOREIGN KEY (子表字段) REFERENCES 主表名 (主表字段) ON DELETE CASCADE;;
	2、级联更新:CONSTRAINT fk_xid FOREIGN KEY (子表字段) REFERENCES 主表名 (主表字段) ON DELETE SET NULL;。
异常信息:ORA-02291:违反完整约束条件(登录用户.约束对象名) - 未找到父项关键字。

6、修改约束:

示例:1、添加约束:ALTER TABLE 表名 ADD CONSTRAINT 自定义约束名cons_id 约束类型UNIQUE (字段) [选项];;
	2、删除约束:ALTER TABLE 表名 DORP CONSTRAINT 自定义约束名。
注意:无法增加非空约束NOT NULL,可通过修改表结构添加非空约束:ALTER TABLE 表名 MODIFY(字段 varchar2(n) NOT NULL);;
	删除非空约束,要先找到非空约束所在字典中的对象:ALTER TABLE 表名 DROP CONSTRAINT 非空对象SYS_C0011097;。

你可能感兴趣的:(Oracle,Oracle)