一.子查詢的使用
1.insert
用子查詢在insert中進行插入數據時,要注意不要加上Vaules關鍵字。
SQL> create table copy_dep as select * from departments;
Table created.
SQL> truncate table copy_dep;
Table truncated.
SQL> insert into copy_dep
2 select * from departments;
27 rows created.
2.create
用子查詢來創建表時,在原表中只有not null會被傳遞到新表,其它約束不會傳遞。
在用子查詢創建表和視圖時,將表達式加上別名是必須的;
SQL> create table dept
2 as
3 select employee_id,last_name,salary*12,hire_date
4 from employees where department_id=80;
select employee_id,last_name,salary*12,hire_date
*
ERROR at line 3:
ORA-00998: must name this expression with a column alias
修改,加上別名
SQL> create table dept(emp_id,name,salary,hire_date)
2 as select employee_id,last_name,salary*12,hire_date
3 from employees where department_id=80;
Table created.
或者
SQL> create table dept
2 as
3 select employee_id,last_name,salary*12 ANNSAL,hire_date
4 from employees where department_id=80;
Table created.
3.update
用子查詢update時,可以從其它表中獲得數據。
SQL> select * from copy_dep;
DEPARTMENT_ID DEPARTMENT_NAME MANAGER_ID LOCATION_ID
----------------------- ------------------------------ ----------------- ------------------
10 Administration 200 1700
20 Marketing 201 1800
30 Purchasing 114 1700
40 Human Resources 203 2400
50 Shipping 121 1500
60 IT 103 1400
SQL> update copy_dep set department_name=(select department_name from departments where department_id=10),
2 location_id=(select location_id from departments where department_id=10)
3 where department_id=50;
1 row updated.
SQL> select * from copy_dep;
DEPARTMENT_ID DEPARTMENT_NAME MANAGER_ID LOCATION_ID
------------- ------------------------------ ---------- -----------
10 Administration 200 1700
20 Marketing 201 1800
30 Purchasing 114 1700
40 Human Resources 203 2400
50 Administration 121 1700
60 IT 103 1400
4.read-only表
表改爲read-only可以阻止對錶的增刪改,但不被阻止刪除表。
SQL> alter table dept read only;
Table altered.
SQL> delete from dept where employee_id=170;
delete from dept where employee_id=170
*
ERROR at line 1:
ORA-12081: update operation not allowed on table "HR"."DEPT"
SQL> alter table dept read write;
Table altered.
SQL> delete from dept where employee_id=170;
1 row deleted.
SQL> alter table dept read only;
Table altered.
SQL> drop table dept;
Table dropped.
5.View
簡單視圖:只要一張表,不使用函數;複雜視圖:一張或者多張表,使用函數。
一般來說可以對簡單視圖執行DML,但並非總是如此,如果視圖不包括具有NOT NULL的強制列,那麼對視圖進行insert操作就不會成功,複雜視圖不能執行DML。
創建個視圖
SQL> create view empvu
2 as select employee_id,last_name,salary from employees where department_id=80;
View created.
SQL> desc empvu
Name Null? Type
----------------------------------------- -------- ----------------------------
EMPLOYEE_ID NOT NULL NUMBER(6)
LAST_NAME NOT NULL VARCHAR2(25)
SALARY NUMBER(8,2)
SQL> select * from empvu;
EMPLOYEE_ID LAST_NAME SALARY
----------- ------- ------------------ ----------
167 Banda 6200
168 Ozer 11500
169 Bloom 10000
170 Fox 9600
171 Smith 7400
172 Bates 7300
把視圖中employee_id=169的last_name=Bloom修改爲last_name=’Blooms’。
SQL> update empvu set last_name='Blooms'
2 where employee_id=169;
1 row updated.
SQL> commit;
Commit complete.
現在查看一下基表有沒有發生修改,
SQL> select employee_id,last_name,salary from employees where employee_id=169;
EMPLOYEE_ID LAST_NAME SALARY
----------- --------- ---------------- ----------
169 Blooms 10000
基表也修改了。
對視圖的修改成功,也是對基表的修改。
對於在創建視圖時不加上with check option。
SQL> create table emp as select * from employees;
Table created.
SQL> create or replace view empvu1
2 as select * from emp where department_id=20;
View created.
SQL> select employee_id,last_name,department_id from empvu1;
EMPLOYEE_ID LAST_NAME DEPARTMENT_ID
----------- ------------ ------------- -------------
201 Hartstein 20
202 Fay 20
SQL> update empvu1 set department_id=10 where employee_id=202;
1 row updated.
SQL> select employee_id,last_name,department_id from empvu1;
EMPLOYEE_ID LAST_NAME DEPARTMENT_ID
----------- ------------------------- -------------
201 Hartstein 20
可以將where子句中 department_id=20修改爲department_id=10,從而導致了這行的消失。
用with check option來創建視圖,可以防止導致行從視圖中消失的DML操作。
SQL> create or replace view empvu1
2 as select * from emp where department_id=20 with check option;
View created.
SQL> select employee_id,last_name,department_id from empvu1;
EMPLOYEE_ID LAST_NAME DEPARTMENT_ID
----------- - ---------------------- -- -------------
201 Hartstein 20
SQL> update empvu1 set department_id=10 where employee_id=201;
update empvu1 set department_id=10 where employee_id=201
*
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation
不能修改
可以對其它列進行修改。
SQL> update empvu1 set last_name='sun' where employee_id=201;
1 row updated.
SQL> select employee_id,last_name,department_id from empvu1;
EMPLOYEE_ID LAST_NAME DEPARTMENT_ID
----------- ------------------------- -------------
201 sun 20
SQL> drop view empvu1;
View dropped.
刪除視圖不會影響基表,這是因爲View並不是存儲數據,而是查詢語句。