CREATEVIEW empview AS SELECT employee_id emp_id,last_name NAME,department_name FROM employees e,departments d WHERE e.department_id = d.department_id;
CREATEVIEW emp_dept AS SELECT ename,dname FROM t_employee LEFTJOIN t_department ON t_employee.did = t_department.did;
CREATEVIEW 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 GROUPBY d.department_name;
CREATEVIEW emp_depart AS SELECT CONCAT(last_name,'(',department_name,')') AS emp_dept FROM employees e JOIN departments d WHERE e.department_id = d.department_id
CREATEVIEW emp_dept_ysalary AS SELECT emp_dept.ename,dname,year_salary FROM emp_dept INNERJOIN emp_year_salary ON emp_dept.ename = emp_year_salary.ename;
#3. 如何创建视图 #准备工作 CREATE DATABASE dbtest14; USE dbtest14;
CREATE TABLE emps AS SELECT* FROM atguigudb.`employees`;
CREATE TABLE depts AS SELECT* FROM atguigudb.`departments`;
SELECT*FROM emps;
SELECT*FROM depts;
DESC emps;
DESC atguigudb.employees;
#3.1 针对于单表 #情况1:视图中的字段与基表的字段有对应关系 CREATEVIEW vu_emp1 AS SELECT employee_id,last_name,salary FROM emps;
SELECT*FROM vu_emp1;
#确定视图中字段名的方式1: CREATEVIEW vu_emp2 AS SELECT employee_id emp_id,last_name lname,salary #查询语句中字段的别名会作为视图中字段的名称出现 FROM emps WHERE salary >8000;
#确定视图中字段名的方式2: CREATEVIEW vu_emp3(emp_id,NAME,monthly_sal) #小括号内字段个数与SELECT中字段个数相同 AS SELECT employee_id,last_name,salary FROM emps WHERE salary >8000;
SELECT*FROM vu_emp3;
#情况2:视图中的字段在基表中可能没有对应的字段 CREATEVIEW vu_emp_sal AS SELECT department_id,AVG(salary) avg_sal FROM emps WHERE department_id ISNOT NULL GROUPBY department_id;
SELECT*FROM vu_emp_sal;
#3.2 针对于多表 CREATEVIEW vu_emp_dept AS SELECT e.employee_id,e.department_id,d.department_name FROM emps e JOIN depts d ON e.`department_id` = d.`department_id`;
SELECT*FROM vu_emp_dept;
#利用视图对数据进行格式化
CREATEVIEW vu_emp_dept1 AS SELECT CONCAT(e.last_name,'(',d.department_name,')') emp_info FROM emps e JOIN depts d ON e.`department_id` = d.`department_id`;
SELECT*FROM vu_emp_dept1;
#3.3 基于视图创建视图 CREATEVIEW vu_emp4 AS SELECT employee_id,last_name FROM vu_emp1;
CREATEOR REPLACE VIEW emp_dept (ename,salary,birthday,tel,email,hiredate,dname) ASSELECT ename,salary,birthday,tel,email,hiredate,dname FROM t_employee INNERJOIN t_department ON t_employee.did = t_department.did ;
INSERT INTO emp_dept(ename,salary,birthday,tel,email,hiredate,dname) ->VALUES('张三',15000,'1995-01-08','18201587896','zs@atguigu.com','2022-02-14','新部门'); #ERROR 1393 (HY000): Can not modify more than one base table through a joinview'atguigu_chapter9.emp_dept'
#第14章_视图的课后练习 USE dbtest14; #练习1: #1. 使用表emps创建视图employee_vu, #其中包括姓名(LAST_NAME),员工号(EMPLOYEE_ID),部门号(DEPARTMENT_ID)
CREATEOR REPLACE VIEW employee_vu(lname,emp_id,dept_id) AS SELECT last_name,employee_id,department_id FROM emps;
#2. 显示视图的结构 DESC employee_vu;
#3. 查询视图中的全部内容 SELECT*FROM employee_vu;
#4. 将视图中的数据限定在部门号是80的范围内 CREATEOR REPLACE VIEW employee_vu(lname,emp_id,dept_id) AS SELECT last_name,employee_id,department_id FROM emps WHERE department_id =80;
#练习2: CREATE TABLE emps AS SELECT*FROM atguigudb.employees;
DESC emps;
#1. 创建视图emp_v1,要求查询电话号码以‘011’开头的员工姓名和工资、邮箱
CREATEOR REPLACE VIEW emp_v1 AS SELECT last_name,salary,email FROM emps WHERE phone_number LIKE'011%';
#2. 要求将视图 emp_v1 修改为查询电话号码以‘011’开头的并且邮箱中包含 e 字符 #的员工姓名和邮箱、电话号码
CREATEOR REPLACE VIEW emp_v1 AS SELECT last_name,email,phone_number,salary FROM emps WHERE phone_number LIKE'011%' AND email LIKE'%e%';
SELECT*FROM emp_v1;
#3. 向 emp_v1 插入一条记录,是否可以?
DESC emps;
# 实测:失败了 INSERT INTO emp_v1 VALUES('Tom','tom@126.com','01012345');
#4. 修改emp_v1中员工的工资,每人涨薪1000 SELECT* FROM emp_v1;
UPDATE emp_v1 SET salary = salary +1000;
#5. 删除emp_v1中姓名为Olsen的员工 DELETEFROM emp_v1 WHERE last_name ='Olsen';
#6. 创建视图emp_v2,要求查询部门的最高工资高于 12000 的部门id和其最高工资
CREATEOR REPLACE VIEW emp_v2(dept_id,max_sal) AS SELECT department_id,MAX(salary) FROM emps GROUPBY department_id HAVINGMAX(salary) >12000;
SELECT*FROM emp_v2;
#7. 向 emp_v2 中插入一条记录,是否可以? #不可以!
#错误:The target table emp_v2 of the INSERTisnot insertable-into INSERT INTO emp_v2(dept_id,max_sal) VALUES(4000,20000);
#8. 删除刚才的emp_v2 和 emp_v1 DROPVIEW IF EXISTS emp_v1,emp_v2; SHOW TABLES;