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

【SQL】MySQL基础2:视图,存储过程,游标,约束,触发器

文章目录

  • 1. 视图
  • 2. 存储过程
    • 2.1 创建存储过程
    • 2.2 执行存储过程
  • 3. 游标
  • 4. 约束
    • 4.1 主键约束
    • 4.2 外键约束
    • 4.3 唯一约束
    • 4.4 检查约束
  • 5. 触发器

1. 视图

视图是虚拟的表,它是动态检索的部分。使用视图的原因:避免重复的SQL语句;使用表的部分而不是全部;限制用户只能访问表的部分以保护数据;更改数据格式和表示。
视图要唯一命名;可以用视图创建视图;需要管理创建视图的权限。

-- case1: 简化SQL语句,为3表的连接创建视图
CREATE VIEW ProductCustomers AS
SELECT cust_nam, cust_contact, prod_id
FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.cust_idAND OrderItems.order_num = Orders.order_num;SELECT cust_nem, cust_contact
FROM ProductCustomers
WHERE prod_id = 'RGAN01';-- csae2: 重新格式化数据,为格式化的查询创建视图
CREATE VIEW VendorLocations AS
SELECT CONCAT(RTRIM(vend_name), ' (', RTRIM(vend_country), ')') AS vend_title
FROM Vendors
ORDER BY vend_name;SELECT * FROM VendorLocations;-- case3: 过滤数据
CREATE VIEW CustomersEmailList AS
SELECT cust_id, cust_name, cust_email
FROM Customers
WHERE cust_email IS NOT NULL;SELECT * FROM CustomerEmailList;-- case4: 为使用计算字段的查询创建视图
CREATE VIEW OrderItemExpanded AS
SELECT prod_id,quantity,item_price,quantity * item_price AS expanded_price
FROM OrderItems;SELECT *
FROM OrderItesExpanded
WHERE order_num = 20008;

2. 存储过程

存储过程(Stored Procedure)是一组为了完成特定功能而预先编译并存储在数据库中的 SQL 语句集合。它类似于编程语言中的函数,有输入输出参数,可以接收用户传递的数据,经过一系列的逻辑处理后返回结果。
存储过程的作用:封装复杂操作,向应用侧减少操作步骤,从而减少出错可能,有利于保证数据一致性;存储过程内部变动对应用侧无感知,基础数据访问被限制从而保证安全性;存储过程以编译形式存储,DBMS工作量小,性能有所提高。

2.1 创建存储过程

创建存储过程涉及多行,为了避免默认分隔符 “;” 终止存储过程的定义,需要使用DELIMITER操作符临时修改分隔符,定义完成后再改回来。存储过程中的局部变量应声明放在最前面。
– v_rows是存储过程中的一个整型变量,参数ListCOunt保存为存储过程返回值。存储过程的执行结果先保存在v_rows中,再赋值给返回参数ListCOunt

DELIMITER //
CREATE PROCEDURE MailingListCount(OUT ListCount INT)
BEGINDECLARE v_rows INT DEFAULT 0;SELECT COUNT(*) INTO v_rowsFROM CustomersWHERE cust_email IS NOT NULL;SET ListCount = v_rows;
END //
DELIMITER ;-- 查看已经创建的存储过程
show procedure status;-- 删除存储过程
drop procedure xxx;

2.2 执行存储过程

SET @ListCount = 0;
CALL MailingListCount(@ListCount);
SELECT @ListCount;

3. 游标

游标主要用于从结果集中相邻地取出数据。游标只能读取,不能更新和删除。
游标主要是在存储过程、函数或触发器内部使用,并且它们是局部对象,仅在定义它们的块内可见,不具备全局的视图或系统表来直接展示所有已创建的游标。
游标的定义没有执行数据检索操作。打开游标操作才实际执行检索操作。

-- 仅仅检索一行
CREATE PROCEDURE CurTest()
BEGINDECLARE v_cust_id char(10);DECLARE v_cust_name char(50);DECLARE CustCursor CURSORFORSELECT cust_id, cust_name FROM CustomersWHERE cust_country = 'USA';OPEN CustCursor;FETCH CustCursor INTO v_cust_id, v_cust_name;SELECT v_cust_id, v_cust_name;CLOSE CustCursor;
END;-- 检索多行
CREATE PROCEDURE CurTest()
BEGINDECLARE v_cust_id char(10);DECLARE v_cust_name char(50);DECLARE done INT;DECLARE CustCursor CURSORFORSELECT cust_id, cust_name FROM CustomersWHERE cust_country = 'USA';DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;OPEN CustCursor;read_loop: LOOPFETCH CustCursor INTO v_cust_id, v_cust_name;IF done THENLEAVE read_loop;END IF;SELECT CONCAT('Customer ID: ', v_cust_id, ', Name: ', v_cust_name);END LOOP;CLOSE CustCursor;
END;

4. 约束

约束是管理插入或者处理数据库数据的规则,DBMS通过在数据库表上施加约束来实现引用完整性。OrderItems表的order_num字段引用了Orders表的order_num字段,OrderItems表中的order_num字段值一定要出现在Orders表的order_num列中,这就是引用完整性。

4.1 主键约束

-- 创建主键方法一:
CREATE TABLE Vendors
(vend_id CHAR(10) NOT NULL PRIMARY KEY,...
)-- 创还能主键方法二:
ALTER TABLE Vendors
ADD CONSTRAINT PRIMARY KEY(vend_id);

4.2 外键约束

外键是表中的一列,其值必须在另一表的主键中。比如Orders表的cust_id可以作为外键,其值在Customers表中cust_id列中,而cust_id列式Customers表的主键。再如OrderItems表的order_num列可以作为外键,而order_num列又是Orders表的主键。设置外键的作用是,外键取值范围限定在其作为主键的表所给出的那些主键值上。

-- 定义外键约束方法一:
CREATE TABLE Orders
(order_num INT NOT NULL PRIMARY KEY,order_date DATETIME NOT NULL,cust_id CHAR(10) NOT NULL REFERENCES Customers(cust_id)
);
-- 定义外键方法二:
ALTER TABLE Orders
ADD CONSTRAINT
FOREIGN KEY(cust_id) REFRENCES Customers(cust_id);

4.3 唯一约束

唯一约束和和主键的区别:唯一约束允许NULL值;唯一约束允许修改或者更新;唯一约束列值可以重用;唯一约束不能用来定义外键;

-- 定义唯一约束之一
CREATE TABLE Employees
(employee_id INT NOT NULL PRIMARY KEY,secure_no INT DEFULT 000,phone char(11) DEFAULT '',name char(10) DEFAULT '',age INT DEAFULT 18,UNIQUE(secure_no, phone)
)-- 定义唯一约束之二:命名的唯一约束
ALERT TABLE Employees
ADD CONSTRAINT unique_constraint
UNIQUE (secure_no, phone);-- 定义唯一约束之三:匿名的唯一约束
ALERT TABLE Employees
ADD UNIQUE(secure_no, phone);-- 删除唯一约束,唯一约束本质是唯一索引
ALTER TABLE employees
DROP INDEX unique_constraint;

4.4 检查约束

检查约束用于确保插入的值满足检查的条件。

-- case1: 检查字段quantity值大于0
CREATE TABLE OrderItems
(order_num INT NOT NULL,order_item INT NOT NULL,prod_id CHAR(10) NOT NULL,quantity INT NOT NULL CHECK (quantity > 0),item_price MONEY NOT NULL
);-- case2:检查性别是否只包含字母M和字母F
ALTER TABLE employee
ADD CONSTRAINT chk_gender CHECK (gender IN ('M', 'F'));

5. 触发器

当特定的数据库操作发生时要执行一些额外的工作,就需要使用触发器。触发器是绑定到单个表的。执行对表的特定操作会触发触发器的操作。触发器的用途:操作执行前数据统一格式;记录某个表的变动到另一个表;进行额外验证;产生计算列的值;更新时间戳。
注意点:触发器操作可以在其所绑定的操作之前或者之后执行,MySQL不允许在触发器操作对同一张表在绑定操作后再进行操作。比如只能在插入操作之前把要插入的数据转为大写。

-- 插入前转为大写
CREATE TRIGGER customer_state
BEFORE INSERT ON Customers
FOR EACH ROW
BEGIN-- 在插入之前将 cust_state 转换为大写SET NEW.cust_state = UPPER(NEW.cust_state);
END;

相关文章:

【SQL】MySQL基础2:视图,存储过程,游标,约束,触发器

文章目录 1. 视图2. 存储过程2.1 创建存储过程2.2 执行存储过程 3. 游标4. 约束4.1 主键约束4.2 外键约束4.3 唯一约束4.4 检查约束 5. 触发器 1. 视图 视图是虚拟的表,它是动态检索的部分。使用视图的原因:避免重复的SQL语句;使用表的部分而…...

【TS学习】(15)分布式条件特性

在 TypeScript 中,分布式条件类型(Distributive Conditional Types) 是一种特殊的行为,发生在条件类型作用于裸类型参数(Naked Type Parameter) 时。这种特性使得条件类型可以“分布”到联合类型的每个成员…...

Android 小组件

小部件的布局文件支持如下布局: FrameLayout LinearLayout RelativeLayout GridLayout 以及如下控件 AnalogClock Button Chronometer ImageButton ImageView ProgressBar TextView ViewFlipper ListView GridView StackView AdapterViewFlipper 应该不止这些有空…...

搭建开源笔记平台:outline

折腾的意义 为什么要自己搭建一个笔记平台?没理由,就是突然想试试。有时候突然有个想法,搜了一下正好有合适的方案,就顺手试一下。 其实已经有很多成熟的笔记软件,例如Notion/OneNote,但谁不想要一个数据完…...

Unity编辑器功能及拓展(2) —Gizmos编辑器绘制功能

Unity中的Gizmos功能是用于在场景视图中绘制辅助图形或图标的工具,帮助开发者在编辑模式下直观调试和可视化游戏对象的位置、范围、方向等信息。 一.定义概述 Gizomsd 概述 Gizoms是Unity提供的一个API,或者叫做一个工具类,包含一系列静态…...

电脑屏幕亮度随心控,在Windows上自由调整屏幕亮度的方法

调整电脑屏幕的亮度对于保护视力和适应不同环境光线条件非常重要。无论是在白天强光下还是夜晚昏暗环境中,合适的屏幕亮度都能让您的眼睛更加舒适。本文中简鹿办公小编将向您介绍几种在 Windows 系统中调整屏幕亮度的方法。 方法一:使用快捷键 大多数笔…...

presto行转列

presto的行列转换和spark、hive一样也是通过外链语句实现的,只不过语法和关键子有点不同,如下 with tmp1 as (select 1,2,3 as a1,4,5,6 as a2 ) select * from tmp1 cross join unnest(split(tmp1.a1, ,),split(tmp1.a2, ,) ) as b(a1s,a2s) 结果如下...

MySQL 5.7 Online DDL 技术深度解析

14.13.1 在线DDL操作 索引操作主键操作列操作生成列操作外键操作表操作表空间操作分区操作 索引操作 下表概述了对索引操作的在线DDL支持情况。星号表示有附加信息、例外情况或依赖条件。有关详细信息,请参阅语法和使用说明。 操作原地执行重建表允许并发DML仅修…...

【汽车功能安全:软件与硬件缺一不可】

随着汽车变得越来越智能,功能安全就成为汽车电子系统不可回避的标准体系,日益复杂的功能导致了汽车中电子元件的数量和复杂性的指数级增长(Leen)。如今高级别汽车拥有多达90个电子控制单元(ECU)&#xff0c…...

docker打包使用有头模式playwright

1.打包镜像 创建Dockerfile文件如下 # playywright 官方镜像 FROM mcr.microsoft.com/playwright:v1.37.0-jammy# 设置非交互式环境变量和时区 ENV DEBIAN_FRONTENDnoninteractive ENV TZEtc/UTC# 安装 Python 3.9 和 pip(修复时区阻塞问题) RUN apt-g…...

TCP/IP协议的应用层与传输层

TCP/IP协议簇是互联网的核心通信框架,定义了数据如何在网络中封装、寻址、传输和路由(确定数据包从源主机到目标主机的传输路径的过程)。 应用层 直接面向用户和应用,负责实现网络服务的具体功能(如网页浏览、文件传输…...

51c自动驾驶~合集15

我自己的原文哦~ https://blog.51cto.com/whaosoft/11720657 #DRAMA 首个基于Mamba的端到端运动规划器(新加坡国立) 运动规划是一项具有挑战性的任务,在高度动态和复杂的环境中生成安全可行的轨迹,形成自动驾驶汽车的核心能…...

拼多多 anti-token unidbg 分析

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向分析 版本7.3-7.4 都试过加密没什…...

【Git】5 个分区的切换方式及示例

目录 1. **工作区(Working Directory)**2. **缓存区(Stage/Index)**3. **本地仓库(Local Repository)**4. **远程仓库(Remote Repository)**5. **贮藏区(Stash&#xff0…...

Java高频面试之并发编程-02

hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:进程和线程的区别是什么? 1. 资源分配与独立性 进程: 独立性:每个进程拥有独立的内存…...

openwebui和keycloak集成,使用keycloak的用户名和密码登录

1,实现效果 使用keycloak定义的用户名和密码,直接登录openwebui 2,实现原理 keycloak中用户信息中包含用户名和密码,以及email。 使用keycloak中的用户名和密码登录之后,会用email创建一个openwebui的账号。之后每次…...

html实现手势密码

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>手势密码</title><style>body {font-fam…...

【区块链安全 | 第八篇】多签机制及恶意多签

部分参考&#xff1a;慢雾科技 文章目录 为什么需要多签多签机制Tron钱包下的恶意多签Tron 钱包多签权限分类Tron 多签机制的运作方式 恶意多签的过程黑客通过多签机制控制账户黑客剥夺用户权限&#xff0c;完全控制账户 恶意多签成因 在区块链中&#xff0c;多签&#xff08;M…...

项目如何安装本地tgz包并配置局部registry

一、判断包来源是否正确 1. 检查url curl <registry_url>2. 查看包是否存在 npm view <package_name> --registry<registry_url>二、局部registry配置步骤&#xff1a; 1. 全局配置 如果你希望对所有项目生效&#xff0c;可以将这行配置添加到全局.npmr…...

二月公开赛Web-ssrfme

目录 环境搭建 题目分析 分析代码 解题过程 Redis未授权访问 寻找Flag 环境搭建 进入含有docker-compose.yml的文件内&#xff0c;拉取容器镜像 docker-compose up -d 题目分析 访问容器地址172.25.254.200:8091查看题目 分析代码 url通过GET请求访问界面&#xff0c…...

JavaRedis和数据库相关面试题

JavaRedis面试题 1. Redis是什么以及Redis为什么快&#xff1f; ​ Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存键值数据库&#xff0c;支持多种数据结构&#xff08;如字符串、哈希、列表、集合等&#xff09;&#xff0c;并提供持久化、复制、…...

告别枯燥工作,走向自动化

嘿&#xff0c;小伙伴们&#xff01;今天给你们介绍两款超实用的RPA办公自动化软件&#xff0c;用它们&#xff0c;再也不用像机器一样做重复劳动啦&#xff0c;超省时间&#xff01; 工具名称&#xff1a;影刀RPA&#xff08;类似产品&#xff0c;八爪鱼 RPA&#xff0c;操作上…...

Spring的 @Conditional @ConditionalOnProperty 注解 笔记250330

Spring的 Conditional ConditionalOnProperty 注解 Spring 的 Conditional 与 ConditionalOnProperty 注解详解 在 Spring 框架中&#xff0c;Conditional 和 ConditionalOnProperty 是用于动态控制 Bean 注册的重要注解。虽然它们都服务于条件化配置&#xff0c;但定位和使用…...

可信数据空间:构筑安全可控数据流通

前言&#xff1a;可信数据空间是一种数据基础设施&#xff0c;发展可信数据空间是全国及各地数据基础设施建设的重要方面。国内数据空间的探索和实践仍然数据探索阶段。本期分享&#xff1a;可信数据空间构筑安全可控数据流通&#xff0c;包括可信数据空间技术介绍、如何助力数…...

Zookeeper特性与节点数据类型

数据结构和监听机制 CP 文件系统形式存储 观察者模式监听节点数据变化、 临时节点客户端超时或发生异常节点就会删除 2888同步数据 3888选举端口 1.什么是Zookeeper ZooKeeper 是一个开源的分布式协调框架&#xff0c;是Apache Hadoop 的一个子项目&#xff0c;主要用来…...

【C++游戏引擎开发】《线性代数》(6):SVD(奇异值分解)的数学原理与实现

一、奇异值分解(SVD)的数学定义 奇异值分解​(Singular Value Decomposition,SVD)是一种将任意实数或复数矩阵分解为三个特定矩阵乘积的方法。其数学定义如下: 1.1 分解形式 给定一个秩为 r r r的矩阵 A ∈ R m n \mathbf{A} \in \mathbb{R}^{m \times n} A∈Rmn(或…...

C语言pthread库创建线程的案例

一、代码案例 #include<stdio.h> #include<stdlib.h> // 多线程库 #include<pthread.h> // 线程1的逻辑描述 void* thread_method_01(void* v){ printf("线程1执行完毕。\n"); return NULL; } // 线程2的执行逻辑 void* thread_meth…...

处理 Linux 信号:进程控制与异常管理的核心

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言&#xff1a; 在 Linux 操作系统中&#xff0c;信号是用于进程间通信的一种机制&#xff0c;能够向进程发送通知&#xff0c;指示某些事件的发生。信号通常由操作系统内核、硬件中断或其他进程发送。接收和处理信号是 Li…...

【蓝桥杯每日一题】4.1

&#x1f3dd;️专栏&#xff1a; 【蓝桥杯备篇】 &#x1f305;主页&#xff1a; f狐o狸x "今日秃头刷题&#xff0c;明日荣耀加冕&#xff01;" 今天我们来练习二分算法 不熟悉二分算法的朋友可以看&#xff1a;【C语言刷怪篇】二分法_编程解决算术问题-CSDN博客 …...

分享系列项目的基础项目

本人分享了一系列的框架项目&#xff0c;它们共同需要依赖这个公共基础&#xff0c;结构如下图所示&#xff1a; 其中&#xff1a; audit: JPA的审计信息基础类auth&#xff1a;认证授权相关类config: 包括redis配置&#xff0c;client中token配置&#xff0c;openai文档配置…...