主键/约束/事务/表关系 Oracle
2016-03-16 00:00
477 查看
1:创建一个主键
--创建一个表,有主键
create table studs(
id varchar(32) primary key,
name varchar(30)
);
--主键也是数据库的对象
--在Oracle数据主加中,有很多的字典表,这些字典表中,保存了所有Oracle内部信息
--dba_xxx - 管理员,user_xxx
select * from tab;
select * from user_tables;
--查询这个用户的约束
select * from user_constraints;[保存了所有用户的约束。]
--知道主键的名称以后,可以删除这个表上的主键
alter table studs
drop constraint sys_c006997;
insert into studs(name) values('Jack');
update studs set id ='S001';
--添加主键 时,如果id列有nill值,则添加主键失败
alter table studs
add constraint studs_pk primary key(id);
主键同时是索引:user_indexes
希望知道,这个表的主键,在哪一个列:
不能为空
不能重复
同时是索引
一个表上,只能有一个主键,可以使用有一个列上,或是多个列上。
2:唯一约束
关键字:unique
特点:
1:唯一,不重复。
2:可以为null
3:同时是索引。
create table teac(
id varchar(32) primary key,
name varchar(30) unique,
age int
);
create table teac(
id varchar(32) primary key,
name varchar(30),
age int,
constraint teac_uq unique(name)
);
alter table teac
add constraint teac_uq unique(name);
insert into teac values('T001','Jack',33);
insert into teac values('T003',null,44);
--查询这个约束
select * from user_constraints;
--查询这个约束同时是索引
select * from user_indexes;
--查询这个约束使用在哪一个列上
select * from user_cons_columns;
--可以禁用唯一约束
alter table teac
disable constraint sys_c007003;
--启动
alter table teac
enable constraint sys_c007003;
--删除这个约束 DDL
alter table teac
drop constraint sys_c007003;
3:检查约束 check
desc teac;
insert into teac values('T004','Alex',-90);
--添加一个约束,约束年龄的范围
delete from teac;
commit;
alter table teac
add constraint taec_ck check (age>=1 and age<=100);
--在创建表时创建
create table t1(
id int,
age int check(age between 1 and 100)
);
检查约束不是索引。
非null值约束
Not null;
默认值约束
Default
4:like模糊查询
5:事务
事务是保证数据操作正确的一种技术。
事务是指用户的一次操作,这一次操作来说,要码都成功,都失败。
在Oracle里,
事务的开始是:执行insert,update,delete.
事务的结束:
显式的结束 – commit,提交,生效。 Rollback 撤销,回滚。
隐式的结束 – DDL 默认是提交。
事务对DDL无效。事务只对DML有效。
1:事务的基本的操作
2:事务的保存点
3:事务的四个特性
事务的特性(ACID特性)
A:原子性(Atomicity)
事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。
B:一致性(Consistency)
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
C:隔离性(Isolation)
一个事务的执行不能被其他事务干扰。
D:持续性/永久性(Durability)
一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
隔离性 (所有数据库内在结构)
级别 isolation 值
脏读 read uncommitted 读取到了没有提交的数据 1 oracle不支持
幻读 read committed 读已提交 2 oracle的默认值
重复读 repeatable read 在同一个事务之内重复的读取前面读取到的数据。 4 oracle不支持
串行化 seri 同步 8 oracle的默认值
Oracle的内存结构:
SGA,PGA
代码:安全shiro,spring security,性能,代码量
6:表关系 外键约束 foreign key
RDBMS – 关系型数据库管理系统。
表关系是通过主键+外键关联实现的。
表关系:
1对多
一对一
多对多
用图来表示表的关系叫:Enty(表)-R(Relation关系)Mapping
1:一对多
如何创建外键:
create table persons(
id varchar(32) primary key,
name varchar(30),
age int
);
--车表-外表
create table cars(
id varchar(32) primary key,
name varchar(30),
price number(10,2),
pid varchar(32),
constraint cars_fk foreign key(pid) references persons(id)
);
E-R:
限制:
1:如果向子表中外表中写入数据,则pid可以为null,,如果不是null值,则这个记录,必须要在persons表中先出现。
2:如果要删除父表,主表中的记录,而子表中已经引用了某个id,则删除不成功
1:查询某个人,有什么车 – 关联查询
insert into persons values('P001','Jack',44);
insert into cars values('C001','Audi',40.00,'P001');
insert into cars values('C002','Auto',1.2,'P001');
insert into persons values('P002','Mary',33);
insert into cars values('C003','Buick',18,'P002');
insert into persons values('P003','Alex',22);
insert into cars values('C004','BMW',45,null);
--以下的查询用的SQL92标准
select p.name,c.name
from persons p,cars c
where p.id=c.pid;
使用SQL99的标准:建议使用 innser join 内联接:
--SQL99标准
select p.name,c.name
from persons p inner join cars c on p.id=c.pid;
2:查询没有车的人
连接的方式:
内联接
左外 – 以左 left [outer] join
select p.name,c.name
from persons p left join cars c on p.id=c.pid
where c.name is null;
右外
--SQL99标准
select p.name,c.name
from persons p right outer join cars c on p.id=c.pid;
全外
连接的方式:
Inner join
Left outer join
Right outer join
Full outer join
3:查询有N部车的人
--查询pid在cars中出现的次数
select pid from cars group by pid having count(pid)=2;
--子查询 - 以下的子查询叫非相关子查询 - 即子查询可以独立执行的子查询叫非相关的子查询
select * from persons where id in(select pid from cars group by pid having count(pid)=2);
--以下是相关子查询 - 子查询不能独立执行。
select * from persons where (select count(*) from cars where cars.pid=persons.id)=0;
2:多对多
create table students(
id varchar(32) primary key,
name varchar(30)
);
create table course(
id varchar(32) primary key,
name varchar(30)
);
create table sc(
studid varchar(32),
courseid varchar(32),
constraint sc_pk primary key(studid,courseid),
constraint sc_fk1 foreign key(studid) REFERENCES students(id),
constraint sc_fk2 foreign key(courseid) references course(id)
);
写入记录:
insert into students values('S001','Jack');
insert into students values('S002','Mary');
insert into students values('S003','Alex');
insert into course values('C001','java');
insert into course values('C002','Oracle');
insert into course values('C003','Math');
insert into sc values('S001','C001');
insert into sc values('S001','C002');
insert into sc values('S002','C001');
1:查询某个选择了某课:
select s.name,c.name
from students s inner join sc on s.id=sc.studid
inner join COURSE c on sc.COURSEID=c.id;
--创建一个表,有主键
create table studs(
id varchar(32) primary key,
name varchar(30)
);
--主键也是数据库的对象
--在Oracle数据主加中,有很多的字典表,这些字典表中,保存了所有Oracle内部信息
--dba_xxx - 管理员,user_xxx
select * from tab;
select * from user_tables;
--查询这个用户的约束
select * from user_constraints;[保存了所有用户的约束。]
--知道主键的名称以后,可以删除这个表上的主键
alter table studs
drop constraint sys_c006997;
insert into studs(name) values('Jack');
update studs set id ='S001';
--添加主键 时,如果id列有nill值,则添加主键失败
alter table studs
add constraint studs_pk primary key(id);
主键同时是索引:user_indexes
希望知道,这个表的主键,在哪一个列:
不能为空
不能重复
同时是索引
一个表上,只能有一个主键,可以使用有一个列上,或是多个列上。
2:唯一约束
关键字:unique
特点:
1:唯一,不重复。
2:可以为null
3:同时是索引。
create table teac(
id varchar(32) primary key,
name varchar(30) unique,
age int
);
create table teac(
id varchar(32) primary key,
name varchar(30),
age int,
constraint teac_uq unique(name)
);
alter table teac
add constraint teac_uq unique(name);
insert into teac values('T001','Jack',33);
insert into teac values('T003',null,44);
--查询这个约束
select * from user_constraints;
--查询这个约束同时是索引
select * from user_indexes;
--查询这个约束使用在哪一个列上
select * from user_cons_columns;
--可以禁用唯一约束
alter table teac
disable constraint sys_c007003;
--启动
alter table teac
enable constraint sys_c007003;
--删除这个约束 DDL
alter table teac
drop constraint sys_c007003;
3:检查约束 check
desc teac;
insert into teac values('T004','Alex',-90);
--添加一个约束,约束年龄的范围
delete from teac;
commit;
alter table teac
add constraint taec_ck check (age>=1 and age<=100);
--在创建表时创建
create table t1(
id int,
age int check(age between 1 and 100)
);
检查约束不是索引。
非null值约束
Not null;
默认值约束
Default
4:like模糊查询
5:事务
事务是保证数据操作正确的一种技术。
事务是指用户的一次操作,这一次操作来说,要码都成功,都失败。
在Oracle里,
事务的开始是:执行insert,update,delete.
事务的结束:
显式的结束 – commit,提交,生效。 Rollback 撤销,回滚。
隐式的结束 – DDL 默认是提交。
事务对DDL无效。事务只对DML有效。
1:事务的基本的操作
2:事务的保存点
3:事务的四个特性
事务的特性(ACID特性)
A:原子性(Atomicity)
事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。
B:一致性(Consistency)
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
C:隔离性(Isolation)
一个事务的执行不能被其他事务干扰。
D:持续性/永久性(Durability)
一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
隔离性 (所有数据库内在结构)
级别 isolation 值
脏读 read uncommitted 读取到了没有提交的数据 1 oracle不支持
幻读 read committed 读已提交 2 oracle的默认值
重复读 repeatable read 在同一个事务之内重复的读取前面读取到的数据。 4 oracle不支持
串行化 seri 同步 8 oracle的默认值
Oracle的内存结构:
SGA,PGA
代码:安全shiro,spring security,性能,代码量
6:表关系 外键约束 foreign key
RDBMS – 关系型数据库管理系统。
表关系是通过主键+外键关联实现的。
表关系:
1对多
一对一
多对多
用图来表示表的关系叫:Enty(表)-R(Relation关系)Mapping
1:一对多
如何创建外键:
create table persons(
id varchar(32) primary key,
name varchar(30),
age int
);
--车表-外表
create table cars(
id varchar(32) primary key,
name varchar(30),
price number(10,2),
pid varchar(32),
constraint cars_fk foreign key(pid) references persons(id)
);
E-R:
限制:
1:如果向子表中外表中写入数据,则pid可以为null,,如果不是null值,则这个记录,必须要在persons表中先出现。
2:如果要删除父表,主表中的记录,而子表中已经引用了某个id,则删除不成功
1:查询某个人,有什么车 – 关联查询
insert into persons values('P001','Jack',44);
insert into cars values('C001','Audi',40.00,'P001');
insert into cars values('C002','Auto',1.2,'P001');
insert into persons values('P002','Mary',33);
insert into cars values('C003','Buick',18,'P002');
insert into persons values('P003','Alex',22);
insert into cars values('C004','BMW',45,null);
--以下的查询用的SQL92标准
select p.name,c.name
from persons p,cars c
where p.id=c.pid;
使用SQL99的标准:建议使用 innser join 内联接:
--SQL99标准
select p.name,c.name
from persons p inner join cars c on p.id=c.pid;
2:查询没有车的人
连接的方式:
内联接
左外 – 以左 left [outer] join
select p.name,c.name
from persons p left join cars c on p.id=c.pid
where c.name is null;
右外
--SQL99标准
select p.name,c.name
from persons p right outer join cars c on p.id=c.pid;
全外
连接的方式:
Inner join
Left outer join
Right outer join
Full outer join
3:查询有N部车的人
--查询pid在cars中出现的次数
select pid from cars group by pid having count(pid)=2;
--子查询 - 以下的子查询叫非相关子查询 - 即子查询可以独立执行的子查询叫非相关的子查询
select * from persons where id in(select pid from cars group by pid having count(pid)=2);
--以下是相关子查询 - 子查询不能独立执行。
select * from persons where (select count(*) from cars where cars.pid=persons.id)=0;
2:多对多
create table students(
id varchar(32) primary key,
name varchar(30)
);
create table course(
id varchar(32) primary key,
name varchar(30)
);
create table sc(
studid varchar(32),
courseid varchar(32),
constraint sc_pk primary key(studid,courseid),
constraint sc_fk1 foreign key(studid) REFERENCES students(id),
constraint sc_fk2 foreign key(courseid) references course(id)
);
写入记录:
insert into students values('S001','Jack');
insert into students values('S002','Mary');
insert into students values('S003','Alex');
insert into course values('C001','java');
insert into course values('C002','Oracle');
insert into course values('C003','Math');
insert into sc values('S001','C001');
insert into sc values('S001','C002');
insert into sc values('S002','C001');
1:查询某个选择了某课:
select s.name,c.name
from students s inner join sc on s.id=sc.studid
inner join COURSE c on sc.COURSEID=c.id;
相关文章推荐
- oracle操作命令大全
- 12c_Data redaction 数据编写策略
- Oracle AWR
- 读了oracle查询与优化做一些笔记,方便以后查看
- Android课程---Oracle VM VirtualBox出现不能为虚拟机打开一个新任务
- excel通过sqlldr导入到oracle数据库
- oracle Long数据类型总结
- oracle日志存放位置dump_dest
- oracle 学习笔记 number
- Oracle 存储过程遇到的问题
- Win7 下基于 Oracle VM VirtualBox 安装 Ubuntu desktop 12.04
- oracle 学习笔记 varchar2
- oracle应用dblink交换数据
- Oracle Day01 数据库基础
- Linux下创建Oracle的OEM
- ORACLE 12C 导入9i导出的含有多个用户的dmp文件
- SQL语句大全-程序员必备(Oracle版)
- ORACLE与.NET类型对应关系(转)
- ORACLE快速合并更新数据——MERGE INTO
- 把Oracle的数据导入到SQL2012中 导出数据--SSIS