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,就不用輸入過多的內容了。