SQL堂上作業十

SQL VIEW(視圖)

VIEW可以理解爲一個虛擬存在的表,該表並不在數據庫中真實存在,行和列的數據來自既有的表中,且基於這些表動態生成。

我們可以藉助這些VIEW,幫助我們更好地編寫SQL語句。

VIEW的創建

CREATE VIEW empvu80
AS SELECT employee_id, last_name, salary
FROM employees
WHERE department_id = 80;

基本上可以理解爲,用一個SELECT語句進行數據生成

我們可以用DESCRIBE empvu80來查看這個VIEW的數據類型,數據類型基於你選出的數據的類型

SQL> describe empvu80;
 名稱                                      是否爲空? 類型
 ----------------------------------------- -------- ----------------------------
 EMPLOYEE_ID                               NOT NULL NUMBER(6)
 LAST_NAME                                 NOT NULL VARCHAR2(25)
 SALARY                                             NUMBER(8,2)

基於別名的創建

在上面的VIEW建立案例中,我們發現所有的名稱都是基於原先所選的表的

我們可以用起別名的方法,給新建的VIEW加上別名

建視圖的代碼如下,可以發現所選項都加了別名

CREATE VIEW salvu50
AS SELECT employee_id ID_NUMBER, last_name NAME,
salary*12 ANN_SALARY
FROM employees
WHERE department_id = 50;

表的類型變成下圖所示:

SQL> DESCRIBE salvu50;
 名稱                                      是否爲空? 類型
 ----------------------------------------- -------- ----------------------------
 ID_NUMBER                                 NOT NULL NUMBER(6)
 NAME                                      NOT NULL VARCHAR2(25)
 ANN_SALARY                                         NUMBER

VIEW的查看

和一般的表一樣,我們可以直接用查詢語句進行顯示

SELECT * FROM salvu50;

由於salvu50這個表,屬於“視圖”,是一個虛擬的表

因此,在運行上述語句前,數據庫會基於視圖salvu50的定義,生成出表salvu50,然後再執行FROM salvu50的語句。

輸出如下:

SQL> select * from salvu50;

 ID_NUMBER NAME                                               ANN_SALARY
---------- -------------------------------------------------- ----------
       120 Weiss                                                   96000
       121 Fripp                                                   98400
       122 Kaufling                                                94800
       123 Vollman                                                 78000
       124 Mourgos                                                 69600
       125 Nayer                                                   38400
       126 Mikkilineni                                             32400
       127 Landry                                                  28800
       128 Markle                                                  26400
       129 Bissot                                                  39600
       130 Atkinson                                                33600
       131 Marlow                                                  30000
       132 Olson                                                   25200
       133 Mallin                                                  39600
       134 Rogers                                                  34800
       135 Gee                                                     28800
       136 Philtanker                                              26400
       137 Ladwig                                                  43200
       138 Stiles                                                  38400
       139 Seo                                                     32400
       140 Patel                                                   30000
       141 Rajs                                                    42000
       142 Davies                                                  37200
       143 Matos                                                   31200
       144 Vargas                                                  30000
       180 Taylor                                                  38400
       181 Fleaur                                                  37200
       182 Sullivan                                                30000
       183 Geoni                                                   33600
       184 Sarchand                                                50400
       185 Bull                                                    49200
       186 Dellinger                                               40800
       187 Cabrio                                                  36000
       188 Chung                                                   45600
       189 Dilly                                                   43200
       190 Gates                                                   34800
       191 Perkins                                                 30000
       192 Bell                                                    48000
       193 Everett                                                 46800
       194 McCain                                                  38400
       195 Jones                                                   33600
       196 Walsh                                                   37200
       197 Feeney                                                  36000
       198 OConnell                                                31200
       199 Grant                                                   31200

已選擇45行。

VIEW的修改

本處的視圖修改,指的是視圖定義的修改,是將表的形態,存儲數據的類型進行一系列的修改,而非對視圖中具體數據的值進行修改

我們可以用下面的指令進行修改:

CREATE OR REPLACE VIEW empvu80
(id_number, name, sal, department_id)
AS SELECT employee_id, first_name || ' ' || last_name, 
salary, department_id
FROM employees
WHERE department_id = 80;

我們查看下錶的類型,發現和之前有了很大的不同

SQL> DESCRIBE empvu80
 名稱                                      是否爲空? 類型
 ----------------------------------------- -------- ----------------------------
 ID_NUMBER                                 NOT NULL NUMBER(6)
 NAME                                               VARCHAR2(46)
 SAL                                                NUMBER(8,2)
 DEPARTMENT_ID                                      NUMBER(4)

Complex View 的建立

相比於一般的View,Complex View可以實現多個表的存儲,通常配合組函數進行表的生成。

下面是一個Complex View創建的代碼:

CREATE VIEW dept_sum_vu
(name, minsal, maxsal, avgsal)
AS SELECT d.department_name, MIN(e.salary), 
MAX(e.salary),AVG(e.salary)
FROM employees e, departments d
WHERE e.department_id = d.department_id 
GROUP BY d.department_name;

注意數據的類別,是一些函數(如xxxsal)

在View中進行DML操作

DML is an abbreviation of Data Manipulation Language.

The DML commands in Structured Query Language change the data present in the SQL database. We can easily access, store, modify, update and delete the existing records from the database using DML commands.

上面是DML的定義,懶得翻譯了qwq

通常情況下,我們可以對Single View進行DML操作,其本質上是直接對錶進行操作。

但在部分情況下,我們不能進行行的刪除操作和添加行的操作(比如包含組函數,去重函數等)。

視圖的只讀標記

我們可以添加一個WITH READ ONLY的標籤來禁用某張表的DML操作。代碼如下:

CREATE OR REPLACE VIEW empvu10
(employee_number, employee_name, job_title)
AS SELECT employee_id, last_name, job_id
FROM employees
WHERE department_id = 10
WITH READ ONLY;

VIEW的刪除

我們可以用DROP VIEW xxx;來刪除VIEW

DROP VIEW empvu80;

SQL SEQUENCE(序列)

序列是SQL中的某一種數據類型,它符合以下的特徵:

• Automatically generates unique numbers
• Is a sharable object
• Is typically used to create a primary key value
• Replaces application code
• Speeds up the efficiency of accessing sequence values when cached in memory

SEQUENCE的創建

我們可以用下列命令創建一個序列

CREATE SEQUENCE dept_deptid_seq
INCREMENT BY 10
START WITH 300
MAXVALUE 9999
NOCACHE
NOCYCLE;

上述命令的含義是:我們創建一個序列,這個序列的首項是300,最大的末項不能超過9999,公差是10;且這個序列無需緩存,且不是循環數列。

序列的使用

我們可以用以下的關鍵字去使用序列,假設序列的名字爲seq

seq.CURRVAL 返回當前的項,然後當前項沒有任何的變化。

seq.NEXTVAL 返回當前的項,然後當前的項+=公差。

假設首項爲300,公差爲10,訪問了四次,則依次返回300,310,320,330。

我們可以通過不斷地調用seq.NEXTVAL來實現主鍵的生成。

基於序列的元素插入

我們可以用INSERT和SEQUENCE進行數據的插入

其中department_id由SEQUENCE自動生成

INSERT INTO departments(department_id, 
department_name, location_id)
VALUES (dept_deptid_seq.NEXTVAL, 
'Support', 2500);

調用過一次後,我們可以用以下語句查看dept_deptid_seq.NEXTVAL的值

SELECT dept_deptid_seq.CURRVAL
FROM dual;

輸出如下:

   CURRVAL
----------
       300

序列的修改

我們可以用ALTER SEQUENCE命令進行序列的修改

ALTER SEQUENCE dept_deptid_seq
INCREMENT BY 20
MAXVALUE 999999
NOCACHE
NOCYCLE;

這個命令,可以修改公差爲20,但是不改變當前的值

序列的刪除

我們可以用DROP SEQUENCE xxx 來刪除掉某個序列

SQL> DROP SEQUENCE dept_deptid_seq;

序列已刪除。

SQL INDEX(索引)

SQL 索引(Index)用於提高數據表的查詢速度。一個表可以創建多個索引,一個索引可以包含一個或者多個字段。

不使用索引,數據庫引擎將遍歷整個表。

從表面上看,索引類似於書的目錄,在沒有目錄的情況下,要從書中查找某項內容就必須閱讀全文,而有了目錄之後,通過頁碼就可以很快定位到相關內容。

從本質上看,索引是根據表的一個或者多個字段生成的子表,該子表中的數據已經進行了排序。子表除了包含指定字段中的數據,還包含一個 rowid 列,用於存儲當前記錄在原始表中的位置。用戶無法看到索引,它只是用來加快查詢速度。

爲了提高查詢效率,便於後期維護,索引都是基於某種數據結構而創建的,比如 B+ 樹、B- 樹、位圖等。

INDEX的創建

我們可以用CREATE INDEX命令創建

CREATE INDEX upper_dept_name_idx
ON departments(UPPER(department_name));

注意:INDEX可以包含多行,比如下面的指令

CREATE INDEX employees ix
ON employees last_name, job_id, salary;

注意:我們需要將最常查詢的內容,放在最前面(比如說last_name)

INDEX的查詢

INDEX的使用,直接用SELECT進行即可

SELECT *
FROM departments
WHERE UPPER(department_name) = 'SALES';

輸出如下:

DEPARTMENT_ID DEPARTMENT_NAME                                              MANAGER_ID LOCATION_ID
------------- ------------------------------------------------------------ ---------- -----------
           80 Sales                                                               145        2500

INDEX的刪除

一樣可以用DROM INDEX命令刪除

SQL Synonyms (別名)

Simplify access to objects by creating a synonym
(another name for an object). With synonyms, you can:
• Ease referring to a table owned by another user
• Shorten lengthy object names

懶得翻譯了

Synonyms的創建

代碼如下

CREATE SYNONYM d_sum
FOR dept_sum_vu;

創建以後,我們就可以用d_sum來表示dept_sum_vu,就不用輸入過多的內容了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章