当前位置: 首页 > article >正文

连接表、视图和存储过程

1. 视图

1.1. 视图的概念

视图(View):虚拟表,本身不存储数据,而是封装了一个 SQL 查询的结果集。

用途

  • 只显示部分数据,提高数据访问的安全性
  • 简化复杂查询,提高复用性可维护性
  • 可为不同用户提供不同的数据视图。

虚拟表的创建连接了一个或多个数据表,不同的查询应用都可以建立在虚拟表之上。

1.2. 创建、更新和删除视图

1. 创建视图:CREATE VIEW

CREATE VIEW view_name AS
SELECT column1, column2
FROM table
WHERE condition;

嵌套视图:

当创建好一张视图之后,还可以在它的基础上继续创建视图。

2. 修改视图:ALTER VIEW

ALTER VIEW view_name AS
SELECT column1, column2
FROM table
WHERE condition

3. 删除视图:DROP VIEW

DROP VIEW view_name

1.3. 用视图简化SQL操作

1. 复杂连接视图封装

✅ 示例:封装球员与身高等级的连接

CREATE VIEW player_height_grades AS
SELECT p.player_name, p.height, h.height_level
FROM player AS p
JOIN height_grades AS h
ON p.height BETWEEN h.height_lowest AND h.height_highest;

查询:

SELECT * FROM player_height_grades WHERE height BETWEEN 1.90 AND 2.08;

2. 格式化输出视图

✅ 示例:拼接球员姓名和球队名称

CREATE VIEW player_team AS
SELECT CONCAT(player_name, '(', team.team_name, ')') AS player_team
FROM player JOIN team
ON player.team_id = team.team_id;

3. 计算字段封装

✅ 示例:统计球员比赛得分组成

CREATE VIEW game_player_score AS
SELECT game_id, player_id,(shoot_hits - shoot_3_hits)*2 AS shoot_2_points,shoot_3_hits*3 AS shoot_3_points,shoot_p_hits AS shoot_p_points,score
FROM player_score;

1.4. 视图的优点、与临时表的区别

视图的优点:

1. 安全性:

  • 视图通常为只读,避免误改数据。
  • 可基于权限控制字段访问。

2. 简洁性与复用性:

  • 简化复杂 SQL。
  • 可嵌套定义,便于模块化管理。

视图与临时表的区别:

特性

视图(View)

临时表(Temporary Table)

是否存储数据

否,虚拟表,实时查询结果

是,存储在临时空间

生命周期

持久存在(除非 DROP)

仅当前会话存在,连接关闭即消失

用途

封装查询逻辑,数据隔离

存放临时数据,如中间计算结果

支持修改数据

限制较多(如包含聚合、连接)

支持普通数据操作(增删改查)

索引支持

大多不支持索引

通常支持索引

示例应用场景:

视图:给销售人员只显示价格、销量,不显示成本。

临时表:购物车临时保存每个用户选购的商品数据。

2. 存储过程 Stored Procedure

2.1. 存储过程的定义

定义:SQL 中对一组语句的封装,可通过一次定义,多次调用,像函数一样执行。

结构组成:包含 SQL 语句、流控制语句(如循环、条件判断等)。

使用方式

CREATE PROCEDURE proc_name ([参数])
BEGIN-- 语句块
END

2.2. 存储过程的优缺点

优点:

✅ 1. 一次编译,多次执行

提前编译后存储在数据库中,后续调用无需重新解析,提高执行效率

✅ 2. 封装逻辑,提升复用性

可将复杂逻辑封装成过程,结构清晰、易于维护与复用,有利于模块化开发。

✅ 3. 减少开发工作量

开发者只需调用过程,避免重复写 SQL,提高开发效率

✅ 4. 增强数据安全性

可设置权限控制,用户只能访问授权存储过程,不直接操作底层表。

✅ 5. 降低网络通信成本

客户端只需一次调用,无需多次发送复杂 SQL,节省网络带宽与响应时间。

✅ 6. 适合执行复杂业务逻辑

封装控制流程(IF、LOOP、CASE)更容易组织复杂业务规则。

缺点:

⚠️ 1. 可移植性差

不同数据库的语法和支持程度不同(如 MySQL 与 Oracle 存储过程差异大),跨平台迁移困难

⚠️ 2. 调试不方便

多数数据库缺少完善的调试工具,过程内错误排查困难,调试成本高

⚠️ 3. 版本管理困难

存储过程通常不受代码版本控制系统(如 Git)管理,迭代不透明、易错难追踪

⚠️ 4. 维护成本高

对团队协作和文档要求高,逻辑变更需谨慎更新过程,否则容易造成逻辑失效。

⚠️ 5. 不适合高并发环境

高并发场景更强调可扩展性与解耦,存储过程绑定数据库逻辑,难以灵活应对分库分表等架构。

http://www.lryc.cn/news/2387376.html

相关文章:

  • 人工智能赋能教育:重塑学习生态,开启智慧未来
  • 银河麒麟V10×R²AIN SUITE:用AI重构安全,以国产化生态定义智能未来
  • JavaScript- 3.2 JavaScript实现不同显示器尺寸的响应式主题和页面
  • 15.进程间通信(一)
  • AI 数据采集实战指南:基于 Bright Data 快速获取招标讯息
  • cursor使用mcp
  • 小白成长之路-计算机网络(四)
  • 【Agent】MLGym: A New Framework and Benchmark for Advancing AI Research Agents
  • 5.27 打卡
  • Web安全测试-文件上传绕过-DVWA
  • 织梦dedecms arclist最新发布日期显示红色
  • 现代 CSS 高阶技巧:实现平滑内凹圆角的工程化实践
  • 【运维自动化-标准运维】如何实现在不同步骤间传递参数
  • STM32 UART通信实战指南:从原理到项目落地
  • 基于stm32的 永磁同步电机二电平驱动控制系统设计
  • [AI]主流大模型、ChatGPTDeepseek、国内免费大模型API服务推荐(支持LangChain.js集成)
  • 手机IP地址更换的影响与操作指南
  • iOS 响应者链详解
  • Flink Table API 编程入门实践
  • MongoDB 安全机制详解:全方位保障数据安全
  • Teensy LC 一款由 PJRC 公司开发的高性能 32 位微控制器开发板
  • MicroPython 开发ESP32应用教程 之 线程介绍及实例分析
  • 鸿蒙5开发宝藏案例分享---一多断点开发实践
  • 嵌入式学习之系统编程(六)线程
  • 分布式常见概念
  • 数据库的事务(Transaction)
  • 大语言模型 提示词的少样本案例的 演示选择与排序新突破
  • 【算法篇】二分查找算法:基础篇
  • Qtc++开发遇到的问题-按钮点击不管用?
  • 重磅发布 | 复旦533页《大规模语言模型:从理论到实践(第2版)》(免费下载)