# 特点
# 特征
- 免费
- 开源
- 关系型
# 优点
- 全平台
- 多线程
- 语言支持好
- 连接方式多样
# 缺点
- 比NoSQL性能差
- 比Oracle功能少
- MyISAM不支持事务
- MyISAM不支持外键
- MyISAM不支持行级锁
- InnoDB不支持全文索引
- InnoDB必须有主键
# 数据类型
| 类型 | 空间(byte) | 范围 |
|---|---|---|
| BIT(M) | (M+7)/8 | |
| BOOL, BOOLEAN, TINYINT(M) | 1 | |
| SMALLINT(M) | 2 | |
| MEDIUMINT(M) | 3 | |
| INT(M), INTEGER(M) | 4 | |
| BIGINT(M) | 8 | |
| FLOAT(M, N) | 4 | |
| DOUBLE(M, N) | 8 | |
| DECIMAL(M, N) | ? | |
| NUMERIC(M, N) | ? | |
| DATE | 3 | [1000-01-01, 9999-12-31] |
| TIME | 3 | [-838:59:59, 838:59:59] |
| YEAR | 1 | [1901, 2155] |
| DATETIME | 8 | [1000-01-01 00:00:00, 9999-12-31 23:59:59] |
| TIMESTAMP | 4 | [1970-01-01 00:00:00, 2038-01-19 03:14:07] |
| CHAR(M) | [0, 2^8 – 1] | |
| VARCHAR(M) | [0, 2^16 – 1] | |
| TINYTEXT(M) | [0, 2^8 – 1] | |
| TEXT(M) | [0, 2^16 – 1] | |
| MEDIUMTEXT(M) | [0, 2^24 – 1] | |
| LONGTEXT(M) | [0, 2^32 – 1] | |
| TINYBLOB(M) | [0, 2^8 – 1] | |
| BLOB(M) | [0, 2^16 – 1] | |
| MEDIUMBLOB(M) | [0, 2^24 – 1] | |
| LONGBLOB(M) | [0, 2^32 – 1] | |
| BINARY(M) | [0, 2^8 – 1] | |
| VARBINARY(M) | [0, 2^16 – 1] | |
| ENUM | ? | |
| JSON | ? |
# 命令
# 系统操作
$ mysql [-h <ip>[:<port>]] -u <username> -p; # 连接数据库
$ mysql -u<username> -p <databasename> < <filename>; # 恢复数据库
$ mysqldump -u<username> -p <databasename> > <filename>; # 导出数据库
$ which mysqld; # 配置文件路径
# 库操作
$ CREATE DATABASE [IF NOT EXISTS] <databasename>; # 创建数据库
$ <CREATE...> DEFAULT CHARACTER SET UTF8MB4 COLLATE UTF8MB4_UNICODE_CI; # 设定字符集和排序规则
$ DROP DATABASE <databasename>; # 删除数据库
$ USE <databasename>; # 打开数据库
$ SHOW DATABASES; # 展示库列表
# 表操作
$ CREATE [TEMPORARY] TABLE [IF NOT EXISTS] <tablename> ( # 创建表
ID INT NOT NULL AUTO_INCREMENT,...
) [ENGINE = MyISAM DEFAULT CHARSET = UTF8MB4 COLLATE = UTF8MB4_UNICODE_CI AUTO_INCREMENT = 1];
$ DROP TABLE <tablename>; # 删除表
$ SHOW TABLES; # 展示表列表
$ SHOW CREATE TABLE <tablename>; # 查看表结构
$ DESCRIBE <tablename>; # 查看表结构
$ ALTER TABLE <tablename> ADD <field> <datatype>; # 添加字段
$ ALTER TABLE <tablename> ADD <indexname> <datatype> FOREIGN KEY (field) REFERENCES (field); # 添加外键字段
$ ALTER TABLE <tablename> DROP <field>; # 删除字段
$ ALTER TABLE <tablename> MODIFY <field> <datatype>; # 修改字段
$ ALTER TABLE <tablename> CHANGE <field> <field> <datatype>; # 修改字段
$ ALTER TABLE <tablename> ALTER <field> SET DEFAULT <value>; # 修改默认值
$ ALTER TABLE <tablename> RENAME TO <tablename>; # 修改表名
$ ALTER TABLE <tablename> ENGINE = <engine_name>; # 设置引擎
$ ALTER TABLE <tablename> CHARACTER SET <character> DEFAULT COLLATE <orderrule>;
# 索引
$ SHOW INDEX FROM <tablename>; # 展示索引
$ CREATE INDEX <indexname> ON <tablename> (<field>[(length)][ASC|DESC]); # 添加索引
$ CREATE UNIQUE INDEX <indexname> ON <tablename> (<field>[(length)][ASC|DESC]); # 添加唯一索引
$ ALTER TABLE <tablename> ADD INDEX <indexname> (<field>[(length)][ASC|DESC]); #
$ DROP INDEX <indexname> ON <tablename>; # 删除索引
# 增删改查
$ INSERT INTO <tablename> (<field>,...) VALUES (<value>,...); # 插入
$ UPDATE <tablename> SET <field> = <value>... [WHERE...]; # 更新
$ DELETE FROM <tablename> [WHERE...]; # 删除
$ SELECT <field>,... FROM <tablename>; # 查询
$ <SELECT...> WHERE <bool>; # 查询WHERE
$ <SELECT...> WHERE <bool> AND <bool>; # 查询AND
$ <SELECT...> WHERE <bool> OR <bool>; # 查询OR
$ <SELECT...> WHERE <field> LIKE <value>; # 查询LIKE
$ <SELECT...> WHERE <field> BETWEEN <value> AND <value>; # 查询BETWEEN
$ <SELECT...> ORDER BY [<field>|FIELD(<value>,...)] [ASC|DESC]; # 排序
$ <SELECT...> GROUP BY <field>; # 分组
$ <SELECT...> UNION [ALL | DISTINCT] [SELECT ...]; # 联合
$ <SELECT...> [INNER | LEFT | RIGHT] JOIN <tablename> ON [tablename.]<field> = [tablename.]<field> # 连接
# JSON
$ SELECT <field>->"$.<key>" <FROM...>; # 查询值
$ SELECT <field>->>"$.<key>" <FROM...>; # 查询值(去字符串化)
$ SELECT JSON_EXTRACT(<field>,'$.<key>') <FROM...>; # 查询值
$ <INSERT...> VALUES(JSON_ARRAY(<item>,...)); # 插入数组
$ <INSERT...> VALUES(JSON_OBJECT(<key>,<value>,...)); # 插入对象
$ <UPDATE...> SET <field> = JSON_ARRAY_APPEND(<field>,'$.<key>',<value>); # 修改数组(尾部插入)
$ <UPDATE...> SET <field> = JSON_ARRAY_INSERT(<field>,'$.<key>',<value>); # 修改数组(选择插入)
$ <UPDATE...> SET <field> = JSON_INSERT(<field>,'$.<key>',<value>); # 修改对象(不覆盖插入)
$ <UPDATE...> SET <field> = JSON_REPLACE(<field>,'$.<key>',<value>); # 修改对象(不新增修改)
$ <UPDATE...> SET <field> = JSON_SET(<field>,'$.<key>',<value>); # 修改对象(覆盖插入)
$ <UPDATE...> SET <field> = JSON_REMOVE(<field>,'$.<key>'); # 修改对象(删除)
$ SELECT JSON_CONTAINS(<field>,<value>,'$.<key>') <FROM...>; # 值存在
$ SELECT JSON_CONTAINS_PATH(<field>,['one'|'all'],'$.<key>') <FROM...>; # 路径存在
$ SELECT JSON_KEYS(<field>,'$.<key>') <FROM...>; # 键值
$ SELECT JSON_SEARCH(<field>,['one'|'all'],<value-like>,'$.<key>') <FROM...>; # 路径
$ SELECT JSON_MERGE_PRESERVE([array|object],[array|object]) <FROM...>; # 合并
$ SELECT JSON_QUOTE([array|object]) <FROM...>; # 字符串化
$ SELECT JSON_UNQUOTE([array|object]) <FROM...>; # 去字符串化
$ SELECT JSON_DEPTH(<field>,'$.<key>') <FROM...>; # 深度
$ SELECT JSON_LENGTH(<field>,'$.<key>') <FROM...>; # 长度
$ SELECT JSON_TYPE(<field>) <FROM...>; # 类型
$ SELECT JSON_VALID(<field>) <FROM...>; # 格式正确
# 事务
$ BEGIN; # 开始
$ ROLLBACK; # 回滚
$ COMMIT; # 提交
$ SAVEPOINT <pointname>; # 创建保存点
$ ROLLBACK TO <pointname>; # 回滚保存点
$ RELEASE SAVEPOINT <pointname>; # 释放保存点
$ SET AUTOCOMMIT = <0 | 1>; # 设置自动提交
$ SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL <READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE>; # 设置隔离级别
# 权限
$ CREATE USER <username>@<ip> IDENTIFIED BY <password>; # 创建用户
$ RENAME USER <username>@<ip>; # 修改用户
$ DROP USER <username>@<ip>; # 删除用户
$ SET PASSWORD FOR <username>@<ip> = <password>; # 修改密码
$ SHOW GRANTS FOR <username>@<ip>; # 查看用户权限
$ GRANT <privilegetype> ON <databasename>.<tablename> TO <username>@<ip>; # 授权用
$ GRANT <privilegetype> ON <databasename>.<tablename> TO <username>@<ip> IDENTIFIED BY <password>; # 创建并授权用户
$ REVOKE <privilegetype> ON <databasename>.<tablename> FROM <username>@<ip>; # 取消授权
$ FLUSH PRIVILEGES; # 刷新权限
# 视图
$ DESCRIBE <viewname>; # 查看视图
$ SHOW CREATE VIEW <viewname>; # 查看视图
$ CREATE VIEW <viewname>[(field...)] AS <SELECT...>; # 创建视图
$ DROP VIEW <viewname>; # 删除视图
# 常用函数
$ SELECT COUNT(*) FROM <tablename>; # 查询条数
$ UPDATE <tablename> SET <field> = NOW(); # 获取时间
$ UPDATE <tablename> SET <field> = MD5(<value>); # 获取MD5加密
$ UPDATE <tablename> SET <field> = FLOOR(RAND() * (100 - 1) + 1); # 获取1~100随机数
# 问题
# 常用函数
SUBSTRING(<string>,<index>,<length>); # 截取
# 字符集区别
| 字符集 | 字节 | 字符 | 大小写 | 排序 准确性 | 排序 速度 |
|---|---|---|---|---|---|
| utf8 | 3 | 常用 | 不区分 | 不准确 | 较快 |
| utf8mb4 | 4 | Unicode | 不区分 | 不准确 | 较快 |
| utf8mb4_bin | 4 | Unicode | 区分 | 准确 | 普通 |
| utf8mb4_general_ci | 4 | Unicode | 不区分 | 不准确 | 较快 |
| utf8mb4_unicode_ci | 4 | Unicode | 不区分 | 准确 | 普通 |
| utf8_general_cs | 4 | Unicode | 区分 | 准确 | 普通 |
# 配置文件
max_connections=1024 # 连接数量
back_log=500 # 连接挂起数量
interactive_timeout=7200 # 连接扫描间隔
wait_timeout=7200 # 连接断开时间
thread_cache_size=64 # 复用线程数量
table_cache=512 # 打开表数量
record_buffer=16773120 # 扫描缓冲区
sort_buffer=16777208 # 排序缓冲区
key_buffer_size=512M # 索引块的缓冲区
innodb_buffer_pool_size=256M # InnoDB引擎缓冲区
query_cache_size=32M # 查询缓存
tmp_table_size=64M # 临时表大小
[mysqld]
bind-address=0.0.0.0 # 监听IP
# 特殊数据储存类型
- 经纬度: DECIMAL(10, 7)
- 手机号: BIGINT NOT NULL
# 信息库information_schema
- SCHEMATA表: 数据库的信息
- TABLES表: 数据库的表信息
- COLUMNS表: 数据库表的列信息
- STATISTICS表: 数据库表的索引信息
- USER_PRIVILEGES表: 用户的权限信息
- SCHEMA_PRIVILEGES表: 权限方案
- TABLE_PRIVILEGES表: 用户的授权表信息
- COLUMN_PRIVILEGES表: 用户的授权列信息
- CHARACTER_SETS表: 字符集的信息
- COLLATIONS表: 字符集的对照信息
- COLLATION_CHARACTER_SET_APPLICABILITY表: 字符集的校对信息
- TABLE_CONSTRAINTS表: 数据库表的约束信息
- KEY_COLUMN_USAGE表: 数据库表的约束键列信息
- ROUTINES表: 存储子程序的信息
- VIEWS表: 视图的信息
- TRIGGERS表: 触发程序的信息
# 关键词
| ADD | ALL | ALTER |
| ANALYZE | AND | AS |
| ASC | ASENSITIVE | BEFORE |
| BETWEEN | BIGINT | BINARY |
| BLOB | BOTH | BY |
| CALL | CASCADE | CASE |
| CHANGE | CHAR | CHARACTER |
| CHECK | COLLATE | COLUMN |
| CONDITION | CONNECTION | CONSTRAINT |
| CONTINUE | CONVERT | CREATE |
| CROSS | CURRENT_DATE | CURRENT_TIME |
| CURRENT_TIMESTAMP | CURRENT_USER | CURSOR |
| DATABASE | DATABASES | DAY_HOUR |
| DAY_MICROSECOND | DAY_MINUTE | DAY_SECOND |
| DEC | DECIMAL | DECLARE |
| DEFAULT | DELAYED | DELETE |
| DESC | DESCRIBE | DETERMINISTIC |
| DISTINCT | DISTINCTROW | DIV |
| DOUBLE | DROP | DUAL |
| EACH | ELSE | ELSEIF |
| ENCLOSED | ESCAPED | EXISTS |
| EXIT | EXPLAIN | FALSE |
| FETCH | FLOAT | FLOAT4 |
| FLOAT8 | FOR | FORCE |
| FOREIGN | FROM | FULLTEXT |
| GOTO | GRANT | GROUP |
| HAVING | HIGH_PRIORITY | HOUR_MICROSECOND |
| HOUR_MINUTE | HOUR_SECOND | IF |
| IGNORE | IN | INDEX |
| INFILE | INNER | INOUT |
| INSENSITIVE | INSERT | INT |
| INT1 | INT2 | INT3 |
| INT4 | INT8 | INTEGER |
| INTERVAL | INTO | IS |
| ITERATE | JOIN | KEY |
| KEYS | KILL | LABEL |
| LEADING | LEAVE | LEFT |
| LIKE | LIMIT | LINEAR |
| LINES | LOAD | LOCALTIME |
| LOCALTIMESTAMP | LOCK | LONG |
| LONGBLOB | LONGTEXT | LOOP |
| LOW_PRIORITY | MATCH | MEDIUMBLOB |
| MEDIUMINT | MEDIUMTEXT | MIDDLEINT |
| MINUTE_MICROSECOND | MINUTE_SECOND | MOD |
| MODIFIES | NATURAL | NOT |
| NO_WRITE_TO_BINLOG | NULL | NUMERIC |
| ON | OPTIMIZE | OPTION |
| OPTIONALLY | OR | ORDER |
| OUT | OUTER | OUTFILE |
| PRECISION | PRIMARY | PROCEDURE |
| PURGE | RAID0 | RANGE |
| READ | READS | REAL |
| REFERENCES | REGEXP | RELEASE |
| RENAME | REPEAT | REPLACE |
| REQUIRE | RESTRICT | RETURN |
| REVOKE | RIGHT | RLIKE |
| SCHEMA | SCHEMAS | SECOND_MICROSECOND |
| SELECT | SENSITIVE | SEPARATOR |
| SET | SHOW | SMALLINT |
| SPATIAL | SPECIFIC | SQL |
| SQLEXCEPTION | SQLSTATE | SQLWARNING |
| SQL_BIG_RESULT | SQL_CALC_FOUND_ROWS | SQL_SMALL_RESULT |
| SSL | STARTING | STRAIGHT_JOIN |
| TABLE | TERMINATED | THEN |
| TINYBLOB | TINYINT | TINYTEXT |
| TO | TRAILING | TRIGGER |
| TRUE | UNDO | UNION |
| UNIQUE | UNLOCK | UNSIGNED |
| UPDATE | USAGE | USE |
| USING | UTC_DATE | UTC_TIME |
| UTC_TIMESTAMP | VALUES | VARBINARY |
| VARCHAR | VARCHARACTER | VARYING |
| WHEN | WHERE | WHILE |
| WITH | WRITE | X509 |
| XOR | YEAR_MONTH | ZEROFILL |
# 参考
License

This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.