MySQL操作命令详解:增删改查

文章目录

  • 一、CRUD
    • [1.1 数据库操作](#1.1 数据库操作)
    • [1.2 表操作](#1.2 表操作)
      • [1.2.1 五大约束](#1.2.1 五大约束)
      • [1.2.2 创建表](#1.2.2 创建表)
      • [1.2.3 修改表](#1.2.3 修改表)
      • [1.2.3 删除表](#1.2.3 删除表)
      • [1.2.4 表数据的增删改查](#1.2.4 表数据的增删改查)
      • [1.2.5 去重方式](#1.2.5 去重方式)
  • 二、高级查询
    • [2.1 基础查询](#2.1 基础查询)
    • [2.2 条件查询](#2.2 条件查询)
    • [2.3 范围查询](#2.3 范围查询)
    • [2.4 判空查询](#2.4 判空查询)
    • [2.5 模糊查询](#2.5 模糊查询)
    • [2.6 分页查询](#2.6 分页查询)
    • [2.7 查询后排序](#2.7 查询后排序)
    • [2.8 聚合查询](#2.8 聚合查询)
    • [2.9 分组查询](#2.9 分组查询)
    • [2.10 联表查询](#2.10 联表查询)
    • [2.11 子查询/合并查询](#2.11 子查询/合并查询)
  • 三、视图
  • 四、触发器
    • [4.1 要素](#4.1 要素)
    • [4.2 语法](#4.2 语法)
    • [4.3 例子](#4.3 例子)
  • 五、权限管理
    • [5.1 创建用户](#5.1 创建用户)
    • [5.2 授权](#5.2 授权)

一、CRUD

CRUD操作是指对数据库进行创建(Create)、读取(Read)、更新(Update)和删除(Delete)等操作的过程。

1.1 数据库操作

创建、选择、删除数据库

sql 复制代码
# 创建
CREATE DATABASE database_name DEFAULT CHARACTER SET utf8;
# 选择
USE database_name;
# 查看数据库
SHOW database_name;
# 删除
DROP DATABASE database_name;

1.2 表操作

1.2.1 五大约束

1)非空约束(Not Null)

非空约束用于限制列中的值不能为空。这样可以确保表中的特定列不包含空值。

2)自增约束(auto_increment)

可以指定初始值,没有指定默认是0;插入节点的时候会自增。

3)唯一约束(Unique)

唯一约束用于确保表中的某个列或一组列的取值是唯一的,但可以包含空值。一个表可以有多个唯一约束。

4)主键约束(Primary Key ):

主键约束用于标识表中的唯一记录。一个表只能有一个主键,主键列不能包含重复值或空值。

5)外键约束(Foreign Key )

外键约束用于维护表之间的关联关系。它定义了一个或多个列与另一个表的主键或唯一键之间的关系。外键约束可以防止无效引用和维护数据的完整性。

1.2.2 创建表

sql 复制代码
# 创建表
CREATE TABLE table_name (column_name column_type);
# 显示表的创建过程
SHOW CREATE TABLE table_name ;
# 获取指定表的结构信息
DESC table_name ;

例子

sql 复制代码
CREATE TABLE IF NOT EXISTS `schedule` (
	`id` INT AUTO_INCREMENT COMMENT '编号',
	`course` VARCHAR(100) NOT NULL COMMENT '课程',
	`teacher` VARCHAR(40) NOT NULL COMMENT '讲师',
	PRIMARY KEY (`id`)
) ENGINE=innoDB DEFAULT CHARSET=utf8 COMMENT = '课程表';

SELECT * FROM `schedule`;

NOT NULL表示输入字段不能为NULL,ENGINE指定引擎,DEFAULT CHARSET指定默认编码方式

1.2.3 修改表

sql 复制代码
# ALTER 修改表
# 添加列:table_name是要修改的表名,column_name是要添加的列名,datatype是列的数据类型
ALTER TABLE table_name ADD column_name datatype;
# 修改列
ALTER TABLE table_name MODIFY column_name datatype;
# 删除列
ALTER TABLE table_name DROP column_name;

例子

sql 复制代码
ALTER TABLE `schedule` ADD `begin_time` DATE DEFAULT '2022-10-24';
# 用于修改表schedule中的列begin_time的数据类型为DATE,并通过AFTER指定其放置在列id之后。
ALTER TABLE `schedule` MODIFY `begin_time` DATE AFTER `id`;  
ALTER TABLE `schedule` DROP `begin_time`;

1.2.3 删除表

sql 复制代码
# 删除表
DROP TABLE table_name ;
# 截断表
TRUNCATE TABLE table_name;
# 清空表
DELETE FROM table_name;

1.2.4 表数据的增删改查

sql 复制代码
# 插入数据
INSERT INTO table_name ( field1, field2,...fieldN )
                       VALUES
                       ( value1, value2,...valueN );
# 删除数据
DELETE FROM table_name [WHERE condition];

# 修改数据
UPDATE tableName SET field=new_value [WHERE condition]

# 查询数据
SELECT field... FROM table_name [WHERE condition]

1.2.5 去重方式

1)GROUP BY

GROUP BY 是一个在 SQL 查询中使用的子句,用于将结果集按照一个或多个列进行分组,并对每个分组执行聚合函数计算。

sql 复制代码
SELECT 列1, 列2, ... 
FROM 表名
WHERE 条件
GROUP BY 列1, 列2, ...

例子,假设有一张名为 orders 的表,包含以下几个列:order_id, customer_id, product_id, 和 order_amount。我们想要按照 customer_id 进行分组,并计算每个客户的订单总金额。可以使用 GROUP BY 来实现这个目标:

sql 复制代码
SELECT customer_id, SUM(order_amount) as total_amount
FROM orders
GROUP BY customer_id

查询结果将按照 customer_id 进行分组,并计算每个客户的订单总金额。SUM() 函数用于求和 order_amount 列的值。示例输出:

sql 复制代码
+-------------+--------------+
| customer_id | total_amount |
+-------------+--------------+
|     1       |    1500      |
|     2       |    2500      |
|     3       |    1800      |
+-------------+--------------+

2)SELECT DISTINCT

SELECT DISTINCT 语句用于检索指定列中的唯一值,即去除重复的值。它返回列中不同的值,每个值只出现一次。

sql 复制代码
SELECT DISTINCT 列
FROM 表名;

例如,假设有一张名为 employees 的表,包含以下几个列:employee_id, first_name, last_name, 和 department。我们希望获取所有不同的部门名称。可以使用 SELECT DISTINCT 来实现这个目标:

sql 复制代码
SELECT DISTINCT department
FROM employees;

查询结果将返回 employees 表中去重后的部门名称。示例输出:

sql 复制代码
+---------------+
|  department   |
+---------------+
|   Sales       |
|   Marketing   |
|   HR          |
|   Finance     |
+---------------+

二、高级查询

结合实例,介绍高级查询

sql 复制代码
SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for class
-- ----------------------------
DROP TABLE IF EXISTS `class`;
CREATE TABLE `class` (
  `cid` int(11) NOT NULL AUTO_INCREMENT,
  `caption` varchar(32) NOT NULL,
  PRIMARY KEY (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of class
-- ----------------------------
INSERT INTO `class` VALUES ('1', '1908班');
INSERT INTO `class` VALUES ('2', '2004班');
INSERT INTO `class` VALUES ('3', '2101班');
INSERT INTO `class` VALUES ('4', '2109班');

-- ----------------------------
-- Table structure for course
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
  `cid` int(11) NOT NULL AUTO_INCREMENT,
  `cname` varchar(32) NOT NULL,
  `teacher_id` int(11) NOT NULL,
  PRIMARY KEY (`cid`),
  KEY `fk_course_teacher` (`teacher_id`),
  CONSTRAINT `fk_course_teacher` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES ('1', '数学', '1');
INSERT INTO `course` VALUES ('2', '语文', '2');
INSERT INTO `course` VALUES ('3', '英语', '4');
INSERT INTO `course` VALUES ('4', '理综', '2');
INSERT INTO `course` VALUES ('5', '文综', '1');

-- ----------------------------
-- Table structure for score
-- ----------------------------
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (
  `sid` int(11) NOT NULL AUTO_INCREMENT,
  `student_id` int(11) NOT NULL,
  `course_id` int(11) NOT NULL,
  `num` int(11) NOT NULL,
  PRIMARY KEY (`sid`),
  KEY `fk_score_student` (`student_id`),
  KEY `fk_score_course` (`course_id`),
  CONSTRAINT `fk_score_course` FOREIGN KEY (`course_id`) REFERENCES `course` (`cid`),
  CONSTRAINT `fk_score_student` FOREIGN KEY (`student_id`) REFERENCES `student` (`sid`)
) ENGINE=InnoDB AUTO_INCREMENT=58 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of score
-- ----------------------------
INSERT INTO `score` VALUES ('1', '1', '1', '10');
INSERT INTO `score` VALUES ('2', '1', '2', '59');
INSERT INTO `score` VALUES ('3', '4', '5', '100');
INSERT INTO `score` VALUES ('4', '5', '4', '67');
INSERT INTO `score` VALUES ('5', '2', '2', '66');
INSERT INTO `score` VALUES ('6', '2', '1', '58');
INSERT INTO `score` VALUES ('8', '2', '3', '68');
INSERT INTO `score` VALUES ('9', '2', '4', '99');
INSERT INTO `score` VALUES ('10', '3', '1', '77');
INSERT INTO `score` VALUES ('11', '3', '2', '66');
INSERT INTO `score` VALUES ('12', '3', '3', '87');
INSERT INTO `score` VALUES ('13', '3', '4', '99');
INSERT INTO `score` VALUES ('14', '4', '1', '79');
INSERT INTO `score` VALUES ('15', '4', '2', '11');
INSERT INTO `score` VALUES ('16', '4', '3', '67');
INSERT INTO `score` VALUES ('17', '4', '4', '100');
INSERT INTO `score` VALUES ('18', '5', '1', '79');
INSERT INTO `score` VALUES ('19', '5', '2', '11');
INSERT INTO `score` VALUES ('20', '5', '3', '67');
INSERT INTO `score` VALUES ('21', '5', '5', '100');
INSERT INTO `score` VALUES ('22', '6', '1', '9');
INSERT INTO `score` VALUES ('23', '6', '2', '100');
INSERT INTO `score` VALUES ('24', '6', '3', '67');
INSERT INTO `score` VALUES ('25', '6', '4', '100');
INSERT INTO `score` VALUES ('26', '7', '1', '9');
INSERT INTO `score` VALUES ('27', '7', '2', '100');
INSERT INTO `score` VALUES ('28', '7', '3', '67');
INSERT INTO `score` VALUES ('29', '7', '4', '88');
INSERT INTO `score` VALUES ('30', '8', '1', '49');
INSERT INTO `score` VALUES ('31', '8', '2', '100');
INSERT INTO `score` VALUES ('32', '8', '3', '67');
INSERT INTO `score` VALUES ('33', '8', '4', '88');
INSERT INTO `score` VALUES ('34', '9', '1', '91');
INSERT INTO `score` VALUES ('35', '9', '2', '88');
INSERT INTO `score` VALUES ('36', '9', '5', '67');
INSERT INTO `score` VALUES ('37', '9', '4', '22');
INSERT INTO `score` VALUES ('38', '10', '1', '90');
INSERT INTO `score` VALUES ('39', '10', '2', '77');
INSERT INTO `score` VALUES ('40', '10', '3', '43');
INSERT INTO `score` VALUES ('41', '10', '4', '87');
INSERT INTO `score` VALUES ('42', '11', '1', '90');
INSERT INTO `score` VALUES ('43', '11', '2', '77');
INSERT INTO `score` VALUES ('44', '11', '5', '43');
INSERT INTO `score` VALUES ('45', '11', '4', '87');
INSERT INTO `score` VALUES ('46', '12', '1', '90');
INSERT INTO `score` VALUES ('47', '12', '2', '77');
INSERT INTO `score` VALUES ('48', '12', '3', '43');
INSERT INTO `score` VALUES ('49', '12', '5', '87');
INSERT INTO `score` VALUES ('50', '13', '3', '87');
INSERT INTO `score` VALUES ('51', '14', '2', '33');
INSERT INTO `score` VALUES ('52', '15', '3', '22');
INSERT INTO `score` VALUES ('53', '15', '5', '11');
INSERT INTO `score` VALUES ('54', '13', '1', '99');
INSERT INTO `score` VALUES ('55', '13', '2', '99');
INSERT INTO `score` VALUES ('56', '13', '4', '67');
INSERT INTO `score` VALUES ('57', '13', '5', '87');

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `sid` int(11) NOT NULL AUTO_INCREMENT,
  `gender` char(1) NOT NULL,
  `class_id` int(11) NOT NULL,
  `sname` varchar(32) NOT NULL,
  PRIMARY KEY (`sid`),
  KEY `fk_class` (`class_id`),
  CONSTRAINT `fk_class` FOREIGN KEY (`class_id`) REFERENCES `class` (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('1', '男', '1', '罗谊');
INSERT INTO `student` VALUES ('2', '女', '1', '戴巧');
INSERT INTO `student` VALUES ('3', '男', '1', '叶黎');
INSERT INTO `student` VALUES ('4', '男', '3', '邵柴');
INSERT INTO `student` VALUES ('5', '女', '1', '韩琪');
INSERT INTO `student` VALUES ('6', '男', '3', '尹伸');
INSERT INTO `student` VALUES ('7', '女', '2', '孙燕');
INSERT INTO `student` VALUES ('8', '男', '2', '廖宽');
INSERT INTO `student` VALUES ('9', '男', '2', '孙行');
INSERT INTO `student` VALUES ('10', '女', '2', '宋贤');
INSERT INTO `student` VALUES ('11', '男', '2', '谭国兴');
INSERT INTO `student` VALUES ('12', '女', '3', '于怡瑶');
INSERT INTO `student` VALUES ('13', '男', '4', '文乐逸');
INSERT INTO `student` VALUES ('14', '男', '4', '邹乐和');
INSERT INTO `student` VALUES ('15', '女', '5', '邓洋洋');
INSERT INTO `student` VALUES ('16', '男', '5', '秦永福');

-- ----------------------------
-- Table structure for teacher
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher` (
  `tid` int(11) NOT NULL AUTO_INCREMENT,
  `tname` varchar(32) NOT NULL,
  PRIMARY KEY (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of teacher
-- ----------------------------
INSERT INTO `teacher` VALUES ('1', '王天一老师');
INSERT INTO `teacher` VALUES ('2', '谢小二老师');
INSERT INTO `teacher` VALUES ('3', '廖阿三老师');
INSERT INTO `teacher` VALUES ('4', '吴启四老师');
INSERT INTO `teacher` VALUES ('5', '谢飞五老师');

2.1 基础查询

sql 复制代码
-- 全部查询
SELECT * FROM student;
-- 只查询部分字段
SELECT `sname`, `class_id` FROM student;
-- 别名 列明 不要用关键字
SELECT `sname` AS '姓名' , `class_id` AS '班级ID'
FROM student;
-- 把查询出来的结果的重复记录去掉
SELECT distinct `class_id` FROM student;

2.2 条件查询

sql 复制代码
-- 查询姓名为 邓洋洋 的学生信息
SELECT * FROM `student` WHERE `name` = '邓洋洋';
-- 查询性别为 男,并且班级为 2 的学生信息
SELECT * FROM `student` WHERE `gender`="男" AND `class_id`=2;

2.3 范围查询

sql 复制代码
-- 查询班级id 1 到 3 的学生的信息
SELECT * FROM `student` WHERE `class_id` BETWEEN 1 AND 3;

2.4 判空查询

sql 复制代码
SELECT * FROM `student` WHERE `class_id` IS NOT NULL; #判断不为空
SELECT * FROM `student` WHERE `class_id` IS NULL; #判断为空
SELECT * FROM `student` WHERE `gender` <> ''; #判断不为空字符串
SELECT * FROM `student` WHERE `gender` = ''; #判断为空字符串

2.5 模糊查询

使用 LIKE 关键字,"%"代表任意数量的字符,"_"代表占位符

sql 复制代码
-- 查询名字为 m 开头的学生的信息
SELECT * FROM `teacher` WHERE `tname` LIKE '谢%';
-- 查询姓名里第二个字为 小 的学生的信息
SELECT * FROM `teacher` WHERE `tname` LIKE '_小%';

2.6 分页查询

分页查询主要用于查看第N条 到 第M条的信息,通常和排序查询一起使用

使用LIMIT 关键字,第一个参数表示从条记录开始显示,第二个参数表示要显示的数目。表中默认第一条记录的参数为0。

sql 复制代码
-- 查询第二条到第三条内容
SELECT * FROM `student` LIMIT 1,2;

2.7 查询后排序

ORDER BY field

sql 复制代码
# ASC:升序, DESC:降序
SELECT * FROM `score` ORDER BY `num` ASC;
-- 按照多个字段排序
SELECT * FROM `score` ORDER BY `course_id` DESC,`num` DESC;

2.8 聚合查询

聚合函数 描述
sum() 计算某列的总和
avg() 计算某列的平均值
max() 计算某列的最大值
min() 计算某列的最小值
count() 计算某列的行数
sql 复制代码
SELECT sum(`num`) FROM `score`;
SELECT avg(`num`) FROM `score`;
SELECT max(`num`) FROM `score`;
SELECT min(`num`) FROM `score`;
SELECT count(`num`) FROM `score`;

2.9 分组查询

sql 复制代码
-- 可以把查询出来的结果根据某个条件来分组显示
SELECT `gender` FROM `student` GROUP BY `gender`;
-- 分组加group_concat
SELECT `gender`, group_concat(`sname`) as name FROM `student` GROUP BY `gender`;
-- 分组加聚合
SELECT `gender`, count(*) as num FROM `student` GROUP BY `gender`;
-- 分组加条件
SELECT `gender`, count(*) as num FROM `student` GROUP BY `gender` HAVING num > 6;

2.10 联表查询


2.10.1 INNER JOIN

只取两张表有对应关系的记录

sql 复制代码
SELECT
cid
FROM
`course`
INNER JOIN `teacher` ON course.teacher_id =
teacher.tid;

2.10.2 LEFT JOIN

在内连接的基础上保留左表没有对应关系的记录

sql 复制代码
SELECT
course.cid
FROM
`course`
LEFT JOIN `teacher` ON course.teacher_id = teacher.tid;

2.10.3 RIGHT JOIN

在内连接的基础上保留右表没有对应关系的记录

sql 复制代码
SELECT
course.cid
FROM
`course`
RIGHT JOIN `teacher` ON course.teacher_id =
teacher.tid;

2.11 子查询/合并查询

2.11.1 单行子查询

sql 复制代码
SELECT * from course WHERE teacher_id = (SELECT tid FROM teacher WHERE tname = '谢小二老师')

2.11.2 多行子查询

多行子查询即返回多行记录的子查询.

IN 关键字:运算符可以检测结果集中是否存在某个特定的值,如果检测成功就执行外部的查询。

EXISTS 关键字:内层查询语句不返回查询的记录。而是返回一个真假值。如果内层查询语句查询到满足条件的记录,就返回一个真值( true ),否则,将返回一个假值( false )。当返回的值为 true 时,外层查询语句将进行查询;当返回的为false时,外层查询语句不进行查询或者查询不出任何记录。

ALL 关键字:表示满足所有条件。使用 ALL 关键字时,只有满足内层查询语句返回的所有结果,才可以执行外层查询语句。

ANY 关键字:允许创建一个表达式,对子查询的返回值列表,进行比较,只要满足内层子查询中的,任意一个比较条件,就返回一个结果作为外层查询条件。

在 FROM 子句中使用子查询:子查询出现在 from 子句中,这种情况下将子查询当做一个临时表使用。

sql 复制代码
select * from student where class_id in (select cid from course where teacher_id = 2);

select * from student where exists(select cid from course where cid = 5);

select student_id,sname 
FROM (SELECT * FROM score WHERE course_id = 5 OR course_id = 2) AS A 
LEFT JOIN student ON A.student_id = student.sid;

三、视图

视图 view 不是表,是一种虚表,没有实体,并不实际存储数据,其内容由查询 select 定义。用来创建视图的表称为基表,通过视图,可以展现基表的部分数据。

视图的优点:

1)简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。

2)安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。

3)数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。

sql 复制代码
CREATE VIEW 视图名 AS SELECT 语句

例如,查询 '数学' 课程比 '语文' 课程成绩高的所有学生的学号

sql 复制代码
CREATE VIEW view_test1 AS SELECT A.student_id FROM 
(
	(SELECT student_id,num FROM score 
	 WHERE course_id = (SELECT cid FROM course WHERE cname = '数学') 
	) AS A
	INNER JOIN
	(SELECT student_id,num FROM score
	 WHERE course_id = (SELECT cid FROM course WHERE cname = '语文') 
	) AS B
	ON A.student_id = B.student_id
)
WHERE A.num > B.num;	

SELECT * FROM view_test1;

作用:

1)权限管理。可以隐藏表结构;视图的表结构可以开放给用户,但不会开放基表的表结构。即某些表对用户屏蔽,但是可以给该用户通过视图来对该表操作。

2)可复用。减少重复语句书写;类似程序中函数的作用。

3)节约资源。一些列表的关联查询构成的数据包比较大,而使用 select ... from view构成的数据包就小多了。

4)重构利器。假如因为某种需求,需要将 user 拆成表 usera 和表 userb;如果应用程序使用 sql 语句:select * from user那就会提示该表不存在;若此时创建视图

sql 复制代码
create view user as select a.name,a.age,b.sex 
from usera as a, userb as b
where a.name=b.name; 

则只需要更改数据库结构,而不需要更改应用程序。

5)逻辑更清晰,屏蔽查询细节,关注数据返回。

四、触发器

触发器(trigger)是一种对表执行某操作后会触发执行其他命令的机制。

4.1 要素

监视对象:table

监视事件:insert、update、delete

触发时间:before ,after

触发事件:insert、update、delete

4.2 语法

sql 复制代码
-- 创建触发器
CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW
BEGIN
	trigger_body
END

-- trigger_time: { BEFORE | AFTER }
-- trigger_event: { INSERT | UPDATE | DELETE }
-- trigger_order: { FOLLOWS | PRECEDES }
-- trigger_body:tbl_name表更新前(OLD, 列名),表更新后(NEW, 列名)

-- 确认触发器
SHOW TRIGGERS

-- 删除触发器
SHOW TRIGGER trigger_name

4.3 例子

DELIMITER 是在 MySQL 数据库中使用的一个关键字,用于指定 SQL 语句的分隔符。它的作用是告诉 MySQL 解析器在遇到指定的分隔符时,将整个语句作为一个整体进行处理,而不会将其中的分号视为语句的结束。通常指定 $$ 或 ||

准备

sql 复制代码
-- 创建触发器
CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW
BEGIN
	trigger_body
END

-- trigger_time: { BEFORE | AFTER }
-- trigger_event: { INSERT | UPDATE | DELETE }
-- trigger_order: { FOLLOWS | PRECEDES }
-- trigger_body:tbl_name表更新前(OLD, 列名),表更新后(NEW, 列名)

-- 确认触发器
SHOW TRIGGERS

-- 删除触发器
SHOW TRIGGER trigger_name
sql 复制代码
DROP TABLE IF EXISTS `goods`;
DROP TABLE IF EXISTS `order`;

CREATE TABLE `goods` (
 `gid` INT PRIMARY KEY auto_increment,
 `name` VARCHAR (32),
 `num` SMALLINT DEFAULT 0
);

CREATE TABLE `order` (
 `id` INT PRIMARY KEY auto_increment,
 `gid` INT,
 `quantity` SMALLINT COMMENT '下单数量'
);

DROP TRIGGER if EXISTS `trig_order_1`;
DROP TRIGGER if EXISTS `trig_order_2`;

需求1:客户新建订单购买的数量,商品表的库存数量自动改变

sql 复制代码
delimiter // 
CREATE TRIGGER `trig_order_1` AFTER INSERT ON `order` FOR EACH ROW
BEGIN
	UPDATE goods SET num = num - new.quantity WHERE gid = new.gid;
END //
delimiter ; 

-- 测试1:新建订单
INSERT INTO `order` VALUES (NULL, 1, 2);
INSERT INTO `order` VALUES (NULL, 2, 2);
INSERT INTO `order` VALUES (NULL, 3, 2);

SELECT * FROM `order`;

需求2:客户修改订单购买的数量,商品表的库存数量自动改变

sql 复制代码
delimiter // EACH ROW
BEGIN
	UPDATE goods SET num = num + old.quantity - new.quantity WHERE gid = new.gid;
END //
delimiter ; 
INSERT INTO `goods` VALUES (NULL, 'cat', 10);
INSERT INTO `goods` VALUES (NULL, 'dog', 10);
INSERT INTO `goods` VALUES (NULL, 'pig', 10);

-- 测试2:修改订单
UPDATE `order` SET quantity = quantity + 2 WHERE gid = 1;

SELECT * FROM `goods`;

五、权限管理

5.1 创建用户

sql 复制代码
CREATE USER username@host IDENTIFIED BY password; 

host 指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost ,如果想让该用户可以从任意远程主机登陆,可以使用通配符 % ;

5.2 授权

5.2.1 对表授权

sql 复制代码
GRANT privileges ON database_name.table_name TO 'username'@'host' WITH GRANT OPTION;

privileges :用户的操作权限,如 SELECT INSERTUPDATE 等,如果要授予所的权限则使用ALL

databasename.tablename 如果是.表示任意数据库以及任意表;

WITH GRANT OPTION 这个选项表示该用户可以将自己拥有的权限授权给别人。注意:经常有人在创建操作用户的时候不指定WITH GRANT OPTION 选项导致后来该用户不能使用 GRANT 命令创建用户或者给其它用户授权。

如果不想这个用户有这个 grant 的权限,则不要加该 WITHGRANT OPTION 选项;

5.2.2 对视图授权

sql 复制代码
GRANT SELECT, SHOW VIEW ON database_name.view_name TO 'username'@'host';

5.2.3 刷新权限

sql 复制代码
-- 修改权限后需要刷新权限
FLUSH PRIVILEGES;
相关推荐
程序员老舅3 小时前
C++高并发精髓:无锁队列深度解析
linux·c++·内存管理·c/c++·原子操作·无锁队列
雨中风华4 小时前
Linux, macOS系统实现远程目录访问(等同于windows平台xFsRedir软件的目录重定向)
linux·windows·macos
IvorySQL4 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·4 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德4 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
爱吃生蚝的于勒4 小时前
【Linux】进程信号之捕捉(三)
linux·运维·服务器·c语言·数据结构·c++·学习
The森4 小时前
Linux IO 模型纵深解析 01:从 Unix 传统到 Linux 内核的 IO 第一性原理
linux·服务器·c语言·经验分享·笔记·unix
惊讶的猫4 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i5 小时前
完全卸载MariaDB
数据库·mariadb
翼龙云_cloud5 小时前
腾讯云代理商: Linux 云服务器搭建 FTP 服务指南
linux·服务器·腾讯云