# 连接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 4
create 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 >= 24
name 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] | M 1D 0D 默认为 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 为0FLOAT . 如果p 为25DOUBLE . 结果范围与前面描述的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 值在内部表示为整数。 |