您的位置:首页 > 数据库 > Oracle

oracle基础二

2016-07-12 15:39 337 查看
Oracle  两种优化模式
1.cbo   cbo模式下  where字句对查询速度没有影响  
2.rbo    在rbo下  会先执行索引。。

oltp   联机事务处理  指经常变更数据的系统。
olap   表数据分析  指数据不经常变的系统  只取数据做分析使用

子查询解决的问题:问题不能一步求解时  考虑使用子查询。。

子查询注意的问题:
1.将子查询放入括号中
2.采用合理的换行和缩进
3.可以在主查询的where from  select having 放子查询
3.1 select 后面的子查询必须是单行子查询
select ename,(select job from emp where empno='')
from emp;

3.2     where,having  后面的子查询  用 
= > >= < <= <>   必须是单行子查询
in  any  all   not in     可以是单行子查询 也 可以是多行子查询

3.3 from  后面的子查询 是一张虚拟表

3.4     查询每个部门最小工资 大于 部门Id是 50 最小工资的部门
select department_id, min(salary)
from employees
group by department_id
having min(salary) > (select min(salary) 
     from employees
     where department_id =50)

4.不能在主查询的group by 后面放子查询
5.强调一下在from后面放置子查询
6.主查询和子查询可以不是同一张表,只要子查询返回的结果,主查询可以使用
7.一般来讲:不在子查询中使用order by;但在Top-N 分析中,必须使用order by;
8.单行子查询只能使用单行操作符;多行子查询只能使用多行操作符
9.子查询中的空值

多表查询可以解决的问题尽量用多表查询    但是  相关子查询例外..

       

子查询(内查询) 在主查询之前执行完成   

子查询的结果被主查询使用(外查询)

多行查询符   

      1.any :和子查询的任意一个值比较
--查询工资比10号部门任意一个员工工资都高的员工信息  
select * from emp  
where sal > any (select sal from emp where deptno = 10);
--其实大于 就是大于一个部门薪资最小值
--    小于 就是小于一个部门薪资最大值

      2.all:和集合的所有值进行比较  
select * from emp 
where sal > all (select sal from emp where deptno = 10);
--其实大于 就是大于一个部门薪资最大值
--    小于 就是小于一个部门薪资最小值

子查询中的空值问题
not in(10,20,null) 查不出数据
使用not in  不能有空值。。 因为not in 是跟所有值做比较
in  (10,20,null)能有数据
因为 in  是跟任意一个值做比较

集合运算

         并集   union/union all  
交集 intersect
差集 minus

集合运算的问题
1.参与运算的各个集合必须列数相同,且类型一致
2.采用第一个集合的表头作为最终的表头
3.order by 必须放在每个集合后

group by rollup(A,B)
=group by a,b;
uoion 
group by a;
uoion
group by null;

 

打开sql执行的时间
set timing on

隐式插入空值   把隐藏的列空出来 insert into (ename,age)values('HAH',18)其他未有的列默认都插入空值

显式插入空值    insert into emp('xx','xx',null,.....)

& 地址符

 insert into emp(empno,ename,sal,deptno) values (&empno,'&ename',&sal,&deptno);

 select empno,ename,&sal from emp;

 地址符可以放入所有的 (DML)操作语句中

往一个表中插入一个集合

   insert into emp10 select * from emp where deptno =10

   --插入要注意列的个数类型必须一致。。。

update tableName set 字段=??

where

字段 =??

delete tableName

where 

字段 =??

更新和修改要考虑数据的完整性   一定得加where子句  除了删除或修改 所有

常见的数据库对象
表     基本数据存储集合,由行和列组成
视图   从表中抽出的逻辑上相关的数据集合。
序列   提供有规律的数值
索引   提供查询的效率
同义词   给对象起别名

命名规则

        1.必须以字母开头
2.必须在1-30个字符之间
3.必须只能包含A-Z a-z 0-9 _ $ #
4.必须不能和用户定义的其他对象重名
5.必须不能是oracle的保留字
6.oralce默认存储是都村委大写
7.数据库名只能是1-8位,datalink(数据链)是可以是128位,和其他一些特殊字符

 

create table
必须具备
create table 权限
存储空间
create table 【schema.】table
(column datatype 【default 表达式】)

查询其他用户的表
其他用户的表不属于本用户的空间
如果要查询其他用户下的表,要是用其他用户的用户名作为前缀

数据类型

        varchar2(size)       可变长字符数据
char(size)           定长字符数据
number(p,s)          可变长数值数据
date     日期型数据
long     可变长字符数据,最大可达到2G
clob     字符数据,最大可达到4G
raw and long raw     原始的二进制数据
blob     二进制数据,最大可达4G

        bfile     存储外部文件的二进制数据,最大可达4G
rowid     行地址

--使用子查询快速建表

create table empincome

as

select empno,ename,sal from emp;

--快速建表不要数据

create table empincome

as

select empno,ename,sal from emp where 1<>1;

--create  创建  alter  修改  drop  删除     (表)  

--追加列 ,修改列 , 删除列 ,重命名列      (列)

1.追加列
alter talbe test2 add image blob;    
--add    增加

2.修改列
alter table test2 modify tname varchar2(30);
--modify 修改

3.删除列
alter talbe test2 drop column image;
--drop   删除

4.重命名列
alter table test2 rename column tname to username;
--rename 重命名

--删除表

  drop table emp;-- 删除在ORACLE回收站中

--oralce回收站
1.查看回收站
    show  recyclebin;

--彻底删除表

         drop talbe emp purge; --彻底删除不会放入回收站

--管理员没有回收站   就是有dba权限的就没回收站

--约束

  --约束类型
1. NOT NULLL
2. UNIQUE
3. PRIMARY KEY
4. FOREIGN KEY
5. CHECK
GENDER VARCHAR2(4) CHECK (GENDER IN ('男','女'));
或  constraint emp_yueshu_name check (salary>0);

--外键约束
1.分两步删除
  删除数据  先删子表  在删主表    或者先设子表数据为 null 在删主表
2.一步删除
  FOREIGN KEY:在子表中,定义了一个表级的约束
  REFERENCES:指定表和父表中的列
  2.1 ON DELETE CASCADE:当删除父表时,级联删除子表记录
  2.2 ON DELETE SET NULL:  将子表的相关依赖记录的外键值置为null  --建议使用  因为级联删除太危险

  --列子
create table myperson
(
  personID varchar2(18) constraint myperson_pk primary key,
  name     varchar2(20) constraint myperson_name not null,
  gender   varchar2(4)  constraint myperson_gender check (gender in('男','女'));
  email    varchar2(40) constraint myperson_email_u unique
constraint myperson_email_n not null,
  deptno   number
constraint myperson_FK references dept(deptno) on delete cascade   --级联删除子表信息
)

--添加约束
-- primary key  check  unique  foreign key
alter table tableName add constraint 约束名字 {【primary key】 (talbecolumnName) | 【check】(talbecolumnName in ('','')|talbecolumnName >=< 10...)   | 【unique】 (talbecolumnName) | 
【foreign key(talbecolumnName)  references tableName(tablecolumnName ) on delete cascade】};

--修改约束
--not null
alter table tableName modify columnName constraint  约束名  not null;

--defalut
alter table  tableName modify  columnName char(2) DEFAULT 'M';

create view view1
as
select * from emp where deptno=10
with check option;  --只能插入满足视图条件的数据
insert into view1(**,10);--ok
insert into view1(**,20);--error

或with read only;     --只读

--禁用约束
alter table  tableName  disable  约束名

--启用约束
alter table  tableName enable   约束名

--延迟约束
alter table  tableName employee  add constraint fk_emp_infro foreign key (deptno)
      references dept(dptno)
deferrable initially deferred;

--向表中添加注释
comment on table tableName is ‘注释’;

--向列中添加注释

comment on column talbeName.columnName  is '注释';

--序列  :可供多个用户用来产生位移数值的数据库对象
1.自动提供唯一的数值
2.共享对象
3.主要用于提供主键值
4.将序列值装入内存可以提供访问效率   内存访问要比硬盘快。。

--[] 内容是可以省略的  [{}]  大括号中必须选一项
create sequence sequencename
[increment by n]

[start with n]                  开始数值
[{maxvalue n | nomaxvalue}]
最大值
[{minvalue n | nominvalue}]
最小值
[{cycle | nocycle}]
循环还是不循环  默认不循环   循环的意思是当序列是最大一个的时候  在循环以 start n  数开始取值
[{cache n | nocache}];
缓存数          默认是 20   

 --select  xx_seq.CURRVAL  form  dual;  取一个序列当前的值 

   select  xx_seq.NEXTVAL  form  dual;  取一个序列下一个值 

 --修改序列 
alter  sequence  sequenceName
increment by 20
maxvalue 999999
nocache
nocycle;

 --删除序列
DROP  sequence  sequenceName;

--索引
一种独立于表的模式对象, 可以存储在与表不同的磁盘或表空间中

索引被删除或损坏, 不会对表产生影响, 其影响的只是查询的速度

索引一旦建立, Oracle 管理系统会对其进行自动维护, 而且由 Oracle 管理系统决定何时使用索引. 用户不用在查询语句中指定使用哪个索引

在删除一个表时, 所有基于该表的索引会自动被删除

通过指针加速 Oracle 服务器的查询速度

通过快速定位数据的方法,减少磁盘 I/O

create index indexName
on emp(deptno);
1.创建一个索引 类似于创建一个索引表
2.索引的作用就是让不连续的数据  在索引表中连续起来

--什么时候创建索引
1.列中数据值分布范围很广
2.列经常在where  子句或连接条件中出现
3.表经常被访问 而且数据量很大,访问的数据大概占数据总量的2% 到 4%
--什么时候不要创建索引
1.表很小
2.列不经常作为连接条件或出现在where子句中
3.查询的数据大于2% 到 4% 
4.表经常更新

   分为--B树索引
位图索引

  --创建索引
自动创建: 
      在定义 PRIMARY KEY 或 UNIQUE 约束后系统自动在相应的列上创建唯一性索引

手动创建:

               用户可以在其它列上创建非唯一的索引,以加速查询

  -- 删除索引
drop  index  indexName 

  --查询索引
可以使用数据字典视图 USER_INDEXES 和 USER_IND_COLUMNS 查看索引的信息
SELECT
ic.index_name, ic.column_name,
ic.column_position col_pos,ix.uniqueness

FROM user_indexes ix, user_ind_columns ic

WHERE ic.index_name = ix.index_name 

AND
ic.table_name = 'EMPLOYEES';

--同义词  就是别名
--为了提高安全性

  --赋权限 grant create synonym  to 用户;

  --创建同义词 create synonym  hremp for emp.employees;

  --删除同义词 drop   synonym  synonymName;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库 oracle