zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

MySQL数据库,详解视图,高手必备(一)

2023-03-14 22:58:39 时间

需求背景

电商公司领导说:给我统计⼀下:当⽉订单总⾦额、订单量、男⼥订单占⽐等信息,我们

啪啦啪啦写了⼀堆很复杂的sql,然后发给领导。

这样⼀⼤⽚sql,发给领导,你们觉得好么?

如果领导只想看其中某个数据,还需要修改你发来的sql,领导⽇后想新增其他的统计指

标,你又会发送⼀⼤坨sql给领导,对于领导来说这个sql看起来很复杂,难以维护。

实际上领导并不关⼼你是怎么实现的,他关⼼的只是这些指标,并且⽅便查看、查询,⽽

你却把复杂的实现都发给了领导。

那我们有什么办法隐藏这些细节,只暴露简洁的结果呢?

数据库已经帮我们想到了:使⽤视图来解决这个问题。

什么是视图

概念

视图是在mysql5之后出现的,是⼀种虚拟表,⾏和列的数据来⾃于定义视图时使⽤的⼀

些表中,视图的数据是在使⽤视图的时候动态⽣成的,视图只保存了sql的逻辑,不保存

查询的结果。

这是Mysql系列第15篇。

环境:mysql5.7.25,cmd命令中进⾏演⽰。使⽤场景

多个地⽅使⽤到同样的查询结果,并且该查询结果⽐较复杂的时候,我们可以使⽤视图来

隐藏复杂的实现细节。案例1

查询姓名中包含a字符的员⼯名、部门、⼯种信息

/*案例1:查询姓名中包含a字符的员⼯名、部门、⼯种信息*/

/*①创建视图myv1*/

CREATE VIEW myv1

AS

SELECT

t1.last_name,

t2.department_name,

t3.job_title

FROM employees t1, departments t2, jobs t3

WHERE t1.department_id = t2.department_id

AND t1.job_id = t3.job_id;

/*②使⽤视图*/

SELECT * FROM myv1 a where a.last_name like 'a%';

效果如下:

mysql> SELECT * FROM myv1 a where a.last_name like 'a%';

+-----------+-----------------+----------------------+

| last_name | department_name | job_title |

+-----------+-----------------+----------------------+

| Austin | IT | Programmer |

| Atkinson | Shi | Stock Clerk |

| Ande | Sal | Sales Representative |

| Abel | Sal | Sales Representative |

+-----------+-----------------+----------------------+

4 rows in set (0.00 sec)

上⾯我们创建了⼀个视图:myv1,我们需要看员⼯姓名、部门、⼯种信息的时候,不⽤关

⼼这个视图内部是什么样的,只需要查询视图就可以了,sql简单多了。

案例2

案例2:查询各部门的平均⼯资级别/*案例2:查询各部门的平均⼯资级别*/

/*①创建视图myv1*/

CREATE VIEW myv2

AS

SELECT

t1.department_id 部门id,

t1.ag 平均⼯资,

t2.grade_level ⼯资级别

FROM (SELECT

department_id,

AVG(salary) ag

FROM employees

GROUP BY department_id)

t1, job_grades t2

WHERE t1.ag BETWEEN t2.lowest_sal AND t2.highest_sal;

/*②使⽤视图*/

SELECT * FROM myv2;

效果:

mysql> SELECT * FROM myv2;

+----------+--------------+--------------+

| 部门id | 平均⼯资 | ⼯资级别 |

+----------+--------------+--------------+

| NULL | 7000.000000 | C |

| 10 | 4400.000000 | B |

| 20 | 9500.000000 | C |

| 30 | 4150.000000 | B |

| 40 | 6500.000000 | C |

| 50 | 3475.555556 | B |

| 60 | 5760.000000 | B |

| 70 | 10000.000000 | D |

| 80 | 8955.882353 | C |

| 90 | 19333.333333 | E |

| 100 | 8600.000000 | C |

| 110 | 10150.000000 | D |

+----------+--------------+--------------+

12 rows in set (0.00 sec)