DDL語句 常見的數據庫對象


作者:gqk:


DDL:數據庫定義語句:

作用於創建,修改,刪除,管理數據庫對象

會自動提交當前的事務

常見的數據庫對象:

 --創建學生表

CREATE TABLE student
(
    stu_id NUMBER(6),
    stu_name VARCHAR2(50),
    stu_sex  CHAR(2),
    stu_hiredate DATE
);

--刪除學生表 

DROP TABLE student;

--創建學生表(帶列默認值)

CREATE TABLE student
(
    stu_id NUMBER(6),
    stu_name VARCHAR2(50),
    stu_sex  CHAR(2) DEFAULT '男',
    stu_hiredate DATE DEFAULT SYSDATE
);

--利用子查詢創建表

CREATE TABLE new_emp2
AS
SELECT employee_id,last_name
FROM   employees;
/*修改學生表*/
--追加列
ALTER TABLE student
ADD (phone VARCHAR2(50),address VARCHAR2(100));

--修改列

ALTER TABLE student
MODIFY (address VARCHAR2(200));

--刪除列

ALTER TABLE student
DROP (phone);

--重命名對象

RENAME student TO stu;

--清空表

TRUNCATE TABLE stu;

/*
         delete      truncate
事務     可回退      自動提交,不可回退
記錄日志 記錄        不記錄
釋放空間 不釋放空間  釋放空間
*/  

--列注釋

COMMENT ON COLUMN  stu.stu_id IS '學生編號';
COMMENT ON COLUMN  stu.stu_name IS '學生姓名';

/*
五種約束:
not null 非空約束
primary key 主鍵約束
unique 唯一值約束
check  檢查約束
foreign key 外鍵約束
*/

--約束可以建表的同時創建,也可以在建表之后追加創建

--創建約束實驗表

CREATE TABLE newdept
AS
SELECT * FROM departments;

CREATE TABLE newemp
AS
SELECT * FROM employees;

--非空約束:限制列值不允許為空

--修改first_name列為非空

ALTER TABLE newemp
MODIFY (first_name NOT NULL);  

--取消非空約束

ALTER TABLE newemp
MODIFY (first_name NULL);

--增加約束

ALTER TABLE 表名
ADD CONSTRAINTS 自定義約束名稱 約束設置;

--主鍵約束:限制列值不允許重復,且不能為空,一個表只能由一個主鍵

--設置主鍵約束

ALTER TABLE newemp
ADD CONSTRAINTS newemp_empid_pk PRIMARY KEY (employee_id);

--刪除約束

ALTER TABLE newemp
DROP CONSTRAINTS newemp_empid_pk;


--復合主鍵(多列組成一個主鍵)

ALTER TABLE newemp
ADD CONSTRAINTS newemp_ename_pk PRIMARY KEY (first_name,last_name);

--唯一值約束:限制列值不允許重復,不限制空值,一個表中可以有多個唯一值約束
--設置唯一值約束

ALTER TABLE newemp
ADD CONSTRAINTS newemp_email_uk UNIQUE (email);

--檢查約束:限制自定義條件,忽略空值
--限制工資不能少於400

ALTER TABLE newemp
ADD CONSTRAINTS newemp_sal_chk CHECK (salary>=400);

--外鍵約束:限制外鍵列值必須是引用的主表中的主鍵列存在的列值,不限制空值
--前置條件:引用的主表中的主鍵列必須已經設置主鍵約束 

--部門主鍵約束設置

ALTER TABLE newdept
ADD CONSTRAINTS newdept_deptid_pk PRIMARY KEY (department_id); 

--員工外鍵約束設置

ALTER TABLE newemp
ADD CONSTRAINTS newemp_deptid_fk FOREIGN KEY (department_id)
REFERENCES newdept (department_id);

--級聯刪除

ALTER TABLE newemp
ADD CONSTRAINTS newemp_deptid_fk FOREIGN KEY (department_id)
REFERENCES newdept (department_id)
ON DELETE CASCADE;

--級聯置空

ALTER TABLE newemp
ADD CONSTRAINTS newemp_deptid_fk FOREIGN KEY (department_id)
REFERENCES newdept (department_id)
ON DELETE SET NULL;

--創建表的同時增加約束:

CREATE TABLE emp2
(
   emp_id NUMBER(6) PRIMARY KEY,
   emp_name VARCHAR2(50) NOT NULL,
   emp_email VARCHAR2(50) UNIQUE,
   emp_sal   NUMBER(8,2)  CHECK (emp_sal>=400),
   emp_deptid NUMBER(6) REFERENCES newdept (department_id)
);

CREATE TABLE emp3
(
   emp_id NUMBER(6),
   emp_name VARCHAR2(50) NOT NULL,
   emp_email VARCHAR2(50),
   emp_sal   NUMBER(8,2),
   emp_deptid NUMBER(6),
   CONSTRAINTS emp2_empid_pk PRIMARY KEY (emp_id),
   CONSTRAINTS emp2_email_uk UNIQUE (emp_email),
   CONSTRAINTS emp2_sal_chk CHECK (emp_sal>=400),
   CONSTRAINTS emp2_deptid_fk FOREIGN KEY (emp_deptid)
   REFERENCES newdept (department_id)
);

  --無效化約束(暫時使約束失效)

ALTER TABLE newemp
DISABLE CONSTRAINTS newemp_empid_pk;

  
--激活約束

ALTER TABLE newemp
ENABLE CONSTRAINTS newemp_empid_pk;

--視圖:虛擬表,作用是保存查詢結果,僅保存查詢語句,而不保存真實數據(物化視圖例外)  

 

--創建視圖語法(如果查詢語句中有衍生列,必須起別名)
CREATE [OR REPLACE] VIEW 視圖名稱
AS
查詢語句

 --查詢員工表中的50號部門的員工編號,姓名,工資

CREATE OR REPLACE VIEW v_emp
AS
SELECT employee_id,last_name,salary
FROM   employees
WHERE  department_id=50;

 --查詢視圖
SELECT * FROM v_emp; 

--創建視圖v_dept:查詢每個部門的編號,名稱,員工人數,員工工資總和

CREATE OR REPLACE VIEW v_dept
AS
SELECT d.department_id,
       d.department_name,
       COUNT(e.employee_id) emp_count,
       SUM(e.salary) sal_sum
FROM   departments d
INNER  JOIN employees e ON d.department_id = e.department_id
GROUP  BY d.department_id,
          d.department_name;

 --查詢視圖
SELECT * FROM v_dept WHERE emp_count>=3;

 --創建只讀視圖

CREATE OR REPLACE VIEW v_emp
AS
SELECT employee_id,last_name,salary
FROM   employees
WHERE  department_id=50
WITH READ ONLY;

  --刪除視圖

DROP VIEW v_emp;

視圖中使用DML的規定

a)        可以在簡單視圖中執行 DML操作

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

                                      i.             組函數

                                    ii.             GROUP BY子句

                                   iii.             DISTINCT關鍵字

                                   iv.             ROWNUM 偽列 DUAL偽表

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

                                      i.             組函數

                                    ii.             GROUP BY子句

                                   iii.             DISTINCT關鍵字

                                   iv.             ROWNUM 偽列

                                    v.             列的定義為表達式

d)        當視圖定義中包含以下元素之一時不能使用insert:

                                      i.             組函數

                                    ii.             GROUP BY子句

                                   iii.             DISTINCT關鍵字

                                   iv.             ROWNUM 偽列

                                    v.             列的定義為表達式

                                   vi.             中非空的列在視圖定義中未包括

 序列 :

通常我們在創建一個表時,都會定義一列為主鍵,通常是數字,對於主鍵我們的要求就是非空且唯一,然而在實際插入數據的時候,我們如何才能保證這個數據是唯一的呢,一種方式就是通過java代碼寫個工具類,產生唯一的數字,另一種方式就是今天所要介紹的一個數據庫對象–序列。


1.什么是序列?

答:序列是oracle提供的用於產生一系列唯一數字的數據庫對象。

2.它有什么作用?

  • 自動提供有規律且唯一的值;
  • 共享對象;
  • 通常用於表的主鍵的值;
  • 將序列存入內存可以提高查詢效率。

--創建序列

CREATE SEQUENCE stu_seq
START WITH 100  --起始值,默認是1
INCREMENT BY 10 --遞增值,默認是1
NOMAXVALUE      --最大值,默認無最大值
NOCYCLE         --假如設置了最大值,到達最大值之后,是否從頭開始,默認NOCYCLE
CACHE 10        --緩存數量,默認20
;

--刪除序列

DROP SEQUENCE stu_seq; 

--創建序列(使用默認值)

CREATE SEQUENCE stu_seq;

在使用的之前我們需要了解兩個”方法”,一個是 序列名.nextval,這個可以類別我們java中的迭代器的概念,代表指向下一個序列值,而序列名.currval,則返回當前值。我們通過偽表dual,來展示一下;

SELECT stu_seq.nextval FROM dual;
SELECT stu_seq.currval FROM dual;

  --在插入語句中使用序列

INSERT INTO stu VALUES (stu_seq.nextval,'tom','男',sysdate);

查詢序列
查詢時我們可以通過工具查看sequences文件夾,當然用命令應該更快點
select increment_by,start_with,max_value,min_value from USER_SEQUENCES;  

.裂縫 
在使用序列的過程中可能會出現裂縫,也就是序列不連續了,比如本來是主鍵值依此應該是1,2,3,4,出現裂縫的意思就是主鍵值是1,3,4,5。那么是什么原因導致出現裂縫的呢,主要原因如下:
1.回滾數據導致的,我們知道可以使用rollback可以對我們剛剛插入的數據進行回滾,但是我們要知道的一點就是序列不會回滾也就是這個值我們已經使用過了,盡管現在不用了,但是虛擬指針已經指向了后面的位置了,不可能回退了,所一展現給我們的也就產生了裂縫。
 2系統異常:也就是我們插入數據時候系統異常了,數據並沒有插入進去, 但是序列值已經使用了,所以下次在此調用序列時就是后面一個序列了,也產生了裂縫。
多個表使用同一個序列,因為有些值在其他表顯示,所以在這個表上面看就出現了裂縫。
---------------------
數據庫索引:

  索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息。如果想按特定職員的姓來查找他或她,則與在表中搜索所有的行相比,索引有助於更快地獲取信息。

例如這樣一個查詢:select * from table1 where id=10000。如果沒有索引,必須遍歷整個表,直到ID等於10000的這一行被找到為止;有了索引之后(必須是在ID這一列上建立的索引),即可在索引中查找。由於索引是經過某種算法優化過的,因而查找次數要少的多。可見,索引是用來定位的。

--創建實驗表
CREATE TABLE new_emp
AS
SELECT * FROM employees;

  --創建唯一性索引:

ALTER TABLE new_emp
ADD CONSTRAINTS newemp_empid_pk PRIMARY KEY (employee_id);

  
--創建普通索引

CREATE INDEX newemp_lname_idx ON new_emp (last_name);

--刪除索引

DROP INDEX newemp_lname_idx;

--創建基於函數的索引

CREATE INDEX newemp_lname_idx ON new_emp (LOWER(last_name));

--創建位圖索引

CREATE BITMAP INDEX newemp_jobid_idx ON new_emp (job_id);

--查詢實驗:

SELECT * FROM new_emp WHERE employee_id=174;
SELECT * FROM new_emp WHERE last_name='King';
SELECT * FROM new_emp WHERE LOWER(last_name)='king';
SELECT * FROM new_emp WHERE job_id='xxx';

  

索引是建立在數據庫表中的某些列的上面。在創建索引的時候,應該考慮在哪些列上可以創建索引,在哪些列上不能創建索引。一般來說,應該在這些列上創建索引:
在經常需要搜索的列上,可以加快搜索的速度;
在作為 主鍵的列上,強制該列的唯一性和組織表中數據的排列結構;
在經常用在連接的列上,這些列主要是一些 外鍵,可以加快連接的速度;在經常需要根據范圍進行搜索的列上創建索引,因為索引已經排序,其指定的范圍是連續的;
在經常需要排序的列上創建索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間;
在經常使用在WHERE子句中的列上面創建 索引,加快條件的判斷速度。
同樣,對於有些列不應該創建索引。一般來說,不應該創建索引的這些列具有下列特點:
第一,對於那些在查詢中很少使用或者參考的列不應該創建索引。這是因為,既然這些列很少使用到,因此有索引或者無索引,並不能提高查詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增大了空間需求。
第二,對於那些只有很少數據值的列也不應該增加索引。這是因為,由於這些列的取值很少,例如人事表的性別列,在查詢的結果中, 結果集的數據行占了表中數據行的很大比例,即需要在表中搜索的數據行的比例很大。增加 索引,並不能明顯加快檢索速度。
第三,對於那些定義為text, image和 bit數據類型的列不應該增加索引。這是因為,這些列的數據量要么相當大,要么取值很少,不利於使用索引。
第四,當修改性能遠遠大於檢索性能時,不應該創建索引。這是因為,修改性能和檢索性能是互相矛盾的。當增加索引時,會提高檢索性能,但是會降低修改性能。當減少索引時,會提高修改性能,降低檢索性能。因此,當修改操作遠遠多於檢索操作時,不應該創建索引。

--同義詞:縮短對象的名稱:

SELECT * FROM user_tables;
SELECT * FROM tabs;

--授權
GRANT CREATE SYNONYM TO scott;
--創建同義詞
CREATE SYNONYM e FOR employees;
--使用同義詞
SELECT * FROM e;
--刪除同義詞
DROP SYNONYM e;
用戶權限問題
--創建新用戶
CREATE USER icss IDENTIFIED BY icss;

--DCL授權語句
--GRANT 權限1,權限2,…… TO 用戶;

--DCL收權語句
--REVOKE 權限1,權限2,……FROM 用戶;

--授予創建會話的權限給ICSS
GRANT CREATE SESSION TO icss;

--回收權限
REVOKE CREATE SESSION FROM icss;

--授予開發人員權限
GRANT CONNECT,RESOURCE TO icss;
GRANT CREATE VIEW TO icss;

--修改密碼
ALTER USER icss IDENTIFIED BY abcd;

--解鎖用戶
ALTER USER icss ACCOUNT UNLOCK;

--授予對象訪問權限
GRANT SELECT ON scott.employees TO icss;
GRANT ALL ON scott.employees TO icss;

--回收對象訪問權限
REVOKE  ALL ON scott.employees FROM icss;

--刪除用戶
DROP USER icss CASCADE;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM