當前位置:成語大全網 - 新華字典 - oracle裏面更新操作能帶有四則運算嗎

oracle裏面更新操作能帶有四則運算嗎

Oracle數據庫基本操作

1.概述

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

2.SQL語句

Data Definition Language(DDL):

主要用於建立、修改、刪除數據庫對象(表),不需要事務的參與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 Language(DQL)

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邏輯操作符連接這些條件SELECT ename, sal, job FROM emp

WHERE sal> 1000 AND job = 'CLERK';

使用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

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

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 table2ON 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_enameFROM 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 deptnoHAVING 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 All與union功能壹樣,只是它不會去掉重復的數據,會全部顯示。

Intersect表示相交,多次查詢後去相同的數據,即同時滿足兩個查詢條件的數據Minus表示差集,即將第壹個結果集中的數據,減去第二個結果集的數據。即滿足第壹個查詢條件,而不滿足第二查詢條件的數據。

Data Control Language(DCL):

用於執行權限的授予和收回操作、創建用戶等,包括授予(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 empWHERE 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