DML 全称Data Manipulation Language,即数据操作语言:insert update delete select
DDL 全称Data Definition Language,即数据定义语言:create alter drop runcate
DCL 全称Data Control Language,即数据控制语言:commit rollback
表名和列名命名规则:
必须以字母开头
必须在 1–30 个字符之间
必须只能包含 A–Z, a–z, 0–9, _, $, 和 #
必须不能和用户定义的其他对象重名
必须不能是Oracle 的保留字
Oracle默认存储是都存为大写
数据库名只能是1~8位,datalink可以是128位,和其他一些特殊字符
DML 介绍
插入数据 insert
为每一列添加一个新值。
按列的默认顺序列出各个列的值。
在 INSERT 子句中随意列出列名和他们的值。
字符和日期型数据应包含在单引号中
INSERT INTO table [(column [, column...])]
VALUES (value [, value...]);
使用这种语法一次只能向表中插入一条数据
insert into emp(empno,ename,sal,deptno) values(1001,'Tom',3000,10);
在SQL 语句中使用 & 变量指定列值。
& 变量放在VALUES子句中
insert into emp(empno,ename,sal,deptno) values(&empno,&ename,&sal,&deptno);
输入 empno 的值: 1002
输入 ename 的值: 'Mary'
输入 sal 的值: 3000
输入 deptno 的值: 20
原值 1: insert into emp(empno,ename,sal,deptno) values(&empno,&ename,&sal,&deptno)
新值 1: insert into emp(empno,ename,sal,deptno) values(1002,'Mary',3000,20)
已创建 1 行。
从其它表中拷贝数据
在 INSERT 语句中加入子查询。
不必书写 VALUES 子句。
子查询中的值列表应与 INSERT 子句中的列名对应
insert into emp10
select * from emp where deptno=10;
更新数据 update
可以一次更新多条数据。
UPDATE table
SET column = value [, column = value, ...]
[WHERE condition];
使用 WHERE 子句指定需要更新的数据。
如果省略WHERE子句,则表中的所有数据都将被更新
update emp set sal=20000 where sal<3000;
删除数据 delete
DELETE [FROM] table
[WHERE condition];
使用WHERE 子句指定删除的记录。
如果省略WHERE子句,则表中的全部数据将被删除。
delete from emp where sal = 5000;
DDL 介绍
创建表 CREATE TABLE
CREATE TABLE [schema.]table
(column datatype [DEFAULT expr][, ...]);
必须具备: CREATE TABLE权限 和 存储空间
必须指定:表名、列名、 数据类型、 数据类型的大小
数据类型
数据类型 | 描述 |
---|---|
VARCHAR2(size) | 可变长字符数据 |
CHAR(size) | 定长字符数据 |
NUMBER(p,s) | 可变长数值数据 |
DATE | 日期型数据 |
LONG | 可变长字符数据,最大可达到2G |
CLOB | 字符数据,最大可达到4G |
RAW and LONG RAW | 原始的二进制数据 |
BLOB | 二进制数据,最大可达到4G |
BFILE | 存储外部文件的二进制数据,最大可达到4G |
ROWID | 行地址 |
create table test1
(tid number,
tname varchar2(20),
hiredate date default sysdate);
使用子查询创建表
指定的列和子查询中的列要一一对应
通过列名和默认值定义列
create table empinfo
as
select e.empno,e.ename,e.sal,e.sal*12 annlsal,d.dname
from emp e,dept d
where e.deptno=d.deptno;
修改表结构语句 ALTER TABLE
使用 ALTER TABLE 语句可以:
追加新的列
修改现有的列
删除一个列
使用 ALTER TABLE 语句追加, 修改, 或删除列的语法
追加
ALTER TABLE table
ADD (column datatype [DEFAULT expr]
[, column datatype]...);
修改
ALTER TABLE table
MODIFY (column datatype [DEFAULT expr]
[, column datatype]...);
删除
ALTER TABLE table
DROP column (column);
重命名
ALTER TABLE table_name rename column old_column_name
to new_column_name
alter table test1 add photo blob;
alter table test1 modify tname varchar2(40);
alter table test1 drop column photo;
alter table test1 rename column tname to username;
删除表 DROP TABLE
数据和结构都被删除
所有正在运行的相关事物被提交
所有相关索引被删除
DROP TABLE 语句不能回滚,但是可以闪回
drop table emp20;
/*
执行上调语句后,oracle会把表放入oracle回收站recyclebin,
可以通过show recyclebin进行查看。然后利用RECYCLEBIN NAME还可以对表进行操作。如:select * from "BIN$dM0SdftKTjKHEAQrtudcZg==$0";
回收站中的表可以通过闪回进行恢复(后面会对闪回进行介绍)
可以通过purge recyclebin;进行清空回收站。
*/
清空表 TRUNCATE TABLE
删除表中所有的数据
释放表的存储空间
TRUNCATE语句不能回滚
truncate table emp20;
delete 和truncate区别
根本区别: delete是DML(可以回滚),truncate是DDL(不可以回滚)
delete是逐条删除;truncate先摧毁表 再重建
delete不会释放空间 truncate会
delete会产生碎片 truncate不会
delete可以闪回 truncate不可以
DCL介绍
数据库事务
数据库事务由以下的部分组成:
一个或多个DML 语句
一个 DDL(Data Definition Language – 数据定义语言) 语句
一个 DCL(Data Control Language – 数据控制语言) 语句
以第一个 DML 语句的执行作为开始
以下面的其中之一作为结束:
显示结束: commit rollback
隐式结束(自动提交): DDL语言,DCL语言, exit(事务正常退出)
隐式回滚(系统异常终了): 关闭窗口,死机,掉电
COMMIT和ROLLBACK语句的优点:
确保数据完整性。
数据改变被提交之前预览。
将逻辑上相关的操作分组。
使用 SAVEPOINT 语句在当前事务中创建保存点。
使用 ROLLBACK TO SAVEPOINT 语句回滚到创建的保存点。
UPDATE...
SAVEPOINT update_done;
Savepoint created.
INSERT...
ROLLBACK TO update_done;
Rollback complete.
事务进程
自动提交在以下情况中执行:
DDL 语句。
DCL 语句。
不使用 COMMIT 或 ROLLBACK 语句提交或回滚,正常结束会话exit。
会话异常结束或系统异常会导致自动回滚
提交或回滚前的数据状态:
改变前的数据状态是可以恢复的
执行 DML 操作的用户可以通过 SELECT 语句查询之前的修正
其他用户不能看到当前用户所做的改变,直到当前用户结束事务。
DML语句所涉及到的行被锁定, 其他用户不能操作。
提交后的数据状态:
数据的改变已经被保存到数据库中。
改变前的数据已经丢失。
所有用户可以看到结果。
锁被释放, 其他用户可以操作涉及到的数据。
所有保存点被释放。
提交数据 COMMIT;
使用 ROLLBACK 语句可使数据变化失效:
数据改变被取消。
修改前的数据状态被恢复。
锁被释放。
数据库的隔离级别
对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题:
脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.
不可重复读: 对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.
幻读: 对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.
数据库事务的隔离性: 数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题.
一个事务与其他事务隔离的程度称为隔离级别. 数据库规定了多种事务隔离级别, 不同隔离级别对应不同的干扰程度, 隔离级别越高, 数据一致性就越好, 但并发性越弱
数据库提供的 4 种事务隔离级别:
隔离级别 | 描述 |
---|---|
READ UNCOMMITED(读未提交) | 允许事务读取未被其他事务提交的变更。脏读,不可重复度读,幻读都有可能出现 |
READ COMMITED(读已提交) | 只允许事务读取已经被其他事务提交的变更。可以避免脏读,但不可重复读,幻读问题仍有可能出现 |
REPEATABLE READ(可重复读) | 确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新。可避免脏读,不可重复读,但幻读问题仍然存在 |
SERIALIZABLE | 确保事务可以从一个表中读取相同的值,在这个事务持续期间,禁止其他事务对这个表进行插入、更新和删除操作。所有并发问题都可以避免,但性能十分低下 |
Oracle 支持的 2 种事务隔离级别:READ COMMITED, SERIALIZABLE. Oracle 默认的事务隔离级别为: READ COMMITED
Mysql 支持 4 中事务隔离级别. Mysql 默认的事务隔离级别为: REPEATABLE READ
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/database/4241.html