2021-05-25

三 创建视图

学习目标

  • 掌握创建视图的方式

  • 知道视图(VIEW)与数据表(TABLE)之间的区别

  • 知道视图的使用场景

0 数据集介绍

  • 数据来自一个在线医疗网站,该网站可以在线比较各城市的医生,并可以在线预约医生,一共有三张表

    • 医生,患者和就诊

Doctor 医生表

idfull_nametypecityratingprice_per_visit
1王建军骨科北京4.595.00
2李文慧内分泌科北京3.8100.00
3孙伟神经科北京4.3100.00
4刘琦精神科北京4.1110.00
5张学武风湿免疫科深圳3.280.00
6蓝淑玲儿科广州2.775.00
7孙凌精神科天津4.9120.00
8梁晓华过敏反应科上海3.8100.00
9张兰玲风湿免疫科上海4.190.00

patient 患者表

idfull_name
1魏平
2王晓磊
3郭慧芳
4刘丽宏
5赵久良
6梁东风
7王红
8钱晓静
9王厚文
10李若兰
11张可欣
12吴爱玲
13钱国富

visit 就诊记录表

iddoctor_idvisit_datepatient_id
152020-02-201
242020-02-205
332020-02-202
462020-02-202
512020-02-206
632020-02-201
722020-02-214
852020-02-213
932020-02-217
1072020-02-219
1112020-02-211
1292020-02-2110
1322020-02-218
1452020-02-215
1582020-02-2212
1632020-02-228
1762020-02-229
1842020-02-223
1932020-02-2213
2052020-02-2210
2192020-02-227
2282020-02-2213
2382020-02-2311
2472020-02-236
2512020-02-2312
  • 如果想展示某次就诊的全部信息,需要把医生表,患者表和就诊表JOIN到一起,具体SQL如下:

 SELECT
   d.id AS doctor_id,
   d.full_name AS doctor_full_name,
   d.type AS doctor_type,
   d.rating AS doctor_rating,
   p.id AS patient_id,
   p.full_name AS patient_full_name,
   v.visit_date AS visit_date
 FROM doctor d
 JOIN visit v
   ON v.doctor_id = d.id
 JOIN patient p
   ON p.id = v.patient_id;

查询结果

doctor_iddoctor_full_namedoctor_typedoctor_ratingpatient_idpatient_full_namevisit_date
5张学武风湿免疫科3.21魏平2020/2/20
4刘琦精神科4.15赵久良2020/2/20
3孙伟神经科4.32王晓磊2020/2/20
6蓝淑玲儿科2.72王晓磊2020/2/20
1王建军骨科4.56梁东风2020/2/20
3孙伟神经科4.31魏平2020/2/20
2李文慧内分泌科3.84刘丽宏2020/2/21
5张学武风湿免疫科3.23郭慧芳2020/2/21
3孙伟神经科4.37王红2020/2/21
7孙凌精神科4.99王厚文2020/2/21
1王建军骨科4.51魏平2020/2/21
9张兰玲风湿免疫科4.110李若兰2020/2/21
2李文慧内分泌科3.88钱晓静2020/2/21
5张学武风湿免疫科3.25赵久良2020/2/21
8梁晓华过敏反应科3.812吴爱玲2020/2/22
3孙伟神经科4.38钱晓静2020/2/22
6蓝淑玲儿科2.79王厚文2020/2/22
4刘琦精神科4.13郭慧芳2020/2/22
3孙伟神经科4.313钱国富2020/2/22
5张学武风湿免疫科3.210李若兰2020/2/22
9张兰玲风湿免疫科4.17王红2020/2/22
8梁晓华过敏反应科3.813钱国富2020/2/22
8梁晓华过敏反应科3.811张可欣2020/2/23
7孙凌精神科4.96梁东风2020/2/23
1王建军骨科4.512吴爱玲2020/2/23
  • 如果我们经常有这样的需求,需要把所有的信息放到一起展示,就需要反复写这样的查询语句。是否有办法避免这种重复劳动?使用视图(VIEW)就可以解决这样的问题

1 什么是视图

  • 视图(VIEW)是一条SQL语句,我们用特定名称“保存”该语句,创建之后,可以把它当做一张表在其它查询中使用。 视图通常称为虚拟表,因为我们可以像常规表一样查询它们

  • 我们在创建DOCTOR表的时候使用了如下SQL语句:

     CREATE TABLE doctor (
       id integer PRIMARY KEY,
       full_name varchar(128),
       type varchar(32),
       city varchar(128),
       rating decimal(2, 1),
       price_per_visit decimal(5, 2)
     );
  • 下面是一个简单的创建视图的示例:

     CREATE VIEW pediatrician AS
     SELECT *
     FROM doctor
     WHERE type = '儿科';
  • 上面的代码以CREATE VIEW开头,然后是视图名称,即儿科医生。 然后是AS关键字。 之后,我们需要在儿科医生基础上进行进一步查询,直接把pediatrician当作一张表来使用即可

     

  • 我们在Navicat的界面中双击视图pediatrician图标,即可查看视图数据

练习

  • 创建视图就诊详细信息(visit_details)将医生,患者,就诊表连接在一起

     CREATE VIEW visit_details AS
     SELECT
       d.id AS doctor_id,
       d.full_name AS doctor_full_name,
       d.type AS doctor_type,
       d.rating AS doctor_rating,
       p.id AS patient_id,
       p.full_name AS patient_full_name,
       v.visit_date AS visit_date
     FROM doctor d
     JOIN visit v
       ON v.doctor_id = d.id
     JOIN patient p
       ON p.id = v.patient_id;

2 表和视图的区别

  • 我们用CREATE VIEW 创建了视图,而且视图可以当做一张表来使用,那么究竟表和视图之间有啥区别?我们为什么要是用视图?

  • 视图不包含任何数据不占用磁盘空间只是把查询的SQL语句保存了起来,数据是保存在表中的,每次查询视图时,都会查询视图下的一个或多个表来再次获取数据

  • 视图的具体应用场景:

    • 出于安全考虑,可以只向特定的用户暴露全部数据的部分行或列

    • 某些时候需要在原始数据基础上创建一些临时列,例如把英里转换成公里,把摄氏度转换成华氏度

    • 在SQL中如果需要经常进行聚合操作,可以在视图中提前处理

       

3 视图的应用

  • 创建视图暴露部分数据,比如创建下面的视图,将医生和患者和姓名隐藏起来,访问visit_details_anonymous这个视图的用户不能看到敏感信息

 CREATE VIEW visit_details_anonymous AS
 SELECT
   doctor_id,
   doctor_type,
   doctor_rating,
   patient_id,
   visit_date
 FROM visit_details
  • 为了方便不同地区的用户访问网站,需要调整价格显示的货币单位,比如我们目前的价格是以人民币为单位的,香港地区的用户访问我们希望显示港币价格,可以创建视图

 CREATE VIEW doctors_hdk AS
 SELECT id, type, rating, price_per_visit * 1.2 AS price_per_visit_hkd
 FROM doctor;
  • 我们需要经常统计每个城市医生数量,并计算该城市医生的平均诊疗费用(只统计医生数量>2的城市),可以创建一个视图

 CREATE VIEW doctors_metrics AS
 SELECT city, COUNT(id) AS doctor_count, AVG(price_per_visit) AS avg_price_per_visit
 FROM doctor
 GROUP BY city
 HAVING COUNT(id) > 2;
  • 创建视图的时候需要注意:

    • 应该尽量避免在视图的基础上创建视图,多重视图不仅难于理解还会降低SQL 的性能

    • 不能向视图里插入数据

小结

  • 视图(View)可以看做一张虚拟表,它不存储数据,但是可以把视图当作一张表进行查询操作

  • 创建视图的语法:

     CREATE VIEW textbooks_stats AS
     SELECT ...
     FROM ...
     ...
  • 我们可以在一个视图的基础上创建另一个视图,但一般避免这么使用

  • 视图只用于查询

目录

三 创建视图

学习目标

0 数据集介绍

1 什么是视图

2 表和视图的区别

3 视图的应用

小结


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用python中的pymsql完成如下:表结构与数据创建 1. 建立 `users` 表和 `orders` 表。 `users` 表有用户ID、用户名、年龄字段,(id,name,age) `orders` 表有订单ID、订单日期、订单金额,用户id字段。(id,order_date,amount,user_id) 2 两表的id作为主键,`orders` 表用户id为users的外键 3 插入数据 `users` (1, '张三', 18), (2, '李四', 20), (3, '王五', 22), (4, '赵六', 25), (5, '钱七', 28); `orders` (1, '2021-09-01', 500, 1), (2, '2021-09-02', 1000, 2), (3, '2021-09-03', 600, 3), (4, '2021-09-04', 800, 4), (5, '2021-09-05', 1500, 5), (6, '2021-09-06', 1200, 3), (7, '2021-09-07', 2000, 1), (8, '2021-09-08', 300, 2), (9, '2021-09-09', 700, 5), (10, '2021-09-10', 900, 4); 查询语句 1. 查询订单总金额 2. 查询所有用户的平均年龄,并将结果四舍五入保留两位小数。 3. 查询订单总数最多的用户的姓名和订单总数。 4. 查询所有不重复的年龄。 5. 查询订单日期在2021年9月1日至9月4日之间的订单总金额。 6. 查询年龄不大于25岁的用户的订单数量,并按照降序排序。 7. 查询订单总金额排名前3的用户的姓名和订单总金额。 8. 查询订单总金额最大的用户的姓名和订单总金额。 9. 查询订单总金额最小的用户的姓名和订单总金额。 10. 查询所有名字中含有“李”的用户,按照名字升序排序。 11. 查询所有年龄大于20岁的用户,按照年龄降序排序,并只显示前5条记录。 12. 查询每个用户的订单数量和订单总金额,并按照总金额降序排序。
06-03

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值