天天看點

SQL文法(二)

資料更新:

       |-    CREATETABLE 建立表名 ASSELECT *|[列名1,列名2,...] FROM 被複制表名;   //複制表資料,Oracle專用。

       |-    INSERTINTO 表名稱 [(列名稱1,列名稱2,...)] VALUES (值1,值2,...);//增加資料,建議寫完整格式,即添加上值對應的列名

              |-    字元串:使用單引号“‘“

              |-    數字:直接編寫

              |-    日期:目前日期(SYSDATE)、使用TO_DATE()轉換,按照日期格式寫

       |-    UPDATE 表名稱 SET字段1=值1,字段2=值2,...[WHERE更新條件(s)];

//修改指定資料表中的資料,WHERE 字句中可以使用IN、BETWEEN...AND、LIKE等進行限定查詢。當資料庫更新資料時,其他使用者不能針對目前資料進行任何操作。

       |-    DELETEFROM 表名稱 [WHERE删除條件(s)];     //删除指定資料,分實體删除和邏輯删除。實體删除即DELECT字段,邏輯删除為添加一個字段如flag(預設值為1),‘删除’資料則使用flag=0,搜尋時使用WHERE flag=1。

例1:INSERT INTO MYEMP (EMPNO,ENAME,JOB,SAL) VALUES(5369,'WENWEN',

‘TEACHER’,’2500’);

例2:UPDATE MYEMP SET SAL=0 WHERE ENAME='SMITH';

例3:UPDATE MYEMP SET

SAL=(

             SELECT SAL

             FROM MYEMP

WHERE ENAME='SMITH')

WHERE ENAME='ALLEN';

例4:UPDATE MYEMP SET

SAL=SAL*1.2

WHERE SAL<(

             SELECT AVG(SAL)

             FROM MYEMP);

------------------------------------------------------------------------------------------------------------

事務處理:              //事務是針對資料更新使用的,隻有DML的更新操作才存在事務的支援

|-    Session(會話,表示唯一的一個登陸使用者)

       |-    COMMIT:事務送出,即如果已經執行了多條操作,那麼隻有執行了commit之後更新才會真正發出;在沒有執行commit之前,所有更新操作都會儲存在緩沖區。

              |-    ROLLBACK:事務復原操作,即如果發現更新操作有問題,則恢複所有的更新操作,以保證原本的資料不被破壞。

-------------------------------------------------------------------------------------------------------------

僞列:

       |-    ROWNUM:顯示每行的行号1,2,3,4...   //操作:1、取出第一行記錄(隻能取出第一行);2、取出前N行記錄(可通過子查詢查詢n-m行或後n行資料)。

       |-    ROWID:行ID,每一行的ID都唯一           //例:AAASO3AAEAAAAITAAA,資料的對象編号:AAASO3,資料儲存檔案編号:AAE,資料儲存的塊号:AAAAIT,資料的儲存行AAA。

例1:SELECT ROWNUM,EMPNO,ENAME,JOB,SAL FROM EMP;
例2:SELECT * FROM EMP WHERE ROWNUM=1;
例3:SELECT * FROM EMP WHERE ROWNUM<=10;

例4:SELECT *

FROM (

             SELECT *

             FROM EMP

             WHERE ROWNUM<=10)

WHERE EMPNO NOT IN (

             SELECT EMPNO

             FROM EMP

             WHERE ROWNUM<5); //通過子查詢,查詢5-10行的資料

例5:SELECT *

FROM (

             SELECT ROWNUM RN,EMPNO,ENAME,JOB

             FROM EMP

             WHERE ROWNUM<=10)

WHERE RN>=5;     //建立一個帶有序号的表,并将ROWNUM使用别名重命名(僞列變實列)

例6:SELECT DEPTNO,DNAME,LOC,MIN(ROWID) FROM MYDAPT GROUP BY DEPTNO,DNAME,LOC; //通過ROWID找到重複資料的最早資料

例7:DELETE FROM MYDAPT

WHERE ROWID NOT IN(

       SELECT MIN(ROWID)

       FROM MYDAPT

       GROUP BY DEPTNO,DNAME,LOC); //删除重複資料并保留最早資料

----------------------------------------------------------------------------------------------------------------

DDL

表結構:

資料類型 作用
VARCHAR2(n) 字元型,n表示最大長度,一般儲存長度較小的内容(200字以内),oracle獨占,通用SQL使用VARCHAR(n)
NUMBER(n,m) NUMBER(n):整數,最多不超過n個長度
NUMBER(n,m):小數占m位,整數占n-m位
NUMBER:既可以整數也可以小數
DATE 日期時間資料
CLOB 大文本資料,最多儲存4G文字
BLOB(不常用) 二進制資料,最多儲存4G資料(文字、圖檔、音頻)

       |-    CREATE TABLE表名稱(   列名稱        資料類型    [DEFAULT預設值],

列名稱       資料類型    [DEFAULT預設值],

                                                               ...

列名稱       資料類型    [DEFAULT預設值]

);//建立新表

       |-    RENAME 舊表名稱 TO新表名稱;     //資料表重命名

       |-    TRUNCATE TABLE 表名稱; //截斷表,立即清空表資料并釋放表所占用的資料空間(oracle獨占)

       |-    CREATETABLE 新表名稱 AS子查詢;  //複制表

       |-    DROPTABLE 表名稱; //删除表(扔入資源回收筒)

       |-    DROPTABLE 表名稱 PURGE;     //徹底删除(不經過資源回收筒完全删除)

       |-    SELECT* FROM USER_RECYCLEBIN;    //檢視資源回收筒

       |-    PURGETABLE 表名稱(資源回收筒内的); //删除資源回收筒内的表

       |-    PURGERECYCLEBIN; //清空資源回收筒

       |-    FLASHBACKTABLE 表名 TOBEFORE DROP;  //閃回(從垃圾箱恢複被删除的資料表)

       |-    ALTERTABLE 表名稱 ADD(

                                   列名稱資料類型   [DEFAULT預設值],

                                   列名稱資料類型   [DEFAULT預設值],...

);//添加表中的資料列

|-    ALTER TABLE表名稱 MODIFY(

                                   列名稱資料類型   [DEFAULT預設值],

                                   列名稱資料類型   [DEFAULT預設值],...

);//修改表中的資料列

|-    ALTER TABLE表名稱 DROP COLUMN 列名稱;//删除表中的資料列

例1:CREATE TABLE member(

               mid NUMBER,

               name VARCHAR2(50) DEFAULT ‘無名氏’,

               age NUMBER(3),

               birthday DATE DEFAULT SYSDATE,

               note CLOB);

例2:CREATE TABLE EMP1 AS (SELECT * FROM EMP);

例3:CREATE TABLE DEPTINFOR AS

SELECT d.DEPTNO,d.DNAME,d.LOC,temp.COUNT,temp.AVG

FROM DEPT d,(

             SELECT DEPTNO,COUNT(EMPNO) COUNT,AVG(SAL) AVG

             FROM EMP

             GROUP BY DEPTNO

) temp

WHERE d.DEPTNO=temp.DEPTNO(+);

例4:CREATE TABLE DEPTINFOR AS SELECT * FROM EMP WHERE 1=2; //僅複制表結構,但不複制資料
例5:FLASHBACK TABLE EMP1 TO BEFORE DROP; //閃回

----------------------------------------------------------------------------------------------------------------

限制:

       |-    非空限制:NOTNULL,簡稱NK  //該字段的内容不允許設定為null值

       |-    唯一限制:UNIQUE,簡稱NK      //該列的内容不允許重複(空NULL不受該限制,即允許多值為空NULL)

       |-    為限制設定名稱:CONSTRAINT 設定的名稱限制名(列名[,列名...])   //為限制的報錯提示資訊設定易讀的代碼名稱

       |-    主鍵限制:PRIMARYKEY,簡稱PK //非空限制+唯一限制不允許重複,也不允許為空

       |-    檢查限制:CHECK,簡稱CK     //在進行資料更新操作前設定過濾條件

       |-    外鍵限制:FOREIGNKEY,簡稱FK  //控制子表中某一列(父表該列必須設定主鍵限制或者唯一限制)的内容與父表中的資料範圍相比對

       |-    有限制強制删除表:DROP TABLE 表名CASCADE CONSTRAINT;

       |-    資料的級聯删除:ON DELETE CASCADE;   //父表資料删除,對應子表資料自動删除

       |-    資料的級聯更新:ON DELETE SET NULL;   //父表資料删除,對應字表資料的對應内容設定為NULL

       |-    增加限制(不要使用):ALTER TABLE 表名稱 ADD CONSTRAINT限制名限制類型(字段)[選項];//如有違反主鍵的資料,則不能添加限制;增加非空限制,隻能通過修改表結構完成

       |-    删除限制(不要使用):ALTER TABLE 表名稱 DROP CONSTRAINT限制名;     //删除非空限制,隻能通過修改表結構完成

例1:CREATE TABLE member(

               name VARCHAR2(10) NOT NULL,

               age NUMBER(3)); //name列不允許插入空

例2:CREATE TABLE member(

               name VARCHAR2(10) NOT NULL UNIQUE,

               age NUMBER(3)); //name列不允許插入空且值不允許重複

例3:CREATE TABLE member(

             name       VARCHAR2(10),

             age   NUMBER(3),

             email      VARCHAR2(30),

             CONSTRAINT uk_email UNIQUE(email));  //為限制設定名稱

例4:CREATE TABLE member(

       name     VARCHAR2(10),

       age NUMBER(3),

       email     VARCHAR2(30),

       CONSTRAINT age_check CHECK(age BETWEEN 0 AND 200)); //添加限制條件

例5:CREATE TABLE member(

              name     VARCHAR2(10),

              mid       NUMBER,

              CONSTRAINT pk_mid PRIMARY KEY(mid));

CREATE TABLE book(

              num       NUMBER(5),

              title       VARCHAR2(20),

              mid       NUMBER,

              CONSTRAINT fk_mid FOREIGN KEY(mid) REFERENCES member(mid));

//REFERENCES參考其他表中的某列資料

例6:CREATE TABLE member(

              name     VARCHAR2(10),

              mid       NUMBER,

              CONSTRAINT pk_mid PRIMARY KEY(mid));

CREATE TABLE book(

              num       NUMBER(5),

              title       VARCHAR2(20),

              mid       NUMBER,

              CONSTRAINT fk_mid FOREIGN KEY(mid) REFERENCES member(mid) ON DELETE CASCADE);  //級聯删除

----------------------------------------------------------------------------------------------------------------

序列:

CREATE SEQUENCE 序列名稱

[INCREMENT BY 步長]

[START WITH 開始值]

[MAXVALUE 最大值|NOMAXVALUE]

[MINVALUE 最小值|NOMAXVALUE]

[CYCLE|NOCYCLE]      //是否循環

[CACHE 緩存資料|NOCACHE];

序列對象.nextval:表示進行序列增長,每調用一次,序列加上指定的步長;

序列對象.currval:表示取得目前的序列内容,不管如何調用,序列内容不改變。

例1: INSERT INTO mytab (mid,name) VALUES(myseq.nextval,'張三’);
例2:SELECT * FROM user_sequences;  //檢視序列資料字典

----------------------------------------------------------------------------------------------------------------

同義詞 (oracle獨占)//其他使用者可以直接通過别名而不是“使用者名.表名稱”通路某使用者的資料表

       |-    CREATE[PUBLIC] SYNONYM 同義詞名稱 FOR使用者名.表名稱;//不加PUBLIC,system使用者不能使用;

----------------------------------------------------------------------------------------------------------------

視圖

       |-    CREATE [OR REPLACE] VIEW 視圖名稱 AS子查詢 [ WITH READ ONLY];

       //用視圖封裝複雜的子查詢;OR REPLACE:如果沒有該視圖,建立新視圖,如果該視圖已存在,則修改替換該視圖;WITH READ ONLY:不允許修改視圖值

       |-    DROPVIEW 視圖名稱;      //删除視圖

例1:SELECT * FROM user_views;  //檢視視圖資料字典

----------------------------------------------------------------------------------------------------------------

索引

       |-    CREATE INDEX 索引名 ON使用者名.表名稱(字段);   //建立索引,将該字段使用二叉樹檢索(修改時消耗大量資源)

----------------------------------------------------------------------------------------------------------------

使用者管理    //使用sys使用者

       |-    CREATE USER 新使用者名 IDENTIFIED BY密碼;  //建立新使用者,但新沒有session會話權限

       |-    GRANTCREATE SESSION TO 使用者名;   //為使用者配置設定session會話權限

       |-    GRANTCREATE TABLE TO 使用者名;       //為使用者配置設定建立資料表權限

。。。。。。

       |-    GRANTCONNECT, RESOURSE TO 使用者名;//為使用者配置設定角色,一次性配置設定權限

       |-    ALTER USER 使用者名 IDENTIFIED BY新密碼;//修改使用者密碼

       |-    ALTERUSER 使用者名PASSWORD EXPIRE;   //使用者登入後需要立即修改密碼

       |-    ALTERUSER 使用者名 ACCOUNTLOCK; //鎖定使用者

       |-    ALTERUSER 使用者名 ACCOUNTUNLOCK;   //解鎖使用者

       |-    GRANTSELECT,INSERT,UPDATE,DELETE ON使用者名1.表名 TO使用者名2;    //對象權限:将使用者1的某資料表的檢視、插入、更新、删除的權限授予給使用者2

       |-    REVOKECONNECT,RESOURSE FROM 使用者名;

              REVOKE CREATE SESSION,CREATE TABLEFROM使用者名;       //撤銷權限

       |-    DROPUSER 使用者名CASCADE;      //删除使用者

----------------------------------------------------------------------------------------------------------------

備份

       |-    exp        //備份資料,在cmd指令行的備份目錄中啟用exp

       |-    imp        //還原資料,在cmd指令行的備份目錄中啟用img

       |-    冷備份:    1、使用sys登入;

                                   2、找到控制檔案:SELECT* FROM v$controlfile;

                                   3、找到重做檔案:SELECT* FROM v$logfile;

                                   4、找到資料檔案:SELECT* FROM v$datefile;

                                   5、找到配置檔案:SHOWPARAMETER pfile;

                                   6、關閉資料庫服務:SHUTDOWNIMMEDIATE;

                                   7、拷貝以上檔案到指定備份目錄

                                   8、啟動資料庫服務:STARTUP

----------------------------------------------------------------------------------------------------------------

Oracle分頁

SELECT  * 

FROM (

SELECT ROWNUM rowno,表名.*

FROM 表名

WHERE ROWNUM <=20

)

WHERE rowno>=10;

----------------------------------------------------------------------------------------------------------------

繼續閱讀