Num58 Oracle总结

表空间:

       安装一个oracle,只有一个数据库。mysql

      ORACLE数据库的逻辑单元。  数据库---表空间   一个表空间能够与多个数据文件(物理结构)关联面试

       一个数据库下能够创建多个表空间,一个表空间能够创建多个用户、一个用户下能够创建多个表。sql

create tablespace itcastspace
datafile 'c:\itcast.dbf'
size 100m
autoextend on
next 10m

itcastspace 为表空间名称数据库

datafile  指定表空间对应的数据文件 编程

size  后定义的是表空间的初始大小oracle

autoextend on  自动增加 ,当表空间存储都占满时,自动增加编程语言

next 后指定的是一次自动增加的大小。ide

用户:

create user itcastuser
identified by itcast
default tablespace itcastspace

identified by  后边是用户的密码 函数

default tablespace 后边是表空间名称工具

oracle数据库与其它数据库产品的区别在于,表和其它的数据库对象都是存储在用户下的。

用户权限:

Oracle中已存在三个重要的角色:connect角色,resource角色,dba角色。

CONNECT角色: --是授予最终用户的典型权利,最基本的

        ALTER SESSION --修改会话

        CREATE CLUSTER --创建聚簇

        CREATE DATABASE LINK --创建数据库连接

        CREATE SEQUENCE --创建序列

        CREATE SESSION --创建会话

        CREATE SYNONYM --创建同义词

        CREATE VIEW --创建视图

  RESOURCE角色: --是授予开发人员的

        CREATE CLUSTER --创建聚簇

        CREATE PROCEDURE --创建过程

        CREATE SEQUENCE --创建序列

        CREATE TABLE --建表

        CREATE TRIGGER --创建触发器

        CREATE TYPE --创建类型

 

DBA角色:拥有所有特权,是系统最高权限,只有DBA才能够建立数据库结构,而且系统权限也须要DBA授出,且DBA用户能够操做全体用户的任意基表,包括删除

grant dba to itcastuser

进入system用户下给用户赋予dba权限,不然没法正常登录

事务:

    oracle不可以自动提交事务。

truncat与delete区别:

1.       delete删除的数据能够rollback

2.       delete删除可能产生碎片,而且不释放空间

3.       truncate是先摧毁表结构,再重构表结构

(磁盘碎片,
删除一条数据,空间不会有人来占,空间碎片
truncate,整个空间被摧毁,不会出现碎片问题)

序列:

Oracle的自动增加只可以依靠序列来完成。

范例:建立一个seqpersonid的序列,验证自动增加的操做

CREATE SEQUENCE seqpersonid;

序列建立完成以后,全部的自动增加应该由用户本身处理,因此在序列中提供了如下的两种操做:

nextval :取得序列的下一个内容

currval :取得序列的当前内容

select seqpersonid.nextval from dual;

select seqpersonid.currval from dual;

在插入数据时须要自增的主键中能够这样使用

在实际项目中每一张表会配一个序列,可是表和序列是没有必然的联系的,一个序列被哪一张表使用均可以,可是咱们通常都是一张表用一个序列。

序列的管理通常使用工具来管理。

完整语法:

CREATE SEQUENCE 序列名 
[INCREMENT BY n] 
[START WITH n] 
[{MAXVALUE/ MINVALUE n|NOMAXVALUE}] 
[{CYCLE|NOCYCLE}] 
[{CACHE n|NOCACHE}];

检查约束:

mysql中没有检查约束。

使用检查约束能够来约束字段值的合法范围。

范例:建立一张表性别只能是1或2

create table person(

       pid      number(10) ,

       name     varchar2(10),

       gender   number(1)  check(gender in (1, 2)),

       birthday date

);

检查约束也能够自定义

create table person(
       pid      number(10) ,
       name     varchar2(10),
       gender   number(1),
       birthday date,
       constraint person_gender_ck check(gender in (1,2))
);

模糊查询和不等于语句:

在LIKE中主要使用如下两种通配符

“%”:能够匹配任意长度的内容

“_”:能够匹配一个长度的内容

排序中的空值问题:

排序  order by  经验:当排序时存在null时就会产生问题  nulls first ,  nulls last

--查询雇员的工资从低到高

select * from emp order by sal nulls first;

select * from emp order by sal desc nulls last ;

dual是伪表:

空值处理nvl:

select ename,nvl(comm,0), sal*12+nvl(comm,0) from emp;

Decode函数:

该函数相似if....else if...esle

select ename,
       decode(job,
              'clerk','业务员',
              'salesman','销售',
              'predident','总裁'
              '无业'
               ) from emp;

case when:

select t.empno,
       t.ename,
       case
         when t.job = 'CLERK' then
          '业务员'
         when t.job = 'MANAGER' then
          '经理'
         when t.job = 'ANALYST' then
          '分析员'
         when t.job = 'PRESIDENT' then
          '总裁'
         when t.job = 'SALESMAN' then
          '销售'
          else 
            '无业'
       end
  from emp t

集合操做:

并集 UNION,UNION ALL:

select  * from emp where sal>1500 
UNION 
select * from emp where deptno=20

交集 INTERSECT:

select  * from emp where sal>1500 
intersect
select * from emp where deptno=20

差集 Minus:

select  * from emp where to_char(hiredate ,'yyyy')='1981'
minus
select * from emp where ='MANAGER' or job='PRESIDENT';

exists和not exists关键字:

exists (sql 返回结果集为真)

not exists (sql 不返回结果集为真)

分页(Rownnum)(Oracle特有):


--分页思想  子查询
select * from 
(select e.*,rownum r from  emp e) t
 where t.r<11 and t.r>5

视图:

视图就是封装了一条复杂查询的语句。

视图是供查询用的,因此是read-only。

索引(适合查询,若是插入频繁,不建议使用):

PLSQL:

[declare]
	    begin

	    [exception]
	    end;


变量的赋值:  :=
判断:      =

变量:

v_name  char(15); 
v_sal  number(9,2);

常量:

married   constant boolean:=true

引用变量:

%type;

引用型变量,即v_name的类型与emp表中ename列的类型同样

在sql中使用into来赋值

declare 
v_name emp.ename%type;
begin
select t.ename into v_name from emp t where t.empno = 7369;
dbms_output.put_line(v_name);
end;

记录型变量:

%rowtype

记录变量份量的引用

v_row.ename:='ADAMS';

declare
v_row emp%rowtype;
begin
select * into v_row from emp t where t.empno = 7369;
dbms_output.put_line(v_row.ename || ' ' || v_row.sal);
end;

游标(指针,结果集):

异常:

存储过程(效率高,预编译)(重点:面试要问):

存储过程写过吗?
    存储过程写过几十行的,多的没写了

存储过程的优势,为何要使用?

        效率高,预编译

存储函数:

存储函数是给存储过程来调用的

存储函数能够在sql中来利用的

存储过程没有return

触发器(能够理解为监听器之类的,一触发就会发生的事情):

触发器比约束强大

触发器里面不能够有事务
 

其余:

sql优化
    尽可能使用子查询,不要使用多表链接。
    尽可能不要用select * ,要把字段写出来,提升效率。

创建索引会影响数据的存储

PLSql是过程化编程语言,是为告终合sql
 

不用左右链接,会出现若是有一个是空值的状况,会显示不出来该条数据。
 
A left join   B  on ....
where ...=...(+)  '+'号写在相对的那一方


select ....group by ...
(select 后面有的字段 group by 都要有,除了使用函数的)

 

别名中间不能够加空格

oracle区分大小写

_(下划线) 是占位符

!=   不等号
<>   不等号

函数:
initcap 第一个大写
substr  截取,起始位置,0,1是一回事
replace 替换
length  长度
concat  链接

数值函数:
round  四舍五入
trunc  截取
mod 取余

mysql 取时间:select now();
oracle :select sysdate+10 from dual;
months_between (23 日期函数)

nvl(comm,0) 为空,看成0 看待

order by 始终放最后

where 后面跟的是存在的物理列

insert into emp1
select * from myemp; 用别名或者保证数据类型是同样的

create view view_minsal as select * from .....

相关文章
相关标签/搜索