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
用於對數據記錄進行操作,包括插入,刪除,修改。需要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(
事務控制語言,包括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邏輯操作符連接這些條件
使用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 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 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 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(轉)