安裝一個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不可以自動提交事務。
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 ;
select ename,nvl(comm,0), sal*12+nvl(comm,0) from emp;
該函數相似if....else if...esle
select ename, decode(job, 'clerk','業務員', 'salesman','銷售', 'predident','總裁' '無業' ) from emp;
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
select * from emp where sal>1500 UNION select * from emp where deptno=20
select * from emp where sal>1500 intersect select * from emp where deptno=20
select * from emp where to_char(hiredate ,'yyyy')='1981' minus select * from emp where ='MANAGER' or job='PRESIDENT';
exists (sql 返回結果集爲真)
not exists (sql 不返回結果集爲真)
--分頁思想 子查詢
select * from
(select e.*,rownum r from emp e) t
where t.r<11 and t.r>5
視圖就是封裝了一條複雜查詢的語句。
視圖是供查詢用的,因此是read-only。
[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 .....