Oracle学习笔记2

关于子查询找出所有员工中
select first_name, salary, min(salary) from s_emp
select max(first_name), min(salary) from s_emp;
//
先运行子查询再运行主查询,子查询一般出现在运算符的
右边。
单
多值运算符:可以对两个以上的值进行操作查询谁跟
1.先找出Smith干什么工作
select title from s_emp where
last_name='Smith';
2.再在所有数据中找和Smith
下种写法可能还存在bug,没有考虑到数据的全面性
select last_name , title from s_emp where title in ( select title from s_emp where last_name='Smith' ) and last_name <> 'Smith;

使用子查询时应注意: 单行
returns more than one value 查出哪些员工的工资比平均工资低:
from s_emp e
where
e.salary<
(select avg( nv
from s_
哪些部门的平均工资比所有部门的平均工资要低:
第一步先查出各个部门的平均工资:
select min(a
第二步再查出哪个部门的工资是最低的:
avg(salary) = (select min(avg(salary) ) from s_emp grou select deptno from dept where deptno not in ( select
deptno from
哪些人是普通员工:(用
select first_name,last_name from s_emp where id not in
(select distinct(manager_id) from s_emp where
1.3.9. 语言环境
zh_CN.hp15CN $ echo $NLS_LANG

1
开发流程先进行需求分析,进行系统设计,建表,再进行
把软件设计模型转化为数据中的表,设计时要考虑性能的设计
第一范式:最简单的一种建方式,一张表只有一个主键。

第三范式:表连接存在的原因,两张表,其中一张表引用其
约束:

primary key (pk)
foregin key (fk) 外键
unique key (uk) 唯一可以为空
not null
数据库设计时的注意:
索引: 为了
考虑表点用的物理空间:
考虑表之间的关系:
一对多关系: 利用FK+PK
一对一关系: 可以利
多对多关系: 通过中间增加一个附加表来实现,附加
联合起来的主键唯一。
1
DDL (DataBase Defind L
view(示图)
sequence(序
index(索引)
创建表语句:
c
schema 默认
数据类型: 表名的命令规则: 首字母为字母,不得超过30个字符
char(size)
varchar2(size) 可变长按实际的字节占用空间
number 所有的数字类型都称为number
number(n, m ) n------n位宽度 m-----小数点后的宽度
number(2,4)小数点后4 位,有效位2位 v
values(0.01)这样出错
LONG 2GB 大文本一个表最我只允许定义一个LONG类型(不建议使用) CLOB 大对象形式
BLOB 存二进制大对象(声音,图像之类)
default 作用演示:
c
1
主键约束的定义:
create table test(c num
create table test( c1 number constraints pkc1 primary key
此约束有名字: pkc1
create table test(c num
用表级约束可以实现联合主键
外键约束的定义:(先定义父表,
carete table parent(c1 number primary key
parent(c1)); //列约束
create table child( c number primary key , c2 number , foreign key(c2 references parent(c1));
on delete cascade (
create table child(id number, parent_id number(10) constraint child_fk references
parent(id) ) on delete cascade
create table child(id number, parent_id number(10) constraint child_fk references parent(id) ) on delete set null
不给约束起名字时,不能重名) 定义一个约束
列级约束 表级约束

not null

check 约束:
create table
此表中要求c1的值必须要大于1000 才为有效值 .

这是一个小技巧,利用永不等式提取零条数据,在JDBC的学习中会用到 where
1=1 的形式,注意体会)
desc user_constraints;(这个数据字典
select constraint_name, constraint_types
table_name='S_EMP'; P pk
R fk
C chec
U UK
V 这种
束) O
非空约束和CHECK都是用

ns;

select column_name, position from user_cons_columns where constraint_name='S_EMP_ID_PK' ;

position 的含义:联合主键,约束名一样。
user_constraints user_cons_columns 两张表的约束名相等,表名相等,两张表一关联就可以查出所需的信息。
select constraint_name , r_constraint_name from user_constraints where constraint_type='R' and table_name='S_EMP' ;

数据库建立时,数据字典就会建好。
user_constraints; 自己拥有的
all_constraints; 你自己拥有的加上你可以访问的
dba_constraints 所有的
查看当前数据库数据字典的字典(这个示图很重要)
desc dict;
select table_name form dict where table_name like '%cons%;

示图:
user_objects; user_tables;
select distinct object_type from user_objects;

1.3.13. 介绍事务的概念:
commit 提交,此时说明前面所有语句都成功执行
rollback 回退操作,此时会恢复至上一次提交时的状态。
savepoint 设置保存点
注意 insert into 后面可以跟子查询
insert into s_emp_42 select * from s_emp where dept_id =42;

UPDATE 修改字段值:
update s_emp set dept_id =10 where id =2 ;
update s_emp set commission_pct =10 ;

没有where条件时说明是改表中所有的值.
注意:如有外键引用时常会出现外键引用值没有找到等错误?
delete 删除记录命令语法:

delete from s_emp where dept_id=42;
delete form s_emp ; 没有where条件时说明删除表中所有的值

注意:如有外键引用时,删除一张表时常会出现不能删除的情况,
原因一 是因为此时正在有人操作表中记录
原因二 此表有其他的表引用,没能设及联删除:
delete 删除一张大表时空间不释放,非常慢是因为占用大量的系统资源,支持回退操作,空间还被这张表占用着。
truncate table 表名 (删除表中记录时释放表空间)
DML 语句:
表级共享锁: 对于操作一张表中的不同记录时,互不影响
行级排它锁:对于一行记录,oracle 会只允许只有一个用户对它在同一时间进行修改操作
wait() 等到行级锁被释放,才进行数据操作
drop一张表时也会对表加锁,DDL排它锁,所以在删除一张表时如果当前还有用户操作表时不能删除表
alter table 命令用于修改表的结构(这些命令不会经常用):
增加约束:
alter table 表名 add constraint 约束名 primary key (字段);
解除约束:(删除约束)
alter table 表名 drop primary key(对于主键约束可以直接用此方法,因为一张表中只有一个主键约束名, 注意如果主键此时还有其它表引用时删除主键时会出错)
alter table father drop primary key cascade ; (如果有子表引用主键时,要用此语法来删除主键,这时子表还存在只是子表中的外键约束被及联删除了)
alter table 表名 drop constraint 约束名;
(怎样取一个约束名:1、人为的违反约束规定根据错误信息获取!
2、查询示图获取约束名!)
alter table 表名 disable from primary key ; (相当于把一个表的主键禁用)
alter table 表名 enable primary key ;(enable 时会自动去检查表的记录是不是符合要求,如果有脏数据时必须要先删除脏数据才可以 enable)


增加字段:
alter table 表名 add(字段字字段类型)
删除字段:
alter table 表名 drop(字段)
alter tbale 表名 drop column 字段 ; (8i 以后才支持)
给列改名:920才支持
alter table 表名 rename column 旧字段名 to 新字段名;
修改字段
(此时应注意的问题,更改时要看具体值情况之间的转达换, 改为字符类型时,必须要为空)
alter table 表名 modify( 字段,类型)
更改表中的字段:
update 表名 set 字段= 值 where 条件
更改表名
rename 旧表名 to 新表名;
删除表:
trucate table 表名:(表结构还在,数据全部删除,释放表所占的空间,不支持回退,常用删除大表)
1.3.14. oralce中产生序列(sequence):
create sequence 序列名;
(不带参数时默认为从1 开始每次递增 1,oracle中为了提高产生序列的效率一般一次性产生20个序列放入当前会话的序列池中备用以加快效率,序列会出现不连续的动作回退操作不会影响序列取值)
sequence 的参数:
increment by n 起始值, start with n 递增量, maxvalue n 最大值, minvalue n 最小值,cycle | no cycle 轮回, cache n 绶存(第一次取时会一次取多少个id存起来)
查看 sequence 示图:
desc user_sequences ;
select sequence_name , cache_size , last_number from user_sequences where sequence_name like 's_';

select 序列名.currval from dual 查看当前的序列数
第一次执行这个命令会出错,因为还没有序列号放进序列池中,也就是说
currval读取的是序列池中的数值。
select 序列名.nextval from dual 查看下一个序列数,它会自动给当前的序列加1,实际上是给序列池中的数值加一,而序列表中加的是缓存的值。

清空当前会话的内存:
alter system flush shared_pool;(执行此命令要有DBA权限,一般用户执行出错)
修改序列:(此命令不常用,只需了解就行不必深究)
alter sequence 序列名修改项;
删除序列sequence
drop sequence 序列名;
1.3.15. 创建示图
creating views(属于了解知识)
desc user_views;
select text from user_views where view_name='TEST1_V1' ;

示图就相当于一条select 语句,定义了一个示图就是定义了一个sql语句,示图不占空间,使用view 不会提高性能,但是能简单化sql语句
(扩展知识: oracle 8i 以后的新示图)MV 物化视图(占存储空间,把select 结果存在一个空间,会提高查询视图,增强实时性,但是存在刷新问题, 主要应用在数据仓库中用要用于聚合表)
使用示图的好处:控制数据访问权限.
如何创建一个示图:
create or replace views test_vi as select * from test1 where c1=1;

此时往表test1(base table 基表)中插入数据时:表中没能变化,示图中的数据发生改变
从示图中插数据时相对应的表会发生改变:
往示图中插数据时,会直接插进基表中,查看示图中的数据时,相当于就是执行创建时的select语句。
简单示图:能进行DML操作。
复杂示图:来源于多张表,不能执行DML操作。
1.3.16. 关于利用rownum分页显示
rownum 有个特点要么等于1 要么小于某个值, 不能直接等于某个值, 不能大于某个值。rownum常用于分页显示。
练习:查询出第5条数据和第10条数据之间:
select first_name , rnum from ( select rownum rnum , first_name from s_emp where rownum <=10 ) where rnum between 5 and 10 ;


分面显示:
SELECT * FROM (SELECT a.*, rownum r FROM S_EMP a ) WHERE r between 5 AND 10;
练习:哪些员工的工资比本部门的平均工资高?
select first_name , salary , avgsal from s_emp e , ( select dept_id , avg (salary ) avgsal from s_emp group by dept_id ) a where e.dept_id =a.dept_id and e.salary > a.avgsal;
在示图上加一个 with check option 就相当于给示图加上了约束
create view test_v as select * from test where c =1 with check option ;
create view test_v as select * from test with read option; 定义在视图上的约束,只读。

同义词:相当于别名的作用(***只需了解***)系统自建的同义词: user_tables
create synonym asd_s_emp for asd_0607.s_emp ;
目的就是为了给asd_0607_s_emp表起另一个代替的名称asd.s_emp;注意这个同义词只能自己使用;
create public synonym p_s_emp fro asd_0607.s_emp; 创建公共的同义词,但是要权限.

删除同义词:
drop synonym 同义词名称
1.3.17. 创建索引
Creating indexes(概念很重要对系统的性能影响非常大)
建索引的目的就是为了加快查询速度,使表中数据在做insert语句时就进行排序。
索引是DML语句触发的,系统自动运行,也可以强制使用索引。
索引的结构
key | rowid
索引就相于一本的书的目录。索引点系统空间,属于表的附属物。删除一个表时,相对应的索引也会删除。truncate 表时索引结构在,但是数据不存在。
full table scan 全表扫描
用索引就是为了快速定位数据:(理解时就以字典的目录为例)
查看表的rowid:
select rowid , first_name from s_emp;

你可能感兴趣的:(数据结构,oracle,C++,c,C#)