数据库:DML、事务处理、约束、视图、序列(sequence)、索引

结构化查询语言 (Structured Query Language),具有定义、查询、更新和控制等多种功能,是关系数据库的标准语言。

SQL分类:

数据操纵语言DML: 

select insert update delete

数据定义语言DDL:

Create alter drop rename truncate

数据控制语言DCL:

grant revoke

Transaction:commit rollback savepoint

insert 语句:

1、insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno)  values(1111,'gao','clerk',7902,sysdate,10000,3000,40)

此处插入的元组中列的个数、顺序与emp的结构完全一致,因此表名之后的列名可以省略不写

insert into emp  values(2222,'gaohs','clerk',7902,sysdate,10000,3000,40)

2、可以只插入部分列

insert into emp(empno,ename)  values (3333,'xiaozhang')

但要求省略的列必须满足下面的条件:

   1、该列定义为允许Null值。

   2、在表定义中给出默认值,这表示如果不给出值,将使用默认值。(叫做必须满足的条件不合适)

如果不符合上面两个条件,将会报错。不能成功插入。

3、可以用insert语句把一个select语句的查询结果插入到一个基本表中,语法如下:

insert into emp2  select * from emp (这里不能加as

insert into emp2  select e.empno,e.job from emp e;

创建一个临时表

create table emp2 as select * from emp  where 1 = 2(这里必须加aswhere 1=2 的功能是只copy一个表,但是不copy里面已经存在的数据(即只copy表结构,字段类型),如不写where 1=2,意味着把emp中的所有数据都copyemp2但不copy约束!!!

执行插入

create table emp3 as select empno, ename, job from emp;

insert into emp3  select empno, ename, job from emp;

DELETE 语句:

SQL的删除操作是指从基本表中删除元组,语法如下:

delete from table where conditon;

其语义是从基本表中删除满足条件表达式的元组

delete from table / delete table表示从表中删除一切元组

如果想从表中删除所有的行,不要使用delete,可使用truncate table 语句,完成相同的工作,但是速度更快。因为delete是一行一行的删,而truncate则是全部清空表数据

UPDATE 语句:

Update语句用于修改基本表中元组的某些列,其语法如下:

update table set column = value [, column = value] [WHERE condition];

其语义是:修改基本表中满足条件表达式的那些元组的列值,需修改的列值在set子句中指出。

事务处理(Transaction

事务(Transaction)是一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位,是数据库环境中的逻辑工作单位。

事务是为了保证数据库的完整性

事务不能嵌套

oracle中,没有事务开始的语句。一个Transaction起始于一条DML(InsertUpdateDelete )语句,结束于以下的几种情况:

1用户显式执行Commit语句提交操作或Rollback语句回退。

2当执行DDL(createalterdrop)语句事务自动提交。

3用户正常断开连接时,Transaction自动提交。

4系统崩溃或断电时事务自动回退。

Commit & Rollback:

Commit表示事务成功地结束,此时告诉系统,数据库要进入一个新的正确状态,该事务对数据库的所有更新都以交付实施。每个Commit语句都可以看成是一个事务成功的结束,同时也是另一个事务的开始。

Rollback表示事务不成功的结束,此时告诉系统,已发生错误,数据库可能处在不正确的状态,该事务对数据库的更新必须被撤销,数据库应恢复该事务到初始状态。每个Rollback语句同时也是另一个事务的开始。

一旦执行了commit语句,将目前对数据库的操作提交给数据库(实际写入DB),以后就不能用rollback进行撤销。

执行一个 DDL 、DCL语句或从 SQL*Plus正常退出,都会自动执行commit命令。

三种状态:

l 提交或回滚前数据的状态:

以前的数据可恢复

当前的用户可以看到DML操作的结果

其他用户不能看到DML操作的结果

被操作的数据被锁住,其他用户不能修改这些数据

l 提交后数据的状态:

数据的修改被永久写在数据库中.

数据以前的状态永久性丢失.

所有的用户都能看到操作后的结果.

记录锁被释放,其他用户可操作这些记录.

l 回滚后数据的状态:

语句将放弃所有的数据修改

修改的数据被回退.

恢复数据以前的状态.

行级锁被释放.

表结构的修改:

在基本表建立并使用一段时间后,可以根据实际需要对基本表的结构进行修改

1增加新的列用“alter table … add …”语句

   alter table emp add address varchar(20)

新增加的类不能定义为“not null”基本表在增加一列后,原有元组在新增加的列上的值都定义为空值。

2删除原有的列用“alter table … drop…”语句,语法格式:alter table 表名 drop column 列名

   alter table emp drop column address

3修改字段“alter table...modify...”

alter table emp modify(job varchar(50))

4在基本表不需要时,可以使用“drop table”语句删除。在一个基本表删除后,所有的数据都丢弃。所有相关的索引被删除

 drop table emp cascade constraints

5可以使用RENAME语句改变表名(视图),要求必须是表(视图)的所有者

RENAME old_name TO new_name

约束 constraint

当我们创建表的时候,同时可以指定所插入数据的一些规则,比如说某个字段不能为空值,某个字段的值(比如年龄)不能小于零等等,这些规则称为约束。约束是在表上强制执行的数据校验规则.

Oracle 支持下面五类完整性约束:

1、NOT NULL 非空

2、UNIQUE Key 唯一键

3、PRIMARY KEY 主键

4、FOREIGN KEY 外键

5、CHECK 自定义检查约束

创建约束的时机

1、在建表的同时创建

2、建表后创建

约束从作用上分类,可以分成两大类:

1、表级约束:可以约束表中的任意一列或多列。可以定义除了Not Null以外的任何约束。

2、字段级约束:只能约束其所在的某一列。可以定义任何约束。

主键约束( PRIMARY KEY

主键约束是数据库中最重要的一种约束。在关系中,主键值不可为空,也不允许出现重复,即关系要满足实体完整性规则。

1主键从功能上看相当于非空且唯一

2一个表中只允许一个主键

3主键是表中能够唯一确定一个行数据的字段

4主键字段可以是单字段或者是多字段的组合

5Oracle为主键创建对应的唯一性索引

主键可用下列两种形式之一定义

1主键子句:在表的定义中加上如下子句 primary key()

2主键短语:在主属性的定义之后加上primary key字样。

上述形式Oracle会自动命名约束,可自己给约束起名

create table t3(

id number(4), 

constraint t3_pk primary key(id)  //这里的t3_pk就是自己起的名字

)

非空约束(NOT NULL:

确保字段值不允许为空,只能在字段级定义

CREATE TABLE employees(

employee_id    number(6),

name          varchar2(25)  not null,

salary          number(8,2),

hire_date       date  constraint  emp_hire_date_nn  not null

)

唯一性约束(UNIQUE

唯一性约束条件确保所在的字段或者字段组合不出现重复值

唯一性约束条件的字段允许出现空值(如果多个字段出现null,并不算违反了唯一性约束)

Oracle将为唯一性约束条件创建对应的唯一性索引

CREATE TABLE employees(

id           number(6),

name        varchar2(25)  not null  unique,

email        varchar2(25),

salary        number(8,2),

hire_date     date  not null,

constraint emp_email_uk unique(email)

);

CHECK 约束

Check约束用于对一个属性的值加以限制(较少使用,大多数情况我们通过程序来保证输入到表中的数据符合任何复杂的要求)

check中定义检查的条件表达式,数据需要符合设置的条件

create table emp3(

id number(4) primary key,

age number(2)  check(age > 0 and age < 100),

salary number(7,2),

sex char(1),

constraint salary_check check(salary > 0)

)

在这种约束下,插入记录或修改记录时,系统要测试新的记录的值是否满足条件

外键约束( FOREIGN KEY

外键是表中的一个列,其值必须在另一表的主键中列出。

作为主键的表称为主表,作为外键的关系称为依赖表

外键参照的是主表的主键或者唯一键

对于主表的删除和修改主键值的操作,会对依赖关系产生影响,以删除为例:当要删除主表的某个记录(即删除一个主键值,那么对依赖的影响可采取下列3种做法:

1RESTRICT方式:只有当依赖表中没有一个外键值与要删除的主表中主键值相对应时,才可执行删除操作。

2CASCADE方式:将依赖表中所有外键值与主表中要删除的主键值相对应的记录一起删除

3SET NULL方式:将依赖表中所有与主表中被删除的主键值相对应的外键值设为空值

foreign key(deptno)  references  dept(deptno)  [on delete [cascade|set null]]

如省略on短语,缺省为第一中处理方式。

约束的添加和撤销:

可增加或删除约束,但不能直接修改

增加alter table tablename add constraint con_name unique(col)

删除alter table tablename drop constraint com_name [cascade]

VIEW:

定义:视图是从若干基本表和(或)其他视图构造出来的表。在创建一个视图时,只是存放的视图的定义,也即是动态检索数据的查询语句,而并不存放视图对应的数据,在用户使用视图时才去求相对应的数据。

以视图被称作虚表

适当的利用视图,可以使我们的查询变得简单,但是如果视图建立太多的话,会给系统的维护带来麻烦,比如表结构修改了,与这张表有关的任何视图都必须跟着修改,视图很多的时候将是一件很麻烦的事,因此除非必要,否则不要轻易建立视图。

 视图的作用:

1可以限制对数据的访问,可以给用户授予表的特定部分的访问权限而不是整个表的访问权限。

2可以使复杂的查询变的简单。在编写查询后,可以方便地重用它而不必知道他的基本查询细节。

3提供了对相同数据的不同显示

创建视图:在create view语句后加入子查询.

CREATE [OR REPLACE] VIEW view

[(alias[, alias]...)]

AS subquery

[WITH READ ONLY];

create or replace view v$_emp_dept  

as 

(select emp.deptno,ename,dname from emp  join dept  on  emp.deptno=dept.deptno  with read only)

在查询时,不需要再写完全的Select查询语句,只需要简单的写上从视图中查询的语句就可以了

select * from  v$_emp_dept

当视图不再需要的时候,用“drop view” 撤销。删掉视图不会导致数据的丢失,因为视图是基于数据库的表之上的一个查询定义.

drop view v$_emp_dept

序列sequence:

序列是oracle专有的对象,它用来产生一个自动递增的数列 

创建序列的语法:

create sequence seq-name

increment by n

start with n

maxvalue n|nomaxvalue 10^27 or -1

minvalue n|no minvalue

cycle|nocycle

cache n|nocache

实例:create  sequence  seq_empcopy_id  start  with  1  increment  by  1;

使用序列

select seq_empcopy_id.nextval from dual

insert into empcopy  (empno,ename)  values (seq_empcopy_id.nextval, ‘TEST’);

查看序列状态

select seq_empcopy_id.currval from dual

删除序列 

drop sequence seq_empcopy_id;

索引:

索引是为了加快对数据的搜索速度而设立的。索引是方案(schema)中的一个数据库对象,与表独立存放

索引的作用:在数据库中用来加速对表的查询,通过使用快速路径访问方法快速定位数据,减少了磁盘的I/O

Sql中的索引是非显示索引,也就是在索引创建以后,在用户撤销它之前不会再用到该索引的名字,但是索引在用户查询时会自动起作用。

索引的创建有两种情况

自动当在表上定义一个PRIMARY KEY 或者UNIQUE 约束条件时,Oracle数据库自动创建一个对应的唯一索引.

手动用户可以创建索引以加速查询

在一列或者多列上创建索引,下面的索引将会提高对EMP表基于 ENAME 字段的查询速度.

create  index  emp_last_name_idx  on  emp (ename)

删掉索引:drop  index  emp_last_name_idx;

开发中使用索引的要点:

1. 索引改善检索操作的性能,但降低数据插入、修改和删除的性能。在执行这些操作时,DBMS必须动态地更新索引。

2. 索引数据可能要占用大量的存储空间。

3. 并非所有的数据都适合于索引。唯一性不好的数据(如省)从索引的到的好处不比具有更多可能值的数据(如姓名)从索引得到的好处多。

4. 索引用于数据过滤和数据排序。如果你经常以某种特定的顺序排序数据,则该数据可能是索引的备选。

5. 可以在索引中定义多个列(如省加城市),这样的索引只在以省加城市的顺序排序时有用。如果想按城市排序,则这种索引没有用处。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值