一. 操纵数据(DML)
数据操纵语言:当添加、更新或者删除数据库中的数据时需要使用 DML 语句。DML 依
据的一个集合构成了一个被称为事务的逻辑单元。
当完成下面操作时,DML 语句被执行:
– 添加新行到表中
– 修改表中的行
– 删除表中的行
1 添加一个新行到表中
1.1INSERT 语句语法
用该语法一次只能插入一行
1.2指定列添加
insert
1.3完全列添加
insert into departments values(280,'Teaching',180,2000);
1.4插入带空值的行
隐式方法: 省略字段列表中的列。
insert into departments(department_id,department_name) values(300,'A');
显式方法: 在 VALUES 子句中指定 NULL 关键字。
insert into departments(department_id,department_name,manager_id,location_id) values(310,'A',null,null);
1.5插入日期值
示例
添加一个新的雇员:
insert into employees(employee_id,first_name,last_name,email,phone_number,hire_date,job_id,salary,commission_pct,manager_id,department_id) values(300,'Old','Lu','sdfsdfd','23423423',sysdate,'AD_PRES',23423,null,204,290);
使用默认日期格式:
insert into employees(employee_id,first_name,last_name, email,phone_number,hire_date,job_id,salary,commission_pct,manager_id,department_id)values(301,'Old','Lu','sdfsdddfd','23423423','01/3 月/2019','AD_PRES',23423,null,204,290);
指定日期格式:
insert into employees(employee_id,first_name,last_name,email,phone_number,hire_date,job_id,salary,commission_pct,manager_id,department_id)values(302,'Old','Lu','sdfsddfd','23423423',to_date('2019-03-01','yyyy-MM-dd'),'AD_PRES',23423,null,204,290);
1.6从另一个表中复制行
• 用一个查询写 INSERT 语句
• 不用 VALUES 子句
• 在查询中列的数目要匹配 INSERT 子句中列的数目
创建表
create table EMP(id NUMBER not null,name VARCHAR2(50),salary NUMBER(8,2),commission NUMBER(2,2));
示例
将 employees 表中的 job_id 中含有 REP 的工作岗位的数据插入到 emp 表中。
insert into emp(id,name,salary,commission) select employee_id,last_name,salary,commission_pctfrom employees where job_id like '%REP%';ORinsert into emp selectemployee_id,last_name,salary,commission_pctfrom employees where job_id like '%REP%';
1.7使用默认值
在 INSERT 中的 DEFAULT
insert into emp (id,name) values(302,'Kevin');
insert into emp values(301,'OldLu',default,null);
2 改变表中的数据
2.1UPDATE 语句的语法
用 UPDATE 语句修改已存在的行
示例
更新 emp 表中 ID 为 170 的数据,将名字修改为 OldLu,薪水修改 20000。
update emp e set e.name = 'OldLu',e.salary= 20000 where e.id = 170;
2.2用查询更新列
示例
更新 emp 表中的雇员 165 的薪水,使其和雇员 156 相同。
update emp e set e.salary = (select salary from emp where id = 156) where e.id = 165;
3 从表中删除行
3.1DELETE 语句
使用 DELETE 语句从表中删除已存在的行。
示例
删除 emp 表中 id 为 302 的雇员。
delete from emp where id = 302;
3.2删除基于另一个表的行
示例
删除 emp 表中薪水与 IT_PROG 岗位相同的薪水。
delete from emp where salary in(select distinct salary from employees where job_id ='IT_PROG');
3.3删除表中的全部数据
如果在删除语句中没有给定任何条件,那么数据将会删除该表中的所有数据。
示例
删除表中的所有数据。
delete emp;
3.4删除行: 完整性约束错误
解决方法:先删除外键,再删除主键。
八、 事务处理语言(TCL)
1 什么是事务
指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
2 什么是事务特性
2.1原子性(ATOMICITY)
事务中的操作要么都不做,要么就全做。
2.2一致性(CONSISTENCY)
一个事务应该保护所有定义在数据上的不变的属性(例如完整性约束)。在完成了一个成
功的事务时,数据应处于一致的状态。
2.3隔离性(ISOLATION)
一个事务的执行不能被其他事务干扰。
2.4持久性(DURABILITY)
一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
3 使用事务
commit.....事物提交
rollback....事物回滚
savepoint..设置回滚点
3.1事务类型
3.1.1显式事务
需要我们手动的提交或回滚。
DML 语言中的所有操作都是显示事务操作。
3.1.2隐式事务
数据库自动提交不需要我们做任何处理,同时也不具备回滚性。
DDL、DCL 语言都是隐式事务操作
3.2事务提交
Commit
当我们执行了一个 DML 语言后,此时的数据并不会持久化到数据文件中。需要使用
commit 来确认提交。
3.3事务回滚
Rollback
当我们执行了一个 DML 语言后,也可以使用 rollback 来撤销当前对表的操作。
3.4设置回滚点
Savepoint
Rollback to
九、 数据定义语言(DDL)
create.....创建数据库对象
drop.......删除数据库对象
arter......修改数据库对象
rename.....修改数据库对象名称
1 创建表(CREATE TABLE)
示例
create table dept(deptno NUMBER(2),dname VARCHAR2(14),loc VARCHAR2(13));
1.2Oracle 数据库中的表
• 用户表:
– 由用户创建和维护的表的集合。
– 包含用户信息。
• 数据字典:
– 由 Oracle 服务器创建和维护的表的集合。
– 包含数据库信息。
1.2.1常见的数据字典表
1.3用查询创建表
示例
create table dept80 as select employee_id,last_name name,salary,hire_date from employees e where e.department_id = 80;
2 修改表(ALTER TABLE)
ALTER TABLE 语句可以修改表的信息。
• 添加一个新列
• 修改一个已存在的列
• 删除一个列
2.1添加一个新的列
示例
alter table dept add(salary number(8,2));
2.2修改一个列
示例
修改数据类型
alter table dept modify(dname varchar2(40));
示例
修改默认值
alter table dept modify(salary number(8,2) default 1000);
alter table dept modify(salary number(8,2) default null);
示例
修改列名
alter table dept rename column dname to name;
2.3删除一个列
示例
alter table dept drop column salary
3 修改表名称(RENAME)
示例
rename dept80 to dept90;
4 截断表(TRUNCATE TABLE)
特点:删除表中的所有的数据,但是保留表结构。在截断表时不能给定条件,截断表是隐式事务,不支持回滚。
示例
truncate table dept90;
5 删除表(DROP TABLE)
示例
drop table dept90;
十、 定义约束
1 数据库中的约束类型
– 非空约束(NOT NULL)
– 唯一性约束(UNIQUE)
– 主键约束(PRIMARY KEY)
– 外键约束(FOREIGN KEY)
– 用户自定义约束(CHECK)
1.1定义约束原则
创建一个约束:在创建表的同时,或者在创建表之后都可以定义约束。可以给约束起名字,但是约束名不能相同,必须是唯一的。如果没有为约束起名字,Oracle 服务器将用默认格式 SYS_Cn 产生一个名字,这里 n 是一个唯一的整数,所以约束名是唯一的。
2 定义 NOT NULL 约束
2.1创建表时定义 NOT NULL 约束
示例
create table dept80(id number,name varchar2(20) not null, salary number constraint dept80_notn not null);
2.2修改表定义 NOT NULL 约束
示例
alter table dept80 modify location_id not null;
3 定义 UNIQUE 约束
3.1创建表时定义 UNIQUE 约束
示例
create table dept90(id number constraint dept90_uk unique,name varchar2(20));
3.2修改表定义 UNIQUE 约束
示例
alter table dept90 modify(name unique);
4 定义 PRIMARY KEY 约束
4.1创建表时定义 PRIMARY KEY 约束
示例
create table dept70(id number constraint dept70_pk primary key);
4.2修改表定义 PRIMARY KEY 约束
示例
alter table dept60 modify(id constraint dept60_pk primary key);
4.3创建联合主键
示例
create table dept50(id number,name varchar2(20),constraint dept50_pk primary key(id,name));
5 定义 FOREIGN KEY 约束
5.1创建表时定义 FOREIGN KEY
示例
create table dept40(id number,d_id number,constraint dept40_fk foreign key(d_id) references dept60(id));
5.2修改表定义 FOREIGN KEY
示例
alter table dept50 add constraint dept50_fk foreign key(d_id) references dept60(id);
6 定义 CHECK 约束
6.1创建表时定义 CHECK 约束
示例
create table dept30(id number,salary number(8,2) constraint dept30_ck check (salary > 1000));
6.2 修改表定义 CHECK 约束
示例
alter table dept50 add constraint dept50_ck check(salary > 1000);
7 禁用与启用约束
7.1查看约束
示例
select constraint_name,constraint_type,search_condition from user_constraints where table_name= 'DEPT40';
7.2禁用约束
示例
alter table dept40 disable constraint
dept40_ck;
级联禁用(禁用有外键的约束加cascade)
alter table dept60 disable constraint dept60_pk cascade;
7.3启用约束
示例
alter table dept40 enable constraint dept40_ck;