oracle(轉)

Oracle數據庫基本操做sql

1.概述數據庫

Oracle數據庫客戶端通常須要安裝在服務器上,能夠在服務器端操做,通常咱們能夠用sql developer工具遠程鏈接到數據庫,先行創建數據庫,而後對錶進行增刪改查。也可使用MyEclispse的DB Broswer工具進行鏈接數據庫並進行簡單的增刪改查。安全

2SQL語句服務器

Data Definition LanguageDDL):函數

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

CREATE:建立表spa

CREATE TABLE emp(

id NUMBER(10),

name VARCHAR2(20),

gender CHAR(1),

birth DATE,

salary NUMBER(6,2),

);

 

DESC :查詢表結構指針

DESC emp;code

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 LanguageDML

用於對數據記錄進行操做,包括插入,刪除,修改。須要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 LanguageTCL

事務控制語言,包括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 指定字段值非空,至關於非空約束

相關文章
相關標籤/搜索