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

news2024/11/15 15:34:45

文章目录

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

一、CRUD

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

1.1 数据库操作

创建、选择、删除数据库

# 创建
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 创建表

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

例子

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 修改表

# 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;

例子

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 删除表

# 删除表
DROP TABLE table_name ;
# 截断表
TRUNCATE TABLE table_name;
# 清空表
DELETE FROM table_name;

在这里插入图片描述

1.2.4 表数据的增删改查

# 插入数据
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 查询中使用的子句,用于将结果集按照一个或多个列进行分组,并对每个分组执行聚合函数计算。

SELECT1,2, ... 
FROM 表名
WHERE 条件
GROUP BY1,2, ...

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

SELECT customer_id, SUM(order_amount) as total_amount
FROM orders
GROUP BY customer_id

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

+-------------+--------------+
| customer_id | total_amount |
+-------------+--------------+
|     1       |    1500      |
|     2       |    2500      |
|     3       |    1800      |
+-------------+--------------+

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

SELECT DISTINCTFROM 表名;

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

SELECT DISTINCT department
FROM employees;

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

+---------------+
|  department   |
+---------------+
|   Sales       |
|   Marketing   |
|   HR          |
|   Finance     |
+---------------+

二、高级查询

结合实例,介绍高级查询

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 基础查询

-- 全部查询
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 条件查询

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

2.3 范围查询

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

2.4 判空查询

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 关键字,"%"代表任意数量的字符,”_”代表占位符

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

2.6 分页查询

分页查询主要用于查看第N条 到 第M条的信息,通常和排序查询一起使用
使用LIMIT 关键字,第一个参数表示从条记录开始显示,第二个参数表示要显示的数目。表中默认第一条记录的参数为0。

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

2.7 查询后排序

ORDER BY field

# 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()计算某列的行数
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 分组查询

-- 可以把查询出来的结果根据某个条件来分组显示
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
只取两张表有对应关系的记录

SELECT
cid
FROM
`course`
INNER JOIN `teacher` ON course.teacher_id =
teacher.tid;

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

SELECT
course.cid
FROM
`course`
LEFT JOIN `teacher` ON course.teacher_id = teacher.tid;

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

SELECT
course.cid
FROM
`course`
RIGHT JOIN `teacher` ON course.teacher_id =
teacher.tid;

2.11 子查询/合并查询

2.11.1 单行子查询

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 子句中,这种情况下将子查询当做一个临时表使用。

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

CREATE VIEW 视图名 AS SELECT 语句

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

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那就会提示该表不存在;若此时创建视图

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 语法

-- 创建触发器
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 解析器在遇到指定的分隔符时,将整个语句作为一个整体进行处理,而不会将其中的分号视为语句的结束。通常指定 $$ 或 ||

准备

-- 创建触发器
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
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:客户新建订单购买的数量,商品表的库存数量自动改变

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:客户修改订单购买的数量,商品表的库存数量自动改变

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 创建用户

CREATE USER username@host IDENTIFIED BY password; 

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

5.2 授权

5.2.1 对表授权

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 对视图授权

GRANT SELECT, SHOW VIEW ON database_name.view_name TO 'username'@'host';

5.2.3 刷新权限

-- 修改权限后需要刷新权限
FLUSH PRIVILEGES;

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

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

相关文章

云智慧x统信软件:智能化IT服务管理,提升客户服务价值

统信软件由中国领先的操作系统厂商于2019年联合成立&#xff0c;是全球主流的操作系统产品及服务提供商&#xff0c;致力于研发安全稳定、智能易用的操作系统产品&#xff0c;拥有统信UOS桌面版、服务器版、智能终端版在内的全栈基础设施&#xff0c;以及集中域管平台、企业级应…

Atcoder 做题记录

My OI Blog A R C 155 F \mathbb{ARC \ 155 \ F} ARC 155 F E, F 先咕着&#xff0c;做一些多项式题&#xff0c;这篇题解是我人工翻译的 [1] Double Counting 双重计数 考虑从叶子节点开始&#xff0c;用唯一的方式&#xff08;如果有的话&#xff09;来构造出一棵满足条件的树…

AMBA总线协议的终结者,一文稿定ACECHIAXI

无论你是IC设计工程师、验证工程师、FPGA工程师、还是微电子相关专业的学生&#xff0c;对于AMBA总线一定不陌生。 随着技术迭代的发展、基于各种复用IP的SoC芯片场景被高度使用&#xff0c;越来越多的人开始和总线互联打交道。 你肯定听说过AMBA、AHB、APB、AXI、ACE 一、A…

银河麒麟V10 SP1安装网络调试助手

文章目录 系统环境文件准备软件配置过程系统环境 系统镜像:Kylin-Desktop-V10-SP1-General-Release-2203-ARM64.iso 内核:5.4.18-53-generic 文件准备 网络调试助手可执行文件压缩包下载m-net-assist-arm64-main.zip 链接:https://pan.baidu.com/s/10Vu8Z6wOzCImXZWAW0Y…

USB采集卡如何打pts

一、使用采集卡提供的pts 二、手动打pts 1.usb采集设备pts的问题 2.采集卡驱动&#xff0c;UVC/UAC&#xff0c;ffmpeg的关系 3.如何自己打pts 4.音视频同步调优 5.NTP等联网调时工具带来的不同步问题 一、使用采集卡提供的pts 我们用使用pc摄像头和使用pc麦克风声卡里的方法&…

SQL分类及通用语法数据类型

一、SQL分类 DDL: 数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库、表、字段&#xff09;DML: 数据操作语言&#xff0c;用来对数据库表中的数据进行增删改DQL: 数据查询语言&#xff0c;用来查询数据库中表的记录DCL: 数据控制语言&#xff0c;用来创建数据库…

大数据技术之Hadoop:HDFS集群安装篇(三)

目录 分布式文件系统HDFS安装篇 一、为什么海量数据需要分布式存储 二、 分布式的基础架构分析 三、 HDFS的基础架构 四 HDFS集群环境部署 4.1 下载安装包 4.2 集群规划 4.3 上传解压 4.4 配置HDFS集群 4.5 准备数据目录 4.6 分发hadoop到其他服务器 4.7 配置环境变…

AlexNet卷积神经网络-笔记

AlexNet卷积神经网络-笔记 AlexNet卷积神经网络2012年提出 测试结果为&#xff1a; 通过运行结果可以发现&#xff0c; 在眼疾筛查数据集iChallenge-PM上使用AlexNet&#xff0c;loss能有效下降&#xff0c; 经过5个epoch的训练&#xff0c;在验证集上的准确率可以达到94%左右…

【NX】NX二次开发中遍历所有部件完整范例

一个入门的基本例子&#xff0c;这里提供完整代码&#xff0c;遍历所有部件&#xff0c;其他同理。 //author&#xff1a;autumoon //邮箱&#xff1a;9506163.com //日期&#xff1a;2023-08-03 /*************************************************************************…

大数据开发的前景怎么样?该怎么学习?

猎聘大数据研究院发布了《2022未来人才就业趋势报告》 从排名来看&#xff0c;2022年1-4月各行业中高端人才平均年薪来看&#xff0c;人工智能行业中高端人才平均年薪最高&#xff0c;为31.04万元&#xff1b;金融行业中高端人才以27.69万元的平均年薪位居第二&#xff1b;通信…

Prometheus-各种exporter

一、 nginx-prometheus-exporter 1 nginx 配置 1.1 Nginx 模块支持 nginx 安装的时候需要有 nginx 的状态模块: stub_status 可通过如下命令检查 nginx -V 2>&1 | grep -o with-http_stub_status_module1.2 Nginx 配置文件配置 添加如下配置到自己 nginx 的配置文…

【Spring框架】SpringBoot统一功能处理

目录 用户登录权限校验用户登录拦截器排除所有静态资源练习&#xff1a;登录拦截器拦截器实现原理 统一异常处理统一数据返回格式为什么需要统⼀数据返回格式&#xff1f;统⼀数据返回格式的实现 用户登录权限校验 用户登录拦截器 1.自定义拦截器 package com.example.demo.…

数据结构【第3章】——线性表

线性表的定义 线性表&#xff1a;零个或多个数据元素的有限序列。 1&#xff09;线性表是一个序列。即元素之间是有顺序的&#xff0c;若元素存在多个&#xff0c;则第一个元素无前驱&#xff0c;最后一个元素无后继&#xff0c;其他每个元素都有且只有一个前驱和后继。 2&a…

百度地图18.8.0首创红绿灯雷达功能,支持全程静音导航、停车推荐

百度地图App最新版本18.8.0已发布&#xff0c;独家推出红绿灯雷达功能&#xff0c;适用于安卓和iOS系统。 根据官方描述说明&#xff0c;行车时手机启用红绿灯雷达&#xff0c;能够自动检测红绿灯&#xff0c;值得一提的是无需输入目的地。同时&#xff0c;依靠北斗高精定位技术…

如何用python做自然语言处理

如何用python做自然语言处理 使用Python进行自然语言处理&#xff08;NLP&#xff09;是非常常见和强大的。以下是一些基本步骤&#xff1a; 安装所需的库&#xff1a; 首先&#xff0c;您需要安装一些用于自然语言处理的Python库&#xff0c;如NLTK&#xff08;自然语言工具包…

AMEYA360:尼得科科宝旋转型DIP开关系列汇总

旋转型DIP开关 S-4000 电路&#xff1a;BCD(十进制) 代码格式&#xff1a;实码 安装类型&#xff1a;表面贴装 调整位置&#xff1a;顶部 可水洗&#xff1a;无 端子类型&#xff1a;J 引线, 鸥翼型 旋转型DIP开关 SA-7000 电路&#xff1a;BCD(十进制), BCH(十六进制) 代码格式…

Qt5.14.2的安装教程

Qt5.14.2的安装教程 qt creator是qt桌面开发必备的软件&#xff0c;最近重新下载了一份&#xff0c;本文介绍一下Qt的安装过程。 找安装包 本文找到安装包&#xff0c;网址链接 qt5.14.2安装包官网&#xff1a; https://download.qt.io/archive/qt/5.14/5.14.2/ 这个官网下载速…

利用openTCS实现车辆调度系统(一)系统介绍

系统介绍 openTCS简介 官方的回答&#xff1a; openTCS&#xff08;开放式运输控制系统的缩写&#xff09;是一种免费的控制系统软件&#xff0c;用于协调自动导引车&#xff08;AGV&#xff09;和移动机器人车队&#xff0c;例如在生产工厂中。 通常应该可以控制任何具有通信…

Vue.js2+Cesium 五、WMS 服务加载,控制自图层显隐

Vue.js2Cesium 五、WMS 服务加载&#xff0c;控制自图层显隐 Demo <template><divid"cesium-container"style"width: 100%; height: 100%;"><div class"layer_container"><button id"btn">清除</button&g…

快速增加Shopee,lazada店铺销量的秘籍大揭秘

在竞争激烈的电商市场中&#xff0c;如何快速提高Shopee。lazada店铺的销量一直是卖家们关注的焦点。 优化产品信息&#xff1a;在Shopee平台上&#xff0c;完整填写产品标题、描述和关键词等信息非常重要。确保您的产品信息准确、清晰&#xff0c;并包含与目标买家搜索相关的…