[1].建立表空間數據庫
CREATE TABLESPACE SYPRO_201310 DATAFILE 'F:\ORACLE_11G\oradata\orcl\SYPRO_201310.DBF' SIZE 10M AUTOEXTEND ON 編程
在指定的F盤下建立一個名SYPRO_201310.DBF的文件初始空間是10M當空間不足時自動增長數組
[2].刪除表空間同時刪除表空間全部硬盤上的物理文件緩存
DROP TABLESPACE SYPRO_201310 INCLUDING CONTENTS AND DATAFILES 函數
[3].查看當前用戶全部表空間學習
SELECT * FROM DBA_TABLESPACES 測試
[4].建立用戶liutao 密碼 liutao 默認表空間 SYPRO_201310 臨時表空間 TEMP編碼
CREATE USER liutao IDENTIFIED BY liutao DEFAULT TABLESPACE SYPRO_201310 TEMPORARY TABLESPACE TEMP spa
[5].用戶受權-鏈接數據庫的權限排序
GRANT CONNECT TO LIUTAO WITH ADMIN OPTION
[6].用戶受權-數據庫管理員DBA角色
GRANT DBA TO LIUTAO WITH ADMIN OPTION
-- 建立表空間
CREATE TABLESPACE BOAICRM_201310 DATAFILE 'F:\ORACLE_11G\oradata\orcl\BOAICRM_201310.DBF' SIZE 50M AUTOEXTEND ON ;
-- 建立用戶
CREATE USER BOAI IDENTIFIED BY BOAI DEFAULT TABLESPACE BOAICRM_201310 TEMPORARY TABLESPACE TEMP ;
-- 用戶受權
GRANT DBA TO BOAI WITH ADMIN OPTION ;
[7].刪除用戶
DROP USER LIUTAO
[8].刪除登陸數據庫的權限
REVOKE CONNECT FROM LIUTAO
=========修改數據表的一些經常使用操做=========
A.快速複製表結構但不復製表中的數據的方法:
CREATE TABLE TB_STUDENT_NEW AS SELECT * FROM TB_STUDENT_OLD WHERE 1 = 2 ;
B.快速複製表結構和表中的數據的方法:
CREATE TABLE TB_STUDENT_NEW AS SELECT * FROM TB_STUDENT_OLD
[9].修改已建立的表-添加字段
ALTER TABLE TB_STUDENT ADD EMAIL VARCHAR2(50)
[10].修改已建立的表-從新定義字段屬性
ALTER TABLE TB_STUDNET MODIFY EMAIL VARCHAR2(100)
[11].修改已建立的表-刪除字段
ALTER TABLE TB_STUDNET DROP COLUMN EMAIL
[12].修改已建立的表-字段重命名
ALTER TABLE TB_STUDNET RENAME COLUMN EMAIL TO EMAIL_163
[13].修改已建立的表-表重命名
RENAME TB_STUDNET TO TD_STUDNET
[14].給表加註釋
COMMENT ON TABLE TB_STUDNET IS '學生表'
[15].給字段加註釋
COMMENT ON COLUMN TB_STUDENT.EMAIL IS '郵箱'
[16].刪除表
DROP TABLE TB_STUDNET 保留回滾段可恢復
DROP TABLE TB_STUDNET Purge 刪除後不可恢復
[17].恢復已刪除的表-10G新特性
FlashBack TABLE TB_STUDNET TO BEFORE DROP
=========數據表的約束和維護=========
[18].添加約束
ALTER TABLE TB_STUDENT ADD CONSTRAINTS TB_STUDENT_ID_PK PRIMARY KEY ID 主鍵約束
ALTER TABLE TB_STUDENT ADD CONSTRAINTS TB_STUDENT_EMAIL_UK UNIQUE EMAIL 惟一性約束
ALTER TABLE TB_STUDENT ADD CONSTRAINTS TB_STUDENT_CLASS_ID_FK FOREIGN KEY (CLASS_ID) REFERENCES TB_CLASS (CLASS_ID) 外鍵約束
[19].刪除約束
ALTER TABLE TB_STUDENT DROP CONSTRAINTS TB_STUDENT_CLASS_ID_FK
[20].禁用約束
ALTER TABLE TB_STUDENT DISABLE CONSTRAINTS TB_STUDENT_CLASS_ID_FK
[21].激活約束
ALTER TABLE TB_STUDENT ENABLE CONSTRAINTS TB_STUDENT_CLASS_ID_FK
[22].用戶解鎖
ALTER USER SCOTT ACCOUNT UNLOCK
[23].從新設密碼
ALTER USER SCOTT IDENTIFIED BY TIGER
===========PL/SQL編程部分=========
[24].PLSQL語法規則:
DECLARE
/**聲明部分在此處聲明要使用的變量、遊標、以及局部的存儲過程及函數。**/
BEGIN
/** 執行部分過程及SQL **/
EXCEPTION
/** 異常處理部分 **/
END
/** 結束部分 **/
DECLARE
STR varchar(50):='HELLOWORD' ;
BEGIN
STR:=STR || 'LIUTAO' ;
dbms_output.put_line(STR) ;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('發生錯誤');
END ;
其中 := 是賦值符號 || 是字符鏈接符號 dbms_output.put_line()是一個輸出方法
[1].--查詢功能實現
DECLARE
V_ID NUMBER ;
V_NAME VARCHAR(50) ;
BEGIN
SELECT STU_ID,STU_NAME
INTO V_ID ,V_NAME FROM TB_STUDENT
WHERE STU_ID = 11 ;
dbms_output.put_line('V_ID=' || V_ID) ;
dbms_output.put_line('V_NAME=' || V_NAME);
END ;
[2].--添加功能
DECLARE
BEGIN
INSERT INTO TB_STUDENT(STU_ID,STU_NAME,STU_AGE) VALUES(20,'劉江紅',10) ;
commit;
END ;
%TYPE 和 %ROWTYPE 用來表示不肯定類型
%TYPE 能夠理解成對數據庫表一個字段的副本
%ROWTYPE 能夠理解成對數據庫一行記錄提取出來的一個副本
[3].-- %TYPE用法示例 :
DECLARE
V_STU_ID TB_STUDENT.STU_ID%TYPE ;
V_STU_NAME TB_STUDENT.STU_NAME%TYPE ;
V_STU_AGE TB_STUDENT.STU_AGE%TYPE ;
BEGIN
SELECT STU_ID ,STU_NAME,STU_AGE INTO V_STU_ID ,V_STU_NAME,V_STU_AGE FROM TB_STUDENT WHERE STU_ID = 14 ;
DBMS_OUTPUT.PUT_LINE('STU_ID=' || V_STU_ID);
DBMS_OUTPUT.PUT_LINE('STU_NAME=' || V_STU_NAME) ;
DBMS_OUTPUT.PUT_LINE('STU_AGE=' || V_STU_AGE) ;
END ;
[4].-- %ROWTYPE用法示例 :
DECLARE
V_TB_STU_ROW TB_STUDENT%ROWTYPE ;
BEGIN
SELECT * INTO V_TB_STU_ROW FROM TB_STUDENT WHERE STU_ID=10;
DBMS_OUTPUT.PUT_LINE('STU_ID=' || V_TB_STU_ROW.STU_ID) ;
DBMS_OUTPUT.PUT_LINE('STU_NAME=' || V_TB_STU_ROW.STU_NAME) ;
DBMS_OUTPUT.PUT_LINE('STU_AGE=' || V_TB_STU_ROW.STU_AGE) ;
DBMS_OUTPUT.PUT_LINE('STU_SEX=' || V_TB_STU_ROW.STU_SEX) ;
END ;
[5].複合數據類型 特色包含多個內部組件、用於存放多個值。須要先定義類型而後用該類型可重複定義多個變量
1.數組 VARRAY
語法:TYPE TYPE_NAME IS VARRAY (MAXINUM_SIZE) OF ELEMENT_TYPE
TYPE_NAME : 可變數組的名稱
MAXINUM_SIZE : 可變數組元素的最大數目
ELEMNET_TYPE : 數組元素的類型
可變數組的下標從1開始
用法示例 :
-- VARRAY 用法示例 :
DECLARE
TYPE ARY IS VARRAY (5) OF VARCHAR2(20) ;
V_ARY ARY := ARY('LIUTAO','MANY','KING','SAN','ABBY') ; /** 不能直接使用需賦值給一個變量 **/
BEGIN
DBMS_OUTPUT.PUT_LINE(V_ARY(1)) ;
DBMS_OUTPUT.PUT_LINE(V_ARY(2)) ;
DBMS_OUTPUT.PUT_LINE(V_ARY(3)) ;
DBMS_OUTPUT.PUT_LINE(V_ARY(4)) ;
DBMS_OUTPUT.PUT_LINE(V_ARY(5)) ;
END ;
=======================================
2.可變數組 TABLE 與JAVA中的數組相似、能夠理解成可變數組、下標無限、按照二進制進行索引
-- TABLE 用法示例 :
DECLARE
TYPE ARY IS TABLE OF VARCHAR(30) INDEX BY BINARY_INTEGER ;
V_LIST ARY ;
BEGIN
V_LIST(10) := 'HELLOWORD_LIUTAO' ;
V_LIST(12) := 'WHERE AND STU_ID' ;
DBMS_OUTPUT.PUT_LINE('V_LIST(10) = ' || V_LIST(10)) ;
DBMS_OUTPUT.PUT_LINE('V_LIST(12) = ' || V_LIST(12)) ;
END ;
=======================================
3.RECORD 能夠理解成JAVA中的集合類型
-- RECORD 用法示例 :
DECLARE
TYPE ARY IS RECORD (
V_ID NUMBER ,
V_NAME TB_STUDENT.STU_NAME%TYPE ,
V_TB_STU TB_STUDENT%ROWTYPE
) ;
V_STUDENT ARY ;
BEGIN
SELECT STU_ID , STU_NAME , STU_AGE , STU_BIRTHDAY , STU_SEX INTO V_STUDENT.V_ID , V_STUDENT.V_NAME ,
V_STUDENT.V_TB_STU.STU_AGE , V_STUDENT.V_TB_STU.STU_BIRTHDAY , V_STUDENT.V_TB_STU.STU_SEX FROM TB_STUDENT WHERE STU_ID = 10 ;
DBMS_OUTPUT.PUT_LINE(V_STUDENT.V_ID) ;
DBMS_OUTPUT.PUT_LINE(V_STUDENT.V_NAME) ;
DBMS_OUTPUT.PUT_LINE(V_STUDENT.V_TB_STU.STU_AGE) ;
DBMS_OUTPUT.PUT_LINE(V_STUDENT.V_TB_STU.STU_BIRTHDAY) ;
DBMS_OUTPUT.PUT_LINE(V_STUDENT.V_TB_STU.STU_SEX) ;
END ;
[6].PLSQL異常處理部分實例 :
-- 異常處理
DECLARE
TB_ROWS TB_STUDENT%ROWTYPE ;
V_SQL_CODE VARCHAR2(200) ;
V_SQL_MSG VARCHAR2(200) ;
BEGIN
SELECT * INTO TB_ROWS FROM TB_STUDENT ;
DBMS_OUTPUT.PUT_LINE('STU_NAME = ' || TB_ROWS.STU_NAME) ;
EXCEPTION -- 處理異常通用將異常信息記錄到數據庫表中保存
WHEN OTHERS THEN
V_SQL_CODE := SQLCODE ; -- 返回錯誤編碼
V_SQL_MSG := SQLERRM ; -- 返回錯誤信息
INSERT INTO TB_ERROR (ID,TABLE_NAME,SQL_CODE,SQL_MSG) VALUES (TB_ERROR_SEQ.NEXTVAL ,'TB_STUDENT',V_SQL_CODE,V_SQL_MSG) ;
COMMIT ;
END ;
[7].PLSQL流程控制語句與循環語句實例 :
[7.1] ************ 流程控制分支語句 ************
-- 語法規則
-- IF (條件) THEN 執行的語句
-- ELSIF (條件) THEN 執行的語句
-- ELSE
-- END IF ;
DECLARE
V_STR VARCHAR2(20) := 'LIUTAO' ;
BEGIN
IF (V_STR = 'LIUTAO') THEN
DBMS_OUTPUT.PUT_LINE('V_STR = ' || 'LIUTAO') ;
ELSIF (V_STR = 'HELLO') THEN
DBMS_OUTPUT.PUT_LINE('V_STR = ' || 'HELLO') ;
ELSE
DBMS_OUTPUT.PUT_LINE('V_STR = ' || '都不知足條件') ;
END IF ;
END ;
[7.2] ********** 循環語句 簡單循環 LOOP **********
DECLARE
V_INDEX NUMBER := 10 ;
BEGIN
LOOP
V_INDEX := V_INDEX + 1 ;
DBMS_OUTPUT.PUT_LINE(V_INDEX);
EXIT WHEN V_INDEX = 15 ;
END LOOP ;
END ;
[7.3] ***************** 嵌套循環 *****************
DECLARE
V_A NUMBER := 0 ;
V_B NUMBER := 0 ;
BEGIN
LOOP
V_A := V_A + 1 ;
DBMS_OUTPUT.PUT_LINE('V_A = ' || V_A) ;
EXIT WHEN V_A = 4 ; -- 外循環四次
V_B := 0 ;
LOOP
EXIT WHEN V_B = 4 ; -- 內循環再次
V_B := V_B + 2 ;
DBMS_OUTPUT.PUT_LINE('V_B = ' || V_B) ;
END LOOP ;
END LOOP ;
DBMS_OUTPUT.PUT_LINE('結束循環...........') ;
END ;
[7.4] *************** 跳出循環體方法 ***************
DECLARE
V_A NUMBER := 0 ;
V_B NUMBER := 0 ;
BEGIN
<<OUTER>>LOOP -- 加上外層循環標識符 OUTER
V_A := V_A + 1 ;
DBMS_OUTPUT.PUT_LINE('V_A = ' || V_A) ;
EXIT WHEN V_A = 4 ; -- 外循環四次
V_B := 0 ;
<<INNER>>LOOP -- 加上內層循環標識符 OUTER
EXIT OUTER WHEN V_B = 8 ; -- 內循環兩次 當V_B = 8 時結束外層循環
V_B := V_B + 2 ;
DBMS_OUTPUT.PUT_LINE('V_B = ' || V_B) ;
END LOOP ;
END LOOP ;
DBMS_OUTPUT.PUT_LINE('結束循環...........') ;
END ;
[7.5] ************ FOR 循環語句 ****************
BEGIN
FOR V_INDEX IN 1..20 LOOP
DBMS_OUTPUT.PUT_LINE(V_INDEX) ;
END LOOP ;
END ;
[7.6] ************ WHILE 循環語句 ************
DECLARE
V_INDEX NUMBER := 1 ;
BEGIN
WHILE V_INDEX < 10 LOOP
DBMS_OUTPUT.PUT_LINE(V_INDEX);
V_INDEX := V_INDEX + 2 ;
END LOOP ;
END ;
[7.6] ************ 遊標的使用 ************
遊標的做用 :提取結果集
DECLARE
CURSOR C_STUDENT IS SELECT * FROM TB_STUDENT ; -- 定義一個遊標提取表 TB_STUDNET 中的全部數據
C_STUDENT_ROW TB_STUDENT%ROWTYPE ; -- 聲明變量接收結果
BEGIN
OPEN C_STUDENT ; -- 打開遊標
LOOP
FETCH C_STUDENT INTO C_STUDENT_ROW ; -- FETCH關鍵字用來提取一行記錄
EXIT WHEN C_STUDENT%NOTFOUND ; -- 判斷是否還有記錄提取
DBMS_OUTPUT.PUT_LINE('STU_ID = ' || C_STUDENT_ROW.STU_ID || 'STU_NAME = ' || C_STUDENT_ROW.STU_NAME) ;
END LOOP ;
CLOSE C_STUDENT ; -- 關閉遊標
END ;
-- 遊標使用案例查詢全部班級信息並列出對應班級的全部學生信息
-- 學習使用帶參數的遊標
DECLARE -- 聲明部分
CURSOR C_CLASS_CURSOR IS SELECT * FROM TB_CLASS ;-- 班級遊標
CURSOR C_STUDENT_CURSOR(V_CLASS_ID NUMBER) IS SELECT * FROM TB_STUDENT WHERE STU_CLASS_ID = V_CLASS_ID ; -- 學生遊標
V_CLASS_RESULT TB_CLASS%ROWTYPE ; -- 保存班級信息
V_STUDENT_RESULT TB_STUDENT%ROWTYPE ; -- 保存學生信息
BEGIN -- 執行部分
OPEN C_CLASS_CURSOR ; -- 打開遊標
LOOP
FETCH C_CLASS_CURSOR INTO V_CLASS_RESULT ; -- 提取結果
EXIT WHEN C_CLASS_CURSOR%NOTFOUND ; -- 判斷是否還有結果
DBMS_OUTPUT.PUT_LINE('CLASS_ID = ' || V_CLASS_RESULT.CLASS_ID || 'CLASS_NAME = ' || V_CLASS_RESULT.CLASS_NAME) ;
OPEN C_STUDENT_CURSOR(V_CLASS_RESULT.CLASS_ID) ; -- 打開學生遊標要傳參數
LOOP
FETCH C_STUDENT_CURSOR INTO V_STUDENT_RESULT ;
EXIT WHEN C_STUDENT_CURSOR%NOTFOUND ;
DBMS_OUTPUT.PUT_LINE('STU_ID = ' || V_STUDENT_RESULT.STU_ID || 'STU_NAME' || V_STUDENT_RESULT.STU_NAME);
END LOOP ;
CLOSE C_STUDENT_CURSOR ; -- 關閉遊標
END LOOP ;
CLOSE C_CLASS_CURSOR ; -- 關閉遊標
END ; -- 結束部分
[8].PLSQL程序單元
主要有四類:過程:執行特定操做、無返回值
函數:進行復雜計算、有返回值
包:邏輯上相關的過程和函數組合到一塊兒
觸發器:事件觸發執行相應操做
[8.1] ************ 存儲過程 ************
-- 第一個無參的存儲過程
CREATE OR REPLACE PROCEDURE INSERT_TB_STUDENT
IS V_SEX VARCHAR2(4) := '女';
BEGIN
INSERT INTO TB_STUDENT
(STU_ID, STU_NAME, STU_AGE, STU_SEX, STU_BIRTHDAY, STU_CLASS_ID)
VALUES
(TB_ERROR_SEQ.NEXTVAL, 'LIUTAO', 11, V_SEX, SYSDATE, 1015,);
COMMIT ;
END INSERT_TB_STUDENT;
-- 有參數的存儲過程
CREATE OR REPLACE PROCEDURE INSERT_TB_STUDENT_PARAMS (
STU_NAME IN VARCHAR2 ,
STU_AGE IN NUMBER ,
STU_SEX IN VARCHAR2 ,
STU_BIRTHDAY IN DATE ,
STU_CLASS_ID IN NUMBER
)
IS
BEGIN
INSERT INTO TB_STUDENT
(STU_ID, STU_NAME, STU_AGE, STU_SEX, STU_BIRTHDAY, STU_CLASS_ID)
VALUES
(TB_ERROR_SEQ.NEXTVAL, STU_NAME ,STU_AGE, STU_SEX, STU_BIRTHDAY, STU_CLASS_ID);
COMMIT ;
END INSERT_TB_STUDENT_PARAMS ;
-- 測試存儲過程的方法
BEGIN
INSERT_TB_STUDENT_PARAMS('張三',14,'男',SYSDATE,1015) ;
END ;
-- 存儲過程實例應用之數據表定時備份:
-- 將TB_STUDENT表中的數據備份到TB_STUDENT_BACK表中、TB_BACK_MAXID表記錄備份的表名、和已完成備份的最大ID
CREATE OR REPLACE PROCEDURE BACK_DATA(MAX_ID NUMBER)
IS
CURSOR C_STUDENT_CURSOR IS
SELECT * FROM TB_STUDENT WHERE STU_ID > MAX_ID ; -- 定義遊標提取TB_STUDENT表中的數據
TB_STUDENT_ROW TB_STUDENT%ROWTYPE ; -- 定義變量存儲遊標的數據
V_INDEX NUMBER := 0 ; -- 分段提交的標識
V_MAX_ID NUMBER := 0 ; -- 最在備份ID
BEGIN
IF C_STUDENT_CURSOR%ISOPEN THEN -- 斷送遊標是否打開
NULL ;
ELSIF
OPEN C_STUDENT_CURSOR ; -- 打開遊標
END IF ;
LOOP
INDEX := INDEX + 1 ;
FETCH C_STUDENT_CURSOR INTO TB_STUDENT_ROW ; -- 提取學生表中的數據
EXIT WHEN C_STUDENT_CURSOR%NOTFOUND ;
INSERT INTO TB_STUDENT_BACK (STU_ID,STU_NAME,_STU_AGE,STU_SEX,STU_BIRTHDAY,STU_CLASS_ID)
VALUES (C_STUDENT_ROW.STU_ID,C_STUDENT_ROW.STU_NAME,C_STUDENT_ROW.STU_AGE,C_STUDENT_ROW.STU_BIRTHDAY,C_STUDENT_ROW.STU_CLASS_ID) ;
IF V_INDEX = 2000 THEN
COMMIT ; -- 分段提交防止內存溢出
V_INDEX := 0 ;
END IF ;
END LOOP ;
SELECT MAX(MAX_ID) INTO V_MAX_ID FROM TB_STUDENT_BACK ;
-- 備份完成及時更新已完成的最大備份ID
UPDATE TB_BACK_MAXID SET MAX_ID = V_MAX_ID WHERE TABLE_NAME = 'TB_STUDENT' ;
COMMIT ;
CLOSE TB_STUDENT_CURSOR ;
END BACK_DATA ;
-- 調用備份存儲過程
CREATE OR REPLACE PROCEDURE EXECUTION_BACK
IS
V_MAX_ID NUMBER := 0 ;
BEGIN
SELECT MAX_ID INTO V_MAX_ID FROM TB_BACK_MAXID WHERE TABLE_NAME='TB_STUDENT' ;
BACK_DATA(V_MAX_ID) ;
END EXECUTION_BACK ;
-- 測試備份存儲過程
BEGIN
EXECUTION_BACK ;
END ;
-- 定時完成備份工做
DECLARE
JOBNO NUMBER ;
BEGIN
DBMS_JOB.SUBMIT(
JOBNO ,
WHAT => 'EXECUTION_BACK ;' , -- 要執行的存儲過程名稱
Interval => 'TRUNC(SYSDATE,''MI'')+3/(24*60)' -- 定義時間間隔每三分鐘
) ;
COMMIT ;
END ;
[8.2] ***************PLSQL函數***************
函數與過程的區別是函數有返回值
-- 計算年薪的函數
CREATE OR REPLACE FUNCTION FUN_COUNT_SAL(
SAL IN NUMBER
)
RETURN NUMBER IS
BEGIN
RETURN SAL*12 ;
END FUN_COUNT_SAL;
-- 測試函數
DECLARE
V_SAL NUMBER ;
BEGIN
SELECT SAL INTO V_SAL FROM EMP WHERE EMPNO='7521' ;
DBMS_OUTPUT.PUT_LINE(FUN_COUNT_SAL(V_SAL)) ;
END ;
[8.3] ***************PLSQL程序包***************
A.-- 定義程序包 :
CREATE OR REPLACE PACKAGE FK_COUNT_SAL IS
V_BOUNS NUMBER := 150 ; -- 定義變量每個月150獎金
-- 定義一個求年薪的函數
FUNCTION COUNT_EMP_SAL(V_SAL NUMBER) RETURN NUMBER ;
-- 定義一個添加學生的過程
PROCEDURE INSERT_STUDENT ;
END FK_COUNT_SAL;
B.-- 定義包體用於實現包中定義的函數和方法:
CREATE OR REPLACE PACKAGE BODY FK_COUNT_SAL IS
FUNCTION COUNT_EMP_SAL(V_SAL NUMBER) RETURN NUMBER IS
BEGIN
RETURN (V_SAL+V_BOUNS)*12 ;
END ;
PROCEDURE INSERT_STUDENT IS
BEGIN
INSERT INTO TB_STUDENT (STU_ID,STU_NAME,STU_AGE,STU_SEX) VALUES (TB_ERROR_SEQ.NEXTVAL,'POW',12,'男') ;
COMMIT ;
END ;
END FK_COUNT_SAL;
C.-- 測試程序包
DECLARE
V_SAL NUMBER ;
BEGIN
SELECT SAL INTO V_SAL FROM EMP WHERE EMPNO = '7369' ;
DBMS_OUTPUT.PUT_LINE(FK_COUNT_SAL.COUNT_EMP_SAL(V_SAL => V_SAL)) ;
FK_COUNT_SAL.INSERT_STUDENT ;
END ;
[8.4] ***************PLSQL觸發器***************
[二]. ***************ORACLE錶鏈接查詢***************
普通等值鏈接(內鏈接)查詢:
SELECT * FROM EMP E ,DEPT D WHERE E.DEPTNO = D.DEPTNO ; 可鏈接多張表、可用 AND 加多個條件限定結果。
標準SQL寫法:
SELECT * FROM EMP E INNER JOIN DEPT D ON E.DEPTNO = D.DEPTNO ; 標準SQL寫法等值鏈接稱爲內鏈接條件用ON限定。
外鏈接查詢分爲左外鏈接和右外鏈接:
左外鏈接:以左表爲主表、右表爲驅動表、左表中的數據所有列出、在右表中沒有匹配的項則用NULL補齊。
右外鏈接:以右表爲主表、左表爲驅動表、右表中的數據所有列出、在左表中沒有匹配的項則用NULL補齊。
普通寫法:
SELECT * FROM EMP E ,DEPT D WHERE E.DEPTNO(+) = D.DEPTNO ; 加號在左邊表示以右表爲主表。
SELECT * FROM EMP E , DEPT D WHERE E.DEPTNO = D.DEPTNO(+) ; 加號在右邊表示以左表爲主表。
標準SQL寫法:
SELECT * FROM EMP E RIGHT OUTER JOIN DEPT D ON E.DEPTNO = D.DEPTNO ; 右鏈接查詢。
SELECT * FROM EMP E LEFT OUTER JOIN DEPT D ON E.DEPTNO = D.DEPTNO ; 左鏈接查詢。
[三]. 組函數、GROUP BY 分組子句、ORDER BY 排序子句
HAVING 與 WHERE 的區別 :
WHERE是在分組前進行條件過濾
HAVING是在分組後進行條件過濾
WHERE子句中不能存在分組函數
HAVING子句中可使用分組函數
[四]. 多行比較運算符
IN 與列表中的任一成員相等
ANY 與子查詢返回的每個值比較
ALL 與子查詢返回的全部值比較
SELECT * FROM EMP WHERE SAL > ANY (
SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO ) 工資大於子查詢返回結果中最小的值都知足條件 。
SELECT * FROM EMP WHERE SAL < ANY (
SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO ) 工資小於子查詢中返回結果最大的值都是知足條件。
SELECT * FROM EMP WHERE SAL < ALL (
SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO ) 工資小於子查詢中返回結果最小的值才知足條件 。
SELECT * FROM EMP WHERE SAL > ALL (
SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO ) 大於全部返回值即大於最大的值才知足條件 。
案例:刪除表中的重複數據保留一條、如今TB_STUDNET表假設STU_NAME和STU_SEX徹底相同則認爲是重複。
1.建立臨時表 CREATE TABLE TB_STUDENT_TMP AS SELECT DISTINCT STU_NAME , STU_SEX FROM TB_STUDENT
2.刪除原有數據表中的數據 TRUNCATE TABLE TB_STUDENT
3.將臨時表中的數據插回來 INSERT INTO TB_STUDENT SELECT * FROM TB_STUDENT_TMP
案例:刪除表中的重複數據不保留
DELETE FROM TB_STUDENT WHERE ROWID IN ( SELECT ROWID FROM TB_STUDENT GROUP BY STU_NAME , STU_SEX HAVING COUNT(*) > 1 )
[五].DECODE 函數的用法
SELECT DECODE(ENAME,'SCOTT','LIUTAO','POW') ENAME ,DEPTNO FROM EMP 查詢員工表若是姓名是SCOTT則顯示LIUTAO不然顯示WANGWU 。
[六].ORACLE 中的序列 SEQUENCE
-- 建立序列
CREATE SEQUENCE STUDENT_SEQ
MINVALUE 1 -- 最小值
MAXVALUE 9999999 -- 最大值
START WITH 1 -- 從1開始
INCREMENT BY 1 -- 每次遞增1
CACHE 20 -- 緩存20個值
SELECT STUDENT_SEQ.NEXTVAL FROM DUAL ; 查看下一值
SELECT STUDENT_SEQ.CURRVAL FROM DUAL ; 查看當前值必須是至少執行一次NEXTVAL纔有值
-- 刪除序列
DROP SEQUENCE STUDENT_SEQ
[七].ORACLE中的同義詞
-- 同義詞 爲簡化操做有時須要對某些表或視圖建立一個同義詞來引用
CREATE SYNONYM TB_CLS FOR SCOTT.TB_CLASS ; 之後則查詢TB_CLS就是查詢表TB_CLASS
[八].ORACLE中的索引 加快數據檢索
主鍵約束和惟一性約束系統自動建立對應的索引。
手動建立索引:
CREATE INDEX TB_ERROR_SQL_MSG ON TB_ERROR(SQL_MSG) ; 爲TB_ERROR表中字段SQL_MSG建立索引名稱爲TB_ERROR_SQL_MSG
刪除索引:
DROP INDEX TB_ERROR_SQL_MSG
[九].ORACLE視圖 簡化查詢
簡單視圖:
CREATE VIEW LIU_EMP AS SELECT * FROM SCOTT.EMP ;