第一篇***Mysql预备基础知识

一、数据库常见的概念

1、DB: 数据库,存储数据的容器。

2、DBMS:数据库管理系统,用于管理或创建DB。

3、SQL:结构化查询语言,用它与数据库通信,几乎所有主流数据库软件通用的语言。

4、SQL语言分为:

  • DQL(data query language):数据查询语言select相关语句;
  • DML(data manipulate language):数据操作语句insert、update、delete语句;
  • DDL(data define language):数据定义语言create、drop、alter语句;
  • TCL(transaction control language):事务控制语言set autocommit=0、start transcation、savepoint、commit、rollback;

二、数据库存储数据的特点

1、数据存在表里,表存在数据库中;

2、一个库中可有多张表,每张表具有唯一的表名来标识自己;

3、表中有一个或多个列,列又称”字段“,相当于java中的属性;

4、表中每一行数据,相当于java中的对象

三、Mysql常用的一些命令

win+R , cmd

扫描二维码关注公众号,回复: 13008212 查看本文章

进入services.msc 会打开服务窗口,在服务窗⼜中找到MySQL服务,点击右键可以启动或者停⽌。

停止命令:net stop mysql

启动命令:net start mysql

若报错:mysql启动命令发生系统错误 5。 拒绝访问。

这种情况是因为当前用户操作权限太低,使用管理员身份运行cmd即可正常。

1、mysql登录
mysql -h localhost -P 3306 -u root -p
说明:
-P大写的P后面跟上端口; 
如果是登录本地账号,ip和端口可以省略,如:mysql -u 用户名 -p
可以通过上面的命令连接原创机器的mysql
2、查看数据库版本
未登录状态:mysql --version  或  mysql -V
登录状态:select version();
3、显示所有数据库
show databases;

4、进入指定的库
use 库名;

5、显示当前库中的所有表
show tables;

6、查看其他库中的所有表
show tables from 库名;

7、查看表的创建语句
show create table 表名;

8、查看表结构
desc 表名;

9、查看当前所在库
select database();

10、查看当前mysql支持的存储引擎
show engines;

11、查看系统变量及其值
show variables;

12、查看某个系统变量
show variables like '变量名';
eg:
show variables like 'wait_timeout';
show variables like '%wait_timeout%t';
  • 不区分大小写,建议关键字大写,表明和列名小写
  • 每条命令最好以英文分号结尾
  • 每条命名根据需要进行缩进或换行
  • 单行注释:#注释文字 或者 – 注释文字,这里需要加空格;
  • 多行注释:/* 注释文字 */

四、MySQL中数据类型

主要包括以下五类:

  • 整数类型:bit,bool,tinyint,smallint,mediumint,int,bigint
  • 浮点数类型:float,double,decimal
  • 字符串类型:char,varchar,tinyblob,blob,mediumblob,longblob,tinytext,text,mediumtext,longtext
  • 日期类型:Date,TateTime,TimeStamp,Time,Year
  • 其他数据类型

示例1:整数类型——有符号类型与无符号类型

mysql> create database test;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |      |
| comperformance     |
| covid19_beta       |
| db_dorm            |
| kettle_demo        |
| mysql              |
| test               |
+--------------------+
8 rows in set (0.00 sec)

mysql> use test;
Database changed

mysql># 有符号类型
mysql> create table demo1(
    -> c1 tinyint
    -> );
Query OK, 0 rows affected (0.11 sec)

mysql> create table demo2(c2 tinyint);
Query OK, 0 rows affected (0.42 sec)

mysql> insert into demo1 values(-pow(2,7)),(pow(2,3)-3);
Query OK, 2 rows affected (0.06 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from demo1;
+------+
| c1   |
+------+
| -128 |
|    5 |
+------+
2 rows in set (0.00 sec)


mysql># 无符号类型
mysql> create table demo3(c1 tinyint unsigned);
Query OK, 0 rows affected (0.19 sec)

mysql> insert into demo3 values(-1);
ERROR 1264 (22003): Out of range value adjusted for column 'c1' at row 1

mysql> insert into demo3 values (pow(2,8)+1);
ERROR 1264 (22003): Out of range value adjusted for column 'c1' at row 1

mysql> insert into demo3 values(0),(pow(2,8)-1);
Query OK, 2 rows affected (0.09 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from demo3;
+------+
| c1   |
+------+
|    0 |
|  255 |
+------+
2 rows in set (0.00 sec)

mysql># C1是无符号的tinyint类型的,插入了负数会报错

示例2:浮点类型——容易出错,要仔细

float数值类型⽤于表⽰单精度浮点数值,⽽double数值类型⽤于表⽰双精度浮点数值,float和double都是浮点型,⽽decimal是定点型。浮点型和定点型可以⽤类型名称后加(M,D)来表⽰,M表⽰该值的总共长度,D表⽰⼩数点后⾯的长度,M和D又称为精度和标度。

float和double在不指定精度时,默认会按照实际的精度来显⽰,⽽DECIMAL在不指定精度时,默认整数为10,⼩数为0。

mysql> use test;
Database changed
mysql> create table test5(a float(5,2),b double(5,2),c decimal(5,2));
Query OK, 0 rows affected (0.18 sec)

mysql> insert into test5 values (1,1,1),(2.1,2.1,2.1),(3.123,3.123,3.123),(4.125,4.125,4.125),(5.115,5.115,5.115),(6.126,6.126,6.126),(7.116,7.116,7.116),(8.1151,8.1151,8.1151),(9.1251,9.1251,9.1251),(10.11501,10.11501,10.11501),(11.12501,11.12501,11.12501);
Query OK, 11 rows affected, 9 warnings (0.04 sec)
Records: 11  Duplicates: 0  Warnings: 9

mysql> select * from test5;
+-------+-------+-------+
| a     | b     | c     |
+-------+-------+-------+
|  1.00 |  1.00 |  1.00 |
|  2.10 |  2.10 |  2.10 |
|  3.12 |  3.12 |  3.12 |
|  4.13 |  4.13 |  4.13 |
|  5.12 |  5.12 |  5.12 |
|  6.13 |  6.13 |  6.13 |
|  7.12 |  7.12 |  7.12 |
|  8.12 |  8.12 |  8.12 |
|  9.13 |  9.13 |  9.13 |
| 10.12 | 10.12 | 10.12 |
| 11.13 | 11.13 | 11.13 |
+-------+-------+-------+
11 rows in set (0.00 sec)

######################################################################
说明(注意看):
c是decimal类型,认真看⼀下输⼊和输出,发现decimal采⽤的是四舍五⼊认真看⼀下a和b的输⼊和输出,不是四舍五⼊,float和double采⽤的是四舍六⼊五成双,decimal插⼊的数据超过精度之后会触发警告。

什么是四舍六⼊五成双?
就是5以下舍弃,5以上进位,如果需要处理数字为5的时候,需要看5后⾯是否还有不为0的任何数字,如果有,则直接进位,如果没有,需要看5前⾯的数字,若是奇数则进位,若是偶数则将5舍掉

我们将浮点类型的(M,D)精度和标度都去掉,看看效果:

mysql> create table test6(a float,b double,c decimal);
Query OK, 0 rows affected (0.17 sec)

mysql> insert into test6 values (1,1,1),(1.234,1.234,1.4),(1.234,0.01,1.5);
Query OK, 3 rows affected, 2 warnings (0.16 sec)
Records: 3  Duplicates: 0  Warnings: 2

mysql> select * from test6;
+-------+-------+------+
| a     | b     | c    |
+-------+-------+------+
|     1 |     1 |    1 |
| 1.234 | 1.234 |    1 |
| 1.234 |  0.01 |    2 |
+-------+-------+------+
3 rows in set (0.00 sec)

#######################################################################
a和b的数据正确插⼊,⽽c被截断了浮点数float、double如果不写精度和标度,则会按照实际显⽰decimal不写精度和标度,⼩数点后⾯的会进⾏四舍五⼊,并且插⼊时会有警告!	

再看看下面的代码:
mysql> select sum(a),sum(b),sum(c) from test5;
+--------+--------+--------+
| sum(a) | sum(b) | sum(c) |
+--------+--------+--------+
|  67.22 |  67.22 |  67.22 |
+--------+--------+--------+
1 row in set (0.00 sec)

mysql> select sum(a),sum(b),sum(c) from test6;
+-----------------+--------+--------+
| sum(a)          | sum(b) | sum(c) |
+-----------------+--------+--------+
| 3.4679999351501 |  2.244 |      4 |
+-----------------+--------+--------+
1 row in set (0.00 sec)
########################################################################
从上⾯sum的结果可以看出float、double会存在精度问题,decimal精度正常的,⽐如银⾏对统计结果要求⽐较精准的建议使⽤decimal。

补充:

类型N说明

在开发中,我们会碰到有些定义整型的写法是int(N),这种写法在开发中没什么用,我们只需要记住两点:

  • 无论N等于多少,int只占4个字节。
  • N表示的是显示宽度,不足以0补足,超过的无视长度只显示整个数字,但要整型设置了unsigned zerofill才有效。

示例:

mysql> CREATE TABLE test3 ( `a` int, `b` int(5), `c` int(5) unsigned, `d` int(5) zerofill, `e` int(5) unsigned zerofill, `f` int zerofill, `g` int unsigned zerofill );
Query OK, 0 rows affected (0.17 sec)

mysql> insert into test3 values (1,1,1,1,1,1,1),(11,11,11,11,11,11,11),(12345,12345,12345,12345,12345,12345,12345);
Query OK, 3 rows affected (0.14 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from test3;
+-------+-------+-------+-------+-------+------------+------------+
| a     | b     | c     | d     | e     | f          | g          |
+-------+-------+-------+-------+-------+------------+------------+
|     1 |     1 |     1 | 00001 | 00001 | 0000000001 | 0000000001 |
|    11 |    11 |    11 | 00011 | 00011 | 0000000011 | 0000000011 |
| 12345 | 12345 | 12345 | 12345 | 12345 | 0000012345 | 0000012345 |
+-------+-------+-------+-------+-------+------------+------------+
3 rows in set (0.00 sec)

mysql> show create table test3;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                  |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test3 | CREATE TABLE `test3` (
  `a` int(11) default NULL,
  `b` int(5) default NULL,
  `c` int(5) unsigned default NULL,
  `d` int(5) unsigned zerofill default NULL,
  `e` int(5) unsigned zerofill default NULL,
  `f` int(10) unsigned zerofill default NULL,
  `g` int(10) unsigned zerofill default NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql># show create table test3; 输出了表test3的创建语句,和我们原始的创建语句不一样,原始的d字段用的是无符号的,可以看出当时使用了zerofill自动会将无符号变为有符号。

说明:int(5)输出宽度不满5时,前⾯⽤0来进⾏填充int(n)中的n省略的时候,宽度为对应类型⽆符号最⼤值的⼗进制的长度,如bigint⽆符号最⼤值为-1 = 18,446,744,073,709,551,615;长度是20位

日期类型

字符串类型

char类型占⽤固定长度,如果存放的数据为固定长度的建议使⽤char类型,如:⼿机号码、⾝份证等固定长度的信息。

选⼩不选⼤:⼀般情况下选择可以正确存储数据的最⼩数据类型,越⼩的数据类型通常更快,占⽤磁盘,内存和CPU缓存更⼩。

简单就好:简单的数据类型的操作通常需要更少的CPU周期,例如:整型⽐字符操作代价要⼩得多,因为字符集和校对规则(排序规则)使字符⽐整型⽐较更加复杂。

尽量避免NULL:尽量制定列为NOT	NULL,除⾮真的需要NULL类型的值,有NULL的列值会使得索引、索引统计和值⽐较更加复杂。

浮点类型的建议统⼀选择decimal

记录时间的建议使⽤int或者bigint类型,将时间转换为时间戳格式,如将时间转换为秒、毫秒,进⾏存储,⽅便⾛索引

五、数据库管理员常用的命令

1、mysql权限工作原理

mysql为了安全性考虑,采⽤主机名+⽤户名来判断⼀个⽤户的⾝份,因为在互联⽹中很难通过⽤户名来判断⼀个⽤户的⾝份,但是我们可以通过ip或者主机名判断⼀台机器,某个⽤户通过这个机器过来的,我们可以识别为⼀个⽤户,所以mysql中采⽤⽤户名+主机名来识别⽤户的⾝份。当⼀个⽤户对mysql发送指令的时候,mysql就是通过⽤户名和来源(主机)来断定⽤户的权限。

2、权限验证分为两个阶段:

阶段1:连接数据库,此时mysql会根据你的⽤户名及你的来源(ip或者主机名称)判断是否有权限连接;

阶段2:对mysql服务器发起请求操作,如create table、select、delete、update、create index等操作,此时mysql会判断你是否有权限操作这些指令;

3、权限生效时间

⽤户及权限信息放在库名为mysql的库中,mysql启动时,这些内容被读进内存并且从此时⽣效,所以如果通过直接操作这些表来修改⽤户及权限信息的,需要重启mysql或者执⾏flush privileges;才可以⽣效。⽤户登录之后,mysql会和当前⽤户之间创建⼀个连接,此时⽤户相关的权限信息都保存在这个连接中,存放在内存中,此时如果有其他地⽅修改了当前⽤户的权限,这些变更的权限会在下⼀次登录时才会⽣效。

4、常用命令使用

1、用户信息在mysql.user表中
use mysql;
select user,host from user;

2、创建用户
create user 用户名[@主机名] [identified by '密码'];
#主机名默认值%,表示这个用户可以从任何主机连接mysql服务器
#密码可以省略,表示无密码登录
示例1:不指定主机名,表示这个用户可以从任何主机连接mysql服务器
mysql> create user wang;
Query OK, 0 rows affected (0.25 sec)

mysql> select user,host from user;
+------+-----------+
| user | host      |
+------+-----------+
| wang | %         |
| root | localhost |
+------+-----------+
2 rows in set (0.00 sec)

mysql> exit;
Bye

C:\Windows\system32>mysql -uwang
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 50 to server version: 5.0.24a-community-nt

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>
###############################################################################
上⾯创建了⽤户名为wang⽆密码的⽤户,没有指定主机,可以看出host的默认值为%,表⽰wang可以从任何机器登录到mysql中。

⽤户创建之后可以在mysql库中通过select user,host from user;查看到。
###############################################################################
其他示例:
create user 'wang2'@'localhost' identifiled by '123';
说明:wang2的主机为localhost表⽰本机,此⽤户只能登陆本机的mysql	

create user 'wang3'@% identifiled by '123';
说明:wang3可以从任何机器连接到mysql服务器

create user 'wang4'@'192.168.11.%' identifiled by '123';
说明:wang4可以从192.168.11段的机器连接mysql	


3、修改密码
(1)管理员修改
set password for '用户名'@'主机' = password('密码');
(2)create user 用户名[@主机名][identifiled by '密码'];
set password = password('密码');
(3)修改mysql.user表修改密码
user mysql;
update user set authentication_string = password('321') where user = 'wang' and host='%';
flush privileges; # 对用户生效
##5.7中user表中的authentication_string字段表⽰密码,⽼的⼀些版本中密码字段是password。


4、给用户授权
创建用户后,需要给用户授权,才有意义。
grant privileges ON database.table TO 'username'[@'host'] [with grant option]

grant命令说明:
(1)priveleges(权限列表),可以是all,表⽰所有权限,也可以是select、update等权限,多个权限之间⽤逗号分开。
(2)ON ⽤来指定权限针对哪些库和表,格式为数据库.表名,点号前⾯⽤来指定数据库名,点号后⾯⽤来指定表名,*.*表⽰所有数据库所有表。
(3)TO 表⽰将权限赋予某个⽤户,格式为username@host,@前⾯为⽤户名,@后⾯接限制的主机,可以是IP、IP段、域名以及%,%表⽰任何地⽅。
(4)with grant option	这个选项表⽰该⽤户可以将⾃⼰拥有的权限授权给别⼈。注意:经常有⼈在创建操作⽤户的时候不指定with grant option选项导致后来该⽤户不能使⽤grant命令创建⽤户或者给其它⽤户授权。备注:可以使⽤GRANT重复给⽤户添加权限,权限叠加,⽐如你先给⽤户添加⼀个select权限,然后又给⽤户添加⼀个insert权限,那么该⽤户就同时拥有了select和insert权限。

示例:
grant all on *.* to 'test1'@'%';
说明:给test1授权可以操作所有库所有权限,相当于dba	

grant select on seata.* to 'test1'@'%';
说明:test1可以对seata库中所有的表执⾏select	

grant select,update on seata.* to 'test1'@'%';
说明:test1可以对seata库中所有的表执⾏select、update	

grant select(user,host) on mysql.user to 'test1'@'localhost';
说明:test1⽤户只能查询mysql.user表的user,host字段


5、查看用户有哪些权限
(1)show grants for '用户名'[@'主机']
主机可以省,默认值%
eg:show grants for 'test1'@'localhost';

(2)show grants;
查看当前用户权限
eg:show grants;

6、撤销用户的权限
revoke privileges ON database.table FROM '用户名'[@'主机'];
可以先通过show grants命令查询⼀下⽤户对于的权限,然后使⽤revoke命令撤销⽤户对应的权限.
eg:
show grants for 'test1'@'localhost';
revoke select(host) ON mysql.user from test1@localhost;
show grants for 'test1'@'localhost';
上⾯我们先通过grants命令查看test1的权限,然后调⽤revoke命令撤销对mysql.user表host字段的查询权限,最后又通过grants命令查看了test1的权限,和预期结果⼀致。


7、删除用户
(1)drop user'用户名'[@'主机']
eg:drop user test1@localhost;
drop的⽅式删除⽤户之后,⽤户下次登录才生效。

(2)通过删除mysql.user表数据的方式删除
eg:
delete from user where user='用户名' and host='主机';
flush privileges;
注意通过表的⽅式删除的,需要调⽤flush privileges;刷新权限信息(权限启动的时候在内存中保存着,通过表的⽅式修改之后需要刷新⼀下)。

1、只授予能满⾜需要的最⼩权限,防⽌⽤户⼲坏事,⽐如⽤户只是需要查询,那就只给select权限就可以了,不要给⽤户赋予update、insert或者delete权限;

2、创建⽤户的时候限制⽤户的登录主机,⼀般是限制成指定IP或者内⽹IP段;

3、初始化数据库的时候删除没有密码的⽤户,安装完数据库的时候会⾃动创建⼀些⽤户,这些⽤户默认没有密码;

4、为每个⽤户设置满⾜密码复杂度的密码;

5、定期清理不需要的⽤户,回收权限或者删除⽤户;

总结

1.通过命令的⽅式操作⽤户和权限不需要刷新,下次登录⾃动⽣效;

2.通过操作mysql库中表的⽅式修改、⽤户信息,需要调⽤flush privileges;刷新⼀下,下次登录⾃动⽣效;

3.mysql识别⽤户⾝份的⽅式是:⽤户名+主机;

4.本⽂中讲到的⼀些指令中带主机的,主机都可以省略,默认值为%,表⽰所有机器;

5.mysql中⽤户和权限的信息在库名为mysql的库中;

猜你喜欢

转载自blog.csdn.net/qq_46009608/article/details/112966250