1個oracle ——1個數據庫——多個數據表(數據對象)——多個用戶sql
注:默認會建立 SYS 和 SYSTEM ,同時 Oracle 爲程序測試提供了一個普通用戶 scott. 默認的用戶中, SYS 和 SYSTEM 用戶是沒有鎖定的,安裝成功後能夠直接使用, SCOTT 用戶默認爲鎖定狀態,所以不能直接使用,須要把 SCOTT 用戶設定爲非鎖定狀態才能正常 使用.數據庫
1、連接數據庫:數組
1.使用sqlplus /nolog(啓動一個客戶端進程)瀏覽器
conn 用戶名/密碼 as 鏈接身份@服務器鏈接字符串緩存
其中連接身份:sys 用戶只能使用 sysdba 身份登陸,而 system 能夠用普通用戶登陸服務器
鏈接身份:表示該用戶鏈接後擁有的權限網絡
sysdba: 即數據庫管理員, 權限包括: 打開數據庫服務器、 關閉數據庫服務
器、 備份數據庫、 恢復數據庫、 日誌歸檔、 會話限制、 管理功能、 建立數據庫。
sys 用戶必須用 sysdba 身份才能登陸, system 用戶能夠用普通身份登陸。
sysyoper: 即數據庫操做員, 權限包括: 打開數據庫服務器、 關閉數據庫服務
器、 備份數據庫、 恢復數據庫、 日誌歸檔、 會話限制。oracle
normal: 即普通用戶, 權限只有查詢某些數據表的數據。默認的身份是 normalide
network/ADMIN/ tnsnames.ora:函數
詳情見附件
配置本地網絡服務名:
本地網絡服務名,即客戶端與服務器的鏈接字符串,本地網絡服務名是客戶端的配置,Oracle 客戶端安裝後,可使用客戶端自帶的網絡配置嚮導( Net Configuration Assistant)進行配置:
2.PL/SQL Developer 工具
2、ORACLE 服務
1). OracleService+服務名 數據庫服務器基本啓動服務
2). OracleOraDb10g_home1TNSListener 服務器監聽客戶端的服務
3).OracleOraDb10g_home1iSQL*Plus 使用瀏覽器進行遠程登陸操做數據庫服務(http://localhost:5560/isqlplus)
4). OracleDBConsole+服務名 基於 B/S 的企業管理器 輸入命令:emctl start dbconsole ,獲取 B/S 地址
3、數據庫啓動跟關閉
sqlplus 中 只能以 sys 用戶啓動 startup open / shutdown immediate
4、用戶和權限
CREATE USER 用戶名 IDENTIFIED BY 口令 [ACCOUNT LOCK|UNLOCK] 默認爲鎖定狀態,須要給用戶賦予 CREATE SESSION 權限才能登陸
權限舉例: CONNECT, RESOURCE, DBA
受權語句: GRANT角色|權限 TO 用戶(角色) :GRANT CONNECT TO jerry;
回收權限: REVOKE 角色|權限 FROM 用戶(角色)
修改密碼: ALTER USER 用戶名 IDENTIFIED BY 新密碼
修改鎖定狀態: ALTER USER 用戶名 ACCOUNT LOCK|UNLOCK
5、數據類型
1). CHAR(length) : 存儲固定長度 length
2). VARCHAR2(length) : 存儲變長字符串 length 爲最大長度
3). NUMBER(p, s) : p 爲整數長度,s 爲小數長度
4). Date 年月日,時分秒,能夠經過 sysdate 函數返回數據
5). TIMESTAMP 不但存儲日期的年月日,時分秒,以及秒後 6 位,同時包含時區,能夠經過 systimestamp函數返回數據
6). CLOB(大文件,ex: xml),BLOB (二進制文件)
6、建立表和約束
1)、
ALTER TABLE 表名 ADD CONSTRAINT 約束名 約束內容
主鍵: ALTER TABLE INFOS ADD CONSTRAINT PK_INFOS PRIMARY KEY(STUID)
驗證: ALTER TABLE INFOS ADD CONSTRAINT CK_INFOS_GENDER CHECK(GENDER = '男' OR GENDER = '女')
惟一: ALTER TABLE INFOS ADD CONSTRAINTS UN_STUNAME UNIQUE(STUNAME)
外鍵: ALTER TABLE SCORES ADD CONSTRAINT FK_SCORES_INFOS_STUID FOREIGN KEY(STUID) REFERENCES INFOS(STUID)
2)、
複製表結構: CREATE TABLE INFOS2 AS SELECT * FROM INFOS WHERE 1=2;
若需插入數據: CREATE TABLE INFOS2 AS SELECT * FROM INFOS;
插入數據的時候要插入時間 date : TO_DATE('2009-8-9 06:30:10',' YYYY-MM-DD HH24:MI:SS ')
3)、
刪除數據: TRUNCATE TABLE 表名 爲DDL命令,數據不能恢復;delete 爲 DML 命令,數據能夠經過日誌文件恢復
4)、
查詢的時候字符串連接: 字符串的鏈接用雙豎線( ||)表示
消除重複: SELECT DISTINCT DEPTNO FROM EMP
LIKE: '%30\%%' escape '\' (包含「 30%」的字符串,「 \」指轉義字符,「 \%」在字符串中
表示一個字符「 %」)
ANY: SELECT ENAME,JOB,SAL FROM EMP
WHERE SAL<ANY (SELECT SAL FROM EMP WHERE JOB='SALESMAN')
ALL: SELECT ENAME,JOB,SAL FROM EMP
WHERE SAL>ALL (SELECT SAL FROM EMP WHERE JOB='SALESMAN')
ROWID,ROWNUM: SELECT ROWNUM,ENAME,JOB,SAL FROM EMP WHERE ROWNUM<=5;
5)、 集合運算
INTERSECT(交集), 返回兩個查詢共有的記錄。
UNION ALL(並集),返回各個查詢的全部記錄,包括重複記錄。
UNION(並集),返回各個查詢的全部記錄,不包括重複記錄。
MINUS(補集),返回第一個查詢檢索出的記錄減去第二個查詢檢索出的記錄以後剩餘的記錄。
6)、
內聯接: SELECT e.ENAME,e.JOB,e.SAL,d.DNAME
FROM EMP e INNER JOIN DEPT d ON e.DEPTNO=d.DEPTNO
其中 INNER 能夠省略
外聯接: SELECT e.ENAME,e.JOB,e.SAL,d.DNAME
FROM EMP e RIGHT OUTER JOIN DEPT d ON e.DEPTNO=d.DEPTNO
其中 OUTER 能夠省略
7、函數
字符串:
示例 示例結果
SELECT ASCII('a') FROM DUAL 97
SELECT CONCAT('Hello', ' world') FROM DUAL Hello world
SELECT INSTR('Hello world', 'or') FROM DUAL 8
SELECT LENGTH('Hello') FROM DUAL 5
SELECT LOWER('hElLO') FROM DUAL; hello
SELECT UPPER('hello') FROM DUAL HELLO
SELECT LTRIM('===HELLO===', '=') FROM DUAL HELLO===
SELECT '=='||LTRIM(' HELLO===') FROM DUAL ==HELLO===
SELECT RTRIM('===HELLO===', '=') FROM DUAL ===HELLO
SELECT '='||TRIM(' HELLO ')||'=' FROM DUAL =HELLO=
SELECT TRIM('=' FROM '===HELLO===') FROM DUAL HELLO
SELECT REPLACE('ABCDE','CD','AAA') FROM DUAL ABAAAE
SELECT SUBSTR('ABCDE',2) FROM DUAL BCDE
SELECT SUBSTR('ABCDE',2,3) FROM DUAL BCD
數字:
函數 說明 示例
ABS(x) x 絕對值 ABS(-3)=3
ACOS(x) x 的反餘弦 ACOS(1)=0
COS(x) 餘弦 COS(1)=1.57079633
CEIL(x) 大於或等於x 的最小值 CEIL(5.4)=6
FLOOR(x) 小於或等於 x 的最大值 FLOOR(5.8)=5
LOG(x,y) x 爲底 y 的對數 LOG(2,4)=2
MOD(x,y) x 除以 y 的餘數 MOD(8,3)=2
POWER(x,y) x 的 y 次冪 POWER(2,3)=8
ROUND(x[,y]) x 在第 y 位四捨五入 ROUND(3.456,2)=3.46
SQRT(x) x 的平方根 SQRT(4)=2
TRUNC(x[,y]) x 在第 y 位截斷 TRUNC(3.456,2)=3.45
說明:
1. ROUND(X[,Y]),四捨五入。
在缺省 y 時,默認 y=0;好比: ROUND(3.56)=4。
y 是正整數,就是四捨五入到小數點後 y 位。 ROUND(5.654,2)=5.65。
y 是負整數,四捨五入到小數點左邊|y|位。 ROUND(351.654,-2)=400。
2. TRUNC(x[,y]),直接截取,不四捨五入。
在缺省 y 時,默認 y=0;好比: TRUNC (3.56)=3。
y 是正整數,就是四捨五入到小數點後 y 位。 TRUNC (5.654,2)=5.65。
y 是負整數,四捨五入到小數點左邊|y|位。 TRUNC (351.654,-2)=300。
日期:
1. ADD_MONTHS(d,n),在某一個日期 d 上,加上指定的月數 n,返回計算後的新日期。
d 表示日期, n 表示要加的月數。
2. LAST_DAY(d),返回指定日期當月的最後一天。
3. ROUND(d[,fmt]),返回一個以 fmt 爲格式的四捨五入日期值, d 是日期, fmt 是格式
模型。默認 fmt 爲 DDD,即月中的某一天。
若是 fmt 爲「 YEAR」則舍入到某年的 1 月 1 日,即前半年捨去,後半年做爲下
一年。
若是 fmt 爲「 MONTH」則舍入到某月的 1 日,即前月捨去,後半月做爲下一
月。
默認爲「 DDD」,即月中的某一天,最靠近的天,前半天捨去,後半天做爲第
二天。
若是 fmt 爲「 DAY」則舍入到最近的周的週日,即上半周捨去,下半周做爲下
一週週日。
與 ROUND 對應的函數時 TRUNC(d[,fmt])對日期的操做, TRUNC 與 ROUND 很是類似,只
是不對日期進行舍入,直接截取到對應格式的第一天。
4. EXTRACT(fmt FROM d),提取日期中的特定部分。
fmt 爲: YEAR、 MONTH、 DAY、 HOUR、 MINUTE、 SECOND。其中 YEAR、 MONTH、 DAY
能夠爲 DATE 類型匹配,也能夠與 TIMESTAMP 類型匹配;可是 HOUR、 MINUTE、 SECOND 必
須與 TIMESTAMP 類型匹配。
轉換函數:
1)、
SELECT TO_CHAR(SYSDATE,'YYYY"年"MM"月"DD"日" HH24:MI:SS') "date"
2)、
SQL> SELECT TO_CHAR(-123123.45,'L9.9EEEEPR') "date"
2 FROM DUAL
3 /
date
--------------------
<¥1.2E+05>
3)、
SQL> SELECT TO_NUMBER('-$12,345.67','$99,999.99') "NUM"
2 FROM DUAL
3 /
NUM
---------------
-12345.67
其餘單行函數:
1. NVL(x,value)
若是 x 爲空,返回 value,不然返回 x。
2. NVL2(x,value1,value2)
若是 x 非空,返回 value1,不然返回 value2。
聚合函數:
名稱 做用 語法
AVG 平均值 AVG(表達式)
SUM 求和 SUM(表達式)
MIN、 MAX 最小值、最大值 MIN(表達式)、 MAX(表達式)
COUNT 數據統計 COUNT(表達式)
8、數據庫對象
同義詞:
案例:建立一個用戶 XiaoMei,該用戶擁有 CONNECT 角色和 RESOURCE 角色。爲 SCOTT
用戶的 EMP 表建立同義詞,並經過同義詞訪問該 EMP 表。
SQL> CONN system/manager@orcl;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
Connected as system
SQL> CREATE USER XiaoMei IDENTIFIED BY XiaoMei; ①
User created
SQL> GRANT CONNECT TO XiaoMei;
Grant succeeded
SQL> GRANT RESOURCE TO XiaoMei;
Grant succeeded
SQL> GRANT CREATE SYNONYM TO XiaoMei;
Grant succeeded
SQL> CONN XiaoMei/XiaoMei@ORCL;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
Connected as XiaoMei
SQL> CREATE SYNONYM MyEmp FOR SCOTT.EMP; ②
Synonym created
SQL> SELECT * FROM MYEMP; ③
SELECT * FROM MYEMP
ORA-00942: 表或視圖不存在
SQL> CONNECT SCOTT/tiger@ORCL //鏈接到Scott
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
Connected as SCOTT
SQL> GRANT ALL ON EMP TO XiaoMei; ④
Grant succeeded
SQL> CONNECT XiaoMei/XiaoMei@ORCL;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
Connected as XiaoMei
SQL> SELECT ENAME,JOB,SAL FROM MyEmp WHERE SAL>2000;
DROP [PUBLIC] SYNONYM [schema.]sysnonym_name
語法解析:
① PUBLIC:刪除公共同義詞。
② 同義詞的刪除只能被擁有同義詞對象的用戶或者管理員刪除。
③ 此命令只能刪除同義詞,不能刪除同義詞下的源對象。
序列號:
語法結構:建立序列
CREATE SEQUENCE sequence_name
[START WITH num]
[INCREMENT BY increment]
[MAXVALUE num|NOMAXVALUE]
[MINVALUE num|NOMINVALUE]
[CYCLE|NOCYCLE]
[CACHE num|NOCACHE]
語法解析:
① START WITH:從某一個整數開始,升序默認值是 1,降序默認值是-1。
② INCREMENT BY:增加數。若是是正數則升序生成,若是是負數則降序生成。升序默
認值是 1,降序默認值是-1。
③ MAXVALUE:指最大值。
④ NOMAXVALUE:這是最大值的默認選項,升序的最大值是: 1027,降序默認值是-1。
⑤ MINVALUE:指最小值。
⑥ NOMINVALUE:這是默認值選項,升序默認值是 1,降序默認值是-1026。
⑦ CYCLE:表示若是升序達到最大值後,從最小值從新開始;若是是降序序列,達到最
小值後,從最大值從新開始。
⑧ NOCYCLE:表示不從新開始,序列升序達到最大值、降序達到最小值後就報錯。默
認 NOCYCLE。
⑨ CACHE:使用 CACHE 選項時,該序列會根據序列規則預生成一組序列號。保留在內
存中,當使用下一個序列號時,能夠更快的響應。當內存中的序列號用完時,系統
再生成一組新的序列號,並保存在緩存中,這樣能夠提升生成序列號的效率。 Oracle
默認會生產 20 個序列號。
案例:建立一個從 1 開始,默認最大值,每次增加 1 的序列,要求 NOCYCLE,緩存中
有 30 個預先分配好的序列號。
代碼演示:生成序列號
SQL> CREATE SEQUENCE MYSEQ
2 MINVALUE 1
3 START WITH 1
4 NOMAXVALUE
5 INCREMENT BY 1
6 NOCYCLE
7 CACHE 30
8 /
序列建立以後,能夠經過序列對象的 CURRVAL 和 NEXTVAL 兩個「僞列」 分別訪問該序
列的當前值和下一個值。
代碼演示:序列修改和刪除
SQL> ALTER SEQUENCE MYSEQ
2 MAXVALUE 10000
3 MINVALUE -300
4 /
SEQUENCE ALTERED
SQL> DROP SEQUENCE MYSEQ;
SEQUENCE DROPPED
視圖:
索引:
表空間:
語法結構:建立表空間
CREATE TABLESPACE 空間名稱
DATAFILE '文件名1' SIZE 數字M
[,'文件名2' SIZE 數字….]
EXTENT MANAGEMENT LOCAL
UNIFORM SIZE 數字M
語法解析:
1. 文件名包括完整路徑和文件名,每一個數據文件定義了文件的初始大小,初始大小一
般以「 M」爲單位。一個表空間中能夠有多個數據文件。
2. EXTENT MANAGEMENT LOCAL 指明表空間類型是: 本地管理表空間。本地管理表空
間要求 Oracle 中的數據分區( Extent) 大小統一。
3. UNIFORM SIZE:指定每一個分區的統一大小。
代碼演示:爲某一用戶指定默認表空間
SQL> CREATE USER ACONG IDENTIFIED BY ACONG
2 DEFAULT TABLESPACE MYSPACE
3 /
代碼演示:爲表指定表空間
SQL> CREATE TABLE SCORES
2 (
3 ID NUMBER ,
4 TERM VARCHAR2(2),
5 STUID VARCHAR2(7) NOT NULL,
6 EXAMNO VARCHAR2(7) NOT NULL,
7 WRITTENSCORE NUMBER(4,1) NOT NULL,
8 LABSCORE NUMBER(4,1) NOT NULL
9 )
10 TABLESPACE MYSPACE
11 /
代碼演示:爲索引指定表空間
SQL> CREATE INDEX UQ_ID ON SCORES(ID)
2 TABLESPACE MYSPACE;
9、數據庫導入與導出
代碼演示:exp 的交互環境
D:\>exp scott/tiger@my_orcl ①
Export: Release 10.2.0.3.0 - Production on 星期一 10月 19 17:04:14 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
鏈接到: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options
輸入數組提取緩衝區大小: 4096 > ②
導出文件: EXPDAT.DMP > scott.dmp ③
(2)U(用戶), 或 (3)T(表): (2)U > 2 ④
導出權限 (yes/no): yes > yes ⑤
導出表數據 (yes/no): yes > yes ⑥
壓縮區 (yes/no): yes > no ⑦
參數名 說明
USERID 表示「用戶名/密碼」。
BUFFER 數據緩衝區大小。以字節爲單位,通常在 64000 以上。
FILE 指定輸出文件的路徑和文件名。通常以.dmp 爲後綴名,注意該文件包括完整路徑,可是 路徑必須存在,導出命令不能自動建立路徑。
COMPRESS 是否壓縮導出,默認 yes。
GRANTS 是否導出權限,默認 yes
INDEXES 是否導出索引,默認 yes
DIRECT 是否直接導出,默認狀況,數據先通過 Oracle 的數據緩衝區,而後再導出數據。
LOG 指定導出命令的日誌所在的日誌文件的位置。
ROWS 是否導出數據行,默認導出全部數據。
CONSTRAINTS 是否導出表的約束條件,默認 yes
PARFILE 能夠把各類參數配置爲一個文本鍵值形式的文件,該參數能夠指定參數文件的位置。
TRIGGERS 是否導出觸發器,默認值是 yes。
TABLES 表的名稱列表,導出多個表可使用逗號隔開。
TABLESPACES 導出某一個表空間的數據。
Owner 導出某一用戶的數據。
Full 導出數據庫的全部數據。默認值是 no
IMP 程序導入就是把 Exp 導出的文件從新導入到數據庫的過程。導入時也有一些重要的
參數:
1.Fromuser:指出導出時 dmp 文件中記載的用戶信息。
2.Touser:dmp 文件要導入到什麼目標用戶中。
3.Commit:默認是 N,在緩衝區滿時是否須要 commit,若是設爲 N,須要較大的回滾段。
4.Igore: Oracle在恢復數據的過程當中,當恢復某個表時,該表已經存在,就要根據 ignore
參數的設置來決定如何操做。若 ignore=y, Oracle 不執行 CREATE TABLE 語句,直接
將數據插入到表中,若是插入的記錄違背了約束條件,好比主鍵約束,則出錯的記
錄不會插入,但合法的記錄會添加到表中。若 ignore=n, Oracle 不執行 CREATE TABLE
語句,同時也不會將數據插入到表中,而是忽略該表的錯誤,繼續恢復下一個表。
代碼演示:Imp 導入
D:\>imp system/manager file=employee.dmp fromuser=scott touser=employee
commit=y
IMP常見問題
1、數據庫對象已經存在
通常狀況, 導入數據前應該完全刪除目標數據下的表, 序列, 函數/過程,觸發器等。
數據庫對象已經存在, 按缺省的 imp 參數, 則會導入失敗。
若是用了參數 ignore=y, 會把 exp 文件內的數據內容導入。
若是表有惟一關鍵字的約束條件, 不合條件將不被導入。
若是表沒有惟一關鍵字的約束條件, 將引發記錄重複。
2、數據庫對象有主外鍵約束
不符合主外鍵約束時, 數據會導入失敗。
解決辦法: 先導入主表, 再導入依存表。
disable 目標導入對象的主外鍵約束, 導入數據後, 再 enable 它們。
3、權限不夠
若是要把 A 用戶的數據導入 B 用戶下, A 用戶須要有 imp_full_database 權限。
4、導入大表( 大於 80M ) 時, 存儲分配失敗
默認的 EXP 時, compress = Y, 也就是把全部的數據壓縮在一個數據塊上。
導入時, 若是不存在連續一個大數據塊, 則會導入失敗。
導出 80M 以上的大表時, 記得 compress= N, 則不會引發這種錯誤。
5、Imp 和 Exp 使用的字符集不一樣
若是字符集不一樣, 導入會失敗, 能夠改變 unix 環境變量或者 NT 註冊表裏 NLS_LANG 相
關信息。
6、Imp 和 Exp 版本不能往上兼容
Imp 能夠成功導入低版本 Exp 生成的文件