【ORACLE-學習筆記】 經常使用命令

//***************************** Day1:基礎操做和數據庫安全 ***********************************數據庫

// 基本操做安全

進入SQL*plus: 併發

SQLPLUS - > user和password函數

查看當看的用戶: 性能

SHOW USER;spa

查看數據庫裏面的數據庫表:   .net

SELECT table_name FROM user_tables;設計

修改自身的密碼: htm

PASSW對象

退出/斷開:

EXIT/DISC

切換用戶:

CONN user/password


// 用戶管理

建立用戶:

CREATE USER user IDENTIFIED BY password;

修改用戶密碼:

PASSWORD user;

修改用戶:

ALTER USER user IDENTIFIED BY newpassword

刪除用戶:

DROP USER user [CASCADE]


// 權限管理(系統權限、對象)

授予系統權限(對系統級的操做):

GRANT system_privilege|ALL_PRIVILEGES TO user|role

授予對象權限(對錶、視圖操做):

GRANT object_privilege|ALL ON scheme.object TO user|role

回收授予的系統權限:

REVOKE system_privilege|ALL_PRIVILEGES FROM user|role

回收授予的對象權限:

REVOKE object_privilege|ALL ON schema.object FROM user|role

系統權限傳遞:

GRANT system_privilege|ALL_PRIVILEGES TO user|role [WITH ADMIN OPTION]

1)若是system給zhangsan授予CREATE SESSION時加上了WITH ADMIN OPTION,

此時zhangsan也能夠給其它用戶授予CREATE SESSION的權限,

若是zhangsan又給lisi授予CREATE SESSION權限,

那麼lisi確定是能夠登陸了。

2)若是system回收了zhangsan的權限,那麼lisi還能登陸嗎?仍是能登陸

        3)system能夠直接回收lisi的CREATE SESSION權限

對象權限傳遞:

GRANT object_privilege|ALL ON scheme.object TO user|role [WITH GRANT OPTION]

1)若是scott給zhangsan授予SELECT時加上了WITH GRANT OPTION,

此時zhangsan也能夠給其它用戶授予SELECT的權限,

若是zhangsan又給lisi授予SELECT權限,

那麼lisi確定是能夠查詢了:SELECT * FROM scott.emp;

2)若是scott回收了zhangsan的SELECT權限,那麼lisi還能查詢嗎?不能查詢了

3)scott不能夠直接回收lisi的SELECT權限



// 角色管理

角色分爲兩類:

第一類是內置角色(CREATE SSSION、CONNECT、RESOURCE、DBA)

第二類是自定角色:

1)角色建立:

CREATE ROLE role;

2)把角色受權權限

GRANT system_privilege|ALL_PRIVILEGES TO role [WITH ADMIN OPTION]

3)把角色給用戶

GRANT role TO user;

4)角色刪除:

DROP ROLE role;


// PROFILE

專門作口令管理(它只對用戶設置,不能對角色設置)

實例:

指定scott密碼只能嘗試輸入3次,若是超過限制就鎖定2天?

1)建立PROFILE

  CREATE PROFILE profile_name LIMIT FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 2;

  具體的參數設置,請在網上找一下參數詳解!

2)把建立好的PROFILE指定對scott

  ALTER USER scott PROFILE profile_name

3) 如今scott就會使用這個PROFILE的限制(3次事後會鎖2天)

4)若是要解鎖

ALTER USER scott ACCOUNT UNLOCK;

5)刪除PROFILE

DROP PROFILE profile_name [CASCADE];


//***************************** Day2:SQL基礎 ***********************************

一、SQL分類:

DDL、DML、DQL、DCL

二、數據類型:

   1)字符型

      變長:VARCHAR2(0-4000)、

      定長:CHAR(0-2000)

      若是咱們在設計數據庫時,已經肯定某些字符串長度是固定的,儘可能使用CHAR,提升效率!

      舉例:二代身份證CHAR(18),MD5 CHAR(32)

   2)數字型

     NUMBER(1) 0-9

     NUMBER(5) 0-99999

     NUMBER(5, 2) 555.22

   3)時間類型

     date 

     timestamp:精確到毫秒,可是咱們在通常的應用裏用不上

     注:可直接使用sysdate取得當前時間!

   4)其餘類型

     blob,最大存儲爲4G,專存二進制

     clob,最大存儲爲4G,專存字符串

 三、DDL

  a)CREATE

CREATE TABLE sys_user (

id NUMBER(10) PRIMARY KEY,

username VARCHAR2(50) NOT NULL,

password CHAR(32) NOT NULL,

birthday date,

salary NUMBER(6,2)

);

b)ALTER

  添加列:

   ALTER TABLE table_name ADD 列描述

  修改列:

   ALTER TABLE table_name MODIFY 列描述

     注:若是修改時涉及到約束,如非空約束,必需要保證數據庫裏沒有數據纔可成功更改!

  刪除列:

   ALTER TABLE table_name DROP COLUMN 列名;

  修改表名:

          ALTER TABLE table_name RENAME TO new_table_name;

       修改列名:

         ALTER TABLE table_name RENAME COLUMN column_name TO new_column_name

    c)DROP

       刪除列:

          ALTER TABLE table_name DROP COLUMN 列名;

       刪除表:

         DROP TABLE table_name;

4)五大約束

  CREATE TABLE sys_user (

id NUMBER(10) PRIMARY KEY,

username VARCHAR2(50) NOT NULL UNIQUE,

password CHAR(32) NOT NULL,

age NUMBER(3) CHECK(age>=18 AND age=120), 

birthday date,

salary NUMBER(6,2)

);


CREATE TABLE sys_user (

id NUMBER(10),

username VARCHAR2(50) NOT NULL,

password CHAR(32) NOT NULL,

age NUMBER(3), 

birthday date,

salary NUMBER(6,2),

CONSTRAINTS sys_user_id_pk PRIMARY KEY(id),

CONSTRAINT sys_user_username_unique UNIQUE(username),

CONSTRAINT sys_user_age_check CHECK(age>=18 AND age<=120)

);



CREATE TABLE sys_user (

id NUMBER(10),

username VARCHAR2(50) NOT NULL,

password CHAR(32) NOT NULL,

age NUMBER(3), 

birthday date,

salary NUMBER(6,2)

);

ALTER TABLE sys_user ADD CONSTRAINTS sys_user_id_pk PRIMARY KEY(id);

ALTER TABLE sys_user ADD CONSTRAINT sys_user_username_unique UNIQUE(username);

ALTER TABLE sys_user ADD CONSTRAINT sys_user_age_check CHECK(age>=18 AND age<=120);



對後期添加的約束作移除:

ALTER TABLE sys_user DROP CONSTRAINT constraint_name;



特殊(Not null):

NOT NULL沒有Constraint的寫法,它的添加和刪除以下:

添加:

ALTER TABLE table_name MODIFY column_name NOT NULL;

刪除:

ALTER TABLE table_name MODIFY column_name NULL;



    建議:直接在列後面追加,這樣更直觀!


5)外鍵約束

   主表:

CREATE TABLE sys_role(

   id NUMBER(10) PRIMARY KEY,

   name VARCHAR2(10) NOT NULL

)


    從表:

CREATE TABLE sys_user(

   id NUMBER(10) PRIMARY KEY,

   name VARCHAR2(10) NOT NULL,

   role_id NUMBER(10) REFERENCES sys_role(id) [ON DELETE CASCADE]

)


CREATE TABLE sys_user(

   id NUMBER(10) PRIMARY KEY,

   name VARCHAR2(10) NOT NULL,

   role_id NUMBER(10),

   CONSTRAINT sys_user_role_id_fk FOREIGN KEY(role_id) REFERENCES sys_role(id) [ON DELETE CASCADE]

)

ALTER TABLE sys_user ADD CONSTRAINT sys_user_role_id_fk FOREIGN KEY(role_id) REFERENCES sys_role(id) [ON DELETE CASCADE];


注意:

  a)建立表:先建主表,再建從表

  b)新增數據:先新增主表數據,再新增從表數據

  c)刪除數據:

        若是直接刪除主表的數據,會提示咱們先去刪除被從表引用的記錄,再刪除主表的記錄

        若是在外鍵上指定了ON DELETE

        CASCADE,那麼咱們在刪除主表記錄的同時會級聯刪除相應的子表記錄,不建議使用!


注意2:要不要使用外鍵?

1)使用外鍵:

  優勢:使用約束,強制保持數據的一致性

  缺點:後期難以維護

        性能問題

2)不使用外鍵(推薦)

  優勢:解決了使用外鍵的缺點

  缺點:數據的一致性,須要程序去控制關係,容易出錯!


//*************************** Day3:簡單查詢和條件查詢基礎 ****************************

一、SQL結構(注意順序)

SELECT 

        [DISTINCT|ALL] select_list

        FROM table_list

    [where_clause]

        [group_by_clause]

        [HAVING condition]

        [order_by_clause]

二、簡單查詢

   1)在數據量大時,必須指定部分字段進行查詢,而不是使用*查詢。

   2)使用別名代替表中的字段名

     SELECT ename 名稱, job "工做", sal AS 工資, comm AS "補助" FROM emp;

     注:

        a)使用別名時不能使用單引號

      b)若是要給emp(表)給別名,不能使用AS方式!

   3)去除重複記錄

     SELECT DISTINCT job FROM emp;

      SELECT DISTINCT job, sal FROM emp;

   4)表達式(||+、-、*、/等等)

     SELECT sal*13 + nvl(comm,0)*12 FROM emp;

   5)使用函數操做查詢的字段

     SELECT max(sal),min(sal),avg(sal),sum(sal) FROM emp; 

 SELECT sysdate FROM dual; 

   6)排序

      a)遇NULL,指定排前(NULLS FIRST,默認)仍是排後(NULLS LAST)

         SELECT comm FROM emp ORDER BY comm DESC NULLS LAST;

      b)別名排序同直接使用列名效果同樣,針對長表達式使用別名更簡單!

      SELECT sal as "工資" FROM emp ORDER BY "工資";

      c)利用多個字段進行排序(若是第一個字段相同,再參考第二個字段)

         SELECT ename,sal,empno FROM emp ORDER BY sal ASC, empno DESC;

三、條件查詢

   1)WHERE條件操做符

   可使用的操做符主要有關係操做符、比較操做符和邏輯操做符:

      · 關係操做符:<、<=、>、>=、=、!=、<>

      · 比較操做符:IS NULL、LIKE、BETWEEN...AND...、IN

      · 邏輯操做符:AND、OR、NOT

   2)查詢值大小寫敏感且字符串需用單引號(跟MySQL不一樣)

     SELECT * FROM emp WHERE ename='ALLEN'

   3)查詢條件中使用函數

      SELECT * FROM emp WHERE nvl(comm,0)=0;

   4)模糊查詢

      _:能夠替代一個字符

  %:能夠替代多個字符

  SELECT * FROM emp WHERE job LIKE '_A%'

   5)專門針對NULL值的查詢

      SELECT * FROM emp WHERE comm IS NULL;

   6)日期比較

      SELECT * FROM emp WHERE hiredate<'01-MAY-1981';

     SELECT ename,hiredate FROM emp WHERE hiredate>to_date('1982-01-01', 'yyyy-mm-dd');

 注:Oracle日期格式化:yyyy-mm-dd hh24:mi:ss

   7)GROUP BY子句和HAVING子句

      GROUP BY都是跟在WHERE後面,若是沒有WHERE條件,就直接跟在FROM後面

      HAVING,主要就是對GROUP BY的信息再進行篩選,它必需要跟在GROUP BY後面

      例:按部門的平均工資分組,而後篩選出平均工資大於等於2000的部門的全部員工信息?

 a)使用子查詢

   SELECT * FROM emp WHERE deptno in(SELECT deptno FROM emp GROUP BY deptno HAVING AVG( sal)>=2000);

 b)把子查詢後結果當作臨時表

   SELECT * FROM emp,(SELECT deptno FROM emp GROUP BY deptno HAVING AVG(sal)>=2000) temp WHERE emp.deptno=temp.deptno; 

//************************* Day4:子查詢、多表查詢、聯合查詢 ****************************

一、子查詢

   1)幾道題?

     a)查詢出emp表中工資最高的員工的名字和工做崗位?

        SELECT ename,job FROM emp WHERE sal=(SELECT MAX(sal) FROM emp);

     b)查詢工資高於平均工資的員工?

        SELECT * FROM emp WHERE sal>(SELECT AVG(sal) FROM emp);

     c)查詢部門名稱裏有A的員工信息?

        多表:

         SELECT * FROM emp e,dept d WHERE e.deptno=d.deptno AND d.dname LIKE '%O%';

      子查詢:

      SELECT * FROM emp WHERE deptno IN(SELECT deptno FROM dept WHERE dname LIKE '%O%');

     d)查詢部門名稱裏有A的員工信息和部門名稱?

        多表:

         SELECT e.*,d.dname FROM emp e,dept d WHERE e.deptno=d.deptno AND d.dname LIKE '%O%';

      把子查詢後結果當作臨時表:

      SELECT * FROM emp e, (SELECT * FROM dept WHERE dname LIKE '%O%') d WHERE e.deptno=d.deptno;


      注:能直接使用多表就直接使用多表,子查詢的使用是要看狀況的!

   2)返回單列和返回多列兩種狀況

     a)返回單列,用=

     b)返回多列,用in

   3)分頁

     查詢前10條的數據:

       SELECT e.*,ROWNUM FROM emp e WHERE ROWNUM <= 10;

     查詢5到10條的數據:

       SELECT * FROM (SELECT e.*,ROWNUM r FROM emp e WHERE ROWNUM <= 10) temp WHERE r>=5;


    擴展:

    顯示比本身部門的平均工資還高的員工信息?

    SELECT e.*,salary.avg_sal FROM emp e,(SELECT deptno, AVG(sal) AS avg_sal FROM emp GROUP BY deptno) salary WHERE e.deptno=salary.deptno AND e.sal>salary.avg_sal;

二、多表查詢

   1)傳統查詢

      a)笛卡爾積的產生和消除

         注:在消除笛卡爾積時,消除條件至少等於表的個數-1

      b)多表查詢時,爲了區別字段,建議使用別名。

   2)內鏈接

      a)等值鏈接

      SELECT * FROM emp e INNER JOIN dept d ON e.deptno=d.deptno;

      等同於:

      SELECT * FROM emp e, dept d WHERE e.deptno=d.deptno;

      b)不等值鏈接

      SELECT * FROM emp e INNER JOIN dept d ON e.deptno>d.deptno;

      考慮:顯示各個員工的姓名工資及其工資的級別?

      SELECT e.ename,e.sal,s.grade FROM emp e,salgrade s WHERE e.sal BETWEEN s.losal AND s.hisal;

      等同於:

SELECT e.ename,e.sal,s.grade FROM emp e JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal;


      注:INNER關鍵字能夠省略!

   3)自鏈接

     考慮:顯示FORD的上級領導的姓名和工資?

     SELECT employee.ename,manager.ename,manager.sal 

FROM emp employee JOIN emp manager 

ON employee.mgr=manager.empno 

WHERE employee.ename='SCOTT';

等同於:

 SELECT employee.ename,manager.ename,manager.sal 

   FROM emp employee, emp manager 

   WHERE employee.mgr=manager.empno AND employee.ename='SCOTT';

   4)外鏈接

      a)左外鏈接

         使用左外鏈接的查詢,返回的結果不只僅是符合鏈接條件的行記錄,還包          含了左邊表中的所有記錄。也就是說,若是左表的某行記錄在右表中沒有          匹配項,則在返回結果中右表的全部選擇列表列均爲空!

         SELECT e.ename,d.dname FROM emp e LEFT JOIN dept d ON e.deptno=d.deptno;

      b)右外鏈接

         右外鏈接跟左外鏈接是相反的,它以右邊的表爲主表。

         SELECT e.ename,d.dname FROM emp e RIGHT JOIN dept d ON e.deptno=d.deptno;

      c)全外鏈接(注:使用傳統鏈接代替不了外鏈接)

         SELECT e.ename,d.dname FROM emp e FULL JOIN dept d ON e.deptno=d.deptno; 

      d)(+),Oracle特有用法,它能夠實現左外鏈接和右外鏈接,但不能實現全鏈接,瞭解便可!

   5)聯合查詢

  合併處理多個查詢語句的結果!

一、UNION

     用於取得兩個結果集的並集,並會自動去掉結果集中的重複行。

     SELECT * FROM emp e1 WHERE e1.sal>2500 UNION SELECT * FROM      emp e2 WHERE e2.job='MANAGER';

二、UION ALL

     使用UNION ALL並不會自動去掉結果集中的重複行!

     SELECT * FROM emp e1 WHERE e1.sal>2500 UNION ALL SELECT *      FROM emp e2 WHERE e2.job='MANAGER';

三、INTERSECT

     Oracle特有操做符,用於取得兩個結果集的交集。

     SELECT * FROM emp e1 WHERE e1.sal>2500 INTERSECT SELECT *      FROM emp e2 WHERE e2.job='MANAGER';

四、MINUS

     Oracle特有操做符,用於取得兩個結果集的差集。第一個集合減去第二個集合,      相同集去除。

     SELECT * FROM emp e1 WHERE e1.sal>2500 MINUS SELECT * FROM      emp e2 WHERE e2.job='MANAGER';


注:讓MySQL支持INTERSECT和MINUS:http://www.jb51.net/article/51411.htm


//************************* Day5:其餘經常使用操做 ****************************

一、序列

a)Oracle提供了Sequence對象,由系統提供自增加的序列號,一般用於生成數           據庫數據記錄的自增加主鍵或序號的地方。

b)建立Sequence

  你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE權限。

     CREATE SEQUENCE 序列名

        [INCREMENT BY n] // 步長,默認爲1

        [START WITH n] // 開始,默認爲1

        [{MAXVALUE/ MINVALUE n|NOMAXVALUE}] // 最大/小值|沒有最大或最小值

        [{CYCLE|NOCYCLE}] // 達到限制是否循環

        [{CACHE n|NOCACHE}]; // 存序列的內存塊大小,默認20


例如:

CREATE SEQUENCE sys_user

INCREMENT BY 1

START WITH 1

MINVALUE 0

NOCYCLE

c)獲得Sequence值

  · 當前值:序列名.currval

  · 下一個值:序列名.nextval

d)刪除Sequence

DROP SEQUENCE 序列名

    e)修改Sequence

       ALTER SEQUENCE sys_user_seq MAXVALUE 999999;

       // 改變序列的初始值只能經過刪除序列以後重建序列的方法實現

       // ALTER SEQUENCE sys_user_seq START WITH 1;

二、事務

1)要麼成功,要麼失敗

    事務在數據庫中主要用於保證數據的一致性,防止出現錯誤數據。在事務內     的語句都會被當作一個單元,一旦有一個失敗,那麼全部的都會失敗,轉帳     是一個很是典型的例子。

2)事務的常見操做:

    SET TRANSACTION:設置事務屬性(併發比較高時可能會用到只讀事務)

    SAVEPOINT:設置保存點

    ROLLBACK TO SAVEPOINT:回滾至保存點

    ROLLBACK:回滾事務

    COMMIT:提交事務

     3)事務的ACID特性

    事務有4個特性,它們分別是原子性、一致性、分離性、持久性。

   a)原子性(Atomicity):原子意味着不可分割,無論有多少程序,只要在同         一個事務中,那麼它們就是一個總體

   b)一致性(Consistency):事務執行的先後數據庫都必須處於一致性狀態,         只有在事務完成後才能被全部使用都看到,保證了數據的完整性。

   c)分離性(Isolation):事務之間不相干擾,一個事務操做的數據不會被其         他事務看到和操做

   d)持久性(Durabilily):一旦事務提交完成,那麼這將是對數據永久的修改

相關文章
相關標籤/搜索