知識點小結3(子查詢)

一.子查詢的使用

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=169last_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並不是存儲數據,而是查詢語句。



發佈了39 篇原創文章 · 獲贊 2 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章