mysql数据库
前言
本文 mysql数据库 是 哈希空间 2020年6月整理编辑,总结最常用、最实用的MySQL基础语句。
祝你能够愉快享用这份精炼的文档。
本文连接 https://www.hashspace.cn/mysql-shujuku.html 欢迎转发分享。
目录
MySQL数据库介绍
MySQL 是最为流行的免费开源关系型数据库系统。在国内外公司都有非常广泛、深入的使用。是目前数据库领域最重要的工具。
## MySQL数据库介绍
MySQL 是最为流行的免费开源关系型数据库系统。在国内外公司都有非常广泛、深入的使用。是目前数据库领域最重要的工具。
### MySQL 下载
MySQL官方下载地址为 https://dev.mysql.com/downloads/installer/
目前最新版本为 MySQL 8.0
Windows 安装程序 420Mb
https://dev.mysql.com/get/Downloads/MySQLInstaller/mysql-installer-community-8.0.20.0.msi
Mac 安装
````
brew install mysqld
````
Ubuntu/Linux 安装
````
apt install mysqld
````
### MySQL 连接数据库
可以参考文章 [MySQL 连接数据库](mysql-lianjieshujuku.html) 和 [mysql新手教程](mysql-xinshoujiaocheng.html)
## SQL 也可以 Hello World
SQL 语句对大小写不敏感。SELECT 等效于 select 。
````sql
select "Hell World";
````
## 创建数据库 create database
````sql
create database 数据库名字
````
## 删除数据库 drop database
````sql
drop database 数据库名字
````
## 列出数据库
````sql
show databases
````
## 使用数据库 use
````sql
use 数据库名字
````
## 建表 CREATE TABLE
语法
````sql
CREATE TABLE 表名称
(
列名称1 数据类型 其它可选配置,
列名称2 数据类型 其它可选配置,
列名称3 数据类型 其它可选配置,
....
)
`````
例子,创建一个学生信息表 student ,包括姓名 name ,生日 birthday ,身高 height
````sql
CREATE TABLE `student` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(16) NOT NULL DEFAULT '',
`birthday` date NOT NULL,
`height` int NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
````
下面对每个字段进行说明 :
| 字段 | 类型 |是否可空 | 说明 |
|---------|-------|---- |---------|
| id | int unsigned | NOT NULL | id 为自增主键 ``AUTO_INCREMENT`` 类型,作为每条记录的唯一 id int 为正数类型,unsigned 表示无符号类型 即只表示正数范围;NOT NULL 表示这个字段不能为空 NULL,必须有值 | |
| name| varchar(16) | NOT NULL | 字符串类型,16个字符,默认为空字符串 '' |
|birthday |date | NOT NULL| 日期类型,出生日期 |
|height| int| NOT NULL| 正数类型,比如 180 则表示 180cm 身高 |
| KEY(`id`) | PRIMARY| | 指定主键为 id 字段| |
| ENGINE| | | 存储引擎使用 InnoDB引擎 |
| DEFAULT CHARSET| || 指定字符集使用 **utf8mb4** 避免出现编码不兼容问题(默认类型可能兼容emoji 等特殊字符) |
### id 自增主键 AUTO_INCREMENT 说明
每个表只可以设置一个自增主键,也可以不设置。一般来说为了确定表中记录的唯一性,都应该默认设置自增主键id
### NOT NULL 说明
NOT NULL 为可选类型,不写则表示该字段值可以为空NULL
### DEFAULT 默认值说明
DEFAULT 为可选表示给字段设置一个初始默认值。
## 列出库里的所有表
````sql
show tables
`````
从中可以找到新建的 student 表
## 插入数据 INSERT INTO
语法
````sql
INSERT INTO 表名 (列1, 列2,...) VALUES (值1, 值2,....)
`````
例子,在学生信息表 student 表中插入一条数据 姓名为 Jack,生日 1990-01-01 ,身高 180
````sql
INSERT INTO `student` (`name`, `birthday`, `height`)
VALUES ('Jack', '1990-01-01', 180);
````
## 查询数据 SELECT
语法
````sql
SELECT 列1,列2,... FROM 表名称
````
或 全部列 *
````sql
SELECT * FROM 表名称
````
例子
````sql
select * from student
````
或使用 `` 将表名和字段名标注起来,防止触发MySQL关键词。
````sql
select * from `student`
````
### where 查询条件
查找 姓名 name 等于 Jack 的记录
````sql
select * from `student` where name='Jack'
````
结果:
| id | name | birthday | height |
| ---- | ----- | ---- |---- |
| 1 | Jack | 1990-01-01 | 180|
几种查询例子:
查找 身高大于等于 170 的记录
````sql
select * from `student` where height >=170
````
#### and 查询
查找 姓名 name 等于 Jack **且** 身高大于等于 170 的记录
````sql
select * from `student` where name='Jack' and height >=170
````
#### or 查询
查找 姓名 name 等于 Jack **或** 身高大于等于 170 的记录
````sql
select * from `student` where name='Jack' or height >=170
````
#### null 记录查询
查找 手机号 mobile 为空 的记录
````sql
select * from `student` where mobile is null
````
### 更新数据 UPDATE
语法
````sql
UPDATE 表名称 SET 某列名称 = 新值 WHERE 某列名称 = 某值
````
例子 ,更新 学生信息表 student 中 姓名为 Jack 的 生日为 1990-02-01
````sql
UPDATE student birthday='1990-02-01' where name='Jack'
`````
### 删除数据 DELETE
语法
````sql
DELETE FROM 表名称 WHERE 列名称 = 值
````
例子,删除 学生信息表 student 中 姓名为 Jack 的记录。
````sql
DELETE FROM student WHERE where name='Jack'
````
例子2 ,删除 学生信息表 student 中 姓名为 Jack 且 生日为 1990-02-01 的记录。
````sql
DELETE FROM student WHERE where name='Jack' and birthday='1990-02-01'
````
例子3 ,如果不写 where 部分,则会删除表中的全部记录
````sql
DELETE FROM student
````
这时可以考虑使用 清空表的语句 TRUNCATE
### 清空表数据 TRUNCATE
例子,清空 student 表,但是不删除表结构
````sql
TRUNCATE student
````
### 表增加字段 ALTER TABLE ADD
语法
````sql
ALTER TABLE `表名字` ADD `新字段名` 字段类型 COMMENT '字段说明'
````
例子,在 学生信息表 student 中,新增一个字段 手机号 mobile ,类型为 varchar(16) 即16个字符。
````sql
ALTER TABLE `student` ADD `mobile` varchar(16) COMMENT '手机号'
`````
### 表删除字段 ALTER TABLE DROP
语法
````sql
ALTER TABLE `表名字` DROP `字段名`
````
例子,删除 学生信息表 student 中 手机号 mobile 字段
````sql
ALTER TABLE `student` DROP `mobile`
````
### 索引优化
索引是为了提高SQL运行效率而提供的一种手段。当对某个字段设置索引优化后,一些情况下使用 where 查询该字段时可以非常快速的返回这些满足条件的记录。
比如在 学生信息表中有100条记录,我们现在要查询姓名为 Jack 的学生记录
````sql
select * from student where name='Jack'
````
理论上,我们需要扫描全部100条记录,依次比较 name 字段是否 Jack 。当我们给 name 字段设置索引后,通常仅需扫描几条记录就可以找到全部 name 为 Jack 的记录,极大的提高了SQL 的执行速度和效率。对于网站等服务是不是 **卡 、慢** 通常有非常明显的作用。
### 索引类型
分为 INDEX 普通索引,UNIQUE 唯一索引,PRIMARY KEY 主键索引。
主键索引只能设置一个,INDEX/UNIQUE 可以设置多个。
可以对一个字段设置索引,也可以多个字段设置 联合索引 。
### 创建索引 ALTER TABLE ADD INDEX
语法
````sql
ALTER TABLE 表名字 ADD INDEX 索引名字(表字段)
````
例子给 学生信息报 studet 表中的name 字段设置索引
````sql
ALTER TABLE student ADD INDEX index_name (name)
````
### 创建唯一索引 ALTER TABLE ADD UNIQUE
例子:因为手机号不应该有重复的,所以给学生信息 studet 表中的 mobile 字段设置唯一索引
````sql
ALTER TABLE student ADD UNIQUE mobile (mobile)
````
这里我们将索引名定为和字段名一样的 mobile ,可以根据需要设置,也可以不同。
### 删除索引 DROP INDEX
例子,删除 学生信息表中的mobile 索引
````sql
ALTER TABLE student DROP INDEX mobile;
`````
注意无论是普通索引还是唯一索引都使用 DROP INDEX 来删除。
### 查看索引
````sql
show index from student;
````
就可以方便的查看表中索引情况,下面是对结果中一些字段的说明:
- Table 表的名称
- Non_unique 如果索引不能包括重复词,则为0。如果可以,则为1
- Key_name 索引的名称
- Seq_in_index 索引中的列序列号,从1开始
- Column_name 列名称
- Collation 列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)
- Null如果列含有NULL,则含有YES。如果没有,则该列含有NO
- Index_type 用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)
## 查看建表语句
````sql
show create table student
````
返回结果如下
````sql
CREATE TABLE `student` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(16) NOT NULL DEFAULT '',
`birthday` date NOT NULL,
`height` int NOT NULL,
`mobile` varchar(16) DEFAULT NULL COMMENT '手机号',
PRIMARY KEY (`id`),
UNIQUE KEY `mobile` (`mobile`),
KEY `index_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4
````
我们可以看到建表语句中已经包含了我们新增的唯一索引 UNIQUE KEY `mobile` (`mobile`) 和普通索引 KEY `index_name` (`name`)
## 查询SQL执行计划
当给表加完索引后,我们想知道查询是否变得更高效了,这时候我们可以使用 查询SQL执行计划的功能,即 SQL 语句前面加个 explain ,例子:
````sql
explain select * from student where name='Jack' ;
````
- possible_keys 为可能使用的索引名
- key 使用的索引名
- key_len 索引长度
- **rows 扫描行数** 这个是最重要的指标,该字段没设置索引时通常为全表记录数,如果设置了索引则会远小于全表记录数
## 查询、终止执行中的SQL
查询执行中的SQL任务
````
show processlist;
````
终止SQL ,其中id 为 上面结果中的 id
````
kill id
````
## mysqldump MySQL导入导出数据
### 导出数据
整个库
````
mysqldump -u 用户名 -p 数据库名 > 导出的文件名.sql
````
单个表
````
mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名.sql
````
### 导出表结构
不导出数据只要表结构,加参数 -d 参数即可
整个库结构
````
mysqldump -d -u 用户名 -p 数据库名 > 导出的文件名.sql
````
单个表结构
````
mysqldump -d -u 用户名 -p 数据库名 表名> 导出的文件名.sql
````
### 导入数据
/tmp/backup.sql 为备份文件
#### mysql 命令导入
````
mysql -u用户名 -p密码 </tmp/backup.sql
````
#### source 命令导入
````
mysql -u 用户名 -p
use 数据库
source /tmp/backup.sql
````