5.DML
DML 語句 語句操作語言
INSERT
UPDATE
DELETE
MERGE
INSERT 方法:
按順序列插入
按指定列插入
default值插入
子查詢(代替values)結果插入
替代變量插入
DML 語句 語句操作語言
INSERT
UPDATE
DELETE
MERGE
INSERT 方法:
按順序列插入
按指定列插入
default值插入
子查詢(代替values)結果插入
替代變量插入
SQL> create table t1(id number,name varchar2(20) default 'dxw');
表已創建。
SQL> select *from t1;
未選定行
SQL> insert into t1(id) values(1);
已創建 1 行。
SQL> select *from t1;
ID NAME
---------- --------------------------------------------------
1 dxw
SQL> insert into t1(id,name) values(1,'daivd');
已創建 1 行。
SQL> select *from t1;
ID NAME
---------- --------------------------------------------------
1 dxw
1 daivd
SQL> insert into t1 values(1,'xyz');
已創建 1 行。
SQL> select *from t1;
ID NAME
---------- --------------------------------------------------
1 dxw
1 daivd
1 xyz
SQL>
SQL> insert into t1 select empno,ename from emp;
已創建14行。
SQL> select *from t1;
ID NAME
---------- --------------------------------------------------
1 dxw
1 daivd
1 xyz
7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
7654 MARTIN
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING
7844 TURNER
7876 ADAMS
7900 JAMES
7902 FORD
7934 MILLER
已選擇17行。
SQL>
SQL> insert into t1(id,name) values(&a,&b);
輸入 a 的值:? 1000
輸入 b 的值:? qwer
原值? ? 1: insert into t1(id,name) values(&a,&b)
新值? ? 1: insert into t1(id,name) values(1000,qwer)
insert into t1(id,name) values(1000,qwer)
*
第 1 行出現錯誤:
ORA-00984: 列在此處不允許
SQL> insert into t1(id,name) values(&a,&b);
輸入 a 的值:? 1000
輸入 b 的值:? 'qwer'
原值? ? 1: insert into t1(id,name) values(&a,&b)
新值? ? 1: insert into t1(id,name) values(1000,'qwer')
已創建 1 行。
SQL> select *from t1;
ID NAME
---------- --------------------------------------------------
1 dxw
1 daivd
1 xyz
7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
7654 MARTIN
。。。。。。。。
update 更新表中數據
一定要加where子句 否則會應用到所有行
加了where子句時只更新where條件受影響的行
多列同時更新列與列之間用逗號分隔
更新日期列時要避免隱式轉換 使用to_date()函數
使用defulat值更新依舊使用default關鍵字
子查詢更新保證等號兩邊列的數量一致
SQL> create table t1 as select *from emp;
Table created.
SQL> select *from t1;
EMPNO ENAME? ? ? JOB ? ? ? MGR HIREDATE ? ? SAL? ? ? COMM? ? DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH? ? ? CLERK ? ? ? 7902 17-DEC-80 ? ? 800 ? 20
7499 ALLEN? ? ? SALESMAN ? ? ? 7698 20-FEB-81 ? 1600? ? ? ? 300 ? 30
7521 WARD? ? ? SALESMAN ? ? ? 7698 22-FEB-81 ? 1250? ? ? ? 500 ? 30
7566 JONES? ? ? MANAGER ? ? ? 7839 02-APR-81 ? 2975 ? 20
7654 MARTIN? ? SALESMAN ? ? ? 7698 28-SEP-81 ? 1250? ? ? 1400 ? 30
7698 BLAKE? ? ? MANAGER ? ? ? 7839 01-MAY-81 ? 2850 ? 30
7782 CLARK? ? ? MANAGER ? ? ? 7839 09-JUN-81 ? 2450 ? 10
7788 SCOTT? ? ? ANALYST ? ? ? 7566 19-APR-87 ? 3000 ? 20
7839 KING? ? ? PRESIDENT ? 17-NOV-81 ? 5000 ? 10
7844 TURNER? ? SALESMAN ? ? ? 7698 08-SEP-81 ? 1500 0 ? 30
7876 ADAMS? ? ? CLERK ? ? ? 7788 23-MAY-87 ? 1100 ? 20
7900 JAMES? ? ? CLERK ? ? ? 7698 03-DEC-81 ? ? 950 ? 30
7902 FORD? ? ? ANALYST ? ? ? 7566 03-DEC-81 ? 3000 ? 20
7934 MILLER? ? CLERK ? ? ? 7782 23-JAN-82 ? 1300 ? 10
14 rows selected.
SQL> update t1 set sal=1000;
14 rows updated.
SQL> select *from t1;
EMPNO ENAME? ? ? JOB ? ? ? MGR HIREDATE ? ? SAL? ? ? COMM? ? DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH? ? ? CLERK ? ? ? 7902 17-DEC-80 ? 1000 ? 20
7499 ALLEN? ? ? SALESMAN ? ? ? 7698 20-FEB-81 ? 1000? ? ? ? 300 ? 30
7521 WARD? ? ? SALESMAN ? ? ? 7698 22-FEB-81 ? 1000? ? ? ? 500 ? 30
7566 JONES? ? ? MANAGER ? ? ? 7839 02-APR-81 ? 1000 ? 20
7654 MARTIN? ? SALESMAN ? ? ? 7698 28-SEP-81 ? 1000? ? ? 1400 ? 30
7698 BLAKE? ? ? MANAGER ? ? ? 7839 01-MAY-81 ? 1000 ? 30
7782 CLARK? ? ? MANAGER ? ? ? 7839 09-JUN-81 ? 1000 ? 10
7788 SCOTT? ? ? ANALYST ? ? ? 7566 19-APR-87 ? 1000 ? 20
7839 KING? ? ? PRESIDENT ? 17-NOV-81 ? 1000 ? 10
7844 TURNER? ? SALESMAN ? ? ? 7698 08-SEP-81 ? 1000 0 ? 30
7876 ADAMS? ? ? CLERK ? ? ? 7788 23-MAY-87 ? 1000 ? 20
7900 JAMES? ? ? CLERK ? ? ? 7698 03-DEC-81 ? 1000 ? 30
7902 FORD? ? ? ANALYST ? ? ? 7566 03-DEC-81 ? 1000 ? 20
7934 MILLER? ? CLERK ? ? ? 7782 23-JAN-82 ? 1000 ? 10
14 rows selected.
SQL> update t1 set sal=2000 where deptno=20;
5 rows updated.
SQL>
SQL> select *from t1;
EMPNO ENAME? ? ? JOB ? ? ? MGR HIREDATE ? ? SAL? ? ? COMM? ? DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH? ? ? CLERK ? ? ? 7902 17-DEC-80 ? 2000 ? 20
7499 ALLEN? ? ? SALESMAN ? ? ? 7698 20-FEB-81 ? 1000? ? ? ? 300 ? 30
7521 WARD? ? ? SALESMAN ? ? ? 7698 22-FEB-81 ? 1000? ? ? ? 500 ? 30
7566 JONES? ? ? MANAGER ? ? ? 7839 02-APR-81 ? 2000 ? 20
7654 MARTIN? ? SALESMAN ? ? ? 7698 28-SEP-81 ? 1000? ? ? 1400 ? 30
7698 BLAKE? ? ? MANAGER ? ? ? 7839 01-MAY-81 ? 1000 ? 30
7782 CLARK? ? ? MANAGER ? ? ? 7839 09-JUN-81 ? 1000 ? 10
7788 SCOTT? ? ? ANALYST ? ? ? 7566 19-APR-87 ? 2000 ? 20
7839 KING? ? ? PRESIDENT ? 17-NOV-81 ? 1000 ? 10
7844 TURNER? ? SALESMAN ? ? ? 7698 08-SEP-81 ? 1000 0 ? 30
7876 ADAMS? ? ? CLERK ? ? ? 7788 23-MAY-87 ? 2000 ? 20
7900 JAMES? ? ? CLERK ? ? ? 7698 03-DEC-81 ? 1000 ? 30
7902 FORD? ? ? ANALYST ? ? ? 7566 03-DEC-81 ? 2000 ? 20
7934 MILLER? ? CLERK ? ? ? 7782 23-JAN-82 ? 1000 ? 10
14 rows selected.
SQL> update t1 set (job,sal)=(select 'worker',3000 from dual) where deptno=30;
6 rows updated.
SQL> select *from t1 order by deptno;
EMPNO ENAME? ? ? JOB ? ? ? MGR HIREDATE ? ? SAL? ? ? COMM? ? DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7782 CLARK? ? ? MANAGER ? ? ? 7839 09-JUN-81 ? 1000 ? 10
7839 KING? ? ? PRESIDENT ? 17-NOV-81 ? 1000 ? 10
7934 MILLER? ? CLERK ? ? ? 7782 23-JAN-82 ? 1000 ? 10
7566 JONES? ? ? MANAGER ? ? ? 7839 02-APR-81 ? 2000 ? 20
7902 FORD? ? ? ANALYST ? ? ? 7566 03-DEC-81 ? 2000 ? 20
7876 ADAMS? ? ? CLERK ? ? ? 7788 23-MAY-87 ? 2000 ? 20
7369 SMITH? ? ? CLERK ? ? ? 7902 17-DEC-80 ? 2000 ? 20
7788 SCOTT? ? ? ANALYST ? ? ? 7566 19-APR-87 ? 2000 ? 20
7521 WARD? ? ? worker ? ? ? 7698 22-FEB-81 ? 3000? ? ? ? 500 ? 30
7844 TURNER? ? worker ? ? ? 7698 08-SEP-81 ? 3000 0 ? 30
7499 ALLEN? ? ? worker ? ? ? 7698 20-FEB-81 ? 3000? ? ? ? 300 ? 30
7900 JAMES? ? ? worker ? ? ? 7698 03-DEC-81 ? 3000 ? 30
7698 BLAKE? ? ? worker ? ? ? 7839 01-MAY-81 ? 3000 ? 30
7654 MARTIN? ? worker ? ? ? 7698 28-SEP-81 ? 3000? ? ? 1400 ? 30
14 rows selected.
子查詢更新,使用子查詢得到的結果對目標表進行更新,如果要更新多個字段,需要把這些字段用括號
括起來,并且用逗號隔開。
SQL> update myemp set (job,sal)=(select job,sal from emp where empno=7788);
已更新14行。
SQL> select *from myemp;
EMPNO ENAME? ? ? JOB? ? ? ? ? ? ? MGR HIREDATE? ? ? ? ? ? ? ? ? SAL? ? ? COMM? ? DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
7369 SMITH? ? ? ANALYST? ? ? ? 7902 1980-12-17 00:00:00? ? ? 3500? ? ? ? ? ? ? ? ? ? 20
7499 ALLEN? ? ? ANALYST? ? ? ? 7698 1981-02-20 00:00:00? ? ? 3500? ? ? ? ? ? ? ? ? ? 30
7521 WARD? ? ? ANALYST? ? ? ? 7698 1981-02-22 00:00:00? ? ? 3500? ? ? ? ? ? ? ? ? ? 30
7566 JONES? ? ? ANALYST? ? ? ? 7839 1981-04-02 00:00:00? ? ? 3500? ? ? ? ? ? ? ? ? ? 20
7654 MARTIN? ? ANALYST? ? ? ? 7698 1981-09-28 00:00:00? ? ? 3500? ? ? ? ? ? ? ? ? ? 30
7698 BLAKE? ? ? ANALYST? ? ? ? 7839 1981-05-01 00:00:00? ? ? 3500? ? ? ? ? ? ? ? ? ? 30
7782 CLARK? ? ? ANALYST? ? ? ? 7839 2016-05-25 00:00:00? ? ? 3500? ? ? 1000? ? ? ? 10
7788 SCOTT? ? ? ANALYST? ? ? ? 7566 1987-04-19 00:00:00? ? ? 3500? ? ? ? ? ? ? ? ? ? 20
7839 KING? ? ? ANALYST? ? ? ? ? ? ? 2016-05-25 00:00:00? ? ? 3500? ? ? 1000? ? ? ? 10
7844 TURNER? ? ANALYST? ? ? ? 7698 1981-09-08 00:00:00? ? ? 3500? ? ? ? ? ? ? ? ? ? 30
7876 ADAMS? ? ? ANALYST? ? ? ? 7788 1987-05-23 00:00:00? ? ? 3500? ? ? ? ? ? ? ? ? ? 20
7900 JAMES? ? ? ANALYST? ? ? ? 7698 1981-12-03 00:00:00? ? ? 3500? ? ? ? ? ? ? ? ? ? 30
7902 FORD? ? ? ANALYST? ? ? ? 7566 1981-12-03 00:00:00? ? ? 3500? ? ? ? ? ? ? ? ? ? 20
7934 MILLER? ? ANALYST? ? ? ? 7782 2016-05-25 00:00:00? ? ? 3500? ? ? 1000? ? ? ? 10
已選擇14行。
關聯子查詢更新
SQL> update myemp m set (job,sal,comm)=(select job,sal,comm from emp where empno=m.empno);
已更新14行。
SQL> select *from myemp;
EMPNO ENAME? ? ? JOB? ? ? ? ? ? ? MGR HIREDATE? ? ? ? ? ? ? ? ? SAL? ? ? COMM? ? DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
7369 SMITH? ? ? CLERK? ? ? ? ? 7902 1980-12-17 00:00:00? ? ? ? 900? ? ? ? ? ? ? ? ? ? 20
7499 ALLEN? ? ? SALESMAN? ? ? ? 7698 1981-02-20 00:00:00? ? ? 1600? ? ? ? 300? ? ? ? 30
7521 WARD? ? ? SALESMAN? ? ? ? 7698 1981-02-22 00:00:00? ? ? 1250? ? ? ? 500? ? ? ? 30
7566 JONES? ? ? MANAGER? ? ? ? 7839 1981-04-02 00:00:00? ? ? 2975? ? ? ? ? ? ? ? ? ? 20
7654 MARTIN? ? SALESMAN? ? ? ? 7698 1981-09-28 00:00:00? ? ? 1250? ? ? 1400? ? ? ? 30
7698 BLAKE? ? ? MANAGER? ? ? ? 7839 1981-05-01 00:00:00? ? ? 2850? ? ? ? ? ? ? ? ? ? 30
7782 CLARK? ? ? MANAGER? ? ? ? 7839 2016-05-25 00:00:00? ? ? 2450? ? ? ? ? ? ? ? ? ? 10
7788 SCOTT? ? ? ANALYST? ? ? ? 7566 1987-04-19 00:00:00? ? ? 3500? ? ? ? ? ? ? ? ? ? 20
7839 KING? ? ? PRESIDENT? ? ? ? ? ? 2016-05-25 00:00:00? ? ? 5000? ? ? ? ? ? ? ? ? ? 10
7844 TURNER? ? SALESMAN? ? ? ? 7698 1981-09-08 00:00:00? ? ? 1500? ? ? ? ? 0? ? ? ? 30
7876 ADAMS? ? ? CLERK? ? ? ? ? 7788 1987-05-23 00:00:00? ? ? 1100? ? ? ? ? ? ? ? ? ? 20
7900 JAMES? ? ? CLERK? ? ? ? ? 7698 1981-12-03 00:00:00? ? ? ? 950? ? ? ? ? ? ? ? ? ? 30
7902 FORD? ? ? ANALYST? ? ? ? 7566 1981-12-03 00:00:00? ? ? 3000? ? ? ? ? ? ? ? ? ? 20
7934 MILLER? ? CLERK? ? ? ? ? 7782 2016-05-25 00:00:00? ? ? 1300? ? ? ? ? ? ? ? ? ? 10
已選擇14行。
delete 刪除表數據
不加where 全部記錄刪除
加where只刪除條件滿足行
where條件中也可以使用子查詢
delete t1
delete t1 where ....
SQL> delete from myemp where deptno=(select deptno from dept where loc='NEW YORK');
已刪除3行。
SQL> SELECT *FROM MYEMP;
EMPNO ENAME? ? ? JOB? ? ? ? ? ? ? MGR HIREDATE? ? ? ? ? ? ? ? ? SAL? ? ? COMM? ? DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
7369 SMITH? ? ? CLERK? ? ? ? ? 7902 1980-12-17 00:00:00? ? ? ? 900? ? ? ? ? ? ? ? ? ? 20
7499 ALLEN? ? ? SALESMAN? ? ? ? 7698 1981-02-20 00:00:00? ? ? 1600? ? ? ? 300? ? ? ? 30
7521 WARD? ? ? SALESMAN? ? ? ? 7698 1981-02-22 00:00:00? ? ? 1250? ? ? ? 500? ? ? ? 30
7566 JONES? ? ? MANAGER? ? ? ? 7839 1981-04-02 00:00:00? ? ? 2975? ? ? ? ? ? ? ? ? ? 20
7654 MARTIN? ? SALESMAN? ? ? ? 7698 1981-09-28 00:00:00? ? ? 1250? ? ? 1400? ? ? ? 30
7698 BLAKE? ? ? MANAGER? ? ? ? 7839 1981-05-01 00:00:00? ? ? 2850? ? ? ? ? ? ? ? ? ? 30
7788 SCOTT? ? ? ANALYST? ? ? ? 7566 1987-04-19 00:00:00? ? ? 3500? ? ? ? ? ? ? ? ? ? 20
7844 TURNER? ? SALESMAN? ? ? ? 7698 1981-09-08 00:00:00? ? ? 1500? ? ? ? ? 0? ? ? ? 30
7876 ADAMS? ? ? CLERK? ? ? ? ? 7788 1987-05-23 00:00:00? ? ? 1100? ? ? ? ? ? ? ? ? ? 20
7900 JAMES? ? ? CLERK? ? ? ? ? 7698 1981-12-03 00:00:00? ? ? ? 950? ? ? ? ? ? ? ? ? ? 30
7902 FORD? ? ? ANALYST? ? ? ? 7566 1981-12-03 00:00:00? ? ? 3000? ? ? ? ? ? ? ? ? ? 20
已選擇11行。
ORACLE就提供了merge來解決這種選擇性執行DML語句
語法:
MERGE INTO table_name table_alias
USING (table|view|sub_query) alias
ON (join condition)
WHEN MATCHED THEN
UPDATE SET
COL1=COL_VAR1,
COL2=COL_VAR2
WHERE expr
DELETE WHERE expr
WEHN NOT MATCHED THEN
INSERT (col1,col2,...)
VALUES (col_var1,col_var2,...);
INTO 被插入或更新的表
USING 參照表 插入或更新的數據從這個表獲取
ON 條件
WHEN MATCHED THEN? 條件成立判斷
UPDATE SET 更新內容(不寫表名) 而且建立關系的列不用用于更新
WEHN NOT MATCHED THEN 條件失敗判斷
INSERT VALUES 插入內容(不寫表名)
SQL> create table myemp as select empno,ename,deptno,sal from emp where deptno=10;
表已創建。
SQL> select *from myemp;
EMPNO ENAME? ? ? ? ? DEPTNO? ? ? ? SAL
---------- ---------- ---------- ----------
7782 CLARK? ? ? ? ? ? ? 10? ? ? 2450
7839 KING? ? ? ? ? ? ? 10? ? ? 5000
7934 MILLER? ? ? ? ? ? 10? ? ? 1300
SQL> update myemp set sal=0;
已更新3行。
SQL> commit;
提交完成。
SQL> select *from myemp;
EMPNO ENAME? ? ? ? ? DEPTNO? ? ? ? SAL
---------- ---------- ---------- ----------
7782 CLARK? ? ? ? ? ? ? 10? ? ? ? ? 0
7839 KING? ? ? ? ? ? ? 10? ? ? ? ? 0
7934 MILLER? ? ? ? ? ? 10? ? ? ? ? 0
merge into myemp m
using emp e
on(m.empno=e.empno)
when matched then
update set m.sal=e.sal
where m.empno=7839
when not matched then
insert values(e.empno,e.ename,e.deptno,e.sal)
where e.deptno=20
SQL> select *from myemp;
EMPNO ENAME? ? ? ? ? DEPTNO? ? ? ? SAL
---------- ---------- ---------- ----------
7782 CLARK? ? ? ? ? ? ? 10? ? ? ? ? 0
7839 KING? ? ? ? ? ? ? 10? ? ? 5000
7934 MILLER? ? ? ? ? ? 10? ? ? ? ? 0
7369 SMITH? ? ? ? ? ? ? 20? ? ? ? 900
7566 JONES? ? ? ? ? ? ? 20? ? ? 2975
7788 SCOTT? ? ? ? ? ? ? 20? ? ? 3500
7876 ADAMS? ? ? ? ? ? ? 20? ? ? 1100
7902 FORD? ? ? ? ? ? ? 20? ? ? 3000
update后可以使用delete where子句
刪除規則: 匹配delete條件并且匹配on條件,并且匹配update的where條件。
6.DCL
DCL 語句 數據控制語言
GRANT? 授予
REVOKE? 回收
DCL語言會在講授權限控制時接觸到更多權限和角色
權限? grant 權限? to user
revoke 權限 from user
7.TCL
TCL 事務控制 語句
什么是事務:用于確保數據的一致性,由一組相關的DML組成, 該組DML的操作要么全確認,要么全取消
比如銀行轉賬業務 步驟一:從A賬戶減少300元,步驟二:向B賬戶增加300元.
為了確保總的金額不變 就要維持數據的一致性 步驟一和步驟二兩個操作或者全確認 或者全取消
事務的開始語句:update insert delete? select ... for update 都能觸發一個事務的開啟
事務的結束語句:commit提交 rollback回滾
未完成的事務可以撤銷
未完成的事務,其他會話看不到結果,只能看到提交的結果
維護事務需要鎖和回退段參與
事務四個特性
事務的原子性:事務中的所有操作作為一個整體,要么全部回退,要么全部提交
事務的隔離性:事務之間互相隔離,相互獨立存在
事務的一致性:未提交的事務不被其他會話看到
事務的持久性:事務提交后,數據永久生效
事物控制語句
COMMIT
SAVEPOINT
savepoint t1
rollback to t1
ROLLBACK
事務的提交方法
1.手動提交
執行commit語句
2.自動提交
ddl,dcl會自動提交之前未結束的事務
exit|disconnect 退出sqlplus會自動提交
3. 設置sqlplus里: set autocommit on|off
事務的撤銷方法
1.手動撤銷
執行rollback
2.自動撤銷
網絡或數據庫崩潰
強制退出sqlplus 點擊X按鈕
commit 執行就是提交整個事務
rollback 用savepoint設置定點 可以回退到事務過程中的定點位置
8.數據庫其他資源
(1).用戶和權限
創建用戶
CREATE USER user_name IDENTIFIED BY password;
DROP USER user_name [cascade];
ALTER USER user_name ACCOUNT [UN]LOCK;
什么是權限
權限就是用來控制特定的用戶發送特定的SQL語句是否允許正確的執行
在多用戶環境,DBA需要維護數據庫訪問的安全
以確保特定用戶擁有特定的操作權限
數據庫的權限分為
系統權限
對象權限
系統權限
大部分是針對對象的創建,刪除,修改,審計等等的操作
查看系統都具備哪些權限
select DISTINCT PRIVILEGE from dba_sys_privs;
查看當前會話都具備哪些權限
select * from session_privs;
對象權限
授予特定用戶對特定對象的權限
特定對象:表、視圖、序列、過程、函數、程序包上。
角色
角色就是一組權限的集合
我們也可以自己建立包含自己擬定權限的角色
查看oracle給你定制了哪些角色
SQL> SELECT *FROM DBA_ROLES;
(2).視圖
視圖 view
命名的sql語句,存儲在數據字典中
視圖本身不包含數據(物化視圖除外),視圖的數據來源于基表或其他視圖(創建視圖時的查詢所關聯的表)
視圖優缺點
可以限制數據的訪問
方便管理
增加了數據庫的負擔
查看視圖的定義
user_views
視圖分類
簡單視圖
只有單表
不包含去重,聚集,分組,函數,偽列,計算表達式
可以在視圖上執行DML操作,這叫可更新視圖
復雜視圖
包含一個或多個表
可以包含函數和分組數據
不能進行DML操作基表
創建語法
create view view_name as select deptno,max(sal) from emp group by deptno;
DEPTNO? MAX(SAL)
---------- ----------
30 2850
20 3000
10 5000
刪除視圖
drop view view_name;
強制選項
SQL> create or replace force view v1 as select empno,ename,sal,deptno from my_emp where deptno=10;
Warning: View created with compilation errors.
(3)序列
sequence 序列
流水號(整數)遞增或遞減
存在于library cache
通常為主鍵或唯一約束提供值
減少編寫生成序列的程序代碼量
比如QQ號的產生
語法
CREATE SEQUENCE seq_name
[INCREMENT BY n]
[START WITH n]
[{MAXVALUE N | NOMAXVALUE}]
[{MINVALUE N | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE N|NOCACHE}];
取值方法
NEXTVAL 返回下一個值
CURRVAL 返回當前值
SQL> create sequence seq1;
Sequence created.
SQL> select *from user_sequences where sequence_name='SEQ1';
SEQUENCE_NAME MIN_VALUE? MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ----------? ? ? ? ---------- ------------ - - ---------- -----------
SEQ1 1? ? ? ? ? ? ? ? ? ? 1.0000E+28 1 N N ? ? ? 20 ? 1
SQL> SELECT SEQ1.NEXTVAL FROM DUAL;
NEXTVAL
----------
1
SQL> /
NEXTVAL
----------
2
SQL> /
NEXTVAL
----------
3
SQL> /
NEXTVAL
----------
4
SQL> SELECT SEQ1.CURRVAL FROM DUAL;
CURRVAL
----------
4
想要修改序列的當前值回溯的過去值 只能刪除重新
drop sequence seq2;
create sequence seq2 start with 10;
修改序列的屬性
alter sequence seq2 minvalue 1;
(4)約束
用來維護數據結構完整性的一種手段
可以是表級 也可以是列級
通過查詢視圖 user_constraints? user_cons_columns
約束的五種類型
非空 not null
唯一 unique
檢測 check? 自定義
主鍵 primary key
外鍵 foreign key
非空約束
列的值不允許null值
可以在建表時指明
可以建完表后添加
可以指定名字 不指定系統會給定隨機名
創建表時在字段類型后添加 not null關鍵字
SQL> create table t1 (id number not null,name varchar2(20) constraint t1_name_notnull not null);
Table created.
SQL> desc t1
Name ? ? Null?? ? Type
-------------------------------------------------- -------- ----------------------------------
ID ? ? NOT NULL NUMBER
NAME ? ? NOT NULL VARCHAR2(20)
查看約束
SQL> select TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS from user_constraints where table_name='T1';
TABLE_NAME ? ? ? CONSTRAINT_NAME ? ? ? C STATUS
------------------------------ ------------------------------ - --------
T1 ? ? ? SYS_C005173 ? ? ? C ENABLED
T1 ? ? ? T1_NAME_NOTNULL ? ? ? C ENABLED
SQL>
查看約束作用于t1表哪一列
SQL> col OWNER for a10
SQL> col column_name for a16
SQL> col table_name for a10
SQL> col CONSTRAINT_NAME for a20
SQL> select * from user_cons_columns where table_name='T1';
OWNER ? CONSTRAINT_NAME TABLE_NAME COLUMN_NAME ? ? ? POSITION
---------- -------------------- ---------- ---------------- ----------
SCOTT ? T1_NAME_NOTNULL T1 ? NAME
SCOTT ? SYS_C005173 T1 ? ID
SQL> insert into t1 values(1,'SEKER');
1 row created.
對已經存在的表添加
SQL> alter table t1 add (mail varchar2(40));
Table altered.
SQL> desc t1
Name ? ? ? Null?? ? Type
-------------------------------------------- -------- ------------------------------
ID ? ? ? NOT NULL NUMBER
NAME ? ? ? NOT NULL VARCHAR2(20)
MAIL ? ? ? VARCHAR2(40)
SQL> alter table t1 modify(mail constraint ct not null);
Table altered.
SQL> desc t1
Name ? ? ? Null?? ? Type
-------------------------------------------- -------- ------------------------------
ID ? ? ? NOT NULL NUMBER
NAME ? ? ? NOT NULL VARCHAR2(20)
MAIL ? ? ? NOT NULL VARCHAR2(40)
唯一約束
列的數據只能是唯一的 不可重復
可以是單列,可以是組合列(就叫表級)
所以唯一性約束它可以是列級別,可以是表級別
但unique規定的列只有一列時可以在列級別定義
如果unique規定的列包含多列時只能在表級別定義
創建唯一約束 即自動創建索引
SQL> create table t1(id number unique,
name varchar2(10),
mail varchar2(20),
constraints my_un unique(name,mail))
;
SQL> select TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE from user_constraints where table_name='T1';
TABLE_NAME CONSTRAINT_NAME C
---------- -------------------- -
T1 ? SYS_C005210 U
T1 ? MY_UN U
SQL> select TABLE_NAME,CONSTRAINT_NAME,COLUMN_NAME from user_cons_columns where TABLE_NAME='T1';
TABLE_NAME CONSTRAINT_NAME COLUMN_NAME
---------- -------------------- ----------------
T1 ? MY_UN NAME
T1 ? MY_UN MAIL
T1 ? SYS_C005210 ID
SQL> select TABLE_NAME,INDEX_NAME,INDEX_TYPE from user_indexes where table_name='T1';
TABLE_NAME INDEX_NAME ? INDEX_TYPE
---------- ------------------------------ ---------------------------
T1 ? SYS_C005210 ? NORMAL
T1 ? MY_UN ? NORMAL
SQL>? 索引自動創建 和約束同名
刪除約束語法
SQL> alter table t1 drop constraint SYS_C0011129;
SQL> alter table t1 disable constraint SYS_C0011129;
表已更改。
主鍵約束
主鍵和唯一共同點:
都是唯一的? 可以單列 也可以多列
都是自動創建索引
主鍵和唯一不同點:
unique? ? ? 可以為空
primary key 不可以為空
一般來說 每個表都應該有自己的主鍵列 而且最好是單列的,一張表只能具有一個主鍵,可以是單列也可以是多列
SQL> create table t2 (id number constraint t2_PK_id primary key,name varchar2(10));
Table created.
外鍵約束
例如 emp.deptno 被 dept.deptno值包含
如果你刪除dept中deptno=10
從數據變更角度來講沒問題 但他的業務邏輯出現了錯誤 沒有部門哪來的員工呢??
這就叫數據的完整性
這就是外鍵的作用 參考主鍵來維護數據完整性
參考主鍵的值 外鍵列中的值被主鍵中的值所包含(子集)
同一張表可以創建多個外鍵列,例如:
SQL> create table t2(id number,name number,
foreign key(id) references emp(empno),
foreign key(name) references emp(empno));
同一個列可以創建多個外鍵約束,但是該列上的只能存在所有參考的主鍵列值的交集部分
外鍵約束既可以參考其他表,也可以參考本表的其他字段,例如:
SQL>alter table emp add constraint emp_mgr_fk foreign key(mgr) references emp(empno);
而且參考列一定是唯一或主鍵
否則會報: ORA-02270: no matching unique or primary key for this column-list
創建外鍵約束
SQL> create table my_dept as select * from dept;
SQL> alter table my_dept modify(deptno number primary key);
SQL> create table my_emp (
empno number,
ename varchar2(20),
deptno number,
constraint my_emp_fk_dno foreign key(deptno) references my_dept(deptno)
);