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

news2025/4/2 1:42:01

文章目录

  • 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_id
  AND 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)
BEGIN
    DECLARE v_rows INT DEFAULT 0;
    SELECT COUNT(*) INTO v_rows
    FROM Customers
    WHERE 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()
BEGIN
    DECLARE v_cust_id char(10);
    DECLARE v_cust_name char(50);

    DECLARE CustCursor CURSOR
    FOR
    SELECT cust_id, cust_name FROM Customers
   	WHERE 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()
BEGIN
	DECLARE v_cust_id char(10);
    DECLARE v_cust_name char(50);
	DECLARE done INT;
    DECLARE CustCursor CURSOR
    FOR
    SELECT cust_id, cust_name FROM Customers
    WHERE cust_country = 'USA';
    
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    
    OPEN CustCursor;
    read_loop: LOOP
        FETCH CustCursor INTO v_cust_id, v_cust_name;
        IF done THEN
            LEAVE 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;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2325268.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Centos 7 搭建 jumpserver 堡垒机

jumpserver 的介绍 1、JumpServer 是完全开源的堡垒机, 使用 GNU GPL v2.0 开源协议, 是符合4A 的专业运维审计系统 1)身份验证 / Authentication 2)授权控制 / Authorization 3)账号管理 / Accounting 4)安全审计 / Auditing 2、JumpServer 使用 Python / Django 进行开…

封装了一个优雅的iOS全屏侧滑返回工具

思路 添加一个全屏返回手势,UIPangesturerecognizer, 1 手势开始 在手势开始响应的时候,将navigationController的delegate代理设置为工具类,在工具类中执行代理方法,- (nullable id )navigationController:(UINavigationControll…

HCIP-6 DHCP

HCIP-6 DHCP DHCP(Dynamic Host Configuration Protocol,动态主机配置协议) 手工配置网络参数存在的问题 灵活性差 容易出错 IP地址资源利用率低 工作量大 人员素质要求高 DHCP服务器按照如下次序为客户端选择IP地址: ①DHCP服务器的数…

opencv图像处理之指纹验证

一、简介 在当今数字化时代,生物识别技术作为一种安全、便捷的身份验证方式,正广泛应用于各个领域。指纹识别作为生物识别技术中的佼佼者,因其独特性和稳定性,成为了众多应用场景的首选。今天,我们就来深入探讨如何利…

记一道CTF题—PHP双MD5加密+”SALT“弱碰撞绕过

通过分析源代码并找到绕过限制的方法&#xff0c;从而获取到flag&#xff01; 部分源码&#xff1a; <?php $name_POST[username]; $passencode(_POST[password]); $admin_user "admin"; $admin_pw get_hash("0e260265122865008095838959784793");…

机器学习的一百个概念(3)上采样

前言 本文隶属于专栏《机器学习的一百个概念》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见[《机器学习的一百个概念》 ima 知识库 知识库广场搜索&…

分秒计数器设计

一、在VsCode中写代码 目录 一、在VsCode中写代码 二、在Quartus中创建工程与仿真 1、建立工程项目文件md_counter 2、打开项目文件&#xff0c;创建三个目录 3、打开文件trl&#xff0c;创建md_counter.v文件 4、打开文件tb&#xff0c;创建md_counter_tb.v文件 5、用VsCod…

Flink介绍——发展历史

引入 我们整个大数据处理里面的计算模式主要可以分为以下四种&#xff1a; 批量计算&#xff08;batch computing&#xff09; MapReduce Hive Spark Flink pig流式计算&#xff08;stream computing&#xff09; Storm SparkStreaming/StructuredStreaming Flink Samza交互计…

12. STL的原理

目录 1. 容器、迭代器、算法 什么是迭代器? 迭代器的作用&#xff1f; 迭代器的类型&#xff1f; 迭代器失效 迭代器的实现细节&#xff1a; 2. 适配器 什么是适配器&#xff1f; 适配器种类&#xff1a; 3. 仿函数 什么是仿函数&#xff1f; 仿函数与算法和容器的…

OSPFv3 的 LSA 详解

一、复习&#xff1a; OSPFv3 运行于 IPv6 协议上&#xff0c;所以是基于链路&#xff0c;而不是基于网段&#xff0c;它实现了拓扑和网络的分离。另外&#xff0c;支持一个链路上多个进程&#xff1b;支持泛洪范围标记和泛洪不识别的报文&#xff08;ospfv2 的行为是丢弃&…

python 原型链污染学习

复现SU的时候遇到一道python原型链污染的题&#xff0c;借此机会学一下参考&#xff1a; 【原型链污染】Python与Jshttps://blog.abdulrah33m.com/prototype-pollution-in-python/pydash原型链污染 文章目录 基础知识对父类的污染命令执行对子类的污染pydash原型链污染打污染的…

入栈操作-出栈操作

入栈操作 其 入栈操作 汇编代码流程解析如下&#xff1a; 出栈操作 其 出栈操作 汇编代码流程解析如下&#xff1a;

C++ 多态:面向对象编程的核心概念(一)

文章目录 引言1. 多态的概念2. 多态的定义和实现2.1 实现多态的条件2.2 虚函数2.3 虚函数的重写/覆盖2.4 虚函数重写的一些其他问题2.5 override 和 final 关键字2.6 重载/重写/隐藏的对比 3. 纯虚函数和抽象类 引言 多态是面向对象编程的三大特性之一&#xff08;封装、继承、…

Python数据可视化-第3章-图表辅助元素的定制

教材 本书为《Python数据可视化》一书的配套内容&#xff0c;本章为第3章-图表辅助元素的定制 本章主要介绍了图表辅助元素的定制&#xff0c;包括认识常用的辅助元素、设置坐标轴的标签、设置刻度范围和刻度标签、添加标题和图例、显示网格、添加参考线和参考区域、添加注释文…

springboot实现异步导入Excel的注意点

springboot实现异步导入Excel 需求前言异步导入面临的问题实现异步如何导入大Excel文件避免OOM&#xff1f;异步操作后&#xff0c;如何通知导入结果&#xff1f;如何加快导入效率&#xff1f;将导入结果通知给用户后&#xff0c;如何避免重复通知&#xff1f; 优化点完结撒花&…

Linux练习——有关硬盘、联网、软件包的管理

1、将你的虚拟机的网卡模式设置为nat模式&#xff0c;给虚拟机网卡配置三个主机位分别为100、200、168的ip地址 #使用nmtui打开文本图形界面配置网络 [rootrhcsa0306 ~]# nmtui #使用命令激活名为 ens160 的 NetworkManager 网络连接 [rootrhcsa0306 ~]# nmcli c up ens160 #通…

论文阅读:GS-Blur: A 3D Scene-Based Dataset for Realistic Image Deblurring

今天介绍一篇 2024 NeurIPS 的文章&#xff0c;是关于真实世界去模糊任务的数据集构建的工作&#xff0c;论文作者来自韩国首尔大学 Abstract 要训练去模糊网络&#xff0c;拥有一个包含成对模糊图像和清晰图像的合适数据集至关重要。现有的数据集收集模糊图像的方式主要有两…

Cocos Creator Shader入门实战(七):RGB不同算法效果的实现,及渲染技术、宏定义、属性参数的延伸配置

引擎&#xff1a;3.8.5 您好&#xff0c;我是鹤九日&#xff01; 回顾 上篇文章&#xff0c;讲解了Cocos Shader如何通过setProperty动态设置材质的属性&#xff0c;以及设置属性时候的一些注意事项&#xff0c;比如&#xff1a; 一、CCEffect部分properties参数的设定后&…

算法学习记录:递归

递归算法的关键在于回复现场&#xff0c;dfs&#xff08;&#xff09;函数返回值、结束条件、它的作用。 目录 1.综合练习 2. 二叉树的深搜 1.综合练习 39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 关键在画出的决策树当中&#xff0c;前面使用过的2、3&#xff0c;…

可发1区的超级创新思路(python\matlab实现):MPTS+Lconv+注意力集成机制的Transformer时间序列模型

首先声明,该模型为原创!原创!原创!且该思路还未有成果发表,感兴趣的小伙伴可以借鉴! 应用场景 该模型主要用于时间序列数据预测问题,包含功率预测、电池寿命预测、电机故障检测等等。 一、模型整体架构(本文以光伏功率预测为例) 本模型由多尺度特征提取模块(MPTS)…