constraint、index、view(day04)
回顾:
1.sql99中的表连接
select 字段列表
from 左表 {[inner]|{left|right|full} [outer]} join 右表
on 关联条件;
集合操作
union
union all
intersect
minus组函数和分组
3.1 组函数
count *
max
min
sum
avgdistinct
NULL
3.2 分组
group by
having语法:
select
from
where
group by
having
order by执行:
from
where
group by
having
select
order by子查询
where子句
select id,first_name,salary from s_emp
where salary>(
select salary froms _emp where first_name='Ben'
);
select id,first_name from s_emp
where id in(
select distinct manager_id from s_emp
);
select id,first_name from s_emp
where id not in(
select distinct manager_id from s_emp
where manager_id is not null
);
select id,name from s_dept d
where exists(select * from s_emp e
where e.dept_id = d.id);
having子句
select dept_id,avg(salary) avgsal
from s_emp
group by dept_id
having avg(salary)>(
select avg(salary) from s_emp
);
from子句
select e.id,e.first_name,e.salary,s.avgsal
from s_emp e,
(select dept_id,avg(salary) avgsal from s_emp
group by dept_id) s
where e.dept_id = s.dept_id
and e.salary>s.avgsal;
select子句
select e.id,e.first_name,e.salary,(
select name from s_dept d where e.dept_id = d.id
) dname
from s_emp e;
5.表操作
5.1 创建表和删除表
create table 表名(
字段名 数据类型,
....
字段名 数据类型
);
drop table 表名;
5.2 数据操作语句
1)insert
insert into 表名[(字段列表)] values(值列表);
2) update
update 表名 set 字段=新值[,字段=新值,...]
[where子句];
3) delete
delete [from] 表名 [where子句];
commit;
truncate table 表名; -- 属于ddl语句,功能上等效于没有where子句的delete语句
5.3 事务控制语句
commit;
rollback;
savepoint 保存点;
rollback to 保存点;
事务的ACID特性
练习:
2.给所有'Carmen'的下属涨工资
- 查询'Carmen'的编号
select id from emp_zsm_00
where first_name='Carmen'; - 根据'Carmen'的编号 查询其下属的编号
select id from s_emp where manager_id = (
select id from emp_zsm_00
where first_name='Carmen'
); - 根据员工编号 改工资
update emp_zsm_00 set salary = salary + 500
where id in(
select id from emp_zsm_00 where manager_id =
(
select id from emp_zsm_00
where first_name='Carmen'
)
);
3.删除和'Ben'同部门的员工
delete from emp_zsm_00 where dept_id=
(select dept_id from emp_zsm_00
where first_name='Ben')
and first_name !='Ben';
约束 constraint
数据完整性:
实体完整性
域完整性
引用完整性
自定义完整性1.1 约束的概念
对表中的字段添加的限制
1.2 约束的具体类型
主键约束:primary key
非空、唯一
一张表只能有一个主键
唯一约束: unique
不能重复
允许为null
一个表中可以有多个唯一
非空约束: not null
不允许为null
检查约束:check(检查约束表达式)
字段的值必须能够使检查约束表达式为真
外键约束: foreign key references1.3 约束的实现方式
列级约束:定义完一个字段后,直接在后边添加约束
表级约束:定义完一个表的所有字段后,逗号隔开,
再添加约束1.4 主键约束
1.4.1 列级实现:
1) 系统自动为约束命名
create table testcons_zsm_00(
id number(7) primary key,
name varchar2(20)
);
insert into testcons_zsm_00 values(1,'test1');
/* 违反了唯一约束 /
insert into testcons_zsm_00 values(1,'test2');
*
ERROR at line 1:
ORA-00001: unique constraint (OPENLAB.SYS_C0042650) violated
/ 主键字段的值不允许为null */
insert into testcons_zsm_00(name) values('test2');
*
ERROR at line 1:
ORA-01400: cannot insert NULL into ("OPENLAB"."TESTCONS_ZSM_00"."ID")- 手动为约束命名
表名_字段_约束类型 : testcons_id_pk
字段 数据类型 constraint 约束名 约束类型
drop table testcons_zsm_00;
create table testcons_zsm_00(
id number(7) constraint testcons_id_pk_zsm_00 primary key,
name varchar2(20)
);
insert into testcons_zsm_00 values(1,'test1');
/* 违反了唯一约束 */
insert into testcons_zsm_00 values(1,'test1');
*
ERROR at line 1:
ORA-00001: unique constraint (OPENLAB.TESTCONS_ID_PK_ZSM_00) violated
1.4.2 表级实现 复合主键(组合键)
drop table testcons_zsm_00;
create table testcons_zsm_00(
id number(7) primary key,
userid number(10) primary key,
name varchar2(20)
);
userid number(10) primary key,
*
ERROR at line 3:
ORA-02260: table can have only one primary keycreate table testcons_zsm_00(
id number(7),
userid number(10),
name varchar2(20),
constraint testcons_id_userid_pk_zsm_00 primary key(id,userid)
);
insert into testcons_zsm_00 values(1,1,'test1');
insert into testcons_zsm_00 values(1,2,'test1');
insert into testcons_zsm_00 values(2,1,'test1');
insert into testcons_zsm_00 values(2,2,'test1');
/* 违反了唯一约束 */
insert into testcons_zsm_00 values(2,2,'test1'); 注意:不建议使用复合主键
1.5 唯一约束、非空约束和检查约束
1.5.1 列级实现
drop table testcons_zsm_00;
create table testcons_zsm_00(
id number primary key,
name varchar2(20) not null,
userid varchar2(18) unique,
sal number(11,2) check(sal>2000)
);
/* 不能向name字段插入null(非空约束的字段不允许为null) */
insert into testcons_zsm_00(id,userid,sal)
values(1,'1234',2500);insert into testcons_zsm_00(id,name,userid,sal)
values(1,'name1','1234',2500);
/* 违反了唯一约束 */
insert into testcons_zsm_00(id,name,userid,sal)
values(2,'name2','1234',2350);
/* 唯一约束的字段允许为null */
insert into testcons_zsm_00(id,name,sal)
values(3,'name3',2350);
/* 唯一约束的字段 可以有多个null值 */
insert into testcons_zsm_00(id,name,sal)
values(4,'name4',2350);
/* 违反了检查约束 */
insert into testcons_zsm_00(id,name,sal)
values(5,'name5',1350);
*
ERROR at line 1:
ORA-02290: check constraint (OPENLAB.SYS_C0042698) violated1.5.2 表级实现
drop table testcons_zsm_00;
/* 一个表中有两个唯一约束 /
create table testcons_zsm_00(
id number unique,
name varchar2(20) not null,
userid varchar2(18) unique,
sal number(11,2) check(sal>2000)
);
insert into testcons_zsm_00 values(1,'test1','12',3000);
/ 违反了id字段的唯一约束 /
insert into testcons_zsm_00 values(1,'test1','123',3000);
/ 违反了userid的唯一约束 */
insert into testcons_zsm_00 values(2,'test1','12',3000);drop table testcons_zsm_00;
/* id和userid组合作为唯一键 */
create table testcons_zsm_00(
id number ,
name varchar2(20) not null,
userid varchar2(18),
sal number(11,2),
unique(id,userid),
check(sal>2000)
);1.5.3 从业务层面,没有多个字段联合非空的需要,所有Oracle没有提供非空约束的表级实现
1.6 外键约束
一个表中某字段的值,受另一张表中某个字段的限制
主表(父表):提供数据的表
从表(子表):外键所在的表
(引用主表中唯一性字段(主键、唯一)的值)
外键的值只能是主表中对应字段的值或者为null
外键约束的语法:
references 主表(字段)
constraint 约束名 references 主表(字段)1.6.1 创建表
一般先创建主表,再创建从表(除非建表时也不添加外键约束)
/* 创建主表 /
create table parent_zsm_00(
id number(7) primary key,
name varchar2(25) not null
);
/ 创建子表 */
create table child_zsm_00(
id number(7) primary key,
c_name varchar2(20) not null,
p_id number(7) references parent_zsm_00(id)
);1.6.2 数据操作语句(dml)
对于有外键约束的表,执行dml操作时,一定要确保子表中
外键的值不能孤立(在主表中可以找到)insert
insert into parent_zsm_00 values(1,'Admin');
commit;
insert into child_zsm_00 values(1001,'test1',1);
insert into child_zsm_00 values(1002,'test2',null);
commit;update
/* 违反了完整性约束-- 添加或更新子表数据时,主表中不存在该值 */
update child_zsm_00 set p_id=2 where id=1002;
*
ERROR at line 1:
ORA-02291: integrity constraint (OPENLAB.SYS_C0042774) violated - parent not found
/* 违反了完整性约束-- 更新或删除主表数据时,数据被子表引用 */
update parent_zsm_00 set id=2 where id=1;
*
ERROR at line 1:
ORA-02292: integrity constraint (SYSTEM.SYS_C0042798) violated - child record
found- delete
delete from parent_zsm_00 where id=1;
1.6.3 删除表
一般先删除子表,再删除主表
drop table child_zsm_00;
drop table parent_zsm_00;
-- 对表的级联删除(先解除外键约束,然后再删除表)
drop table 表名 cascade constraits;drop table parent_zsm_00 cascade constraints;
drop table child_zsm_00 cascade constraints;1.6.4 表中数据的级联删除和级联置空
级联删除:on delete cascade
级联置空:on delete set null/* 创建主表 */
create table parent_zsm_00(
id number(7) primary key,
name varchar2(25) not null
);
/* 创建子表 */
create table child_zsm_00(
id number(7) primary key,
c_name varchar2(20) not null,
p_id number(7),
constraint parent_id_child_pid_fk_zsm_00 foreign key(p_id) references parent_zsm_00(id) on delete cascade
);
insert into parent_zsm_00 values(1,'Admin');
insert into parent_zsm_00 values(2,'Test');
commit;
insert into child_zsm_00 values(1001,'test1',1);
insert into child_zsm_00 values(1002,'test2',1);
insert into child_zsm_00 values(1003,'test3',2);
insert into child_zsm_00 values(1004,'test4',2);
commit;
delete from parent_zsm_00 where id=1;
commit;- 手动为约束命名
其他的数据库对象和分页
2.1 其他的数据库对象
2.1.1 序列 sequence- 作用
给主键产生不重复的数字 - 创建序列
create sequence 序列名;
-- 创建一个测试表
create table testseq_zsm_00(
id number(10) primary key,
name varchar2(20)
);
-- 创建序列
create sequence testseq_id_zsm_00;
3) 使用序列
nextval:产生一个新的序列值
currval: 当前的序列值
序列名.nextval
序列名.currval
第一个使用一个序列时,应该首先调用nextval获取第一个值
insert into testseq_zsm_00 values(
testseq_id_zsm_00.nextval,
'test'||testseq_id_zsm_00.currval);
commit;相关数字字典:user_sequences
- 删除序列
drop sequence 序列名;
drop sequence testseq_id_zsm_00;
2.1.2 索引 index
- 作用
提高查询的效率
用增删改的时间和和索引页占用的空间获取查询效率的提升
- 系统会自动为主键字段添加索引
s_index:id(pk) name
set timing on -- 显式语句执行的时间
select id,name from s_index where id=1000000;
select id,name from s_index
where name='test1000000';
-- 创建测试表
create table testindex(
id number(10) primary key,
name varchar2(20) not null
);
-- 创建一个序列
create sequence testindex_id;
begin
for var_i in 1..5000000 loop
insert into testindex values(testindex_id.nextval,
'test'||testindex_id.currval);
commit;
end loop;
end;- 手动创建索引
语法:
create index 索引名 on 表名(字段); - 删除索引
drop index 索引名;
相关的数据字典:user_indexes;
- 作用
2.1.3 视图 view
1) 作用
简化查询操作
数据安全
本质上视图就是一条select语句
2) 创建视图
语法:
create [or replace] view 视图名[(别名列表)]
as select语句
[with check option]
[with read only];
3)创建一个视图 (基于emp_zsm_00)
create or replace view vw_emp_zsm_00
as
select id,last_name,first_name,salary
from emp_zsm_00
where dept_id in(31,32,33,34,35);
select * from vw_emp_zsm_00;
insert into vw_emp_zsm_00 values(
30,'LName','FName',2500);
commit;
-- 创建只读视图
create or replace view vw_emp_zsm_00
as
select id,last_name,first_name,salary
from emp_zsm_00
where dept_id in(31,32,33,34,35)
with read only;
/* 只读视图 不能执行dml操作 */
insert into vw_emp_zsm_00 values(
31,'LName','FName',2500);
4)删除视图
drop view 视图名;
drop view vw_emp_zsm_00;
相关的数字字典: user_views
2.2 分页
sqlserver: top
mysql: limit
oracle: rownum
rownum:伪列
-- 显示s_emp表中第一页(每页5行)
select rownum,first_name,salary from s_emp
where rownum<6;
-- 显示s_emp表中第二页(每页5行)
/* rownum不能使用> */
select rownum,first_name,salary from s_emp
where rownum>=6 and rownum<11;
select * from
(select rownum rn,id,first_name,salary from s_emp
where rownum<11)
where rn>=6;
-- 按照工资降序排序,显示第二页
select * from
(
select rownum rn,id,first_name,salary from
(
select id,first_name,salary from s_emp
order by salary desc
)
where rownum<11
)
where rn>=6;
练习:
- 创建一张表
编号 数字 主键
名字 字符串 非空
入职日期 日期
工资 数字 不能低于700
2.把s_emp表中的数据导入新建表中
insert into 表名(字段列表) select语句;
3.在新建表的名字字段上创建索引
4.在新建表上创建视图,并测试对视图执行操作
constraint、index、view(day04)的更多相关文章
- [Hive - LanguageManual] Create/Drop/Alter -View、 Index 、 Function
Create/Drop/Alter View Create View Drop View Alter View Properties Alter View As Select Version info ...
- python中的find、rfind、index、rindex
find()从左向右寻找子序列的位置,如存在多个相同子序列只返回第一个查找到的位置,如果子序列不存在返回-1 rfind()从右向左寻找子序列的位置..... index()从左向右寻找子序列的位置, ...
- 闪回之 回收站、Flashback Drop (table、index、trigger等)
一: Flashback Drop 操作流程 模式一:drop table 后未新建同名表 SQL> create table flashdrop as select * from user_o ...
- Elasticsearch核心技术(2)--- 基本概念(Index、Type、Document、集群、节点、分片及副本、倒排索引)
Elasticsearch核心技术(2)--- 基本概念 这篇博客讲到基本概念包括: Index.Type.Document.集群,节点,分片及副本,倒排索引. 一.Index.Type.Docume ...
- 为SQL Server表中的列添加/修改/删除注释属性(sp_addextendedproperty、sp_updateextendedproperty、sp_dropextendedproperty)
本篇基本完全参考:sql--sp_addextendedproperty和sp_updateextendedproperty (Transact-SQL) 三个存储过程用法一样,以sp_addexte ...
- SQL Server扩展属性的增、删、改、查
使用 sql 语句创建表时,可以使用系统存储过程 sp_addextendedproperty 给字段添加描述说明. sp_addextendedproperty 语法: sp_addextended ...
- Mysql索引PRIMARY、NORMAL、UNIQUE、FULLTEXT 区别和使用场合
索引 数据库的索引就像一本书的目录,能够加快数据库的查询速度. MYSQL索引有四种PRIMARY.INDEX.UNIQUE.FULLTEXT, 其中PRIMARY.INDEX.UNIQUE是一类,F ...
- MySQL联接查询算法(NLJ、BNL、BKA、HashJoin)
一.联接过程介绍 为了后面一些测试案例,我们事先创建了两张表,表数据如下: 1 2 3 4 CREATE TABLE t1 (m1 int, n1 char(1)); CREATE TABLE t ...
- vs2017 git 操作重置、还原、挑拣对比
工具 :vs2017 git 操作 背景:本地与远程分支同步 操作:还原.挑拣.重置--hard .重置--mixed 分支:本地1.本地2.origin\本地1 基本操作 1:分支:本地2-ad ...
随机推荐
- java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
1.错误描写叙述 java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String service. ...
- OC基础回想(十二)协议
在OC基础(十一)中我们讨论了类别和非正式协议的奇异之处.在使用非正式协议时.能够仅仅实现你想要获得响应的方法.也不必在对象中声明不论什么内容来表示该对象可用作托付对象. 全部这些任务能够用最少的代码 ...
- Android开发之WebView的开发使用(源码分享)
假设我们想提供一个web应用程序(或仅仅是一个网页)作为client应用程序的一部分,我们能够使用WebView.WebView类是Android的视图类的扩展,它同意您显示web页面的一部分活动布局 ...
- UNIX环境高级编程之第3章:文件I/O
3.1 引言 文件I/O函数:打开文件,读文件,写文件 经常使用到五个函数:open, read, write, lseek, close. 本章描写叙述的函数都是:不带缓冲的I/O(unbuffer ...
- Android push推送消息到达成功率优化
Android push推送消息到达成功率优化 问题:server向client发送消息.未考虑client是否在线,这种消息到达率是非常低的. 第一次优化:使用server离线缓存数据,推断假设cl ...
- C\C++控制台颜色设置类
windows和Linux都可用的一个类...用来设置颜色,没有太复杂.简单够用吧. #ifdef _WIN32 #include <Windows.h> class FontColor ...
- Android Fragment和Activity的交互介绍
Fragment和Activity的交互 一个Fragment的实例总是和包括它的Activity直接相关. fragment能够通过getActivity() 方法来获得Activity的实例.然后 ...
- 在android系统调试中使用tinyalsa命令【转】
本文转载自:http://blog.csdn.net/tangdexi112/article/details/17579021 我们在进行音频调试的时候,需要使用tinymix.tinyplay.ti ...
- Android入门之文件系统操作(一)简单的文件浏览器
版权声明:本文为博主原创文章,未经博主允许不得转载. import java.io.File; import java.util.*; import android.app.Activit ...
- class--类①
原来看其他人的代码,发现有好多class之类的语句,当时没太注意.可后来,我觉得应该有学习新知识的必要了. 类定义是以关键字 class 开头,后跟类的名称.类的主体是包含在一对花括号中.类定义后必须 ...