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 .....

相關文章
相關標籤/搜索