一、MySQL基础知识
1.概念
DB:数据库,存储数据的容器。
DBMS:数据库管理系统,又称为数据库软件或数据库产品,用于创建或管理DB。
SQL:结构化查询语言,用于和数据库通信的语言,不是某个数据库软件持有的,而是几乎所有的主流数据库软件通用的语言。
2.数据库存储数据的特点
- 数据存放在表中,然后表存放在数据库中
- 一个库中可以有多张表,每张表具有唯一的名称(表名)来标识自己
- 表中有一个或多个列,列又称为“字段”,相当于java中的“属性”
- 表中每一行数据,相当于java中的“对象”
3.常见命令
- 显示所有数据库:show databases;
- 进入指定的库:use 库名;
- 显示当前库中所有的表:show tables;
- 查看其他库中所有的表:show tables from 库名;
- 查看表的创建语句:show create table 表名;
- 查看表结构:desc 表名;
4.sql语句分类
- DQL(Data Query Language):数据查询语言
select 相关语句 - DML(Data Manipulate Language):数据操作语言
insert 、update、delete 语句 - DDL(Data Define Languge):数据定义语言
create、drop、alter 语句 - TCL(Transaction Control Language):事务控制语言
set autocommit=0、start transaction、savepoint、commit、rollback
二、MySQL数据类型
1. 5类数据类型
- 整数类型:
bit
、bool
、tinyint
、smallint
、mediumint
、int
、bigint
- 浮点数类型:
float
、double
、decimal
- 字符串类型:
char
、varchar
、tinyblob
、blob
、mediumblob
、longblob
、tinytext
、text
、mediumtext
、longtext
- 日期类型:
Date
、DateTime
、TimeStamp
、Time
、Year
- 其他数据类型:暂不介绍,用的比较少。
2.类型选择
- 选小不选大:一般情况下选择可以正确存储数据的最小数据类型,越小的数据类型通常更快,占用磁盘,内存和CPU缓存更小。
- 简单就好:简单的数据类型的操作通常需要更少的CPU周期,例如:整型比字符操作代价要小得多,因为字符集和校对规则(排序规则)使字符比整型比较更加复杂。
- 尽量避免NULL:尽量制定列为NOT NULL,除非真的需要NULL类型的值,有NULL的列值会使得索引、索引统计和值比较更加复杂。
- 浮点类型的建议统一选择decimal
- 记录时间的建议使用int或者bigint类型,将时间转换为时间戳格式,如将时间转换为秒、毫秒,进行存储,方便走索引
三、用户权限管理
Mysql权限验证分为2个阶段:
阶段1:连接数据库,此时mysql会根据你的用户名及你的来源(ip或者主机名称)判断是否有权限连接
阶段2:对mysql服务器发起请求操作,如create table、select、delete、update、create index等操作,此时mysql会判断你是否有权限操作这些指令
权限生效时间
用户及权限信息放在库名为mysql的库中,mysql启动时,这些内容被读进内存并且从此时生效,所以如果通过直接操作这些表来修改用户及权限信息的,需要重启mysql
或者执行flush privileges;
才可以生效。
查看mysql中所有用户
用户信息在mysql.user
表中
创建用户
语法
create user 用户名[@主机名] [identified by '密码'];
说明:
-
主机名默认值为%,表示这个用户可以从任何主机连接mysql服务器
-
密码可以省略,表示无密码登录
示例1:test1的主机为localhost表示本机,此用户只能登陆本机的mysql
create user 'test1'@'localhost' identified by '123';
示例2:test2可以从任何机器连接到mysql服务器
create user 'test2'@% identified by '123';
示例3:test3可以从192.168.11段的机器连接mysql
create user 'test3'@'192.168.11.%' identified by '123';
修改密码
方式1:通过管理员修改密码
SET PASSWORD FOR '用户名'@'主机' = PASSWORD('密码');
方式2:create user 用户名[@主机名] [identified by '密码'];
set password = password('密码');
方式3:通过修改mysql.user表修改密码
use mysql;
update user set authentication_string = password('321') where user = 'test1' and host = '%';
flush privileges;
注意:通过表的方式修改之后,需要执行flush privileges;
才能对用户生效
给用户授权
用户创建以后,需要给用户授权,才有意义
语法:
grant privileges ON database.table TO 'username'[@'host'] [with grant option]
说明:
-
priveleges (权限列表),可以是
all
,表示所有权限,也可以是select、update
等权限,多个权限之间用逗号分开。 -
ON 用来指定权限针对哪些库和表,格式为
数据库.表名
,点号前面用来指定数据库名,点号后面用来指定表名,*.* 表示所有数据库所有表。 -
TO 表示将权限赋予某个用户, 格式为
username@host
,@前面为用户名,@后面接限制的主机,可以是IP、IP段、域名以及%,%表示任何地方。 -
WITH GRANT OPTION 这个选项表示该用户可以将自己拥有的权限授权给别人。注意:经常有人在创建操作用户的时候不指定WITH GRANT OPTION选项导致后来该用户不能使用GRANT命令创建用户或者给其它用户授权。
备注:可以使用GRANT重复给用户添加权限,权限叠加,比如你先给用户添加一个select权限,然后又给用户添加一个insert权限,那么该用户就同时拥有了select和insert权限
示例1:给test1授权可以操作所有库所有权限,相当于dba
grant all on *.* to 'test1'@‘%’;
示例2:给test1授权可以操作所有库所有权限,相当于dba
grant select on seata.* to 'test1'@'%';
示例3:test1可以对seata库中所有的表执行select、update
grant select,update on seata.* to 'test1'@'%';
示例4:test1用户只能查询mysql.user表的user,host字段
grant select(user,host) on mysql.user to 'test1'@'localhost';
查看用户权限
show grants for '用户名'[@'主机']
主机可以省略,默认值为%
查看当前用户的权限:show grants;
撤销用户的权限
语法:
revoke privileges ON database.table FROM '用户名'[@'主机'];
可以先通过show grants
命令查询一下用户对于的权限,然后使用revoke
命令撤销用户对应的权限,示例:
mysql> show grants for 'test1'@'localhost';
+--------------------------------------------------------------------+
| Grants for test1@localhost |
+--------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test1'@'localhost' |
| GRANT SELECT (host, user) ON `mysql`.`user` TO 'test1'@'localhost' |
+--------------------------------------------------------------------+
2 rows in set (0.00 sec)
mysql> revoke select(host) on mysql.user from test1@localhost;
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for 'test1'@'localhost';
+--------------------------------------------------------------+
| Grants for test1@localhost |
+--------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test1'@'localhost' |
| GRANT SELECT (user) ON `mysql`.`user` TO 'test1'@'localhost' |
+--------------------------------------------------------------+
2 rows in set (0.00 sec)
上面我们先通过grants
命令查看test1的权限,然后调用revoke命令撤销对mysql.user
表host
字段的查询权限,最后又通过grants命令查看了test1的权限,和预期结果一致
删除用户【2种方式】
1,rop user '用户名'[@‘主机’],示例:
mysql> drop user test1@localhost;
Query OK, 0 rows affected (0.00 sec)
drop的方式删除用户之后,用户下次登录就会起效
2,通过删除mysql.user表数据的方式删除,如下:
delete from user where user='用户名' and host='主机';
flush privileges;
注意通过表的方式删除的,需要调用flush privileges;
刷新权限信息(权限启动的时候在内存中保存着,通过表的方式修改之后需要刷新一下)。