数据库视图-多表

在数据库中创建一个视图,结合多张表通常会用到 JOIN 操作(连接操作)。通过将多个表的数据联合起来,你可以创建一个包含来自多个表的字段的视图。

示例:从多个表中创建视图

假设我们有以下两张表:

  1. 员工表 (employees)

    • employee_id:员工ID
    • employee_name:员工姓名
    • department_id:员工所属部门ID
  2. 部门表 (departments)

    • department_id:部门ID
    • department_name:部门名称

我们希望创建一个视图,该视图包含员工的姓名和他们所在的部门名称。

1. 创建多表视图的 SQL 示例:

sql 复制代码
CREATE VIEW employee_department_view AS
SELECT e.employee_name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id;

解释:

  • JOIN 操作 :将 employees 表与 departments 表连接,连接条件是两表的 department_id 字段相等。
  • 视图名称employee_department_view 是我们要创建的视图名称。
  • 查询 :视图中包含的查询是从两个表中选取 employee_namedepartment_name 字段。

2. 查询视图:

一旦视图创建完成,可以像查询普通表一样查询视图:

sql 复制代码
SELECT * FROM employee_department_view;

3. 更复杂的多表视图

可以通过更复杂的查询来组合多个表的数据,下面是一个包含多个表的更复杂视图创建示例。

假设还要添加一个 薪资表 (salaries),该表包含员工的薪资信息:

  • 薪资表 (salaries)
    • employee_id:员工ID
    • salary:员工薪资

现在,我们要创建一个视图,显示员工姓名、部门名称和薪资。

4. 创建多表视图(包含三个表):

sql 复制代码
CREATE VIEW employee_details_view AS
SELECT e.employee_name, d.department_name, s.salary
FROM employees e
JOIN departments d ON e.department_id = d.department_id
JOIN salaries s ON e.employee_id = s.employee_id;

解释:

  • 该视图包含了 员工姓名部门名称薪资
  • 使用了两个 JOIN 操作:
    • employeesdepartments 表通过 department_id 连接。
    • employeessalaries 表通过 employee_id 连接。

5. 使用 LEFT JOIN 连接多表:

如果我们希望即使某些员工没有薪资信息时,依然显示他们的姓名和部门,可以使用 LEFT JOIN

sql 复制代码
CREATE VIEW employee_department_salary_view AS
SELECT e.employee_name, d.department_name, s.salary
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id
LEFT JOIN salaries s ON e.employee_id = s.employee_id;

解释:

  • 使用了 LEFT JOIN,即使某些员工没有对应的薪资记录,视图也会返回这些员工的姓名和部门信息,只是薪资列会返回 NULL

总结:

  • 创建多表视图通常依赖于 JOIN 操作,将多个表的数据合并到一起,创建一个虚拟的综合视图。
  • 你可以使用不同类型的 JOIN(如 INNER JOIN, LEFT JOIN 等)来控制数据的合并方式。
  • 视图的好处是让复杂查询变得更简单,用户不需要关心表的结构,只需要查询视图。
相关推荐
筏.k22 分钟前
用 Qt 打造优雅的密码输入框:添加右侧眼睛图标切换显示
开发语言·数据库·qt
怒码ing35 分钟前
分布式事务----spring操作多个数据库,事务以及事务回滚还有用吗
数据库·分布式·spring
Miraitowa_cheems1 小时前
Redis 核心概念、命令详解与应用实践:从基础到分布式集成
数据库·redis·缓存
-SGlow-8 小时前
MySQL相关概念和易错知识点(3)(表内容的CURD、内置函数)
linux·运维·服务器·数据库·mysql
飞翔的佩奇8 小时前
基于SpringBoot+MyBatis+MySQL+VUE实现的经方药食两用服务平台管理系统(附源码+数据库+毕业论文+部署教程+配套软件)
数据库·vue.js·spring boot·mysql·毕业设计·mybatis·经方药食两用平台
bing_1589 小时前
在多租户或多服务共享 Redis 时,如何做逻辑隔离或权限控制?
数据库·redis·缓存
ChaITSimpleLove9 小时前
PostgreSQL 中删除指定数据库下的所有表结构
数据库·postgresql·bash·sql 脚本·.net npgsql
孫治AllenSun11 小时前
【Mysql】字段隐式转换对where条件和join关联条件的影响
数据库·mysql·oracle
生涯にわたる学び11 小时前
数据库02 网页html01 day44
数据库·html
2301_7930868712 小时前
Mysql group by
数据库·mysql