作者: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';
--同義詞:縮短對象的名稱:
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;