单表删除语法
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [[AS] tbl_alias]
[PARTITION (partition_name [, partition_name] ...)]
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
多表删除
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
tbl_name[.*] [, tbl_name[.*]] ...
FROM table_references
[WHERE where_condition]
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
FROM tbl_name[.*] [, tbl_name[.*]] ...
USING table_references
[WHERE where_condition]
使用修饰符LOW_PRIORITY时 SQL 执行优先级会很低直到所有查询语句执行完毕才执行。LOW_PRIORITY 只对只支持表锁的引擎有用,例如 MyISAM、MEMORY、MERGE。
使用修饰符QUICK 时,存储引擎不会去处理因删除数据而需要合并索引叶子节点,这样可以在一定程度上加快删除速度,例如 MyISAM。
修饰符IGNORE 用来忽略 SQL 执行过程中的错误报错。
另外 delete 语句支持 order by 和 limit 来删除满足 where 的部分数据。
根据id删除一个学生
mysql> delete from students where id=1;
Query OK, 1 row affected (0.00 sec)
使用 order by limit 删除 id 最大的学生
mysql> delete from students order by id desc limit 1;
Query OK, 1 row affected (0.00 sec)
mysql> select * from students;
+----+------+--------+-----+------+---------------------+---------------------+
| id | no | name | sex | age | created_at | updated_at |
+----+------+--------+-----+------+---------------------+---------------------+
| 2 | 0002 | 冷锋 | 2 | 25 | 2019-12-20 20:00:00 | 2019-12-20 20:00:00 |
| 3 | 0003 | 六一 | 2 | 25 | 2019-12-20 20:00:00 | 2019-12-20 20:00:00 |
| 4 | 0004 | 杨过 | 2 | 25 | 2019-12-20 00:26:14 | NULL |
| 6 | 0006 | 铁蛋 | 2 | 25 | 2019-12-20 01:51:46 | NULL |
+----+------+--------+-----+------+---------------------+---------------------+
4 rows in set (0.00 sec)
新建一个作业表并初始化一部分数据
mysql> CREATE TABLE `homeworks` (
-> `id` int NOT NULL AUTO_INCREMENT COMMENT '作业id',
-> `student_id` int NOT NULL COMMENT '学生学号',
-> `name` varchar(128) NOT NULL COMMENT '作业名字',
-> `status` tinyint NOT NULL DEFAULT '0' COMMENT '0 未做 1 已提交 2 已批改',
-> `content` text DEFAULT NULL COMMENT '作业内容',
-> `score` int not null default 0 comment '作业分数',
-> `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
-> `updated_at` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
-> PRIMARY KEY (`id`),
-> index `student_id_index` (`student_id`)
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='作业表';
Query OK, 0 rows affected (0.02 sec)
mysql>
mysql>
mysql>
mysql> insert into homeworks (`student_id`,`name`) values(3,'1+1'),(3,'2+2'),(2,'1+1');
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from homeworks;
+----+------------+------+--------+---------+-------+---------------------+------------+
| id | student_id | name | status | content | score | created_at | updated_at |
+----+------------+------+--------+---------+-------+---------------------+------------+
| 1 | 3 | 1+1 | 0 | NULL | 0 | 2019-12-29 22:39:57 | NULL |
| 2 | 3 | 2+2 | 0 | NULL | 0 | 2019-12-29 22:39:57 | NULL |
| 3 | 2 | 1+1 | 0 | NULL | 0 | 2019-12-29 22:39:57 | NULL |
+----+------------+------+--------+---------+-------+---------------------+------------+
删除 id=3 的学生及其所有作业
mysql> delete s,h from students s left join homeworks h on s.id=h.student_id where s.id=3;
Query OK, 2 rows affected (0.00 sec)
mysql> select * from students;
+----+------+--------+-----+------+---------------------+------------+
| id | no | name | sex | age | created_at | updated_at |
+----+------+--------+-----+------+---------------------+------------+
| 4 | 0004 | 杨过 | 2 | 25 | 2019-12-20 00:26:14 | NULL |
| 6 | 0006 | 铁蛋 | 2 | 25 | 2019-12-20 01:51:46 | NULL |
+----+------+--------+-----+------+---------------------+------------+
2 rows in set (0.00 sec)
mysql> select * from homeworks;
+----+------------+------+--------+---------+-------+---------------------+------------+
| id | student_id | name | status | content | score | created_at | updated_at |
+----+------------+------+--------+---------+-------+---------------------+------------+
| 1 | 1 | 1+1 | 0 | NULL | 0 | 2019-12-29 22:39:57 | NULL |
| 2 | 1 | 2+2 | 0 | NULL | 0 | 2019-12-29 22:39:57 | NULL |
+----+------------+------+--------+---------+-------+---------------------+------------+
2 rows in set (0.00 sec)
我们有时候需要清除数据库数据,我们可以使用 delete 也可以用 truncate,两者对比如下
非著名程序员,全栈开发工程师,长期专注系统开发与架构设计。
功能待开通!
MySQL 创建库语法 CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [create_specification] ... create_specification: [DEFAULT] CHARACTER SET [=] charset_name | [DEFAULT] COLLATE [=] collation_name 创建一个默认的数据库 create database school; 执行结果 mysql> create database school; Query OK, 1 row affecte
创建表 创建学生表 SQL create table if not exists`students` ( `id` int not null auto_increment comment '学生id', `no` char(5) not null comment '学生学号', `name` varchar(128) not null default '' comment '学生姓名', `sex` tinyint not null default 0 comment '0 无 1 女 2 男', `age` tinyint null default
MySQL 体系结构 从图我们可以看出,MySQL 有如下几部分组成: 连接池组件 管理服务和工具组件 SQL 接口组件 查询优化组件 优化器组件 缓冲组件 插件式存储引擎 物理文件 需要注意存储引擎是基于表的而不是库,比如我们可以在建表的时候为表指明存储引擎。 MySQL 存储引擎 常见存储引擎 InnoDB MySQL 5.5.8 版本之后的默认存储引擎,事务性,行锁,支持外键。 MyISAM 存储引擎不支持事务、表锁,支持全文索引,主要面对一些 OLAP 数据库应用。MySQL 5.5.6 版本之前的默认存储引擎。 NDB 存储引擎是一个集群存储引擎。 Memory 存储引擎将表
information_schema MySQL 自带一个数据库 information_schema ,这个数据库用于记录 MySQL 数据库的基本信息,比如数据库名,数据库的表,表栏的数据类型与访问权限等。 mysql> use information_schema; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql>
MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要。不管存储哪种数据类型,下面几个简单的原则都有助于做出更好的选择。 更小的通常更好 一般情况下,尽可能使用可以正确存储数据的最小数据类型。更小的数据类型通常更快,因为他们占用的更少的磁盘、内存和CPU缓存,处理时需要的CPU周期更少。 简单最好 简单的数据类型的操作通常需要更少的CPU周期。例如整数比字符操作代价更低,因为字符集和校对规则使字符串比较比整型更复杂。 两个实际使用中的例子,一个是使用MySQL内置的类型而不是字符串存储时间,另一个是使用整型而不是字符串存储IP。 尽量避免NULL 很多表都包含可为 NULL