Oracle学习笔记(二)
2016-03-16 14:42
429 查看
一、sql各种语句划分
![](https://img-blog.csdn.net/20160316142514874?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20160316142531656?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20160316142603531?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
隔离级别:
脏读 不可重复读 幻读
未提交读 read uncommitted: √ √ √
*提交读: read committed : × √ √
可重复读: repeatable read : × × √
√串行化: Serializable : × × ×
Oracle支持提交读和串行化两个级别:
开启事务: set autocommit off;
更改隔离级别:
提交读:
set transaction isolation level read committed;
串行化:
set transaction isolation level serializable;
隐式提交:
* 在事务中,执行DML操作时,执行了一个DDL操作,
数据库会在DDL操作之前隐式的添加一个commit操作
显示提交:
* 在事务中,手动执行commit操作
------------------------------------------------
** drop trucate 和delete 有什么区别?
1 drop 和truncate 是DDL 而delete是DML
2 drop 表示删除表,不会释放表原先占有的内存空间
truncate是截断表,能够释放表中数据所占有的内存空间
delete是删除表中的数据,不会释放数据占有的内存空间.
3 drop使用purge命令时,可以释放表和数据所占有的内存空间.
--------------------------------
Exec:
1 创建打卡时间 cardtime表 结构如下:
编号cid 员工姓名ename 手机号phone 打卡时间ctime
请写出创建表的语句
2 在原表的基础上新增一个员工住址列 addr
3 插入数据如下图:
cid ename phone ctime addr
1 LILEI 13725221234 12-4月 2014 山东济南
2 Di_mi 15612341212 23-4月 2014 河北邯郸
3 Lucy 15110105566 20-5月 2014 山东青岛
4 HMM 18616521652 25-7月 2014 山东济南
5 LILI 13225219800 15-4月 2014 北京朝阳
6 Tom 13556567878 4-8月 2014 香格里拉
7 Tom_mi 13678261277 14-3月 2014 上海虹桥
请写出新增语句,以'LILEI'为例
二、表的约束
SQL : Structured Query Language 结构化 查询 语言 --------------------------------------------------- DDL: Data Definition Language 数据 定义 语句 create drop truncate alter DML: Data Manipulation Language 数据 操纵 语句 insert update delete DQL: Data Query Language 数据 查询 语句 select from DCL: Data Control Language 数据 控制 语句 grant to revoke from TCL: Transactional Control Language 事务 控制 语句 --------------------------------------------------- DDL: 数据定义语句 create 创建 alter 修改 drop 删除 truncate 截断 * create 创建用户: create user 用户名 identified by 口令; 创建表: create table 表名( 列名1 数据类型, 列名2 数据类型, ... 列名x 数据类型 ); create table student( sid number, sname varchar(20), phone varchar2(11) ); * alter 修改 修改用户密码: alter user 用户名 identified by 新密码; 修改表结构: **新增一个列: alter table 表名 add (列名 类型,列名2 类型,..); Exec: 给student 表添加一个新列 gender 字符类型: alter table student add(gender varchar(2) ); **修改列的类型: alter table 表名 modify 列名 新类型; Exec: 将student的性别列修改为number: alter table student modify gender number; **删除列: alter table 表名 drop column 列名; Exec: 将student的性别列删除: alter table student drop column gender; **修改列的名字: alter table 表名 rename column 原列名 to 新列名; Exec: 将student表的sname列更改为name列: alter table student rename column sname to name; **修改表名: alter table 表名 rename to 新名; * drop 删除 删除用户: drop user 用户名; (这种写法用在没有内容的用户中) drop user 用户名 cascade; 删除表: drop table 表名; ** 通过drop删除的表会被存放到系统回收空间中, 表以及其中数据原先占有的内存空间并没有被释放掉. recyclebin: 回收站 ** 可以使用purge命令来清空回收站, 或者在删除表的同时添加purge关键字. 使用了purge命令的删除语句会立即释放表原先占有的内存空间 * truncate 截断 截断表: truncate table 表名; * 保留表的结构,释放表中数据占有的内存空间. ----------------------------------------------------------------------- DML : Data Manipulation Language 数据操纵语句 * insert 新增 向表中插入一条数据: insert into 表名 values(列1值,列2值...); * 如果表名之后没有括号写出列名, 那么values之后的括号中要根据表的列的默认顺序, 把所有的列都给赋值. * 如果某个列是字符类型, 那么values中的对应的值必须使用单引号引起来 insert into 表名(列1,列3,列2) values(列1值,列3值,列2值); * 可以在表名之后指定要给哪几个列插入数据. insert into student(sname,sid) values(&a,&b); 注: & 符号可以用来匹配多次插入数据 插入日期类型的字段: insert into student(sid,sname,birth) values(100,'小明','15-7月 1915'); * 如期类型可以通过字符串的方式来插入数据 * update 更新 update 表名 set 列名=值,列名=值... where 条件; * 如果没有where条件,默认更新全表 * 更新操作将表中set后的列默认的更新为等号右侧的值 * 如果列是字符串,那么值需要用单引号 * delete 删除 delete from 表名 where 条件; * 如果没有where条件,那么默认清空整张表 效果等同于 truncate 相同 DQL : Data Query Language 数据查询语句 * select 查询 查询当前用户中的可用表名: select table_name from user_tables; 查询所有的符合条件的记录: select * from 表名 where 条件; -------------------------------------------------------- DCL: Data Control Language 数据控制语句 权限: grant 权限 [on 资源] to 用户 [with admin/grant option]; revoke 权限 [on 资源] from 用户; ------------------------------------------------------ TCL : Transactional Control Language 事务控制语句 commit ; 提交 * 将收受影响的DML操作,持久化到数据库中 rollback ; 回滚 * 回退到上一次commit操作之后 savepoint ; 还原点 * 在某个DML操作之后,可以设置还原点, 通过rollback to 还原点名; 就能够回退到该状态. 事务: * 事务只能影响DML操作 * 事务是一个整体操作,所有的操作步骤全部成功执行, 那么整个操作才算完成;如果有一个步骤操作失败, 那么整个操作全部失败需要回退到最初状态. Oracle 开启事务: set autocommit off; -- 设置自动提交关闭 打开事务 set autocommit on; -- 设置自动提交开启 关闭事务 事务特性: * 原子性 :事务不可再分 * 一致性 :操作事务中数据时,类型保持一致 * 持久性 :事务能够持久化数据到数据库中 * 隔离性 :多个事务之间可能产生的隔离性问题 隔离性问题: * 脏读: 如果两个事务A和B, 事务A读到事务B未提交的数据. * 不可重复读:(更新) 两个事务A和B, 如果事务A读取某张表,事务B同时读取这张表,并且做了修改操作, 事务B提交后,事务A再次读取这张表时读到了修改后的数据,跟上一次读取的数据不同 * 数据量未发生变化而数据内容被修改 * 幻读:(新增 删除) * 数据量发生变化 以下为《Spring实战》上对事务隔离级别的介绍
隔离级别:
脏读 不可重复读 幻读
未提交读 read uncommitted: √ √ √
*提交读: read committed : × √ √
可重复读: repeatable read : × × √
√串行化: Serializable : × × ×
Oracle支持提交读和串行化两个级别:
开启事务: set autocommit off;
更改隔离级别:
提交读:
set transaction isolation level read committed;
串行化:
set transaction isolation level serializable;
隐式提交:
* 在事务中,执行DML操作时,执行了一个DDL操作,
数据库会在DDL操作之前隐式的添加一个commit操作
显示提交:
* 在事务中,手动执行commit操作
------------------------------------------------
** drop trucate 和delete 有什么区别?
1 drop 和truncate 是DDL 而delete是DML
2 drop 表示删除表,不会释放表原先占有的内存空间
truncate是截断表,能够释放表中数据所占有的内存空间
delete是删除表中的数据,不会释放数据占有的内存空间.
3 drop使用purge命令时,可以释放表和数据所占有的内存空间.
--------------------------------
Exec:
1 创建打卡时间 cardtime表 结构如下:
编号cid 员工姓名ename 手机号phone 打卡时间ctime
请写出创建表的语句
2 在原表的基础上新增一个员工住址列 addr
3 插入数据如下图:
cid ename phone ctime addr
1 LILEI 13725221234 12-4月 2014 山东济南
2 Di_mi 15612341212 23-4月 2014 河北邯郸
3 Lucy 15110105566 20-5月 2014 山东青岛
4 HMM 18616521652 25-7月 2014 山东济南
5 LILI 13225219800 15-4月 2014 北京朝阳
6 Tom 13556567878 4-8月 2014 香格里拉
7 Tom_mi 13678261277 14-3月 2014 上海虹桥
请写出新增语句,以'LILEI'为例
二、表的约束
什么约束?(下面是百度的专业回答) 约束是在表中定义的用于维护数据库完整性的一些规则 通过为表中的列定义约束可以防止将错误的数据插入表中,也可以保持表之间数据的一致性 .若某个约束条件只作用于单独的列,可以将其定义为列约束也可定义为表约束; 若某个约束条件作用域多个列,则必须定义为表约束 表约束通常放在最后一个列定义的后面 .如:CREATE TABLE products ( product_no integer, name text, price numeric CHECK (price > 0) ) 这是列约束 CREATE TABLE products ( product_no integer, name text, price numeric, discounted_price numeric, CHECK (price > discounted_price)) 这是表约束 什么时候使用约束?使用什么约束? * 需要唯一标识数据的列,我们可以使用主键 * 需要告诉数据库母子表之间的关系,需要指定外键 * 如果该列上不能出现空值,比如一条数据的录入日期 not null .... ** 约束越多,数据库数据越健壮; 约束越多,数据库效率越低. Oracle中表的约束:1、主键约束: primary key 主键: 能够通过该列上的一个唯一的值确定一条数据 * 特性: 非空且唯一 创建主键: create table test1( tid number constraint pk_tid primary key, tname varchar2(10), age number ); * constraint pk_tid : 约束名 (可有可无) primary key : 主键约束 将该列变为一个主键列,则这个列是非空且唯一 ** 复合主键: 一个主键是由多个列组成. 也就是说多个列组合在一起才起到一个主键的作用. create table test2( tid number , tname varchar2(10) , age number, constraint pk_t primary key(tid,tname) ); 表外添加主键:alter table 表名 add constraint 约束名 primary key(列名1,列2...);create table test3( tid number , tname varchar2(10) , age number ); 如何给test3添加主键? alter table test3 add constraint pk_t3 primary key(tid);2、外键约束: foreign key 一个部门中有多个员工 主表(母表) : 部门表 从表(子表) : 员工表 * 外键: 在子表中,如果有一个列上的数据引用了另外一张 表的主键列上的数据,那么这个在子表中的列就被称作外键列创建外键: 主表: create table mother( mid number primary key, mname varchar2(20) ); 子表: create table child( cid number primary key, cname varchar2(20), age number, birth date, mno number, constraint fk_c foreign key(mno) references mother(mid) );插入数据: 首先插入主表数据,然后插入子表数据删除数据: 首先删除对应的子表中子记录,然后删除主表数据表外给子表添加外键约束的写法:alter table 表名 add constraint 约束名 foreign key(列1,列2...) references 主表名(列1,列2...) 主键约束: primary key 主键: 能够通过该列上的一个唯一的值确定一条数据 * 特性: 非空且唯一 * 一张表只能有一个主键 创建主键: create table test1( tid number constraint pk_tid primary key, tname varchar2(10), age number ); * constraint pk_tid : 约束名 (可有可无) primary key : 主键约束 将该列变为一个主键列,则这个列是非空且唯一 ** 复合主键: 一个主键是由多个列组成. 也就是说多个列组合在一起才起到一个主键的作用. create table test2( tid number , tname varchar2(10) , age number, constraint pk_t primary key(tid,tname) ); 表外添加主键: alter table 表名 add constraint 约束名 primary key(列名1,列2...); create table test3( tid number , tname varchar2(10) , age number ); 如何给test3添加主键? alter table test3 add constraint pk_t3 primary key(tid); 外键约束: foreign key 一个部门中有多个员工 主表(母表) : 部门表 从表(子表) : 员工表 * 外键: 在子表中,如果有一个列上的数据引用了另外一张 表的主键列上的数据,那么这个在子表中的列就被称作外键列 创建外键: 主表: create table mother( mid number primary key, mname varchar2(20) ); 子表: create table child( cid number primary key, cname varchar2(20), age number, birth date, mno number, constraint fk_c foreign key(mno) references mother(mid) ); 插入数据: 首先插入主表数据,然后插入子表数据 删除数据: 首先删除对应的子表中子记录,然后删除主表数据 表外给子表添加外键约束的写法: alter table 表名 add constraint 约束名 foreign key(列1,列2...) references 主表名(列1,列2...) 3、唯一性约束: unique * 数据库会在具有唯一性的列上,自动添加索引 创建唯一性约束: create table Test4( tid number primary key, tname varchar2(20) unique ); * 带有唯一性的列可以不添加数据 * 如果唯一性的列上带有数据,那么必须不能重复 表外添加: alter table test5 add constraint un_tname unique(tname); 非空约束: not null * 不允许在该列上出现空值 创建非空约束: create table test5( tid number not null, tname varchar(20) ); alter table test5 modify tid not null; 检查约束: check * 数据库需要对某些字段做另外的一些约束 比如学生年龄必须大于12岁: create table teacher( sid number primary key, sname varchar(10), age number, check(age>56) ); 4、删除约束: alter table 表名 drop constraint 约束名; -------------------------------------------------- Exec: 学生表Student : 学号sno 姓名sname 年龄age 学科表Subject: 学科号bno 学科名bname 成绩表Sc: 学号sid 学科号bid 成绩score * 分别给学生表和学科表添加主键 alter table student add constraint pk_sno primary key(sno); alter table subject add constraint pk_bno primary key(bno); 给成绩表添加联合主键 alter table sc add constraint pk_sc primary key(sid,bid); * 给成绩表添加外键: sid引用学生表的学号,bid引用学科表的学科号 alter table sc add constraint fk_sid foreign key(sid) references student(sno); alter table sc add constraint fk_bid foreign key(bid) references subject(bno); * 成绩不能为空 alter table sc modify score not null;
相关文章推荐
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- SQL中的三值逻辑
- SQL Server 作业批量停止
- 结束SQL阻塞的进程
- 动态生成SQL Server视图作业
- Oracle Containers for J2EE远程安全漏洞(CVE-2014-0413)
- Oracle 10g R2不能使用EM的问题
- SQL Server 语句操纵数据库
- 表空间操作
- PreparedStatement中in子句的处理
- SQL(结构化查询语句)
- VMware下RedHat4.8_64位安装Oracle 10g RAC--简略脚本
- oracle sql日期比较
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- OS block size和Oracle block size,查找OS Blocksize的方法
- linux快速部署mysql服务器