1. 程式人生 > 實用技巧 >MySql的回顧十一:檢視

MySql的回顧十一:檢視

  靈明無著,物來順應,未來不迎,當下不雜,既過不戀,是之謂虛而已矣,是之謂誠而已矣。

  8月的處暑漸漸離我們遠去,天氣一天天的涼了起來,希望我們的心也能跟著這天氣漸漸涼下來,真正能做到上面這句話。

  接下來由我帶領各位讀者繼續學習MySql的檢視部分的內容。

檢視的建立
檢視:MySql從5.0.1版本開始提供檢視功能。一種虛擬存在的表
行和列的資料來定義檢視的查詢中使用的表,並且是在使用檢視的動態生成,只儲存了SQL邏輯,
不儲存查詢結果。 應用場景: 多個地方用到同樣的的查詢結果。 該查詢結果使用的SQL語句教複雜。
先來一個案例領略一下檢視的魅力。
#正常查詢寫法
查詢姓張的同學與學科
SELECT s.studentname,m.majorname
FROM student s
INNER JOIN major m ON s.majorid 
= m.majorid WHERE s.studentname LIKE '%張%';

#檢視封裝寫法
CREATE VIEW shitu
AS
SELECT s.studentname,m.majorname
FROM student s
INNER JOIN major m ON s.majorid = m.majorid;

#運用檢視(得到與上面圖片一樣的結果)
SELECT * FROM shitu WHERE studentname LIKE '%張%';

HeiDiSQL中建立檢視

檢視檢視詳情

#建立檢視

語法:
CREATE VIEW 檢視名
AS
查詢語句
優點:
重用SQL語句
簡化複雜的SQL的操作,不必知道它的查詢細節
保護資料,提高安全性(隱藏原始表的資訊)
#切換庫 USE myemployees; #1.查詢郵箱中包含a字元的員工名,部門名和工種資訊。 #1.正常查詢方法 SELECT e.last_name,d.department_name,j.job_title,e.email FROM employees e INNER JOIN departments d ON e.department_id=d.department_id INNER JOIN jobs j ON e.job_id=j.job_id WHERE e.email LIKE'%a%'; #檢視查詢方法
#①建立檢視 CREATE VIEW ayuan AS SELECT e.last_name,d.department_name,j.job_title,e.email FROM employees e INNER JOIN departments d ON e.department_id
=d.department_id INNER JOIN jobs j ON e.job_id=j.job_id;

#②使用檢視查詢
SELECT * FROM ayuan WHERE email LIKE '%a%';

#2.查詢各部門的平均工資級別
#第一步建立檢視,查出平均工資
CREATE VIEW pj
AS
SELECT ROUND(AVG(salary),2) ag,department_id
FROM employees
GROUP BY department_id;

#第二步連線查詢
SELECT pj.ag,g.grade_level
FROM pj
INNER JOIN job_grades g
ON pj.ag BETWEEN g.lowest_sal AND g.highest_sal;

#3.查詢平均工資最低的部門
#複用上一題的SQL語句邏輯,查出平均工資。
CREATE VIEW pj
AS
SELECT ROUND(AVG(salary),2) ag,department_id
FROM employees
GROUP BY department_id;
#查出最低工資
SELECT * FROM pj ORDER BY ag LIMIT 1;

#4.查詢平均工資最低的部門名和工資
#思路1.檢視也可以套檢視
#1.第一步
CREATE VIEW pj2
AS
SELECT *
FROM pj
ORDER BY ag LIMIT 1;
#2.第二步
SELECT d.department_id,d.department_name,p.ag
FROM pj2 p
INNER JOIN departments d
ON p.department_id=d.department_id;

#思路2.複用第二題的SQL語句邏輯,查出平均工資
SELECT d.department_name,pj.ag,d.department_id
FROM pj
INNER JOIN departments d
ON pj.department_id=d.department_id
ORDER BY ag LIMIT 1;

檢視的修改
修改檢視:
語法方式一
CREATE OR REPLACE VIEW 檢視名 AS 查詢語句; 檢視存在修改,檢視不存在建立。 #示例:修改檢視 #1.檢視原檢視 SELECT * FROM pj2; #2.修改檢視 CREATE OR REPLACE VIEW pj2 AS SELECT AVG(salary),job_id FROM employees GROUP BY job_id;

修改檢視
語法:方式二
ALTER VIEW 檢視名
AS
查詢語句;
只能修改,不能建立。

ALTER VIEW pj2
AS
SELECT * FROM employees;

刪除檢視
語法:
DROP VIEW 檢視名,...;
可以一次性刪除多個。

DROP VIEW pj,pj2;
檢視檢視結構
#第一種方式
DESC pj2;

#第二種方式:
完整的展示檢視建立的語句(LINUX下檢視) SHOW CREATE VIEW pj2;

案例:檢視的建立
#一.建立檢視emp_v1,要求查詢電話號碼以‘011’開頭的員工姓名和工資,郵箱。
CREATE OR REPLACE VIEW emp_v1
AS
SELECT last_name,first_name,salary,email
FROM employees
WHERE phone_number LIKE '011%';
檢視檢視
SELECT * FROM emp_v1;

#二.建立檢視emp_v2,要求查詢部門的最高工資高於12000的部門資訊。

#常規寫法,第一步查出每個部門最高工資
SELECT MAX(salary) mx_dep,department_id
FROM employees
GROUP BY department_id
HAVING MAX(salary)>12000;
#第二步,查詢最高工資高於12000的部門資訊
SELECT d.*,m.mx_dep
FROM departments d
INNER JOIN (
SELECT MAX(salary) mx_dep,department_id
FROM employees
GROUP BY department_id
HAVING MAX(salary)>12000
) m
ON m.department_id=d.department_id;

#檢視第一步,獨立最高工資
CREATE OR REPLACE VIEW emp_v2
AS
SELECT MAX(salary) mx_dep,department_id
FROM employees
GROUP BY department_id
HAVING MAX(salary)>12000;

#檢視第二步.檢視也可以起別名
SELECT d.*,m.mx_dep
FROM departments d
INNER JOIN emp_v2 m
ON m.department_id = d.department_id;

檢視的更新
(檢視內的資料修改) #不能更新
/不是所有的檢視都能更新 CREATE OR REPLACE VIEW myv1 AS SELECT last_name,email,salary*(1+IFNULL(commission_pct,0)) "annual salary" FROM employees;

#重新建立檢視
CREATE OR REPLACE VIEW myv2
AS
SELECT last_name,email
FROM employees;

#1.插入資料

INSERT INTO myv2 VALUES('guangtouqiang','[email protected]');
/* Affected rows: 1  Found rows: 0  Warnings: 0  Duration for 1 
query: 0.016 sec.
*/
受影響的行:1 找到的行:0 警告:0 1 查詢的持續時間:0.016 秒。 #檢視檢視中的資料 SELECT * FROM myv2; SELECT * FROM employees; /資料插入成功後,檢視與原始表會同時更新資料

#2修改資料
UPDATE myv2 SET last_name = '高倉健' WHERE last_name = 'guangtouqiang';

#檢視檢視中的資料
SELECT * FROM myv2;
SELECT * FROM employees;

#3.刪除資料
DELETE FROM myv2 WHERE last_name = '高倉健';
/語句執行後,檢視與原始表會同時刪除資料/

#檢視的可更新性和檢視中查詢的定義有關係,以下型別的檢視是不能更新的。
發現包含以下的欄位都是涉及到全表的資料,所以不允許修改。
包含以下關鍵字的SQL語句:分組函式,DISTINCT,GROUP BY,HAVING,
常量檢視 UNION或者UNION ALL SELECT中包含子查詢 JOIN FROM一個不能更新的檢視 WHERE子句的子查詢引用了FROM 子句中的表。

① #分組函式,新建檢視
CREATE OR REPLACE VIEW myv1
AS
SELECT MAX(salary) M,department_id
FROM employees
ORDER BY department_id;

#檢視檢視
SELECT * FROM myv1;

② #常量檢視
CREATE OR REPLACE VIEW myv2
AS
SELECT 'john' NAME;
SELECT * FROM myv2;

③ #SELECT中包含子查詢
CREATE OR REPLACE VIEW myv3
AS
SELECT (SELECT AVG(salary) FROM employees) AS 平均工資;
SELECT * FROM myv3;

④ #JOIN
CREATE OR REPLACE VIEW myv4
AS
SELECT last_name,department_name
FROM employees e
INNER JOIN departments d
ON e.department_id=d.department_id;
SELECT * FROM myv4;

#更新
UPDATE myv4 SET last_name = 'GuangTouQiang' WHERE last_name='Fay';

雖然UPDATE沒報錯,但不能插入,統籌不能更新

⑤ #FROM一個不能更新的檢視
CREATE OR REPLACE VIEW myv3
AS
SELECT (SELECT AVG(salary) FROM employees) AS 平均工資,department_id
FROM employees;
CREATE OR REPLACE VIEW myv5
AS
SELECT * FROM myv3;
SELECT * FROM myv5;

⑥ #WHERE子句的子查詢引用了FROM 子句中的表。
CREATE OR REPLACE VIEW myv6
AS
SELECT last_name,email,salary
FROM employees
WHERE employee_id IN(
SELECT manager_id
FROM employees
WHERE manager_id IS NOT NULL
);
SELECT * FROM myv6;

#更新

  檢視部分到此結束,希望看到這裡的讀者有所收,更多複雜而有趣的用法還需我們自己開動自己的大腦去帶著手加以實踐。