黑马程序员MySQL-视图SQL笔记
生活随笔
收集整理的這篇文章主要介紹了
黑马程序员MySQL-视图SQL笔记
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
對應課程地址
-- 視圖 -- 準備數據 create database if not exists mydb6_view; use mydb6_view; create table dept(deptno int primary key,dname varchar(20),loc varchar(20) ); insert into dept values(10, '教研部','北京'), (20, '學工部','上海'), (30, '銷售部','廣州'), (40, '財務部','武漢');create table emp(empno int primary key,ename varchar(20),job varchar(20),mgr int,hiredate date,sal numeric(8,2),comm numeric(8, 2),deptno int, -- FOREIGN KEY (mgr) REFERENCES emp(empno),FOREIGN KEY (deptno) REFERENCES dept(deptno) ON DELETE SET NULL ON UPDATE CASCADE ); insert into emp values (1001, '甘寧', '文員', 1013, '2000-12-17', 8000.00, null, 20), (1002, '黛綺絲', '銷售員', 1006, '2001-02-20', 16000.00, 3000.00, 30), (1003, '殷天正', '銷售員', 1006, '2001-02-22', 12500.00, 5000.00, 30), (1004, '劉備', '經理', 1009, '2001-4-02', 29750.00, null, 20), (1005, '謝遜', '銷售員', 1006, '2001-9-28', 12500.00, 14000.00, 30), (1006, '關羽', '經理', 1009, '2001-05-01', 28500.00, null, 30), (1007, '張飛', '經理', 1009, '2001-09-01', 24500.00, null, 10), (1008, '諸葛亮', '分析師', 1004, '2007-04-19', 30000.00, null, 20), (1009, '曾阿牛', '董事長', null, '2001-11-17', 50000.00, null, 10), (1010, '韋一笑', '銷售員', 1006, '2001-09-08', 15000.00, 0.00, 30), (1011, '周泰', '文員', 1008, '2007-05-23', 11000.00, null, 20), (1012, '程普', '文員', 1006, '2001-12-03', 9500.00, null, 30), (1013, '龐統', '分析師', 1004, '2001-12-03', 30000.00, null, 20), (1014, '黃蓋', '文員', 1007, '2002-01-23', 13000.00, null, 10);create table salgrade(grade int primary key,losal int,hisal int ); insert into salgrade values (1, 7000, 12000), (2, 12010, 14000), (3, 14010, 20000), (4, 20010, 30000), (5, 30010, 99990);-- 創建視圖 CREATE OR REPLACE VIEW view1_emp AS SELECTename,job FROMemp;-- 查看表和視圖 show tables; show full tables;-- 查看視圖結構 DESCRIBE view1_emp;-- 查詢視圖 SELECT* FROMview1_emp;-- 修改視圖結構 ALTER VIEW view1_emp AS SELECT a.deptno, a.dname, a.loc, b.ename, b.sal FROMdept a,emp b WHEREa.deptno = b.deptno;-- 更新視圖:修改原表數據 -- 先創建一個視圖 CREATE OR REPLACE VIEW view1_emp AS SELECTename,job FROMemp;-- 查詢一下視圖 SELECT* FROMview1_emp;-- 更新視圖 UPDATE view1_emp SET ename = '魯肅' WHEREename = '謝遜';-- 1、插入數據時,視圖只是引用表格中的某些字段, -- 而另外一些字段又沒有指定默認值時會插入失敗 INSERT INTO view1_emp VALUES( '周瑜', '文員' );-- 2、視圖包含聚合函數不可更新 CREATE OR REPLACE VIEW view2_emp AS SELECTcount(*) cnt FROMemp;SELECT* FROMview2_emp; INSERT INTO view2_emp VALUES( 100 );UPDATE view2_emp SET cnt = 100;-- 3、視圖包含distinct不可更新 CREATE OR REPLACE VIEW view3_emp AS SELECT DISTINCTjob FROMemp;SELECT* FROMview3_emp;INSERT INTO view3_emp VALUES( '財務' );-- 4、視圖包含group by、having不可更新 CREATE OR REPLACE VIEW view4_emp AS SELECTdeptno FROMemp GROUP BYdeptno HAVINGdeptno > 10;SELECT* FROMview4_emp;insert into view4_emp values(40);-- 5、視圖包含union、union all不可更新 -- union all不去重,union會去重 CREATE OR REPLACE VIEW view5_emp AS SELECTempno,ename FROMemp WHEREempno <= 5 UNION SELECT empno, ename FROM emp WHERE empno > 8;SELECT* FROMview5_emp;INSERT INTO view5_emp VALUES( 1015, '宋江' );-- 6、視圖包含子查詢不可更新 CREATE OR REPLACE VIEW view6_emp AS SELECTempno,ename,sal FROMemp WHEREsal = (SELECTmax( sal ) FROMemp);SELECT* FROMview6_emp;INSERT INTO view6_emp VALUES( 1015, '血刀老祖', 30000.0 );-- 7、視圖包含join不可更新 CREATE VIEW view7_emp AS SELECT dname, ename, sal FROMemp aJOIN dept b ON a.deptno = b.deptno;INSERT INTO view7_emp VALUES( '行政部', '韋小寶', 6500.00 );-- 8、視圖包含常量文字值不可更新 CREATE OR REPLACE VIEW view8_emp AS SELECT'行政部' dname,'楊過' ename;INSERT INTO view8_emp VALUES( '行政部', '韋小寶' );CREATE OR REPLACE VIEW view9_emp AS SELECT* FROMemp; -- 重命名視圖 RENAME TABLE view9_emp TO view9_1_emp; -- 刪除視圖 DROP VIEW IFEXISTS view9_1_emp;-- 視圖練習 -- 1:查詢部門平均薪水最高的部門名稱 -- 最原始做法:不使用開窗函數,不使用視圖 SELECTdname FROMdept WHEREdeptno = (SELECTb.deptno FROM(SELECTa.deptno,max( a.avg_sal ) FROM( SELECT deptno, avg( sal ) avg_sal FROM emp GROUP BY deptno ) a ) b );-- 1:增加一點難度查詢部門平均薪水處于最高兩位的部門名稱 -- 使用開窗函數,不使用視圖 -- 1.1 先查出每個部門編號對應的平均薪水 -- 1.2 用開窗函數進行排序 -- 1.3 找到rank小于等于2的deptno -- 1.4 再跟dept表聯合查找出dname SELECTdname FROMdept d,(SELECTdeptno FROM(SELECT*,rank() over ( ORDER BY avg_sal DESC ) rn FROM( SELECT deptno, avg( sal ) avg_sal FROM emp GROUP BY deptno ) a ) b WHERErn = 1 ) c WHEREd.deptno = c.deptno;-- 1:增加一點難度查詢部門平均薪水處于最高兩位的部門名稱 -- 使用開窗函數,并且使用視圖 -- 1.1 先查出每個部門編號對應的平均薪水,創建一個視圖 CREATE OR REPLACE VIEW view_dept_avg_sal AS SELECTdeptno,avg( sal ) avg_sal FROMemp GROUP BYdeptno; -- 1.2 用開窗函數進行排序,創建一個視圖 CREATE OR REPLACE VIEW view_dept_avg_sal_rank AS SELECT*,rank() over ( ORDER BY avg_sal DESC ) rn FROMview_dept_avg_sal; -- 1.3 找到rank小于等于2的deptno,創建一個視圖 CREATE OR REPLACE VIEW view_dept_avg_sal_top2 AS SELECT* FROMview_dept_avg_sal_rank WHERErn <= 2; -- 1.4 再跟dept表聯合查找出dname CREATE OR REPLACE VIEW view_dept_avg_sal_top2_dname AS SELECTdname FROMdept a,view_dept_avg_sal_top2 b WHEREa.deptno = b.deptno;-- 2:查詢員工比所屬領導薪資高的部門名、員工名、員工領導編號 -- 最原始做法:不使用視圖 SELECTdname,ename,mgr FROMdept b,(SELECTe1.deptno,e1.ename,e1.sal,e1.mgr,e2.sal mgr_sal FROMemp e1,emp e2 WHEREe1.mgr = e2.empno AND e1.sal > e2.sal ) a WHEREb.deptno = a.deptno;-- 2:查詢員工比所屬領導薪資高的部門名、員工名、員工領導編號 -- 使用視圖 -- 2.1查詢員工比所屬領導薪資高的部門號,然后創建一個視圖 CREATE OR REPLACE VIEW view_deptno_ename_mgr AS SELECTe1.deptno,e1.ename,e1.mgr FROMemp e1,emp e2 WHEREe1.mgr = e2.empno and e1.sal > e2.sal; -- 2.2將上一步查詢出來的部門號和部門表進行連表查詢 CREATE OR REPLACE VIEW view_dname_ename_mgr AS SELECTdname,ename,mgr FROMdept a,view_deptno_ename_mgr b WHEREa.deptno = b.deptno;-- 3:查詢工資等級為4級,2000年以后入職的工作地點為上海的員工編號、姓名和工資, -- 并查詢出薪資在前2名的員工信息 -- 最原始做法,不使用視圖 SELECTempno,ename,sal FROM(SELECTempno,ename,sal,rank() over ( ORDER BY sal DESC ) rn FROMemp e,dept d,salgrade s WHEREe.deptno = d.deptno AND YEAR ( hiredate ) >= '2000' AND loc = '上海' AND grade = 4 AND sal BETWEEN losal AND hisal ) a WHERErn <= 2;-- 3:查詢工資等級為4級,2000年以后入職的工作地點為上海的員工編號、姓名和工資, -- 并查詢出薪資在前2名的員工信息 -- 使用視圖 -- 3.1 查詢工資等級為4級,2000年以后入職的工作地點為上海的員工編號、姓名和工資,創建一個視圖 CREATE OR REPLACE VIEW view_ename_sal_after2000_grade4 AS SELECTempno, ename, sal FROMemp e,dept d,salgrade s WHEREe.deptno = d.deptno AND grade = 4 AND sal BETWEEN losal AND hisal AND loc = '上海' AND YEAR ( hiredate ) > '2000' -- 此處三張表聯查還可以用join,邏輯會更清晰 SELECTempno,ename,sal FROMemp eJOIN dept d ON e.deptno = d.deptno AND loc = '上海' AND YEAR ( hiredate ) > '2000';JOIN salgrade s ON grade = 4 AND ( sal BETWEEN losal AND hisal )-- 3.2 查詢出薪資在前2名的員工信息 SELECTempno,ename,sal FROM( SELECT *, rank() over ( ORDER BY sal DESC ) rn FROM view_ename_sal_after2000_grade4 ) a WHERErn <= 2;總結
以上是生活随笔為你收集整理的黑马程序员MySQL-视图SQL笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用TreeMap对要签名做排序ASCI
- 下一篇: [vue] 在组件中怎么访问到根实例?