1.一個需求
emp 表的列信息很多,有些信息是個人重要信息 (比如 sal, comm, mgr, hiredate),如果我們希望某個用戶只能查詢 emp 表的 (empno、ename, job 和 deptno ) 信息,有什么辦法?
表的數據:
想讓用戶查詢到的:
MySQL提供的視圖(view)功能就可以滿足我們的需求。
2.視圖的基本概念
- 視圖是一個虛擬表,其內容由查詢定義。同真實的表一樣,視圖包含列,其數據來自對應的真實表(基表)
- 視圖和基表關系的示意圖
- 對視圖的總結
①視圖是根據基表來創建的,視圖是虛擬的表;
②視圖也有列,數據來自基表;
③通過視圖可以修改基表的數據;
④基表的改變,也會影響到視圖的數據。
3.視圖的基本使用
3.1創建一個新視圖
create view 視圖名 as select語句
3.2修改已存在的視圖
alter view 視圖名 as select語句
3.3查看某個視圖的創建語句
SHOW CREATE VIEW 視圖名
3.4刪除一個或多個視圖
drop view 視圖名1,視圖名2
4.視圖的使用細節
視圖(view)
● 視圖細節討論
- 創建視圖后,到數據庫去看,對應視圖只有一個視圖結構文件(形式: 視圖名.frm) ;
CREATE VIEW emp_view AS SELECT empno,ename,job,deptno FROM emp;
可以看到視圖只有emp_view.frm這個結構文件,而不像別的數據庫表有其真正的數據文件。
- 視圖的數據變化會影響到基表,基表的數據變化也會影響到視圖[insert update delete ] ;
查詢一下基表和視圖最原始的樣子:
在視圖中修改數據,基表也會隨之改變:
UPDATE emp_view SET job = 'worker' WHERE empno = 7499;
在基表中插入數據,視圖也會更新。
INSERT INTO emp VALUES(8848,'sakura','worker',8888,'2013-6-1',800,200,30);
- 視圖中可以再使用視圖,數據仍然來自基表。
CREATE VIEW emp_view_view AS SELECT ename,job,deptno FROM emp;
SELECT * FROM emp_view_view;
5.視圖的使用實例
● 視圖練習:針對 emp , dept ,和 salgrade 張三表.創建一個視圖,可以顯示雇員編號,雇員名,雇員部門名稱和薪水級別。
數據庫建表準備,并且插入一些示例數據:
CREATE TABLE emp (empno INT PRIMARY KEY, ename VARCHAR(50) NOT NULL, job VARCHAR(50), mgr INT, hiredate DATE, sal DECIMAL(10,2) NOT NULL, comm DECIMAL(10,2), deptno INT
);INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
VALUES
(7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800.00, NULL, 20),
(7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600.00, 300.00, 30),
(7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250.00, 500.00, 30),
(7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975.00, NULL, 20),
(7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250.00, 1400.00,30),
(7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850.00, NULL, 30),
(7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450.00, NULL, 10),
(7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000.00, NULL, 20),
(7839, 'KING', 'PRESIDENT', NULL, '1981-11-17', 5000.00, NULL, 10),
(7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500.00, 0.00, 30);
CREATE TABLE dept (deptno INT PRIMARY KEY, dname VARCHAR(50) NOT NULL, loc VARCHAR(50)
);INSERT INTO dept (deptno, dname, loc)
VALUES
(10, 'ACCOUNTING', 'NEW YORK'), -- 財務部,對應 emp 中 deptno=10 的雇員(如 KING、CLARK)
(20, 'RESEARCH', 'DALLAS'), -- 研發部,對應 emp 中 deptno=20 的雇員(如 SMITH、JONES、SCOTT)
(30, 'SALES', 'CHICAGO'); -- 銷售部,對應 emp 中 deptno=30 的雇員(如 ALLEN、WARD、MARTIN 等)
CREATE TABLE salgrade (grade INT PRIMARY KEY, -- 薪資等級(1-5級,等級越高薪資范圍越大)losal DECIMAL(10,2) NOT NULL, -- 該等級的最低工資hisal DECIMAL(10,2) NOT NULL -- 該等級的最高工資
);-- 插入示例數據(覆蓋emp表中所有sal值的范圍)
INSERT INTO salgrade (grade, losal, hisal)
VALUES
(1, 500.00, 1000.00), -- 對應emp中sal=800.00(SMITH)
(2, 1001.00, 1500.00), -- 對應emp中sal=1250.00(WARD、MARTIN)、1500.00(TURNER)
(3, 1501.00, 2000.00), -- 對應emp中sal=1600.00(ALLEN)
(4, 2001.00, 3000.00), -- 對應emp中sal=2450.00(CLARK)、2850.00(BLAKE)、2975.00(JONES)、3000.00(SCOTT)
(5, 3001.00, 6000.00); -- 對應emp中sal=5000.00(KING)
創建視圖,根據需求寫select語句:
CREATE VIEW emp_dept_salgrade_view AS SELECT emp.empno AS '雇員編號', -- 從 emp 表取雇員編號emp.ename AS '雇員名', -- 從 emp 表取雇員名dept.dname AS '部門名稱', -- 從 dept 表取部門名稱salgrade.grade AS '薪水級別' -- 從 salgrade 表取薪資等級
FROM emp,dept,salgrade
WHERE emp.deptno = dept.deptno AND emp.sal BETWEEN salgrade.losal AND salgrade.hisal;
查看一下該視圖:
SELECT * FROM emp_dept_salgrade_view;
6.視圖的使用總結
- 安全。一些數據表有著重要的信息。有些字段是保密的,不能讓用戶直接看到。這時就可以創建一個視圖,在這張視圖中只保留一部分字段。這樣,用戶就可以查詢自己需要的字段,不能查看保密的字段。
- 性能。關系數據庫的數據常常會分表存儲,使用外鍵建立這些表的之間關系。這時,數據庫查詢通常會用到連接(JOIN)。這樣做不但麻煩,效率相對也比較低。如果建立一個視圖,將相關的表和字段組合在一起,就可以避免使用JOIN查詢數據。
- 靈活。如果系統中有一張舊的表,這張表由于設計的問題,即將被廢棄。然而,很多應用都是基于這張表,不易修改。這時就可以建立一張視圖,視圖中的數據直接映射到新建的表。這樣,就可以少做很多改動,也達到了升級數據表的目的。