ZZZZZZ目的
ZZZZZZ代码
ZZZZZZ重点
ZZZZZZ操作(非代码,需要自己手动)
4- WITH OPTION CHECK子句 | THE WITH OPTION CHECK Clause_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1UE41147KC?p=66&vd_source=eaeec77dfceb13d96cce76cc299fdd08
- 将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_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1UE41147KC?p=67&vd_source=eaeec77dfceb13d96cce76cc299fdd08视图的优点总结
- 视图可以简化查询
- 对我们的表可以防止一层抽象层,减少原表改动造成的影响
个人觉得可以这样理解,假如说有一张表,然后根据这个表制作了一个视图,那么我们就可以后续都在这个视图上进行查询筛选。如果后续这个表有变动,我们不用对所有的查询筛选的代码进行修改,只用修改视图,保证视图和原来一样,就可以保证后续的查询筛选的代码不用修改。如果所有的查询筛选都是根据表来制作的,那么当表发生改变时,所有的查询筛选都要修改,会很麻烦
2- 创建一个存储过程 | Creating a Stored Procedure_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1UE41147KC?p=69&vd_source=eaeec77dfceb13d96cce76cc299fdd08
- 创建一个叫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信息 - 调用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_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1UE41147KC?p=70&vd_source=eaeec77dfceb13d96cce76cc299fdd08
- 如果觉得每次创建储存过程都需要更改默认符很麻烦,右击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_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1UE41147KC?p=71&vd_source=eaeec77dfceb13d96cce76cc299fdd08
- 删除名为get_clients的存储过程
DROP PROCEDURE get_clients - 如果我们再执行一次上面的代码,会发现MySQL报错,这是因为没有名为get_clients的存储,所以为了MySQL不报错,我们可以把代码改成
DROP PROCEDURE IF EXISTS get_clients - 一般我们在创建存储的时候,都是这样的(创建存储的基本框架)
DROP PROCEDURE IF EXISTS get_clients;
DELIMITER $$
CREATE PROCEDURE get_clients()
BEGIN
SELECT * FROM clients;
END $$
DELIMITER ;
5- 参数 | Parameters_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1UE41147KC?p=72&vd_source=eaeec77dfceb13d96cce76cc299fdd08
- 创建一个名为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