# 连接Mysql
 | 
 | 
# 数据库操作
# 新增数据库
create database [IF NOT EXISTS] 数据库名字 [charactar set 字符集] [collate 排序规则]
# example 1
 | 
 | 
# example 2
 | 
 | 
# 删除数据库
drop database [IF EXISTS] 数据库名;
# example
 | 
 | 
# 修改数据库
alter database 数据库名 default [character set 字符集] [collate 排序规则];
# example
 | 
 | 
# 查看数据库
show database [like ‘表达式’];
like: 表达式, 可以使用
_表示匹配单个字符;%表示匹配多个字符.
show create database 数据库名;
查看数据库的字符集和排序规则.
# example1
 | 
 | 
# example2
匹配my开头的数据库
 | 
 | 
# 选择数据库
use 数据库名字;
 | 
 | 
# 数据表操作
# 新增数据表
1 2 3 4create table [IF NOT EXISTS] [数据库名.]表名( 字段名 字段类型 [not null] [default '内容'] [comment '注释'] [primary key[(字段1, 字段2, ...)]] [auto_increment] [unique key[(字段1, 字段2, ...)]], ...... ) [engine=engine_name] [default] [charset=[字符集](#数据库字符集)] [collate=[排序规则](#数据库排序规则)];
- IF NOT EXISTS: 如果表不存在则创建
 数据库名.: 在没有使用use指定数据库名字的情况下, 可以通过指定数据库名字创建到对应数据库中.- 字段选项:
 
not null: 字段不能为null.default: 默认内容.comment: 注释.primary key: 主键, 如果需要设置复合主键的话添加各个字段名.auto_increment: 内容自增.unique key: 唯一键, 复合唯一键添加各个字段名.- 建表选项
 
# example
创建一张表.
- id: 不能为空, 自增, 主键.
 - name: 最长15个字符, 不能为空.
 - age: 最大255, 不能为空.
 - height_cm: 最大255, null表示不设定.
 - gender: 性别.
 - create_at: 不能为空, 默认是数据添加时间
 - update_at: 但数据发生更新时, 自动更新该字段的时间为当前时间.
 - update_by: 修改人id, 为它创建一个索引.
 
 | 
 | 
# 删除数据表
drop table [数据库名.]表名;
# 修改数据表
用到了在更新~ 现在懒得更新哈哈, 但是大致使用该命令: alter table add/drop ...
# example
 | 
 | 
 | 
 | 
# 查看数据表
show tables [like ‘表达式’];
like: 表达式, 可以使用
_表示匹配单个字符;%表示匹配多个字符.查看表结构:
- describe 表名;
 - desc 表名;
 - show columns from 表名;
 
# example 1
显示所有表
 | 
 | 
# example 2
显示users结尾的所有表
 | 
 | 
# 新增数据表, 从已有的表迁移结构
create table [数据库名.]表名(复制到的位置) like [数据库名.]表名(从哪里复制的位置);
# example
 | 
 | 
# 数据操作
# 新增数据
insert into 表名[(字段列表)[,…]] values(值)[,…];
insert命令还有其他更多选项可以输入, 等我用到了再更新吧哈哈
# example 1
 | 
 | 
# example 2
 | 
 | 
# 删除数据
delete from [数据库名.]表名 [where 条件表达式];
truncate table 表名;
truncate会直接清空整张表, 包括自增长键的起始值. delete则是删除部分键, 如果删除全部数据的话, 自增键的值不会被重置.
# example
删除表中所有数据: delete from users;
删除name为kaylee的数据.
 | 
 | 
# 修改数据
update [数据库名.]表名 set 字段名 = 值[, …] [where 条件表达式];
# example
修改所有数据的update_by值: update users set update_by = 1;
修改name为kaylee的height_cm
 | 
 | 
# 查看数据
select 字段名[ as 别名][,…] from [数据库名.]表名 [where 条件表达式[ and/or 表达式 …]] [group by 字段名[,…]] [having 条件表达式] [order by 字段名[,…] [排序方式]] [limit 数量] [distinct];
- 字段名可以使用*号表示所有字段
 - 条件表达式:
 name = 'kaylee'age >= 24name in ('张三', '李四')group by: 数据分组having: 可以在数据分组后, 使用having进行聚合计算去筛选数据, 该表达式的值只能为Boolean.order by: 排序, 如果不指定排序方式, 默认是ASC(升序), 也可以指定为DESC(降序).limit: 限制结果返回的数量distinct: 不显示重复记录当然了, select语句还有更多的操作, 这里简单展示最常用的, 还有表链接等等.
# example 1
查询全部数据: select * from users;
查询年龄>=24且性别为男的用户.
 | 
 | 
# example 2
查询大于男性平均年龄值的用户, 并按照年龄降序展示. 这里涉及到子表查询, 基础差的同学可能看了会纳闷.
 | 
 | 
# example 3
查询男性平均年龄和女性平均年龄分别是多少, 并按照平均年龄降序排序.
 | 
 | 
# 从SQL文件导入数据
你可以使用下面两种方式导入数据:
# 第一种: 连接时导入
 | 
 | 
# 第二种: 已连接导入
 | 
 | 
# 用户操作
# 新增用户
create user ‘用户名’[@‘主机名’] identified by ‘密码’;
主机名: 不填写主机名, 默认为%, 表示允许所有主机访问.
# example
创建用户名为kaylee, 密码为2CJ^8Tz$rF27f*的用户, 并允许只有本地才能的访问.
 | 
 | 
# 删除用户
drop user ‘用户名’[@‘主机名’];
主机名: 不填写主机名, 默认为%.
# example
 | 
 | 
==注意: 删除用户时, 主机名需要能够匹配上, 如果kaylee的主机是localhost, 直接执行drop user 'kaylee';是无法删除的, 因为省略主机名后, mysql默认去删除'kaylee'@'%', 此时会删除失败.==
# 修改密码
set password for ‘用户名’[@‘主机名’] = password(‘密码’);
主机名: 不填写主机名, 默认为%.
# example
 | 
 | 
# 查看用户
 | 
 | 
# 用户权限操作
# 为用户新增权限
grant 权限名[, …] on [数据库名.]表名 to ‘用户名’[@‘主机名’];
权限名:
- all privileges: 代表全部权限
 - 其他细粒度的权限可以在这里找到
 
表名: 可以使用*.*表示所有数据库的所有表, 也可以使用dbname.*来指定某个数据的所有表.
主机名: 不填写主机名, 默认为%.
# example
将users表的select权限赋予用户kaylee.
 | 
 | 
# 删除用户权限
revoke 权限 on [数据库名.]表名 to ‘用户名’[@‘主机名’];
权限名:
- all privileges: 代表全部权限
 - 其他细粒度的权限可以在这里找到
 
表名: 可以使用*.*表示所有数据库的所有表, 也可以使用dbname.*来指定某个数据的所有表.
主机名: 不填写主机名, 默认为%.
# 查看用户权限
show grants for ‘用户名’[@‘主机名’];
主机名: 不填写主机名, 默认为%.
# example
 | 
 | 
# example
回收kaylee对于users表的select权限.
 | 
 | 
# 同步/生效权限
 | 
 | 
# 其他操作
# 设置数据库字符集
其他字符集内容参考数据库字符集
 | 
 | 
执行上面命令等同于执行:
 | 
 | 
# 查看MYSQL信息
# 查看全部信息
 | 
 | 
# 查看数据库字符集信息
 | 
 | 
# 数据库字符集
| 字符集 | 长度 | 说明 | 
|---|---|---|
| latin1 | 1 | MySQL默认字符集 | 
| GBK | 2 | 支持中文,但是不是国际通用字符集 | 
| UTF-8 | 3 | 支持中英文混合场景,是国际通用字符集 | 
| utf8mb4 | 4 | 完全兼容UTF-8,用四个字节存储更多的字符 | 
更多内容可以使用show charset;命令在mysql中查看.
# 数据库排序规则
| 排序规则 | 说明 | 
|---|---|
| utf8mb4_unicode_ci | 基于标准的Unicode来排序和比较, 能够在各种语言之间精确排序, 不区分大小写 | 
| utf8mb4_general_ci | 排序速度更快, 但在遇到某些特殊语言或者字符集,排序结果可能不一致, 不区分大小写 | 
utf8mb4_unicode_ci为了能够处理特殊字符的情况, 实现了略微复杂的排序算法.
更多内容可以使用show charset;命令在mysql中查看.
# 数据库类型
# 数值型
| 类型 | 范围(有符号) | 范围(无符号) | 
|---|---|---|
| TINYINT[(M)] [UNSIGNED] [ZEROFILL] | -128 to 127 | 0 to 255 | 
| SMALLINT[(M)] [UNSIGNED] [ZEROFILL] | -32768 to 32767 | 0 to 65535 | 
| MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] | -8388608 to 8388607 | 0 to 16777215 | 
| INT[(M)] [UNSIGNED] [ZEROFILL] | -2147483648 to 2147483647 | 0 to 4294967295 | 
| INTEGER[(M)] [UNSIGNED] [ZEROFILL] | 同INT | 同INT | 
| BIGINT[(M)] [UNSIGNED] [ZEROFILL] | -9223372036854775808 to 9223372036854775807 | 0 to 18446744073709551615 | 
| DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL] | M1~65, D0~30. D默认为 0. M默认为 10. M是总位数 | 
从MySQL 8.0.17开始,UNSIGNED属性已被弃用. | 
| FLOAT[(M,D)] [UNSIGNED] [ZEROFILL] 从 MySQL 8.0.17开始, 此语法已被弃用. | 
-3.402823466E+38 to -1.175494351E-38. 省略M和D,则值将存储到硬件允许的限制内. | 
0/1.175494351E-38 to 3.402823466E+38. 从MySQL 8.0.17开始,UNSIGNED属性已被弃用. | 
| FLOAT(p) [UNSIGNED] [ZEROFILL] | 如果p为0~24,则数据类型为FLOAT. 如果p为25~53,则数据类型为DOUBLE. 结果范围与前面描述的FLOAT或后面描述的DOUBLE相同. FLOAT(p)语法是为了兼容 ODBC. | 
从MySQL 8.0.17开始,UNSIGNED属性已被弃用. | 
| DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL] 从 MySQL 8.0.17开始, 此语法已被弃用. | 
-1.7976931348623157E+308 to -2.2250738585072014E-308. 省略M和D,则值将存储到硬件允许的限制内. | 
0/2.2250738585072014E-308 to 1.7976931348623157E+308. 从MySQL 8.0.17开始,UNSIGNED属性已被弃用. | 
# 类型中的M解释
M表示总数字位数, 可以不指定, 默认存储到硬件允许的限制内.
TINYINT(1) 只能存储一位数字, 即范围为0~9.
# DECIMAL类型
DECIMAL(6,2): 最多可以存储6位数字,小数位数为2位; 因此,列的范围是从-9999.99到9999.99。
从上面的表格可以看出, 从MySQL 8.0.17开始, 存储带有小数的内容推荐应该使用DECIMAL类型.
# 日期和时间类型
| 类型 | 范围 | 格式 | 
|---|---|---|
| DATE | ‘1000-01-01’ to ‘9999-12-31’ | ‘YYYY-MM-DD’ | 
| DATETIME[(fsp)] | ‘1000-01-01 00:00:00.000000’ to ‘9999-12-31 23:59:59.499999’ | ‘YYYY-MM-DD hh:mm:ss[.fraction]’. .fraction表示微秒 | 
| TIMESTAMP[(fsp)] | ‘1970-01-01 00:00:01.000000’ to ‘2038-01-19 03:14:07.499999’ | 10位(秒级)的时间戳[.fraction]. .fraction表示微妙 | 
| TIME[(fsp)] | ‘-838:59:59.000000’ to ‘838:59:59.000000’ | ‘hh:mm:ss[.fraction]’. .fraction表示微妙 | 
| YEAR[(4)] | 4 位数字格式的年份 | YYYY | 
# 类型中的fsp解释
可以给出0~6范围内的可选fsp值来指定小数秒精度. 值0表示没有小数部分. 如果省略,则默认为 0.
# DATETIME和TIMESTAMP类型配置自动填写
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
DEFAULT: 表示数据被时间时自动填充当前时间ON UPDATE: 表示数据被更新时自动填充当前时间
# 字符串类型
| 类型 | 范围 | 说明 | 
|---|---|---|
| CHAR[(M)] [CHARACTER SET charset_name] [COLLATE collation_name] | 取决于M, M的取值范围0~255. | 固定长度字符串,存储时始终用空格右填充至指定长度。检索 CHAR 值时会删除尾随空格 | 
| VARCHAR(M) [CHARACTER SET charset_name] [COLLATE collation_name] | 取决于实际大小, 但不能超过M. M的范围是0~65535. | 
可变长度字符串 | 
| ENUM(‘value1’,‘value2’,…) [CHARACTER SET charset_name] [COLLATE collation_name] | 只能存储一个值字符串对象. 其中ENUM最大长度为65535个元素 | 
一个字符串对象,只能有一个值,从值列表“value1”、“value2”、…、NULL 或特殊的“错误值”中选择。 ENUM 值在内部表示为整数。 | 
| SET(‘value1’,‘value2’,…) [CHARACTER SET charset_name] [COLLATE collation_name] | 不清晰 | 可以有零个或多个值字符串对象,每个值都必须从值列表中选择。SET 值在内部表示为整数。 |