[SQL入門級] 上篇被移出園子首頁,那這篇咱就'薄利多銷'

這個系列的博文知識回顧sql知識做的記錄,溫故而知新。上一篇內容達不到知識分享的層級被移出園子首頁,對不住各位看官,內容簡單了些。下面咱就記錄多一些的基礎知識,薄利多銷:sql

控制用戶權限數據庫

• 建立用戶express

   CREATE USER user緩存

   IDENTIFIED BY password;服務器

• 建立用戶表空間函數

   ALTER USER user QUOTA UNLIMITEDspa

   ON users3d

• 賦予系統權限指針

   – CREATE SESSION(建立會話)對象

   – CREATE TABLE(建立表)

   – CREATE SEQUENCE(建立序列)

   – CREATE VIEW(建立視圖)

   – CREATE PROCEDURE(建立過程)

   image

 

   image

 

• 賦予對象權限

   GRANT object_priv [(columns)]

   ON object

   TO {user|role|PUBLIC} --PUBLIC表明數據庫全部用戶

   [WITH GRANT OPTION]; --使用戶一樣具備分配權限的權利

  --分配表 EMPLOYEES 的查詢權限

   GRANT select

   ON employees

   TO sue, rich;

• 回收對象權限

   REVOKE {privilege [, privilege...]|ALL}  --使用 WITH GRANT OPTION 子句所分配的權限一樣被收回

   ON object

   FROM {user[, user...]|role|PUBLIC}

   [CASCADE CONSTRAINTS];

   --回收對象權限舉例

   REVOKE select, insert

   ON departments

   FROM scott;

 

• 查詢權限

   image

  SELECT * 
   FROM 
user_sys_privs

 

多表查詢

首先明確咱們要作的事:

image

如上圖是咱們平時業務中再正常不過的了,那麼這小節咱就說說鏈接多表查詢數據。

 

內鏈接:合併具備同一列的兩個以上的表的行, 結果集中不包含一個表與另外一個表不匹配的行

  • 等值鏈接

     - 方式一:在 WHERE 子句中寫入鏈接條件,鏈接 n個表,至少須要 n-1個鏈接條件(通用型)

        SELECT e.employee_id, e.last_name, e.department_id,

        d.department_id, d.location_id

        FROM employees e , departments d

        WHERE e.department_id = d.department_id;

     - 方式二:使用JOIN…ON建立多表鏈接(經常使用方式:較通用型WHERE條件,更易實現外鏈接(左、右、滿))

        SELECT employee_id, city, department_name

        FROM employees e

        JOIN departments d

        ON d.department_id = e.department_id

        JOIN locations l

        ON d.location_id = l.location_id;

     - 方式三:使用USING子句建立鏈接(侷限性:好於天然鏈接,但若多表的鏈接列列名不一樣,此法不合適)

        SELECT e.employee_id, e.last_name, d.location_id

        FROM employees e JOIN departments d

        USING (department_id)--JOIN和USING常常同時使用

  • 不等值鏈接

        SELECT e.last_name, e.salary, j.grade_level

        FROM employees e, job_grades j

        WHERE e.salary BETWEEN j.lowest_sal AND j.highest_sal;

  • 自鏈接

        SELECT worker.last_name || ' works for ' || manager.last_name

        FROM employees worker, employees manager

        WHERE worker.manager_id = manager.employee_id;

  • 天然鏈接(侷限性:會自動鏈接兩個表中相同的列)

     - NATURAL JOIN 子句,會以兩個表中具備相同名字的列爲條件建立等值鏈接

     - 在表中查詢知足等值條件的數據。

     - 若是隻是列名相同而數據類型不一樣,則會產生錯誤

        SELECT department_id, department_name, location_id, city

        FROM departments

        NATURAL JOIN locations ;

外鏈接:兩個表在鏈接過程當中除了返回知足鏈接條件的行之外還返回左(或右)表中不知足條件的行 ,這種鏈接稱爲左(或右) 外鏈接。沒有匹配的行時, 結果表中相應的列爲空(NULL)。

  • 左外鏈接

     - 方式一:外鏈接運算符

        SELECT table1.column, table2.column

        FROM table1, table2

        WHERE table1.column = table2.column(+);

     - 方式二:SQL1999語法

        SELECT e.last_name, e.department_id, d.department_name

        FROM employees e

        LEFT OUTER JOIN departments d

        ON (e.department_id = d.department_id) ;

  • 右外鏈接

     - 方式一:外鏈接運算符

        SELECT table1.column, table2.column

        FROM table1, table2

        WHERE table1.column(+) = table2.column;

     - 方式二:SQL1999語法

        SELECT e.last_name, e.department_id, d.department_name

        FROM employees e

        RIGHT OUTER JOIN departments d

        ON (e.department_id = d.department_id);

  • 滿外鏈接

        SELECT e.last_name, e.department_id, d.department_name

        FROM employees e

        FULL OUTER JOIN departments d

        ON (e.department_id = d.department_id);

 

SET運算符:將多個查詢用SET操做符鏈接組成一個新的查詢

• 在SELECT 列表中的列名和表達式在數量和數據類型上要相對應,因此就有了各類字段匹配

     SELECT department_id, TO_NUMBER(null) locationhire_date

     FROM employees

     UNION

     SELECT department_id, location_idTO_DATE(null)

     FROM departments;

• 括號能夠改變執行的順序

• ORDER BY 子句:

    – 只能在語句的最後出現

    – 可使用第一個查詢中的列名, 別名或相對位置

• 除 UNION ALL以外,系統會自動將重複的記錄刪除

• 系統將第一個查詢的列名顯示在輸出中

• 除 UNION ALL以外,系統自動按照第一個查詢中的第一個列的升序排列

   image

UNION 返回兩個查詢的結果集的並集

   SELECT employee_id, job_id

   FROM employees

   UNION

   SELECT employee_id, job_id

   FROM job_history;

   image

UNION ALL 返回兩個查詢的結果集的並集。對於兩個結果集的重複部分,不去重

   SELECT employee_id, job_id, department_id

   FROM employees

   UNION ALL

   SELECT employee_id, job_id, department_id

   FROM job_history

   ORDER BY employee_id;

   image

INTERSECT 返回兩個結果集的交集

   SELECT employee_id, job_id

   FROM employees

   INTERSECT

   SELECT employee_id, job_id

   FROM job_history;

   image

MINUS 返回兩個結果集的差集

   SELECT employee_id,job_id

   FROM employees

   MINUS

   SELECT employee_id,job_id

   FROM job_history;

   image

 

子查詢

• 在查詢時基於未知的值時,應使用子查詢

• 子查詢(內查詢)在主查詢以前一次執行完成

• 子查詢的結果被主查詢(外查詢)使用

• 子查詢要包含在括號內

• 將子查詢放在比較條件的右側

• 單行操做符對應單行子查詢,多行操做符對應多行子查詢(注意理解ANY和ALL的區別)

    SELECT select_list

    FROM table

    WHERE expr operator (

                                     SELECT select_list

                                     FROM table

                                    );

image

image

 

高級子查詢

<例子說明一切!>

1. 多列子查詢

   --查詢與141號或174號員工的manager_id和department_id相同的其餘員工的employee_id, manager_id, department_id

   --不成對比較
   select employee_id, manager_id, department_id
   from employees
   where manager_id in(
                     select manager_id
                     from employees
                     where employee_id in(141,174)
                    )
   and department_id in(
                     select department_id
                     from employees
                     where employee_id in(141,174)
                    )
   and employee_id not in(141,174)

   --成對比較

   select employee_id, manager_id, department_id
   from employees
   where (manager_id,department_id) in(
                     select manager_id,department_id   --多列子查詢
                     from employees
                     where employee_id in(141,174)
                    )
   and employee_id not in(141,174)

2. 在FROM子句中使用子查詢

  --返回比本部門平均工資高的員工的last_name, department_id, salary及平均工資

   select last_name, e.department_id, salary,temp.avg_sal
   from employees e,(
                  select department_id,avg(salary) avg_sal
                  from employees
                  group by department_id
                  ) temp

   
where e.department_id = temp.department_id

3. 單列子查詢 單列子查詢表達式是在一行中只返回一列的子查詢

  • Oracle8i 只在下列狀況下可使用, 例如:

     – SELECT 語句 (FROM 和 WHERE 子句)

     – INSERT 語句中的VALUES列表中

  • Oracle9i中單列子查詢表達式可在下列狀況下使用:

     – DECODE 和 CASE

     – SELECT 中除 GROUP BY 子句之外的全部子句中

  --顯示員工的employee_id,last_name和location。其中,若員工department_id與location_id爲1800的department_id相同,則location爲’Canada’,其他則爲’USA’

   SELECT employee_id, last_name,

   (CASE

   WHEN department_id =

                               (SELECT department_id FROM departments

                                WHERE location_id = 1800)

   THEN 'Canada' ELSE 'USA' END) location

   FROM employees;

4. 相關子查詢

什麼是相關?

先來舉個栗子!

   --查詢員工的employee_id,last_name,要求按照員工的department_name排序

   SELECT employee_id, last_name

   FROM employees e

   ORDER BY  (SELECT department_name

                     FROM departments d

                     WHERE e.department_id = d.department_id); --首先看內層子查詢使用了外層查詢的表,並經過WHERE語句使他倆產生關係,這種就叫相關子查詢

如上語句的執行步驟是這樣的:先從e表中select一條數據,而後執行子查詢,子查詢用外查詢select的數據進行操做返回一條結果,而後外層查詢再用這個結果來執行order by,這樣主查詢和子查詢就發生了相關性!如圖:

image

5. EXISTS操做符

  • EXISTS 操做符檢查在子查詢中是否存在知足條件的行

  • 若是在子查詢中存在知足條件的行:

     – 不在子查詢中繼續查找

     – 條件返回 TRUE

  • 若是在子查詢中不存在知足條件的行:

     – 條件返回 FALSE

     – 繼續在子查詢中查找

   --查詢公司管理者的employee_id,last_name,job_id,department_id信息

   SELECT employee_id, last_name, job_id, department_id

   FROM employees outer

   WHERE EXISTS ( SELECT 'X'

                            FROM employees

                            WHERE manager_id = outer.employee_id);

   image

   --查詢departments表中,不存在於employees表中的部門的department_id和department_name

   SELECT department_id, department_name

   FROM departments d

   WHERE NOT EXISTS ( SELECT 'X'

                                   FROM employees

                                   WHERE department_id = d.department_id);

   image

6. 相關更新、刪除

  使用相關子查詢依據一個表中的數據更新、刪除另外一個表的數據

   UPDATE table1 alias1

   SET column = (SELECT expression

                         FROM table2 alias2

                         WHERE alias1.column = alias2.column);

   DELETE FROM table1 alias1

   WHERE column operator

                             (SELECT expression

                              FROM table2 alias2

                              WHERE alias1.column = alias2.column);

7. WITH子句

   • 使用 WITH 子句, 能夠避免在 SELECT 語句中重複書寫相同的語句塊

   • WITH 子句將該子句中的語句塊執行一次並存儲到用戶的臨時表空間中

   • 使用 WITH 子句能夠提升查詢效率

  --查詢公司中各部門的總工資大於公司中各部門的平均總工資的部門信息

   WITH
   dept_costs AS (

                          SELECT d.department_name, SUM(e.salary) AS dept_total

                          FROM employees e, departments d

                          WHERE e.department_id = d.department_id

                          GROUP BY d.department_name),

   avg_cost AS (

                        SELECT SUM(dept_total)/COUNT(*) AS dept_avg

                        FROM dept_costs)

   SELECT *

   FROM dept_costs

   WHERE dept_total >

                      (

                        SELECT dept_avg

                        FROM avg_cost)

   ORDER BY department_name;

 

增刪改

插入數據(注意非空約束的列)

  • 手動插入

   INSERT INTO table [(column [, column...])]

   VALUES (value [, value...]);

  • 從其它表中拷貝數據(沒必要書寫VALUES子句;子查詢中的列與INSERT語句中的列一一對應;)

   INSERT INTO sales_reps(idnamesalarycommission_pct)

   SELECT employee_idlast_namesalarycommission_pct

   FROM employees

   WHERE job_id LIKE '%REP%';

更新數據

   UPDATE table

   SET column = value [, column = value, ...]

   [WHERE condition];

刪除數據

   DELETE FROM table

   [WHERE condition];

 

建立管理表

如下這些DDL的命令,操做完後皆不可回滾!

建立表

  • 白手起家本身動手建立表

   CREATE TABLE [schema.]table

   (column datatype [DEFAULT expr][, ...]);

  • 長袖善舞咱依據他表建立新表

   CREATE TABLE table

   [(column, column...)]

   AS subquery;

     --複製現有表(包含數據)

     create table emp1 as select * from employees;

     --複製現有表結構

     create table emp2 as select * from employees where 1=2;

修改表

  • 追加新的列

   ALTER TABLE table

   ADD (column datatype [DEFAULT expr]

   [, column datatype]...);

  • 修改現有的列/爲新追加的列定義默認值

   ALTER TABLE table

   MODIFY (column datatype [DEFAULT expr]

   [, column datatype]...);

  • 刪除一個列

   ALTER TABLE table

   DROP COLUMN column_name;

  • 重命名錶的一個列名

   ALTER TABLE table_name RENAME COLUMM old_column_name

   TO new_column_name;

刪除表

  • 數據和結構都被刪除

  • 全部正在運行的相關事務被提交

  • 全部相關索引被刪除

  • DROP TABLE 語句不能回滾

  DROP TABLE table;   

清空表

  • 刪除表中全部的數據

  • 釋放表的存儲空間

  • TRUNCATE語句不能回滾

  • 清空表的操做也能夠用DELETE語句,能夠回滾

  TRUNCATE TABLE table;

 

事務管理 COMMIT ROLLBACK SAVEPOINT

首先來看看事務:一組邏輯操做單元,使數據從一種狀態變換爲另外一種狀態。由如下部分組成:

   • 一個或多個DML 語句

   • 一個 DDL語句

   • 一個 DCL語句

一圖勝千言!

image

提交或回滾前的數據狀態

   • 改變前的數據狀態是能夠恢復的

   • 執行 DML 操做的用戶能夠經過 SELECT 語句查詢以前的修正

   • 其餘用戶不能看到當前用戶所作的改變,直到當前用戶結束事務

   • DML語句所涉及到的行被鎖定, 其餘用戶不能操做

提交後的數據狀態

   • 數據的改變已經被保存到數據庫中

   • 改變前的數據已經丟失

   • 全部用戶能夠看到結果

   • 鎖被釋放,其餘用戶能夠操做涉及到的數據

   • 全部保存點被釋放

 

約束 CONSTRAINT

• NOT NULL(非空,只能是列級約束) 對INSERT語句有影響

   create table emp4(
   id number(10) constraint emp2_id_nn not null, --命名約束,見名知意
   name varchar2(20) not null, --系統默認命名 SYS_Cn
   salary number(10,2)
   )

 

• UNIQUE(惟一) UNIQUE約束能夠插入NULL值

   create table emp3(
   --列級約束
   id number(10) constraint emp3_id_uk unique,
   name varchar2(20) constraint emp3_name_nn not null,
   email varchar2(30),
   salary number(10,2),
   
--表級約束 在全部列定義完後加個逗號寫約束
   constraint emp3_email_uk unique(email)
   )

 

• PRIMARY KEY(主鍵) 非空且惟一

   create table emp1(
   id number(10),
   name varchar2(20) constraint emp1_name_nn not null,
   email varchar2(20),
   salary number(10,2),
   constraint emp1_email_uk unique(email),
   constraint emp1_id_pk primary key(id)
   )

 

• FOREIGN KEY(外鍵) 外鍵是聯繫兩張表,在子表(emp2)中插入數據時外鍵字段的值必須在父表(departments)中存在

   create table emp2(
   id number(10),
   name varchar2(20) constraint emp2_name_nn not null,
   email varchar2(20),
   salary number(10,2),
   department_id number(10),
   constraint emp2_email_uk unique(email),
   constraint emp2_id_pk primary key(id),
   constraint emp2_dept_id_fk foreign key(department_id) references departments(department_id)
   )

   - ON DELETE CASCADE(級聯刪除):當父表中的列被刪除的時候,子表中相對應的列也被刪除(想成某個部門被砍了,那麼下面的員工也一把被砍掉了)

   - ON SELETE SET NULL(級聯置空):子表中相對應的列置空


 

• CHECK 定義每一行必須知足的條件

   create table emp2(
   id number(10) constraint emp2_id_pk primary key,
   name varchar2(20) constraint emp2_name_nn not null,
   salary number(10) constraint emp2_salary_ck check(salary > 1500 and salary < 30000),
   dept_id number(10),
   constraint emp2_dept_id_fk foreign key(dept_id) references dept1(id) on delete cascade
   )

 

添加刪除約束

• 添加或刪除約束,可是不能修改約束

   ALTER TABLE employees

   ADD CONSTRAINT emp_manager_fk

   FOREIGN KEY(manager_id)

   REFERENCES employees(employee_id);

 

   ALTER TABLE employees

   DROP CONSTRAINT emp_manager_fk;

 

• 有效化無效化約束

   ALTER TABLE employees

   DISABLE CONSTRAINT emp_emp_id_pk;

 

   --當定義或激活UNIQUE 或 PRIMARY KEY 約束時系統會自動建立UNIQUE 或 PRIMARY KEY索引

   ALTER TABLE employees

   ENABLE CONSTRAINT emp_emp_id_pk;

 

• 添加 NOT NULL 約束要使用 MODIFY 語句

   ALTER TABLE emp

   MODIFY(emp_name varchar2(50) NOT NULL);

 

查詢約束

   SELECT constraint_name, constraint_type,

   search_condition

   FROM user_constraints

   WHERE table_name = 'EMPLOYEES';

   image

   --查詢定義約束的列

   SELECT constraint_name, column_name

   FROM user_cons_columns

   WHERE table_name = 'EMPLOYEES';

   image

 

視圖 View

視圖是幹嗎使的?

   • 視圖是一種虛表

   • 視圖創建在已有表的基礎上, 視圖賴以創建的這些表稱爲基表

   • 向視圖提供數據內容的語句爲 SELECT 語句, 能夠將視圖理解爲存儲起來的 SELECT 語句

   • 視圖向用戶提供基表數據的另外一種表現形式

 

視圖有哪些好處?

   • 控制數據訪問

   • 簡化查詢(能夠關聯多張表建立視圖)

   • 對視圖的操做會同步到基表中

   • 避免重複訪問相同的數據

 

建立修改和刪除視圖

  create or replace view empview(id,name,salary,dept_name--同建立表,字段要一一對應,或此處不寫明也可
   as
   select employee_id,first_name||' '||last_name,salary,department_name --給視圖的列定義了別名,在選擇視圖的中列時用別名
   from employees e, departments d
   where e.department_id = d.department_id

   with read only --可使用 WITH READ ONLY 選項屏蔽對視圖的DML操做

 

   drop view empview; --刪除視圖,只是刪除視圖的定義,並不會刪除基表的數據

 

區別簡單視圖和複雜視圖 → 是否使用了聚合函數

   create or replace view empview3
   as
   select d.department_name name, MIN(e.salary) minsal, MAX(e.salary) maxsal, AVG(e.salary) avgsal --使用局和函數的列必須取別名
   from employees e,departments d
   where e.department_id = d.department_id
   
group by d.department_name --使用了分組函數即爲複雜視圖

 

視圖中使用DML的規定,緣由也很簡單,想一想就清楚

• 能夠在簡單視圖中執行 DML 操做

• 當視圖定義中包含如下元素之一時不能使用delete:

   – 組函數

   – GROUP BY 子句

   – DISTINCT 關鍵字

   – ROWNUM 僞列

• 當視圖定義中包含如下元素之一時不能使用update:

   – 組函數

   – GROUP BY子句

   – DISTINCT 關鍵字

   – ROWNUM 僞列

   – 列的定義爲表達式

• 當視圖定義中包含如下元素之一時不能使insert:

   – 組函數

   – GROUP BY 子句

   – DISTINCT 關鍵字

   – ROWNUM 僞列

   – 列的定義爲表達式

   – 表中非空的列在視圖定義中未包括

 

使用「TOP-N」分析

這個咱一步步來解釋:

首先老闆說了,把公司中工資前十名的信息給他。

好!咱寫出這樣的語句:

select employee_id,first_name||' '||last_name name,salary,hire_date
from employees
order by salary desc

給老闆的是全公司員工的數據,這不合適,不能讓他去數前十個吧!

image

那咱幹不下去啦?不,事情總有解決方案!咱先引入一個新的概念:僞列 ROWNUM,它是啥呢,如圖:

image

這個就叫僞列,它與一張表中數據掛鉤!

有了這個那簡單了!

   select rownum,employee_id,first_name||' '||last_name name,salary,hire_date
   from employees
   where rownum <=10
   order by salary desc

image

可是!發現結果好像有點不對啊!這分明就不是工資最高的前十我的嘛!你特麼在逗我!

那麼緣由呢上面我也說了這個ROWNUM是和表中數據對應的,每變動一條數據時ROWNUM都惟一對應着一條數據。

那咱就利用這個概念,既然我SELECT查詢的結果集也有ROWNUM,那我就查詢出排好序的數據,按結果集的ROWNUM我就能夠找到前10我的啦!

   select employee_id,name,salary,hire_date
   from (  --此處用到子查詢
            select employee_id,first_name||' '||last_name name,salary,hire_date
            from employees
            order by salary desc
          )
   where rownum <= 10

   image

013608EB,咱大功告成!

這時候老闆又說了,你給我找到40~50名工資的有哪些人我要作報表。

接到任務很興奮啊!這簡單,把上面那個改改!

   select rownum,employee_id,name,salary,hire_date
   from (
            select employee_id,first_name||' '||last_name name,salary,hire_date
            from employees
            order by salary desc
          )
   where
 rownum <= 50 and rownum >= 40

   image

看到結果的我眼淚掉下來!013F00C1這特麼數據呢!再一看錶中是有數據的呀!

後來咱知道了,對 ROWNUM 只能使用 < 或 <=, 而用 =, >, >= 都將不能返回任何數據!

你說你咋恁多事呢!

那咱就得想其它辦法啦,怎麼作呢?

既然對ROWNUM這個特有的列咱們不能使用=, >, >=,可是通常的列咱行啊!那咱就複製這個列唄!

   select *
   from(
            select rownum rn,employee_id,name,salary,hire_date --經過將ROWNUM這個特有列取別名跟數據庫關鍵字區別開
            from (
                      select employee_id,first_name||' '||last_name name,salary,hire_date
                      from employees
                      order by salary desc
                    )
          )
   
where rn <= 50 and rn >= 40

   image

老闆!你是否是要這個!

 

序列 SEQUENCE:可供多個用戶用來產生惟一數值的數據庫對象

• 自動提供惟一的數值

• 共享對象

• 主要用於提供主鍵值,惟一且非空

• 將序列值裝入內存能夠提升訪問效率

建立序列

   CREATE SEQUENCE sequence

   [INCREMENT BY n] --每次增加的數值

   [START WITH n] --從哪一個值開始

   [{MAXVALUE n | NOMAXVALUE}]

   [{MINVALUE n | NOMINVALUE}]

   [{CYCLE | NOCYCLE}] --是否須要循環

   [{CACHE n | NOCACHE}]; --是否緩存登陸

查詢序列

   SELECT sequence_name, min_value, max_value, increment_by, last_number

   FROM user_sequences--若是指定NOCACHE 選項,則列LAST_NUMBER 顯示序列中下一個有效的值

使用序列

   INSERT INTO departments(department_id, department_name, location_id)

   VALUES (dept_deptid_seq.NEXTVAL, 'Support', 2500);

   • NEXTVAL 返回序列中下一個有效的值,任何用戶均可以引用

   • CURRVAL 中存放序列的當前值

   • NEXTVAL 應在 CURRVAL 以前指定,不然會報CURRVAL 還沒有在此會話中定義的錯誤

   • 將序列值裝入內存可提升訪問效率

   • 序列在下列狀況下出現裂縫:

      – 回滾 ROLLBACK

      – 系統異常

      – 多個表同時使用同一序列

   • 若是不將序列的值裝入內存(NOCACHE), 可以使用表 USER_SEQUENCES 查看序列當前的有效值

修改序列

   ALTER SEQUENCE dept_deptid_seq

   INCREMENT BY 20

   MAXVALUE 999999

   NOCACHE

   NOCYCLE;

   • 必須是序列的擁有者或對序列有 ALTER 權限

   • 只有未來的序列值會被改變

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

刪除序列

   DROP SEQUENCE dept_deptid_seq;

   • 使用 DROP SEQUENCE 語句刪除序列

   • 刪除以後,序列不能再次被引用

 

索引 INDEX

• 一種獨立於表的模式對象, 能夠存儲在與表不一樣的磁盤或表空間中

• 索引被刪除或損壞, 不會對錶產生影響, 其影響的只是查詢的速度

• 索引一旦創建, Oracle 管理系統會對其進行自動維護, 並且由 Oracle 管理系統決定什麼時候使用索引用戶不用在查詢語句中指定使用哪一個索引

• 在刪除一個表時,全部基於該表的索引會自動被刪除

• 經過指針加速 Oracle 服務器的查詢速度

• 經過快速定位數據的方法,減小磁盤 I/O

• 索引加速查詢,可是插入刪除操做會變慢,由於要維護索引表

建立索引

   • 自動建立: 在定義 PRIMARY KEY 或 UNIQUE 約束後系統自動在相應的列上建立惟一性索引

   • 手動建立: 用戶能夠在其它列上建立非惟一的索引,以加速查詢

      CREATE INDEX index

      ON table (column[, column]...);

   • 如下狀況能夠建立索引:

      – 列中數據值分佈範圍很廣

      – 列常常在 WHERE 子句或鏈接條件中出現

      – 表常常被訪問並且數據量很大,訪問的數據大概佔數據總量的2%到4%

   • 何時不要建立索引

      – 表很小

      – 列不常常做爲鏈接條件或出如今WHERE子句中

      – 查詢的數據大於2%到4%

      – 表常常更新

查詢索引

   SELECT ic.index_name, ic.column_name, ic.column_position col_pos,ix.uniqueness

   FROM user_indexes ix, user_ind_columns ic

   WHERE ic.index_name = ix.index_name AND ic.table_name = 'EMPLOYEES';

刪除索引

   DROP INDEX index;

   • 只有索引的擁有者或擁有DROP ANY INDEX 權限的用戶才能夠刪除索引

   • 刪除操做是不可回滾

 

同義詞 SYNONYM

• 方便訪問其它用戶的對象

• 縮短對象名字的長度

建立同義詞

   CREATE [PUBLIC] SYNONYM synonym

   FOR object–object可使表、視圖等

刪除同義詞

   DROP SYNONYM d_sum;

相關文章
相關標籤/搜索