第11章 データ処理2の追加・削除・変更

ケース 1:

シナリオ: テーブル test1 には、int 型の eid フィールドと varchar 型の ename フィールドの 2 つのフィールドがあります。ename フィールドには多くの重複値があります。ここで、これらの重複値を削除してレコードを保持する必要があります。最大の eid で。次の表に示すように:

CREATE TABLE `test1` (
  `eid` int(11) NOT NULL AUTO_INCREMENT,
  `ename` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`eid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO test1 VALUES(1, 'aaa'),(2, 'aaa'),(3, 'bb'),(4, 'bb'),(5, 'cc');

削除前:

画像-20230520210812156

解析:

# 报错。 不允许在一条语句中增删改某个表的记录时,同时还对该表进行子查询
-- DELETE FROM test1 WHERE eid < (SELECT MAX(eid) FROM test1 GROUP BY ename); 

# 方式一
DELETE a FROM test1 a LEFT JOIN test1 b ON a.ename = b.ename WHERE a.eid<b.eid;

# 方式二
# SELECT * FROM test1 a LEFT JOIN (SELECT MAX(eid) AS eid FROM test1 GROUP BY ename ) b ON a.eid = b.eid WHERE b.eid IS NULL;
DELETE a FROM test1 a LEFT JOIN (SELECT MAX(eid) AS eid FROM test1 GROUP BY ename ) b ON a.eid = b.eid WHERE b.eid IS NULL;

削除後:

画像-20230520210922968

ケース 2:

Mysql の関連フィールドを通じて、あるテーブルのフィールドを別のテーブルに更新します

シナリオ: Student テーブルの ID は book_borrow テーブルに格納されており、student テーブルの name フィールドの値は冗長であり、関連付け条件は book_borrow.student_id =student.id です。student テーブル内の一部の生徒の名前が更新されるため、ただし、book_borrow テーブルの Student_name フィールドの値は Update to ではありません。

要件: book_borrow テーブルの Student_name フィールドの値を Student テーブルの name フィールドの値に更新する SQL を作成します。

テーブル構造

student表

CREATE TABLE student (
	id BIGINT ( 20 ) NOT NULL AUTO_INCREMENT COMMENT '自增id',
	name VARCHAR ( 30 ) DEFAULT NULL COMMENT '名字',
	class_id INT DEFAULT NULL COMMENT '班级id',
	create_time datetime DEFAULT NULL COMMENT '创建时间',
	update_time datetime DEFAULT NULL COMMENT '更新时间',
	is_del TINYINT DEFAULT 0 COMMENT '是否已删除,0:否 1: 是',
	PRIMARY KEY (`id`)
);

INSERT INTO `student` VALUES (1, '小明', 1, '2022-04-03 15:10:21', '2022-04-03 15:35:06', 0);
INSERT INTO `student` VALUES (2, '小野', 1, '2022-04-03 15:10:21', '2022-04-03 15:35:06', 0);
INSERT INTO `student` VALUES (3, '小王', 2, '2022-04-03 15:10:21', '2022-04-03 15:35:06', 0);
INSERT INTO `student` VALUES (4, '小李', 3, '2022-04-03 15:10:21', '2022-04-03 15:35:06', 0);

画像-20220403154057335

本を借りる表

CREATE TABLE book_borrow (
	id BIGINT ( 20 ) NOT NULL AUTO_INCREMENT COMMENT '自增id',
	book_name VARCHAR ( 50 ) DEFAULT NULL COMMENT '名字',
	student_id BIGINT DEFAULT NULL COMMENT '班级id',
    student_name VARCHAR ( 30 ) DEFAULT NULL COMMENT '学生名字',
    class_id INT DEFAULT NULL COMMENT '班级id',
	create_time datetime DEFAULT NULL COMMENT '创建时间',
	update_time datetime DEFAULT NULL COMMENT '更新时间',
	is_del TINYINT DEFAULT 0 COMMENT '是否已删除,0:否 1: 是',
	PRIMARY KEY (`id`)
);

INSERT INTO `book_borrow` VALUES (1, 'Spring实战', 1, NULL, NULL, '2022-04-03 15:37:21', '2022-04-03 15:37:24', 0);
INSERT INTO `book_borrow` VALUES (2, 'Spring微服务实战', 88, '88不能被删除', NULL, '2022-04-03 15:37:21', '2022-04-03 15:37:24', 0);
INSERT INTO `book_borrow` VALUES (3, '深入理解Java虚拟机', 3, NULL, NULL, '2022-04-03 15:37:21', '2022-04-03 15:37:24', 0);
INSERT INTO `book_borrow` VALUES (4, 'java编程思想', 99, '99不能被删除', NULL, '2022-04-03 15:37:21', '2022-04-03 15:37:24', 0);
INSERT INTO `book_borrow` VALUES (5, 'java核心技术 卷I', 2, '大湿', NULL, '2022-04-03 15:37:21', '2022-04-03 15:37:24', 0);

画像-20220403154810952

分析、さまざまな更新方法:

1 元のテーブルデータの更新を維持する

Student テーブル内のデータのみが更新され、Student テーブル内に見つからないデータは book_borrow テーブル内にそのまま残り、更新されません。これは内部接続と同等です。

update book_borrow br,student st set br.student_name = st.name where br.student_id = st.id;
-- 或者
update book_borrow br inner join student st on br.student_id = st.id set br.student_name = st.name;

更新された結果

画像-20220403155427360

2 右の表のすべてのデータが優先されます。

更新結果は学生のクエリ結果の影響を受け、学生内で見つからなかったすべてのレコードは null に更新されます。これは外部接続と同等です。

update book_borrow br set student_name = (select name from student where id = br.student_id);
-- 或者
update book_borrow br left join student st on br.student_id = st.id set br.student_name = st.name; 

更新された結果:

画像-20220403155701288

おすすめ

転載: blog.csdn.net/qq_29216579/article/details/130785952