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

MySQL(B站CodeWithMosh)——2024.10.12(15)

ZZZZZZ目的
ZZZZZZ代码
ZZZZZZ重点
ZZZZZZ操作(非代码,需要自己手动)

4- WITH OPTION CHECK子句 | THE WITH OPTION CHECK Clause_哔哩哔哩_bilibiliicon-default.png?t=O83Ahttps://www.bilibili.com/video/BV1UE41147KC?p=66&vd_source=eaeec77dfceb13d96cce76cc299fdd08

  1. 将invoices_with_balance中id为2的发票更新成总支付等于总发票
    UPDATE invoices_with_balance
    SET payment_total = invoice_total
    WHERE invoice_id = 2
    可以发现,id为2的发票从invoices_with_balance这个表中消失了,因为这个表只将存在结余的发票展现出来,现在id为2的发票不存在结余了,所以也就不存在了
    假如我们现在不想让这一行消失,或者不希望UPDATE或者DELETE语句将行从视图中删除,那么需要在下面这一行代码的最后面加入WITH CHECK OPTION,这条子句会防止UPDATE或者DELETE语句将行从视图中删除
    CREATE OR REPLACE VIEW invoices_with_balance AS
    SELECT invoice_id, number, client_id, invoice_total, payment_total, 
           invoice_total - payment_total AS balance,
           invoice_date, due_date, payment_date
    FROM invoices
    WHERE (invoice_total - payment_total) > 0
    将invoices_with_balance中id为3的发票更新成总支付等于总发票
    UPDATE invoices_with_balance
    SET payment_total = invoice_total
    WHERE invoice_id = 3
    在我们运行时,会发现抱错,MySQL输出窗口显示检查视图失败

5- 视图的其他优点 | Other Benefits of Views_哔哩哔哩_bilibiliicon-default.png?t=O83Ahttps://www.bilibili.com/video/BV1UE41147KC?p=67&vd_source=eaeec77dfceb13d96cce76cc299fdd08视图的优点总结

  1. 视图可以简化查询
  2. 对我们的表可以防止一层抽象层,减少原表改动造成的影响
    个人觉得可以这样理解,假如说有一张表,然后根据这个表制作了一个视图,那么我们就可以后续都在这个视图上进行查询筛选。如果后续这个表有变动,我们不用对所有的查询筛选的代码进行修改,只用修改视图,保证视图和原来一样,就可以保证后续的查询筛选的代码不用修改。如果所有的查询筛选都是根据表来制作的,那么当表发生改变时,所有的查询筛选都要修改,会很麻烦

2- 创建一个存储过程 | Creating a Stored Procedure_哔哩哔哩_bilibiliicon-default.png?t=O83Ahttps://www.bilibili.com/video/BV1UE41147KC?p=69&vd_source=eaeec77dfceb13d96cce76cc299fdd08

  1. 创建一个叫get_clients的存储,内容是存储clients表格中的所有信息
    DELIMITER $$
    CREATE PROCEDURE get_clients()
    BEGIN
          SELECT * FROM clients;
    END $$
    DELIMITER ;
    SELECT * FROM clients后面需要加上分号,因为这已经是一条语句了;
    如果我们想执行下面这段代码,而不是只有SELECT * FROM clients,那么就需要用DELIMITER函数更改默认分隔符,修改完之后别忘记改回来
    CREATE PROCEDURE get_clients()
    BEGIN
          SELECT * FROM clients;
    END $$
    运行完之后,我们可以在左边SCHEMAS的sql_invoicing中找到Stored Procedures,里面就有get_clients这个存储,点击get_clients旁边的⚡,就可以得到所有的clients信息
  2. 调用get_clients
    CALL get_clients()

【练习题】
创建一个名为get_invoices_with_balance(有结余的发票),返回所有结余大于0的发票

 

DELIMITER $$
CREATE PROCEDURE get_invoices_with_balance()
BEGIN SELECT * FROM invoices_with_balance WHERE balance > 0;
END $$
DELIMITER ;

因为我们之前创建了invoices_with_balance,所以可以直接用这个

3- 使用MySQL工作台创建存储过程 | Creating Procedures Using MySQLWorkbench_哔哩哔哩_bilibiliicon-default.png?t=O83Ahttps://www.bilibili.com/video/BV1UE41147KC?p=70&vd_source=eaeec77dfceb13d96cce76cc299fdd08

  1. 如果觉得每次创建储存过程都需要更改默认符很麻烦,右击SCHEMAS中sql_invoicing中Store Procedures,再点击Create Stored Procedure,在这里窗口就不用但需需要更改默认分隔符了
    例如,创建一个名为get_payments的存储过程先按张上面的流程创建,然后将new_procedure改为get_payments,然后在BEGIN后换行输入SELECT * FROM payments;,然后点击Apply,可以看到MySQL自动帮我更改了默认符,然后再点击Apply,Finsh,就可以了

4- 删除存储过程 | Dropping Stored Procedures_哔哩哔哩_bilibiliicon-default.png?t=O83Ahttps://www.bilibili.com/video/BV1UE41147KC?p=71&vd_source=eaeec77dfceb13d96cce76cc299fdd08

  1. 删除名为get_clients的存储过程
    DROP PROCEDURE get_clients
  2. 如果我们再执行一次上面的代码,会发现MySQL报错,这是因为没有名为get_clients的存储,所以为了MySQL不报错,我们可以把代码改成

    DROP PROCEDURE IF EXISTS get_clients
  3. 一般我们在创建存储的时候,都是这样的(创建存储的基本框架)
    DROP PROCEDURE IF EXISTS get_clients;
    DELIMITER $$
    CREATE PROCEDURE get_clients()
    BEGIN
          SELECT * FROM clients;
    END $$
    DELIMITER ;

5- 参数 | Parameters_哔哩哔哩_bilibiliicon-default.png?t=O83Ahttps://www.bilibili.com/video/BV1UE41147KC?p=72&vd_source=eaeec77dfceb13d96cce76cc299fdd08

  1. 创建一个名为get_clients_by_state,按州来获取顾客信息
    DROP PROCEDURE IF EXISTS get_clients_by_state;
    DELIMITER $$
    CREATE PROCEDURE get_clients_by_state(state CHAR(2))
    BEGIN
        SELECT * FROM clients c
        WHERE c.state = state;
    END $$
    DELIMITER ;
    CHAR(2)表示有两个字符的字符串,比如CA、LA,当遇到电话号码、姓名和信息等,可以用VARCHAR,除非我们可以确定字符串的长度;
    如果有很多参数,那么就在state CHAR(2)后面用逗号分割;

    如果我们想找到住在CA的顾客,那么可以输入CALL get_clients_by_state('CA'),如果在括号中不填入任何值,MySQL会报错

【练习题】
创建一个名为get_invoices_by_client的存储过程,按照顾客的id来获取发票信息

USE sql_invoicing;
DROP PROCEDURE IF EXISTS get_invoices_by_clients;
DELIMITER $$
CREATE PROCEDURE get_invoices_by_clients(client_id INT)
BEGIN
    SELECT * FROM invoices i WHERE i.client_id = client_id;
END $$
DELIMITER ;

获取的是发票信息,所以是FROM invoices;
可以通过点击invoices表旁边的工具按钮,看Datatype这一列,就可以找到client_id的数据类型,可以确认为INT


http://www.kler.cn/news/355157.html

相关文章:

  • OPC Router快速打通设备层与influxDB数据通讯
  • 矢量网络分析仪工作原理
  • Docker system
  • 数学学习——积化和差、和差化积
  • 2025 -中医儿科学 -考研-执业
  • vue 导出文件空白 导出EXCEL打不开
  • CTFHUB技能树之SQL——UA注入
  • 数字图像处理:图像分割应用
  • 什么!我上传的文件不见了?
  • Vue3状态管理
  • 4K分页机制相关介绍
  • 【C语言】循环结构-for循环
  • c++数据结构算法复习基础-- 5 -- 线性表-双向链表/双向循环链表-常用操作接口-复杂度分析
  • k3s安装指定版本以及离线安装(docker)
  • 多签机制简明理解及实例说明
  • GitHub每日最火火火项目(10.18)
  • 前端原型链:探索 JavaScript 中的继承奥秘
  • 宝塔下如何应对检测到存在待处理的恶意文件提醒
  • Android 通过计算器暗码启动应用
  • TCP/IP 协议【四次挥手】简要说明