(Structured Query Language),具有定义、查询、更新和控制等多种功能,是关系数据库的标准语言。
SQL分类:
数据操纵语言DML:
insert update delete
数据定义语言DDL:
alter drop rename truncate
数据控制语言DCL:
grant revoke
rollback savepoint
insert 语句:
into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values(1111,'gao','clerk',7902,sysdate,10000,3000,40)
此处插入的元组中列的个数、顺序与emp的结构完全一致,因此表名之后的列名可以省略不写
into emp values(2222,'gaohs','clerk',7902,sysdate,10000,3000,40)
2、可以只插入部分列
into emp(empno,ename) values (3333,'xiaozhang')
但要求省略的列必须满足下面的条件:
1、该列定义为允许Null值。
2、在表定义中给出默认值,这表示如果不给出值,将使用默认值。(叫做必须满足的条件不合适)
如果不符合上面两个条件,将会报错。不能成功插入。
3、可以用insert语句把一个select语句的查询结果插入到一个基本表中,语法如下:
into emp2 select * from emp (这里不能加as)
insert into emp2 select e.empno,e.job from emp e;
创建一个临时表
table emp2 as select * from emp where 1 = 2(这里必须加as,where 1=2 的功能是只copy一个表,但是不copy里面已经存在的数据(即只copy表结构,字段类型),如不写where 1=2,意味着把emp中的所有数据都copy到emp2中)但不copy约束!!!
执行插入
table emp3 as select empno, ename, job from emp;
into emp3 select empno, ename, job from emp;
DELETE 语句:
SQL的删除操作是指从基本表中删除元组,语法如下:
from table where conditon;
其语义是从基本表中删除满足条件表达式的元组
from table / delete table表示从表中删除一切元组
如果想从表中删除所有的行,不要使用delete,可使用truncate table 语句,完成相同的工作,但是速度更快。因为delete是一行一行的删,而truncate则是全部清空表数据
UPDATE 语句:
Update语句用于修改基本表中元组的某些列,其语法如下:
table set column = value [, column = value] …[WHERE
其语义是:修改基本表中满足条件表达式的那些元组的列值,需修改的列值在set子句中指出。
事务处理(Transaction):
事务(Transaction)是一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位,是数据库环境中的逻辑工作单位。
事务是为了保证数据库的完整性
事务不能嵌套
在oracle中,没有事务开始的语句。一个Transaction起始于一条DML(Insert、Update和Delete )语句,结束于以下的几种情况:
1、用户显式执行Commit语句提交操作或Rollback语句回退。
2、当执行DDL(create、alter、drop)语句事务自动提交。
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...”
table emp modify(job varchar(50))
4、在基本表不需要时,可以使用“drop table”语句删除。在一个基本表删除后,所有的数据都丢弃。所有相关的索引被删除
drop table emp cascade constraints
5、可以使用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、主键字段可以是单字段或者是多字段的组合
5、Oracle为主键创建对应的唯一性索引
主键可用下列两种形式之一定义
1、主键子句:在表的定义中加上如下子句 primary key(列)
2、主键短语:在主属性的定义之后加上primary key字样。
上述形式Oracle会自动命名约束,可自己给约束起名
create table t3(
id number(4),
t3_pk primary key(id) //这里的t3_pk就是自己起的名字
)
非空约束(NOT NULL):
确保字段值不允许为空,只能在字段级定义
CREATE TABLE employees(
number(6),
varchar2(25) not null,
number(8,2),
date constraint emp_hire_date_nn not null
)
唯一性约束(UNIQUE):
唯一性约束条件确保所在的字段或者字段组合不出现重复值
唯一性约束条件的字段允许出现空值(如果多个字段出现null,并不算违反了唯一性约束)
Oracle将为唯一性约束条件创建对应的唯一性索引
CREATE TABLE employees(
number(6),
varchar2(25) not null unique,
varchar2(25),
number(8,2),
date not null,
emp_email_uk unique(email)
);
CHECK 约束:
Check约束用于对一个属性的值加以限制(较少使用,大多数情况我们通过程序来保证输入到表中的数据符合任何复杂的要求)
在check中定义检查的条件表达式,数据需要符合设置的条件
create table emp3(
number(4) primary key,
number(2) check(age > 0 and age < 100),
salary number(7,2),
sex char(1),
salary_check check(salary > 0)
)
在这种约束下,插入记录或修改记录时,系统要测试新的记录的值是否满足条件
外键约束( FOREIGN KEY):
外键是表中的一个列,其值必须在另一表的主键中列出。
作为主键的表称为“主表”,作为外键的关系称为“依赖表”
外键参照的是主表的主键或者唯一键
3种做法:
1、RESTRICT方式:只有当依赖表中没有一个外键值与要删除的主表中主键值相对应时,才可执行删除操作。
2、CASCADE方式:将依赖表中所有外键值与主表中要删除的主键值相对应的记录一起删除
3、SET NULL方式:将依赖表中所有与主表中被删除的主键值相对应的外键值设为空值
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语句后加入子查询.
[OR REPLACE] VIEW view
[(alias[, alias]...)]
AS subquery
[WITH READ ONLY];
or replace view v$_emp_dept
as
emp.deptno,ename,dname from emp join dept on emp.deptno=dept.deptno with read only)
在查询时,不需要再写完全的Select查询语句,只需要简单的写上从视图中查询的语句就可以了
* from v$_emp_dept
当视图不再需要的时候,用“drop view” 撤销。删掉视图不会导致数据的丢失,因为视图是基于数据库的表之上的一个查询定义.
view v$_emp_dept;
序列sequence:
序列是oracle专有的对象,它用来产生一个自动递增的数列
创建序列的语法:
create sequence seq-name
increment by n
start with n
n|nomaxvalue 10^27 or -1
minvalue n|no minvalue
cycle|nocycle
cache n|nocache
sequence seq_empcopy_id start with 1 increment by 1;
使用序列
seq_empcopy_id.nextval from dual
into empcopy (empno,ename) values (seq_empcopy_id.nextval, ‘TEST’);
查看序列状态
seq_empcopy_id.currval from dual
删除序列
sequence seq_empcopy_id;
索引:
索引是为了加快对数据的搜索速度而设立的。索引是方案(schema)中的一个数据库对象,与表独立存放.
索引的作用:在数据库中用来加速对表的查询,通过使用快速路径访问方法快速定位数据,减少了磁盘的I/O
Sql中的索引是非显示索引,也就是在索引创建以后,在用户撤销它之前不会再用到该索引的名字,但是索引在用户查询时会自动起作用。
索引的创建有两种情况
自动: 当在表上定义一个PRIMARY KEY 或者UNIQUE 约束条件时,Oracle数据库自动创建一个对应的唯一索引.
手动: 用户可以创建索引以加速查询
在一列或者多列上创建索引,下面的索引将会提高对EMP表基于 ENAME 字段的查询速度.
index emp_last_name_idx on emp (ename)
删掉索引:drop index emp_last_name_idx;
开发中使用索引的要点:
1. 索引改善检索操作的性能,但降低数据插入、修改和删除的性能。在执行这些操作时,DBMS必须动态地更新索引。
2. 索引数据可能要占用大量的存储空间。
3. 并非所有的数据都适合于索引。唯一性不好的数据(如省)从索引的到的好处不比具有更多可能值的数据(如姓名)从索引得到的好处多。
4. 索引用于数据过滤和数据排序。如果你经常以某种特定的顺序排序数据,则该数据可能是索引的备选。
5. 可以在索引中定义多个列(如省加城市),这样的索引只在以省加城市的顺序排序时有用。如果想按城市排序,则这种索引没有用处。