1. 程式人生 > >oracle(轉)

oracle(轉)

exp 執行權 sql 表操作 right manager 默認 字段值 但是

Oracle數據庫基本操作

1.概述

Oracle數據庫客戶端一般需要安裝在服務器上,可以在服務器端操作,一般我們可以用sql developer工具遠程連接到數據庫,先行建立數據庫,然後對表進行增刪改查。也可以使用MyEclispse的DB Broswer工具進行連接數據庫並進行簡單的增刪改查。

2SQL語句

Data Definition LanguageDDL):

主要用於建立、修改、刪除數據庫對象(表),不需要事務的參與

CREATE:創建表

CREATE TABLE emp(

id NUMBER(10),

name VARCHAR2(20),

gender CHAR(1),

birth DATE,

salary NUMBER(
6,2), );

DESC :查詢表結構

DESC emp;

RENAME:重命名表名

RENAME emp TO employee;

DROP:刪除表

DROP TABLE emp;

ALTER:列(字段)操作

ADD:增加字段

ALTER TABLE employee ADD (birth DATE DEFAULT sysdate);

MODITY:修改字段

ALTER TABLE employee MODIFY (name VARCHAR2(40) DEFAULT ‘CLERK‘ );

DROP:刪除字段

ALTER TABLE employee DROP (birth);

Data Manipulation Language

DML

用於對數據記錄進行操作,包括插入,刪除,修改。需要commit才能真正確認操作,如果需要撤銷則rollback。

INSERT INTO:插入數據

INSERT INTO employee(id, name, salary) VALUES(1001, ‘rose‘, 5500);

UPDATE…SET..:更新數據

UPDATE employee SET salary = 8500 WHERE name = ‘ROSE‘;

DELETE FROM:刪除記錄

DELETE FROM employee WHERE job is null;

Transaction Control Language

TCL

事務控制語言,包括commit提交,rollback回滾,savepoint保存點(可以回退到指定保存點)。在sql developer中為圖標。

Data Query LanguageDQL

SQL基礎查詢:

查詢語句的執行順序

FROM 子句:執行順序為從後往前、從右到左。數據量較少的表盡量放在後面。

WHERE子句:執行順序為自下而上、從右到左。將能過濾掉最大數量記錄的條件寫在WHERE 子句的最右。

GROUP BY執行順序從左往右分組,最好在GROUP BY前使用WHERE將不需要的記錄在GROUP BY之前過濾掉。

HAVING 子句:消耗資源。盡量避免使用,HAVING 會在檢索出所有記錄之後才對結果集進行過濾,需要排序等操作。

SELECT子句:少用*號,盡量取字段名稱。ORACLE 在解析的過程中, 通過查詢數據字典將*號依次轉換成所有的列名, 消耗時間。

ORDER BY子句:執行順序為從左到右排序,消耗資源。

也就是從哪張表中以什麽樣的限制條件確定數據內容,再通過分組與進一步限制分組條件得到一個處理過的數據,最後選擇出來,如有需要,則對最後選擇的數據進行排序。

FROM子句:

From後接表名,from前可以可以是*,但是不建議(查詢效率低),一般接要查詢的字段名。分組函數,字段和表名都可以使用別名,不加引號數據庫中為大寫,加引號別名可以用空格小寫等。

WHERE子句:

當查詢條件中和數字比較,可以使用單引號引起,也可以不用,當和字符及日期類型的數據比較,則必須用單引號引起。

使用條件判斷:>,<,<=,<=,!=,<>,=。

SELECT ename, sal FROM emp WHERE sal< 2000;

SELECT ename, sal, job FROM emp WHERE job = ‘SALESMAN‘;

SELECT ename, sal, hiredate FROM emp

WHERE hiredate>todate(‘2002-1-1‘,‘YYYY-MM-DD‘);

使用AND/OR關鍵字

如果希望返回的結果必須滿足多個條件,應該使用AND邏輯操作符連接這些條件

如果希望返回的結果滿足多個條件之一即可,應該使用OR邏輯操作符連接這些條件

使用LIKE條件

SELECT ename, job FROM emp WHERE ename LIKE ‘_A%‘;(第二個字母為A)

_A%’_表示占位一個字符,%表示0到多個字符。

使用IN/NOT IN

WHERE子句中可以用比較操作符IN(list)來取出符合列表範圍中的數據。其中的參數list表示值列表,當列或表達式匹配於列表中的任何一個值時,條件為TRUE,該條記錄則被顯示出來。

SELECT ename, job FROM emp WHERE job IN (MANAGER, CLERK);

使用BETWEEN 1 AND 2

用來查詢符合(12)值域範圍之內的數據,通常查詢數字和日期類型的數據範圍。

SELECT ename, sal FROM emp

WHERE sal BETWEEN 1500 AND 3000;

使用IS NULL和IS NOT NULL

條件篩選值為空的記錄,空值不能用‘=’來判斷。

使用ANY和ALL條件

在比較運算符中,可以出現ALL和ANY,表示“全部”和“任一”,

> ANY : 大於最小< ANY:小於最大> ALL:大於最大< ALL:小於最小

SELECT empno, ename, job, sal, deptno

FROM emp WHERE

sal> ANY (SELECT sal FROM emp WHERE job = ‘SALESMAN‘);

查詢條件中使用算術表達式

當查詢需要對選出的字段進行進一步計算,可以在數字列上使用算術表達式(+、-、*、/)。表達式符合四則運算的默認優先級,如果要改變優先級可以使用括號。

SELECT ename, sal, job FROMempWHERE ename = UPPER(rose);

SELECT ename, sal, job FROM empWHERE sal * 12 >100000;

使用DISTINCT過濾重復

DISTINCT必須緊跟SELECT,後面可以有多個字段,表示過濾掉多個字段都重復的選項,第二例中不顯示重復的deptno和job相同的記錄。

SELECT DISTINCT deptno FROM emp;

SELECT DISTINCT deptno, job FROM emp;

使用ORDER BY子句

對查詢數據按照一定的規則排序,則使用order by子句,order by子句必須為select子句的最後一個子句。默認升序排列,從小到大,ASC表示升序。DESC表示降序,從大到小。

SELECT ename, sal FROM emp

ORDER BY sal DESC;

Order by多個列,每個列需要單獨指定排序規則,先按照第一個字段排序,當第一個字段的值相同時,再按照第二個字段的值排序。

聚合函數分組函數

當需要統計的數據並不能在表裏直觀列出,而是需要根據現有的數據計算得到結果,這種功能可以使用聚合函數來實現。

因為是多行數據參與運算返回一行結果,也稱作分組函數、多行函數、集合函數。用到的關鍵字:GOURP BY 按什麽分組,HAVING進一步限制分組結果

MAX和MIN

用來取得列或者表達式的最大最小值,包括數字,字符和日期。

SELECT MAX(sal) max_sal, MIN(sal) min_sal FROM emp;

AVG和SUM

用來統計列或者表達式的平均值和求和,只能處理數字類,並且平均值忽略NULL。

SELECT AVG(sal) avg_sal, SUM(sal) sum_sal FROM emp;

COUNT

用來計算表中的記錄條數,同樣忽略NULL。

SELECT COUNT(job) total_num FROM emp;

空值的操作

NVL(expr1, expr2):將NULL轉變為非NULL值。如果expr1為NULL,則取值expr2, expr2是非空值。

NVL2(expr1, expr2, expr3):和NVL函數功能類似,都是將NULL轉變為非空值。NVL2用來判斷expr1是否為NULL,如果不是NULL,返回expr2,如果是NULL,返回expr3。

GROUP BY子句

Group by是表示對表中某個字段進行分組,值相同為一組,而分組函數的意思則是對這每一個組進行計算,平均值或是最大最小值。

HAVING子句

是對分組後的結果進行進一步的限制,HAVING子句必須緊跟在GROUP BY子句後,不能單獨存在。限制分組條件不能放在WHERE子句中。

SELECT deptno, MAX(sal) max_sal FROM emp

GROUP BY deptno HAVING MAX(sal) >4000;

SQL關聯查詢:

概述,在實際應用中,往往我們所需要的數據是分布在不同的表上的,我們想要獲取數據必須跨表格查詢。

關聯有兩種方式:

SELECT table1.column, table2.column

FROM table1, table2

WHERE table1.column1 = table2.column2;

SELECT table1.column, table2.column

FROM table1JOIN table2

ON(table1.column1 = table2.column2);

關聯查詢有三種連接方式

內連接返回關聯表中所有滿足條件的記錄(也稱等值連接)

外連接返回一些不滿足條件的記錄,外連接有左外連接,右外連接和全外連接三種形式

其中左外連接返回左邊所有記錄而不必管右邊是否匹配,如不匹配則為NULL值,

右外連接返回右邊所有記錄而不必管左邊的記錄是否匹配,如不匹配則默認NULL,

全外連接返回左邊和右邊所有的數據,左右邊不匹配的數據,對應的其他字段值為NULL,

格式如下

JOIN ON式

SELECT table1.column, table2.column

FROM table1 [LEFT | RIGHT | FULL] JOIN table2

ON table1.column1 = table2.column2;

WHERE式

Select * from dave a,bl b where a.id=b.id(+);

+號的位置和意義

‘+’號加在哪個表,哪個表就是關聯表,另一張表就是基表。基表全部顯示,關聯表匹配顯示。+在左邊就是右外連接,+在右邊就是左外連接。

自連接:

表示數據的來源是同一張表的內容,即將一張表中的不同列進行連接,可以是等值或者不等值。實現方式是利用別名將一張表看作兩張表。

SELECT worker.empnow_empno,worker.enamew_ename, manager.empnom_empno, manager.enamem_ename

FROM emp worker join emp manager

ON worker.mgr = manager.empno;

SQL高級查詢:

子查詢:

子查詢用在WHERE

SELECT中,往往WHERE的限制條件並不是一個確定的值,而是來源於另一個查詢結果,即需要在另一個查詢結果的基礎上進行查詢,這個時候為另一個查詢提供數據的查詢就叫做子查詢。

SELECT e.ename, e.job FROM emp e

WHERE e.job = (SELECT job FROM emp WHERE ename = SCOTT);

可以與多行/單行比較操作符混合使用。

子查詢用在HAVING子句

SELECT deptno, MIN(sal) min_sal FROM emp GROUP BY deptno

HAVING MIN(sal) > (SELECT MIN(sal) FROM emp WHERE deptno = 30);

表示分組條件需要滿足的條件。可以把子查詢當成一個結果。

子查詢用在FROM部分

子查詢用在FROM子句中,子查詢可稱為行內視圖或者匿名試圖,可以把它當成一張單獨的表,用別名進行標識。

子查詢用在SELECT子句中

可以認為是外連接的一張表現

分頁查詢:

ROWNUM

偽列,返回標識行數據順序的數字,偽列並不是真正的列數據,只是用來顯示行數,並不能單獨作為一列進行分組操作。

ROWNUM的結果從第一行數據之上開始,每查詢到一條數據則指針下移一個,所以只有查詢到數據後才能夠出現偽列數字,因此不能直接用在where裏,如果要利用ROWNUM截取結果集的部分數據,可以將含有ROWNUM偽列的SELECT子句放在FROM內,作為視圖,供外部的SELECT語句使用,此時的偽列已形成順序數據,可以進行分組函數操作。

也就是將ROWNUM先作為行內視圖的一個列,在主查詢中就可以使用這個列值作為條件。

SELECT  * FROM  (SELECT  ROWNUMrn , e.* FROM emp e ) 

 WHERE rn BETWEEN 8 AND 10;

使用子查詢和ROWNUM進行分頁

分頁操作需要有一個作為分頁標準的數據,該數據線進行排序,排序的結果作為視圖被父查詢用偽列標識順序數字,然後在最外面的爺爺查詢對偽列進行分頁。

如:

SELECT  * FROM

  (SELECT  ROWNUMrn , t.* FROM

    (SELECT empno,ename,sal FROM emp

     ORDER BY sal DESC)  t

  ) 

 WHERE rn BETWEEN 8 AND 10;

DECODE函數

DECODE (expr, search1, result1[, search2, result2…][, default])

它用於比較參數expr的值,如果匹配到哪一個search條件,就返回對應的result結果,可以有多組search和result的對應關系,如果任何一個search條件都沒有匹配到,則返回最後default的值。default參數是可選的,如果沒有提供default參數值,當沒有匹配到時,將返回NULL。

SELECT ename, job, sal,

DECODE(job, MANAGER, sal * 1.2,

               ANALYST, sal * 1.1,

              SALESMAN, sal * 1.05,

sal) bonus

FROM emp;

SELECT deptno, dname, loc

FROM dept

ORDER BY

DECODE(dname, 研發部,1,市場部,2,銷售部,3), loc;

分組函數

ROW_NUMBER

ROW_NUMBER()

OVER (PARTITION BY deptno ORDER BY empno)

根據deptno分組,在分組內根據empno內排序,比ROWNUM功能更強。可以直接從結果集中取出子集

RANK

RANK() OVER( PARTITION BY col1 ORDER BY col2)

功能與上相同,不同在於存在並列,並列第二跳過第三直接第四的規則。

DENSE_RANK

如果有並列第二,下一個排序將是三。

高級分組函數

ROLLUP

如果對兩個字段rollup,那麽第一個字段相同的值會當成一組,如果有分組函數求和,就會對第一字段所有的數據求和,單獨成行。此時第二字段值為空。可以用於統計年度銷售(工資)和。

CUBE

CUBE函數對字段進行排列統計,比如三個字段的CUBE運算,將三個字段排列成6種情況具體需要使用的時候再參考百度。

GROUPING()

GROUPING只能在使用ROLLUP或CUBE的查詢中使用。當需要在返回空值的地方顯示某個值時,GROUPING()就非常有用。案例情況復雜,具體使用時再說。

集合操作

UNION、UNION ALL、INTERSECT、MINUS

Union表示取多次SELECT結果的並集,如果去掉重復的數據。

Union Allunion功能一樣,只是它不會去掉重復的數據,會全部顯示。

Intersect表示相交,多次查詢後去相同的數據,即同時滿足兩個查詢條件的數據

Minus表示差集,即將第一個結果集中的數據,減去第二個結果集的數據。即滿足第一個查詢條件,而不滿足第二查詢條件的數據。

Data Control LanguageDCL:

用於執行權限的授予和收回操作、創建用戶等,包括授予(GRANT)語句,收回(REVOKE)語句,CREATE USER語句,其中GRANT用於給用戶或角色授予權限, REVOKE用於收回用戶或角色已有的權限。DCL語句也不需要事務的參與,是自動提交的。

GRANT CREATE VIEW TO tarena;

3.視圖、索引、序列、約束

視圖

視圖本質上是一條SELECT語句,當SELECT子查詢在from子句中,可以把SELECT子句的結果當作一個視圖。視圖本身只是基表的映射,只是把基表中的數據顯示出來,可以把視圖當成表看待,所有操作都與表操作極其相似。

視圖有三種,簡單視圖不包括函數,復雜視圖包含了分組函數等附加的內容,連接視圖是基於多個表的。

視圖的優劣點:

如果需要經常執行某項復雜查詢,可以基於這個復雜查詢建立視圖,此後查詢此視圖即可,簡化復雜查詢;視圖本質上就是一條SELECT語句,所以當訪問視圖時,只能訪問到所對應的SELECT語句中涉及到的列,對基表中的其它列起到安全和保密的作用,可以限制數據訪問。

同時因為視圖本質是基表的數據,所以對視圖的操作會影響到基表從而不安全。這裏可以使用WITH READ ONLY來限制對視圖的DML語言。

CREATE OR REPLACE VIEW v_emp_10

AS

SELECT empno, ename, sal, deptno FROM emp

WHERE deptno = 10

WITH READ ONLY;

使用DCL語句可以授權用戶創建視圖的權限

GRANT CREATE VIEW TO tarena;

創建簡單視圖

CREATE VIEW v_emp_10

AS

SELECT empno, ename, sal, deptno

FROM emp

WHERE deptno = 10;

查詢視圖

SELECT id, name, salary FROM v_emp_10;

對視圖的DML操作

簡單視圖可以進行DML操作,但是操作的對象必須是基表裏視圖包含的字段,即對視圖可見。而且簡單視圖的DML操作會對影響基表數據。

WITH CHECK OPTION短語表示,通過視圖所做的修改,必須在視圖的可見範圍內,無論是INSERT UPDATE DELETE操作都必須在視圖範圍內,超過視圖範圍不可用。

CREATE [OR REPLACE] VIEW view_name[(alias[, alias…])]

AS subquery

[WITH CHECK OPTION];

刪除視圖

DROP VIEW v_emp_10;

對視圖的刪除不會導致基表數據的丟失,不會影響基表數據。

序列

序列(SEQUENCE)是一種用來生成唯一數字值的數據庫對象。序列的值由Oracle程序按遞增或遞減順序自動生成,通常用來自動產生表的主鍵值,是一種高效率獲得唯一鍵值的途徑。

序列是獨立的數據庫對象,和表是獨立的對象,序列並不依附於表。

通常情況下,一個序列為一個表提供主鍵值,但一個序列也可以為多個表提供主鍵值。

CREATE SEQUENCE [schema.]sequence_name

    [ START WITH i ] [ INCREMENT BY j ]

    [ MAXVALUE m | NOMAXVALUE ]

    [ MINVALUE n | NOMINVALUE ]

[ CYCLE | NOCYCLE ][ CACHE p | NOCACHE ]

創建一個序列,起始數據是100,步進是10:

CREATE SEQUENCE emp_seq

START WITH 100

INCREMENT BY 10;

NEXTVAL:獲取序列的下個值

CURRVAL:獲取序列的當前值

當序列創建以後,必須先執行一次NEXTVAL,之後才能使用CURRVAL

獲取序列的第一個值,並且使用序列值為EMP表插入新的記錄:

刪除序列

DROP SEQUENCE emp_seq;

索引

創建索引

CREATE [UNIQUE] INDEX index_name

        ON table(column[, column…]);

index_name表示索引名稱

table表示表名

column表示列名,可以建立單列索引或復合索引

UNIQUE表示唯一索引

CREATE INDEX idx_emp_job_sal ON emp(job, sal);

可以增加函數

CREATE INDEX emp_ename_upper_idx

ON emp(UPPER(ename));

重建索引,提高索引空間利用率

ALTER INDEX index_name REBUILD;

刪除索引

DROP INDEX idx_emp_ename;

為提升查詢效率,創建和使用索引的原則:

1.為經常出現在WHERE子句中的列創建索引

2.為經常出現在ORDER BY、DISTINCT後面的字段建立索引。如果建立的是復合索引,索引的字段順序要和這些關鍵字後面的字段順序一致

3.為經常作為表的連接條件的列上創建索引

4.不要在經常做DML操作的表上建立索引

5.不要在小表上建立索引

6.限制表上的索引數目,索引並不是越多越好

7.刪除很少被使用的、不合理的索引

約束

CONSTRAINT

非空約束(Not Null),簡稱NN

創建表時添加約束

CONSTRAINT employees_hiredate_nn NOT NULL

修改表時增加非空約束

ALTER TABLE employees

MODIFY (eid NUMBER(6) NOT NULL);

修改表時取消非空約束

ALTER TABLE employees

MODIFY (eid NUMBER(6));

唯一性約束(Unique),簡稱UK

CONSTRAINT employees_email_uk UNIQUE(email)

ALTER TABLE employees

ADD CONSTRAINT employees_name_uk UNIQUE(name);

主鍵約束(Primary Key),簡稱PK

在主鍵約束下的單字段或者多字段組合上不允許有空值,也不允許有重復值。

主鍵應是對系統無意義的數據

永遠也不要更新主鍵,讓主鍵除了唯一標識一行之外,再無其他的用途

主鍵不應包含動態變化的數據,如時間戳

主鍵應自動生成,不要人為幹預,以免使它帶有除了唯一標識一行以外的意義

主鍵盡量建立在單列上

ALTER TABLE employees3

ADD CONSTRAINT

employees3_eid_pk PRIMARY KEY (eid);

外鍵約束(Foreign Key),簡稱FK

ALTER TABLE employees4

ADD CONSTRAINT employees4_deptno_fk

FOREIGN KEY (deptno) REFERENCES dept(deptno);

檢查約束(Check),簡稱CK

檢查(Check)約束條件用來強制在字段上的每個值都要滿足Check中定義的條件。當定義了Check約束的列新增或修改數據時,數據必須符合Check約束中定義的條件。

ALTER TABLE employees4

ADD CONSTRAINT employees4_salary_check

CHECK (salary > 2000);

其他

DEFAULT指定字段默認值

NOT NULL 指定字段值非空,相當於非空約束

oracle(轉)