基础操作
在介绍 MySQL
基础操作前,需要先安装 MySQL
。
Linux
系统安装MySQL
1 2 3 4 5 6 7 8
# debian, ubuntu sudo apt update && sudo apt install mysql # centos 7 yum update && install mysql # centos 8, rocky linux dnf update && dnf install mysql
Docker
安装MySQL
官方镜像1 2 3 4 5
docker serach mysql docker pull mysql:latest docker run --name mysql-study -e MYSQL_ROOT_PASSWORD="<ENTER YOUR PASSWORD>" -d mysql:latest docker container ls docker logs mysql-study
数据库操作
下面将创建数据库 mysql_test
,在此数据库下创建数据表 test
,然后进行一系列的数据库操作。
连接
MySQL Server
1 2 3 4 5
# 使用容器时需要先进入容器内 docker exec -it mysql-study /bin/bash `MySQL` -u root -p <ENTER YOUR PASSWORD>
进入
MySQL
Server 后每条指令都需要以;
作为指令结束的标志。查看帮助
1
HELP;
查看数据库
1
SHOW databases;
创建数据库
1 2 3 4
CREATE DATABASE test01; # 设置数据库编码和排序方式,可以在库级别设置,也可以在表级别设置 CREATE DATABASE test01 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; SHOW databases;
查看库编码格式
1 2 3 4 5 6 7
# 查看单个数据库 SELECT default_character_set_name, default_collation_name FROM information_schema.schemata WHERE schema_name = 'test01'; # 查看所有数据库 SELECT schema_name, default_character_set_name, default_collation_name FROM information_schema.schemata;
设置或更新库编码格式
1
ALTER DATABASE test01 CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
重命名数据库
MySQL 5.1
版本之前可以使用1
RENAME DATABASE test01 TO mysql_test;
建新库,重命名表名,删除老库
1 2 3 4
CREATE DATABASE mysql_test CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; # test01 中所有的表名都要更改,相当于将表从 test01 移动到 mysql_test RENAME TABLE test01.tb TO mysql_test.tb; DROP DATABASE test01;
建新表,导出老表,导入新表,删除老表
1
CREATE DATABASE mysql_test CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
1 2
mysqldump -u root -p<ENTER YOUR PASSWORD> --set-gtid-purged=OFF test01 > /tmp/test01.sql mysqldump -u root -p<ENTER YOUR PASSWORD> mysql_test < /tmp/test01.sql
1
DROP DATABASE test01;
尽量不要变更数据库名称!!!
数据表操作
创建数据表
1 2 3 4 5 6 7 8 9 10
CREATE TABLE mysql_test.test ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, gender BOOLEAN, address TEXT, birth DATE COMMENT 'format just like 1970-01-01', description VARCHAR(255), create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE = InnoDB CHARSET = utf8mb4;
表级别编码方式高于库级别编码方式。
MySQL
有多种存储引擎,各有优缺点。其中,最常用的两种存储引擎是InnoDB
和MyISAM
。InnoDB
是MySQL 5.5
及以后版本中的默认存储引擎。它支持事务、使用行级锁、支持外键关联、支持热备份等特性,容灾性强,能够在崩溃后安全恢复。MyISAM
则不支持事务、使用表级锁、并发性差、主机宕机后易损坏、灾难恢复性不佳。但是,它可以配合锁实现操作系统下的复制备份、迁移,数据紧凑存储,因此可获得更小的索引和更快的全表扫描性能。
总之,
InnoDB
更适合写密集的表,而MyISAM
更适合读密集的表。查看建表语句
1
SHOW CREATE TABLE mysql_test.test;
查看数据表结构
1 2 3
DESCRIBE mysql_test.test; SHOW COLUMNS FROM mysql_test.test;
设置或更新存储引擎
1 2
ALTER TABLE mysql_test.test ENGINE = MyISAM; ALTER TABLE mysql_test.test ENGINE = InnoDB;
设置或更新编码
1
ALTER TABLE mysql_test.test CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
重命名表名
1 2
RENAME TABLE mysql_test.test TO mysql_test.test01; RENAME TABLE mysql_test.test01 TO mysql_test.test;
添加列
1
ALTER TABLE mysql_test.test ADD COLUMN description TEXT;
TEXT
类型IO
性能较差,适合存储大文本数据。更改列
1
ALTER TABLE mysql_test.test CHANGE COLUMN address address VARCHAR(255) NOT NULL COMMENT 'address in id card';
删除列
1
ALTER TABLE mysql_test.test DROP COLUMN description;
删除数据表
1
DROP TABLE mysql_test.test;
字段操作
添加主键
1 2 3
ALTER TABLE mysql_test.test ADD CONSTRAINT ID PRIMARY KEY (id); # 也可以变更列属性 ALTER TABLE mysql_test.test CHANGE COLUMN id id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY;
CONSTRAINT ID
的意思是为主键取个名称ID
。删除主键
1 2 3
# 对于自增主键,必须先去掉自增属性,才能删除主键属性 ALTER TABLE mysql_test.test MODIFY id BIGINT UNSIGNED NOT NULL; # 尽量只删除自增属性 ALTER TABLE mysql_test.test DROP PRIMARY KEY;
一张表只能有一个主键,主键自带唯一性且不能为空 主键应当不影响业务逻辑,也不应该更新主键值
添加索引
1 2 3 4
# 添加索引 ALTER TABLE mysql_test.test ADD INDEX name (name); # 添加唯一索引 ALTER TABLE mysql_test.test ADD UNIQUE INDEX (name);
删除索引
1
ALTER TABLE mysql_test.test DROP INDEX name;
添加索引能够加快检索速度,唯一索引确保数据唯一性,索引可以为空 考虑到会建立多个索引,可以为每个索引添加名称(名称不可以重复),不添加时默认使用列名
添加联合索引
1 2 3 4
# 添加联合索引 ALTER TABLE mysql_test.test ADD INDEX name_address (name, address); # 添加唯一联合索引 ALTER TABLE mysql_test.test ADD UNIQUE INDEX name_address (name, address);
删除联合索引
1
ALTER TABLE mysql_test.test DROP INDEX name_address;
- 联合索引名称需要与列名称相关,最好能够望名知义
- 联合索引的排序和查询都是按照字段的先后顺序进行的,所以让数据重复概率低,字符短,经常使用的列排在联合索引的最左边
- 联合索引遵循最左前缀匹配原则,即查询条件中只能使用索引的最左侧部分
增删改查操作
增加数据
1
INSERT INTO mysql_test.test (name, address) VALUES ('张三', 'JX');
只能使用单引号,不能使用双引号
查询数据
1 2 3 4 5 6 7 8 9 10
# 查询表中所有数据 SELECT * FROM mysql_test.test; # 查询表中单列所有数据 SELECT name FROM mysql_test.test; # 条件查询 SELECT name, address FROM mysql_test.test WHERE id = 1; # 多条件查询 SELECT name, address FROM mysql_test.test WHERE id = 1 AND gender = false; # 按 id 升序排序,从 id>0 的数据中查询前 10 条数据,不足 10 条时返回所有数据 SELECT name, gender, address FROM mysql_test.test WHERE id > 0 ORDER BY id LIMIT 10;
更新数据
1 2 3 4
# 更新表中所有数据 UPDATE mysql_test.test SET gender = true; # 更新表中满足条件的数据 UPDATE mysql_test.test SET gender = true WHERE id = 1;
删除数据
1 2 3 4
# 清空表中所有数据 DELETE FROM mysql_test.test; # 清空表中满足条件的数据 DELETE FROM mysql_test.test WHERE gender = true;