MySQL系列学习1~3

一、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类数据类型

  • 整数类型bitbooltinyintsmallintmediumintintbigint
  • 浮点数类型floatdoubledecimal
  • 字符串类型charvarchartinyblobblobmediumbloblongblobtinytexttextmediumtextlongtext
  • 日期类型DateDateTimeTimeStampTimeYear
  • 其他数据类型:暂不介绍,用的比较少。

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 '密码'];

说明:

  1. 主机名默认值为%,表示这个用户可以从任何主机连接mysql服务器

  2. 密码可以省略,表示无密码登录

示例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.userhost字段的查询权限,最后又通过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;刷新权限信息(权限启动的时候在内存中保存着,通过表的方式修改之后需要刷新一下)。

你可能感兴趣的:(数据库学习)