news 2026/5/1 4:56:29

关系型数据库大王Mysql——SQL编程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
关系型数据库大王Mysql——SQL编程

SQL编程

触发器

什么是触发器?

​ 当某个表的数据发生某件事(insert, delete, update), 然后自动触发预先编译好的若干条sql

触发器

1.特点:触发的操作和触发器的sql语句是一个事务操作,具备原子性,要么都执行,要么都不执行

2.作用:保证数据的完整性,起到约束的作用

示例1

mysql> create table emp_count( -> emp_count_id int primary key auto_increment, -> total int); Query OK, 0 rows affected (0.07 sec) mysql> show tables; +--------------------+ | Tables_in_dml_test | +--------------------+ | department | | emp_count | | employee | | user | +--------------------+ 4 rows in set (0.00 sec) mysql> insert into emp_count values(1,0); Query OK, 1 row affected (0.01 sec) mysql> select * from emp_count; +--------------+-------+ | emp_count_id | total | +--------------+-------+ | 1 | 0 | +--------------+-------+ 1 row in set (0.00 sec) mysql> update emp_count set total = 18 where total = 0; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from emp_count; +--------------+-------+ | emp_count_id | total | +--------------+-------+ | 1 | 18 | +--------------+-------+ 1 row in set (0.00 sec) #临时修改终止符,以免与触发器语句发生冲突 mysql> \d $ #delimiter $ mysql> create trigger emp_count_p after insert -> on employee for each row -> begin -> update emp_count set total = total + 1 where emp_count_id = 1; -> end -> $ Query OK, 0 rows affected (0.01 sec) mysql> show triggers\G *************************** 1. row *************************** Trigger: emp_count_p Event: INSERT Table: employee Statement: begin update emp_count set total = total + 1 where emp_count_id = 1; end Timing: AFTER Created: 2025-11-18 20:10:20.59 sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION Definer: root@% character_set_client: utf8mb4 collation_connection: utf8mb4_0900_ai_ci Database Collation: utf8mb4_0900_ai_ci 1 row in set (0.01 sec) mysql> insert into employee(number,name) values("23123213132",'来俊希')$ Query OK, 1 row affected (0.01 sec) mysql> select * from emp_count$ +--------------+-------+ | emp_count_id | total | +--------------+-------+ | 1 | 19 | +--------------+-------+ 1 row in set (0.00 sec)

示例2

mysql> create table bank( -> b_id int primary key auto_increment, -> value int)$ Query OK, 0 rows affected (0.03 sec) mysql> create table u( -> u_id int primary key auto_increment, -> value int)$ Query OK, 0 rows affected (0.04 sec) #创建触发器 mysql> create trigger u_bank_t after insert -> on u for each row -> begin -> update bank set value = value + 500 where b_id = 1; -> end -> $ Query OK, 0 rows affected (0.02 sec) #查看创建的触发器 mysql> show triggers\G *************************** 1. row *************************** Trigger: emp_count_p Event: INSERT Table: employee Statement: begin update emp_count set total = total + 1 where emp_count_id = 1; end Timing: AFTER Created: 2025-11-18 20:10:20.59 sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION Definer: root@% character_set_client: utf8mb4 collation_connection: utf8mb4_0900_ai_ci Database Collation: utf8mb4_0900_ai_ci *************************** 2. row *************************** Trigger: u_bank_t Event: INSERT Table: u Statement: begin update bank set value = value + 500 where b_id = 1; end Timing: AFTER Created: 2025-11-18 20:24:50.28 sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION Definer: root@% character_set_client: utf8mb4 collation_connection: utf8mb4_0900_ai_ci Database Collation: utf8mb4_0900_ai_ci 2 rows in set (0.00 sec) mysql> insert into bank(b_id,value) values(1,0); Query OK, 1 row affected (0.01 sec) mysql> select * from bank; +------+-------+ | b_id | value | +------+-------+ | 1 | 0 | +------+-------+ 1 row in set (0.00 sec) mysql> insert into u(u_id,value) values(1,500); Query OK, 1 row affected (0.01 sec) mysql> select * from bank; +------+-------+ | b_id | value | +------+-------+ | 1 | 500 | +------+-------+ 1 row in set (0.00 sec) mysql> select * from u; +------+-------+ | u_id | value | +------+-------+ | 1 | 500 | +------+-------+ 1 row in set (0.00 sec) mysql> select value from u where u_id = 1; +-------+ | value | +-------+ | 500 | +-------+ 1 row in set (0.00 sec) mysql> select value from u group by u_id having max(value); +-------+ | value | +-------+ | 500 | +-------+ 1 row in set (0.00 sec) mysql> insert into bank(value) select value from u group by u_id having max(value); Query OK, 1 row affected (0.02 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> select * from bank; +------+-------+ | b_id | value | +------+-------+ | 1 | 500 | | 2 | 500 | +------+-------+ 2 rows in set (0.00 sec)

存储过程

什么是存储过程

事先经过编译并存储在数据库中的一段sql语句集合

示例1

mysql> create procedure emp_count() -> begin -> select count(emp_count_id) from emp_count; -> end -> $ Query OK, 0 rows affected (0.01 sec) #查看创建的存储过程 mysql> show create procedure emp_count\G$ *************************** 1. row *************************** Procedure: emp_count sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION Create Procedure: CREATE DEFINER=`root`@`%` PROCEDURE `emp_count`() begin select count(emp_count_id) from emp_count; end character_set_client: utf8mb4 collation_connection: utf8mb4_0900_ai_ci Database Collation: utf8mb4_0900_ai_ci 1 row in set (0.00 sec) #调用存储过程 mysql> call emp_count(); -> $ +---------------------+ | count(emp_count_id) | +---------------------+ | 1 | +---------------------+ 1 row in set (0.00 sec)

示例2

mysql> create table t1( -> id int primary key auto_increment, -> password varchar(255)); -> $ Query OK, 0 rows affected (0.03 sec) mysql> create procedure insert_many_date(in total_row) -> begin -> declare i int default 1; -> while (i < rows) do -> insert into t1 values(i,md5(i)); -> set i = i + 1; -> end while; -> end -> $ mysql> create procedure user_password(in pwd varchar(255)) -> begin -> select * from user where password = pwd; -> end$ Query OK, 0 rows affected (0.01 sec) mysql> call user_password("111")$ Empty set (0.01 sec)

示例3

mysql> select * from user; -> $ +---------+----------+----------+------+------------+ | user_id | username | password | name | hire_date | +---------+----------+----------+------+------------+ | 1 | ljx | ljxbbfjw | cj | 2006-06-06 | | 2 | ljx | ljxbbfjw | cj | 2006-06-06 | | 3 | lisi | 123 | ls | 2007-07-07 | | 4 | wangwu | 123 | ww | 2008-08-08 | | 5 | cj | 123 | cj | 2009-09-09 | +---------+----------+----------+------+------------+ 5 rows in set (0.00 sec) mysql> create procedure user_password(in pwd varchar(255)) -> begin -> select * from user where password = pwd; -> end$ Query OK, 0 rows affected (0.01 sec) mysql> call user_password("123")$ +---------+----------+----------+------+------------+ | user_id | username | password | name | hire_date | +---------+----------+----------+------+------------+ | 3 | lisi | 123 | ls | 2007-07-07 | | 4 | wangwu | 123 | ww | 2008-08-08 | | 5 | cj | 123 | cj | 2009-09-09 | +---------+----------+----------+------+------------+ 3 rows in set (0.00 sec) Query OK, 0 rows affected (0.00 sec)

示例4

mysql> select @a; -> $ +------------+ | @a | +------------+ | NULL | +------------+ 1 row in set (0.00 sec) mysql> set @a = 1; -> $ Query OK, 0 rows affected (0.01 sec) mysql> select @a; -> $ +------+ | @a | +------+ | 1 | +------+ 1 row in set (0.00 sec) mysql> \d $ mysql> create procedure user_count_a(out number int) -> begin -> select count(1) into number from user; -> end$ Query OK, 0 rows affected (0.01 sec) mysql> show create procedure user_count_a\G$ *************************** 1. row *************************** Procedure: user_count_a sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION Create Procedure: CREATE DEFINER=`root`@`%` PROCEDURE `user_count_a`(out number int) begin select count(1) into number from user; end character_set_client: utf8mb4 collation_connection: utf8mb4_0900_ai_ci Database Collation: utf8mb4_0900_ai_ci 1 row in set (0.00 sec) mysql> call user_count_a(@a); -> $ Query OK, 1 row affected (0.01 sec) mysql> select @a -> $ +------+ | @a | +------+ | 5 | +------+ 1 row in set (0.00 sec) mysql> \d ; mysql> select count(1) from user; +----------+ | count(1) | +----------+ | 5 | +----------+ 1 row in set (0.00 sec)

示例5

mysql> \d $ mysql> create procedure count_emp_name(in dep_name varchar(255),out count_emp int) -> begin -> select count(*) into count_emp from employee where department_NO = (select number from department where name = dep_name); -> end$ Query OK, 0 rows affected (0.02 sec) mysql> \d ; mysql> show create procedure count_emp_name\G; *************************** 1. row *************************** Procedure: count_emp_name sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION Create Procedure: CREATE DEFINER=`root`@`%` PROCEDURE `count_emp_name`(in dep_name varchar(255),out count_emp int) begin select count(*) into count_emp from employee where department_NO = (select number from department where name = dep_name); end character_set_client: utf8mb4 collation_connection: utf8mb4_0900_ai_ci Database Collation: utf8mb4_0900_ai_ci 1 row in set (0.00 sec) mysql> call count_emp_name("上海中心",@a); Query OK, 1 row affected (0.00 sec) mysql> select @a -> ; +------+ | @a | +------+ | 2 | +------+ 1 row in set (0.00 sec) mysql> select count(*) from employee where department_NO = (select number from department where name = "上海中心"); +----------+ | count(*) | +----------+ | 2 | +----------+ 1 row in set (0.00 sec)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 16:21:00

基于Java的幼儿园教师备课智慧管理系统的设计与实现全方位解析:附毕设论文+源代码

1. 为什么这个毕设项目值得你 pick ? 幼儿园教师备课智慧管理系统主要功能模块包括系统会员管理、幼儿园管理、班级管理等&#xff0c;通过SpringMVC开发框架和MySQL数据库实现。此项目专注于解决传统选题普遍存在的问题&#xff1a;过于泛化缺乏创新性与实用性。本系统的特色…

作者头像 李华
网站建设 2026/4/16 1:06:42

人工智能应用-机器听觉:12.说话人向量

展示了一组说话人向量的可视化&#xff0c;每个点代表一个语音片段的向量&#xff0c;不同颜色表示不同的发音人。同一说话人的向量会在空间中聚集&#xff0c;不同说话人的向量则相互分离&#xff0c;说明说话人向量具有良好的区分度。这与人脸识别中的“人脸嵌入”类似&#…

作者头像 李华
网站建设 2026/4/21 22:03:51

机器学习之词向量转换

目录 简介 一、词向量转换相关概念 二、算法应用 三、案例分析 1.数据集 2.整体功能概述 3.代码分步详解 简介 jieba库、朴素贝叶斯算法和TF-IDF值是自然语言处理&#xff08;NLP&#xff09;中常用的工具和技术&#xff0c;各自在文本处理的不同阶段发挥作用。 在自然…

作者头像 李华
网站建设 2026/4/23 11:37:38

**AI漫剧软件2025推荐,解锁个性化互动叙事新体验**

AI漫剧软件2025推荐&#xff0c;解锁个性化互动叙事新体验在2025年&#xff0c;AI漫剧软件市场正经历一场深刻的变革。据《2025中国AI内容生成行业白皮书》数据显示&#xff0c;2025年国内AI漫剧制作工具的用户规模预计突破1500万&#xff0c;但其中能够实现“从文字到高质量视…

作者头像 李华
网站建设 2026/4/25 13:18:30

期货入门介绍

文章目录0.前言1.简介2.由来3.种类4.核心要素5.核心功能6.主要参与者7.期货交易的基础机制8.期货与期权的区别9.小结参考文献0.前言 期货市场如同一座精密运转的时间机器——它允许人们在今天锁定未来的价格。 无论你是对金融市场充满好奇的新手&#xff0c;还是希望扩展投资…

作者头像 李华
网站建设 2026/4/23 15:59:31

零基础理解Cortex-M3的HardFault异常响应机制

以下是对您提供的博文《零基础理解Cortex-M3的HardFault异常响应机制》进行 深度润色与专业重构后的终稿 。本次优化严格遵循您的全部要求: ✅ 彻底消除AI生成痕迹,语言自然、老练、有“人味”——像一位在产线摸爬滚打十年的嵌入式老兵,在调试台前边烧板子边给你讲原理;…

作者头像 李华