下载
MySQL5.7.24
下载连接:MySQL :: Download MySQL Community Server (Archived Versions)
下载后,解压缩到某个文件路径。配置环境变量:
新建配置文件my.ini 保存到mysql的根目录:
[mysql]
default-character-set=utf8
[mysqld]
character-set-server=utf8
default-storage-engine=INNODB
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
保存为my.ini。
打开cmd。初始化mysql:
mysqld --initialize-insecure
如果报了这个错,就需要以管理员的方式启动cmd:
注册mysql服务:
mysqld -install
启动或停止mysql服务:
net start mysql
net stop mysql
可以先从电脑的服务上看一下mysql服务叫什么名,是不是叫mysql还是ysql57之类。
修改默认用户密码:
mysqladmin -u root password root123
启动mysql:
mysql -uroot -p
退出mysql:
CTRL+C
quit
exit
登录参数:
mysql -u用户名 -p密码 -h要连接的mysql服务器的ip地址(默认127.0.0.1) -P端口号(默认3306)
mysql卸载:
mysqld -remove mysql
然后移除环境变量,删除目录即可。
命令行访问
mysql -u root -p
输入密码
SQL
SQL通用语法
1. SQL语句可以单行或多行书写,以分号结尾。
2. SQL语句可以使用空格/缩进来增强语句的可读性。
3.MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。4.注释:
. 单行注释:--注释内容或#注释内容(MySQL特有)
. 多行注释:/*注释内容*/
DDL:
mysql所有表全部小写,大写也给你转小写,可使用_下划线。
数据库
show databases; --查询当前连接的所有库
create database [if not exists] 名称; --创建库
drop database [if exists] 名称; --删除库
select database(); -- 查当前
use 数据库名; --选中库,使用该库作为当前库
数据表
show tables; --查当前库所有表
desc 表名; --显示该表的描述:字段、类型、允许null、Key(如主键)、Default(默认值)、Extra(如自增)
/* 创建一个表 */
create table 表名(
字段1 类型1,
...
字段n 类型n
)
# 使用时,注意删除分号后的空格,否则可能执行失败
drop table 表名; --删除表
drop table if exists 表名; --删除表
alter table 表名 rename to 新的表名; --给表重命名
alter table 表名 add 列名 数据类型; --给表添加一个列
alter table 表名 modify 列名 新的数据类型; --修改表字段的类型
alter table 表名 change 列名 新列名 新数据类型; --修改表字段的名字和类型
alter table 表名 drop 列名; --删除掉表中某个列
数据类型
有符号和无符号的字节byte转位bit方法:1个字节为8个二进制位,即2的8次方=256.
2个字节为16个二进制位,即2的16次方=65536.
他们的无符号数值范围为0~255,0~65535。
他们的有符号数值范围为-265/2=-128~127.和-65536/2=-32768-32767.有无符号可以在mysql中字段的类型中设置勾选。
数值类型
数值类型:
mysql中设计表时字段类型位树数值类型的长度其实是类似注释的意思,并不起限制作用。
tinyint -128~127 0~255 1byte 长度有符号4无符号3。
smallint -32768~32767 0~65535 2bytes 长度有符号6无符号5。
mediumint -8388608~8388607 0~16777215 3bytes 长度有符号9无符号8。
int/integer -2147483648~2141483647 0~4294967295 4bytes 长度有符号11无符号10。
bigint -9223372036854775808~9223372036854775807 0~18446744073709551615 8bytes 长度有符号20无符号20。
float 4byte 32个二进制位 1个符号位,8个指数位,23个尾数位
float 取值范围-2的(2的8次方/2=128)128次方~2的128次方即-3.4E+38~3.4E+38 精度为2的23次方8388608,即6~7位
double 8byte 64个二进制位 1个符号位,11个指数位,52个尾数位
double 取值范围-2的(2的11次方/2=1024)1024次方~2的1024 次方即-1.79E+308~1.79E+308 精度为2的52次方4.5035996E+15,即15~16位
decimal 取值范围±1.0E28~±7.9E28 精度28~29位 12bytes
时间日期类型
Date YYYY-MM-DD
Time HH:MM:SS
Year YYYY
DataTime YYYY-MM-DD HH:MM:SS
TimeStamp YYYY-MM-DD HH:MM:SS 范围是'1970-01-01 00:00:00'到2037年
字符串类型
utf-8中文字符和符号均占3个字节 英文和数字均占1个字节
GBK中文每个字符占用2个字节,英文1个字节
blob是一个存储原始数据类型的容器,可以存计算机上的任何东西,本质都是二进制。
char 0~255bytes mysql字段可设置长度起限制作用 定长字符串
varchar 0~65535bytes mysql字段可设置长度起限制作用 变长字符串
tinyblob 0~255bytes 存二进制文件如图片音频
tinytext 0~255bytes mysql字段无法设置长度 定长文本
blob 0~65535bytes 63kb 存二进制文件如图片音频
text 0~65535bytes 63kb mysql字段无法设置长度 定长文本
mediumblob 0~16777215bytes 15MB 存二进制文件如图片音频
mediumtext 0~16777215bytes 15MB mysql字段无法设置长度 定长文本
longblob 0~4294967295bytes 3.99GB 存二进制文件如图片音频
longtext 0~4294967295bytes 3.99GB mysql字段无法设置长度 定长文本
使用建议:
1.char长度固定, 即每条数据占用等长字节空间;适合用在身份证号码、手机号码等定。超过255字节的只能用varchar或者text。
2.varchar可变长度,可以设置最大长度;适合用在长度可变的属性。
3.text不设置长度, 当不知道属性的最大长度时,适合用text, 能用varchar的地方不用text。
4.如果都可以选择,按照查询速度: char最快, varchar次之,text最慢。
DML
insert into 表名(列名1,列名2,...) values(值1,值2,...); --按列名插入一条数据
insert into 表名 values(值1,值2,...); --表中所有字段匹配插入一条数据
insert into 表名(列名1,列名2,...) values(值1,值2,...),(值1,值2,...),(值1,值2,...)...; --按列名一次性插入多条数据
insert into 表名 values(值1,值2,...),(值1,值2,...),(值1,值2,...)...; --表中所有字段匹配插入多条数据
update 表名 set 列名1=值1,列名2=值2,... [where 条件]; -- 修改表中记录 注意:无where条件全改
delete from 表名 [where 条件]; --删除表中记录 注意:无where条件全删
DQL
Select
distinct 字段名1,字段名2,
[fun(字段名)]
from 表1
<join类型>join 表2
on <join条件>
where <where条件>
group by <字段>
having <having条件>
order by <排序字段>
limit <起始偏移量,行数>
select 字段列表 from 表名列表 where 条件列表 group by 分组字段 having 分组后条件 order by 排序字段 limit 0,5;
select distinct 字段列表 from 表名;
as关键字给返回的表头起个别名;也可以省略as换成空格
查询条件:
> 、< 、>= 、<= 、= 、<>或!= 、 between...and...在某个范围内(都包含) 、in(...)多选一 、like 占位符(_单任意字符 %多个任意字符) 、 is null 、is not null 、and或&& 、or或|| 、not或!
排序
select 字段列表 from 表名 order by 排序字段1 [排序方式1] , 排序字段2 [排序方式2] ...; //多个排序条件,前面条件一样时才会根据后面条件继续排序。
聚合函数
count(列名) 、max(列名) 、min(列名) 、sum(列名) 、avg(列名)
select 聚合函数名(列名) from 表; //null值不参与聚合运算
分组查询
select 字段列表 from 表名 [where 分组前条件限定] group by 分组字段名 [having 分组后条件过滤] //分组后,查询的字段为聚合函数和分组字段,查询其他字段无意义。
//where是分组前限定,不满足where的不参与分组,having是分组后过滤。where不能对聚合函数判断,而having可以。
//执行顺序:where>聚合函数>having
分页查询
select 字段列表 from 表名 limit 起始索引,查询条目数;
//起始索引为0,=(当前页码-1)*每页展示的条数
DCL
DCL英文全称是Data Control Language(数据控制语言),用来管理数据库用户、控制数据库的访问权限。
用户管理
use mysql; --进入到mysql系统库
select * from user; --查询用户
# 创建用户
create user 'kdy'@'localhost' IDENTIFIED by 'kdy20010226'; --创建用户 只能在当前主机访问mysql
#创建用户kdy666 ,可以在任意主机访问该数据库
create user 'kdy666'@'%' IDENTIFIED by 'kdy20010226';
#修改用户密码
alter user 'kdy666'@'%' identified with mysql_native_password by 'root_123';
#删除用户
drop user 'kdy666'@'%';
drop user 'kdy'@'localhost';
命令行访问 mysql -u kdy -p
权限控制
ALL,ALL PRIVILEGES所有权限、SELECT查询数据、INSERT插入数据、UPDATE修改数据、DELETE删除数据、ALTER修改表、DROP删除数据库/表/视图、CREATE创建数据库/表、其他权限描述及含义,可以直接参考官方文档。
SHOW GRANTS for 'kdy666'@'%';--查询权限
##2.授予权限
grant all on jdbc.* to 'kdy666'@'%'; --只能访问jdbc库的所有表的所有权限,以这个用户登录连接后,只能看到jdbc这个数据库
#3.撤销权限
REVOKE all ON jdbc.* FROM 'kdy666'@'%'
函数
上面学了聚合函数,是函数的一种
count(列名) 、max(列名) 、min(列名) 、sum(列名) 、avg(列名)
select 聚合函数名(列名) from 表; //null值不参与聚合运算
函数是指一段可以直接被另一段程序调用的程序或代码。
1、字符串函数
MySQL中内置了很多字符串函数,常用的几个如下:
CONCAT(S1,S2,..Sn) 字符串拼接,将S1,S2,...Sn拼接成一个字符串
LOWER(str) 将字符串str全部转为小写
UPPER(str) 将字符串str全部转为大写
LPAD(str,n,pad) 左填充,用字符串pad对str的左边进行填充,达到n个字符串长度
RPAD(str,n,pad) 右填充,用字符串pad对str的右边进行填充,达到n个子付中长度
TRIM(str) 去掉字符串头部和尾部的空格(不去除中间的空格)
SUBSTRING(str,start,len) 返回从字符串str从start位置起的len个长度的字符串,它的索引值从1开始的。
/*CONCAT(S1,S2,..Sn) 字符串拼接,将S1,S2,...Sn拼接成一个字符串
LOWER(str) 将字符串str全部转为小写
UPPER(str) 将字符串str全部转为大写
LPAD(str,n,pad) 左填充,用字符串pad对str的左边进行填充,达到n个字符串长度
RPAD(str,n,pad) 右填充,用字符串pad对str的右边进行填充,达到n个子付中长度
TRIM(str) 去掉字符串头部和尾部的空格(不去除中间的空格)
SUBSTRING(str,start,len) 返回从字符串str从start位置起的len个长度的字符串*/
select concat("hello,","world");--hello,world
select LOWER("HELLO,WORLD")--hello,world
select UPPER("hello,world");--HELLO,WORLD
select LPAD("hello",10,"*6") --*6*6*hello
select RPAD("hello",10,"*6*") --hello*6**6
select TRIM(" HELLO world ") --HELLO world
select SUBSTRING("hello,world",2,3) --ell
应用场景,如下:
由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0。比如:1号员工的工号应该为00001。
update emp set workno = lpad(workno,5,'0');
2、数值函数
常见数值函数如下:
CEIL(x) 向上取整
FLOOR(x) 向下取整
MOD(x,y) 返回x/y的模
RAND() 返回(0~1)内的随机数,产生0(包含)到1(不包含)的随机数,
ROUND(x,y) 求参数x的四舍五入的值,保留y位小数
/*
CEIL(x) 向上取整
FLOOR(x) 向下取整
MOD(x,y) 返回x/y的模
RAND() 返回0~1内的随机数
ROUND(x,y) 求参数x的四舍五入的值,保留y位小数*/
select ceil(1.1) --2
select floor(1.9) --1
select mod(3,4) --3/4取余数为3,因为商0余3
select mod(5,2) --5/2取余数为1,因为商2余1
select rand() --返回一个0-1之间的随机数
select ROUND(2.345,2) --2.35
#案例:通过数据库的函数,生成一个六位数的随机验证码。
select lpad( round(rand()*1000000) ,6,0)
3、日期函数
常见的日期函数
CURDATE() 返回当前日期
CURTIME() 返回当前时间
NOW() 返回当前日期和时间
YEAR(date) 获取指定date的年份
MONTH(date) 获取指定date的月份
DAY(date) 获取指定date的日期
DATE_ADD(date, INTERVAL expr type) 返回一个日期/时间值加上一个时间间隔expr后的时间值
DATEDIFF(date1,date2) 返回起始时间date1和结束时间date2之间的天数
/*
CURDATE() 返回当前日期
CURTIME() 返回当前时间
NOW() 返回当前日期和时间
YEAR(date) 获取指定date的年份
MONTH(date) 获取指定date的月份
DAY(date) 获取指定date的日期
DATE_ADD(date, INTERVAL expr type) 返回一个日期/时间值加上一个时间间隔expr后的时间值
DATEDIFF(date1,date2) 返回起始时间date1和结束时间date2之间的天数*/
select CURDATE(); --2023-09-03
select CURTIME(); --12:26:50
select NOW() --2023-09-03 12:27:07.0
select YEAR(NOW()) --2023
select YEAR("2021-2-23") --2021
select YEAR("2020/02/23") --2020
select YEAR("2019.02.7") --2019
select MONTH(NOW()) --9
select MONTH("2021-2-23") --2
select MONTH("2020/06/23") --6
select MONTH("2019.9.7") --9
select DAY(NOW()) --3
select DAY("2021-2-21") --21
select DAY("2020/06/23") --23
select DAY("2019.9.7") --7
select DATE_ADD(now() , INTERVAL 70 day) --2023-11-12 12:32:30.0
select DATE_ADD(now() , INTERVAL 7 month) --2024-04-03 12:33:08.0
select DATE_ADD(now() , INTERVAL 3 year) --2026-09-03 12:33:25.0
select DATEDIFF("2023-11-01","2021-2-6") --998
查询所有员工的入职天数,并根据入职天数倒序排序。
select name,datediff(curdate(),entrydate) as 'entrydays' from emp order by entrydays desc;
4、流程函数
流程函数也是很常用的一类函数,可以在SQL语句中实现条件筛选,从而提高语句的效率。
- lF(value , t , f) 如果value为true,则返回t,否则返回f
- IFNULL(value1 , value2) 如果value1不为空,返回value1,否则返回value2
- CASE WHEN [ val1 ] THEN [res1] ...ELSE [ default ]END 如果val1为true,返回res1, ...否则返回default默认值
- CASE [ expr ] WHEN [ val1 ] THEN [res1] ...ELSE [ default ] END 如果expr的值等于vall,返回res1,...否则返回default默认值
/*lF(value , t , f) 如果value为true,则返回t,否则返回f
IFNULL(value1 , value2) 如果value1不为空,返回value1,否则返回value2
CASE WHEN [ val1 ] THEN [res1] ...ELSE [ default ]END 如果val1为true,返回res1, ...否则返回default默认值
CASE [ expr ] WHEN [ val1 ] THEN [res1] ...ELSE [ default ] END 如果expr的值等于vall,返回res1,...否则返回default默认值*/
select if(true,"OK","Error") --OK,这里的true位置直接写死了,正常应该为一个条件表达式
select ifnull("OK","default") --OK 正常第一个参数是否为null,注意""空串不为null
select ifnull(null,"default") --default
#需求:查询emp表的员工姓名和工作地址〔北京/上海---->一线城市,其他–--->二线城市)
select
name,
(case workaddress when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市' end) as '工作地址'
from emp;
#统计班级各个学员的成绩,展示的规则如下:. >=85,展示优秀· >=60,展示及格·否则,展示不及格
select
id,name,
(case when math >= 85 then '优秀' when math >=60 then '及格' else '不及格' end ) '数学',
(case when english >= 85 then '优秀' when english >=60 then'及格' else '不及格' end )'英语',
(case when chinese >= 85 then'优秀' when chinese >=60 then'及格' else '不及格' end ) '语文'
from score ;
约束
作用于列,限制数据加入,保证数据正确、有效、完整。
非空:not null 、
唯一:unique 、
主键:primary key 、
自增:auto_increment、
默认: default、
外键:foreign key
自增
create table user(
id int primary key auto_increment, --主键自增
age int not null, --非空
keyNum char(18) unique --唯一
)
--插入数据时,inser into user (age) values(6)或inser into user (id,age) values(null,6)均可自增
非空
alter table 表名 modify 字段名 数据类型 not null;
alter table 表名 modify 字段名 数据类型; //删除非空约束
唯一
create table user(
id int primary key auto_increment, --主键自增
age int not null, --非空
keyNum char(18),
constraint unique(keyNum) --唯一约束
)
alter table 表名 modify 字段名 数据类型 unique;
alter table 表名 drop index 字段名;
主键
create table user(
id int auto_increment, --自增
age int not null, --非空
keyNum char(18),
constraint primary key(id) --主键约束
)
alter table 表名 add primary key(字段名);
alter table 表名 drop primary key;
默认
create table user(
id int auto_increment, --自增
age int default 22 --默认
)
alter table 表名 alter 列名 set default 默认值;
alter table 表名 alter 列名 drop default;
外键
create table userTable(
id int primary key auto_increment, --主键自增
age int not null, --非空
keyNum char(18),
deptId int,
constraint foreign key(deptId) references detpTable (id)
)
-- constraint foreign key(外键列名) references 主表(主表列名)
/*比如在userTable表中增加detpTable表的关联关系,就可在userTable表中加上一个列,如deptId和detpTable关联。
想要确保数据的正确、有效、完整和逻辑的正确性,我们需要给这个的deptId加上一个外键进行约束,让其deptId指向(references)参考detpTable的id。
必须先删除deptId中id为3的数据,才能删除userTable中用到deptId=3的数据。
解释:建立外键约束的关联表,从表中引用了主表的字段,因此若先删除主表,从表中的字段就会找不到对应的约束字段,系统会报错,所以要先删除从表,才能删除主表。
*/
alter table 表名 add constraint foreign key(外键字段名称) references 主表(主表列名)
alter table 表名 drop foreign key 外键名称;
数据库设计
一对一
常用于表拆分,常用的放到一张表,不常用的放到另一张表。
一对多
一个部门多个员工,一个员工一个部门
在多的一方建立外键,指向一的一方的主键,如在员工表建立deptId指向部门表的id
多对多
一个商品可对应多个订单,一个订单也可对应多个商品
建立第三张中间表,至少包含2个外键关联双方的主键。
多表查询
笛卡尔积
当select* from a,b;会出现查a和b表所有数据的所有组合的结果。
连接查询
写sql的时候,from后面的表名可使用`反引号包裹起来表名,有时候不反引号包裹表名会报错
内连接
取A和B的记录的交集:
隐式内连接
select 字段列表 from 表1,表2... where 条件(如表1.属性=表2.属性);
显示内连接
select 字段列表 from 表1 [inner] join 表2 on 条件(如表1.属性=表2.属性);
外连接
左外连接
左外连接:select * 取左表所有记录和右表的有交集部分的补充,右表无交集就为null。
select 字段列表 from 表1 left [outer] join 表2 on 条件;
如下案例:
如select * from `user` left join `order` on user.id = order.uid ;
结果集中,from前面的条件,如果是*,就取左表和右表所有字段依次排开作为表头,顺序参考from后面写表名的顺序。当然你可以写别名后,select o.*,u.*from . . .即可。
最后的结果集行数肯定>=左表行数的,左表全部数据都会显示,右表满足条件的数据如果和左表满足on条件对应起来也会显示在右侧,且右表如果多条数据对应左表的一条数据,左表该条数据就在结果集中复制多行和右表多条数据对应。
右外连接
右外连接:select * 取右表所有记录和左表的有交集部分的补充,左表无交集就为null。
select 字段列表 from 表1 right [outer] join 表2 on 条件;
select * from `user` right join `order` on user.id = order.uid ;
自连接
自连接查询语法:
SELECT字段列表FROM表A 别名A JOIN 表A别名B ON条件...;
自连接查询,可以是内连接查询,也可以是外连接查询。
比如:
1.查询员工及其所属领导的名字,如果没领导就不查,相当于自连接后使用内连接
2.查询所有员工 emp及其领导的名字emp ,如果员工没有领导,也需要查询出来,相当于左外连接
所以第一个需求的查询语句就可写为:
select a.name , b.name from emp a , emp b where a.managerid = b.id;
第二个需求查询语句可写为:
select a.name '员工', b.name '领导' from emp a left join emp b on a.managerid = b.id;
联合查询
联合查询-union , union all
对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集。
对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。
union all会将全部的数据直接合并在一起,union会对合并之后的数据去重。
SELECT 字段列表 FROM 表A ...
UNION [ ALL ]
SELECT 字段列表 FROM 表B....;
1.将薪资低于5080 的员工,和年龄大于50 岁的员工全部查询出来.
select * from emp where salary < 5000
union all
select *from emp where age > 50;
UNION ALL相当于把上面两个select查询导的结果集,所有的行直接合并起来。但如果有个员工这两个条件都符合,就会重复出现在最后的结果集上。
可把UNION ALL 换成UNION,就不会重复出现了。
子查询
单行单列
子查询的结果为单行单列的内容:如下面的猪八戒的工资。
select 字段列表 from 表 where 字段名 = (子查询); //使用=、!=、>、<等条件进行判断
如查询员工表中工资大于猪八戒工资的所有记录。传统方式:先查出猪八戒的工资,然后再条件查询。
select * from emp where salary > (select salary from emp where name = "猪八戒");
如:
select * from `user` where birthday > (select birthday from `user` where id = 50); --查询birthday晚于id为51用户的birthday的所有用户
子查询select birthday from `user` where id = 50 的内容为
整体查询的结果为:
多行单列
子查询的结果为多行单列的内容
select 字段列表 from 表 where 字段名 in (子查询);
使用in等关键字作为判断
如查询市场和财务部的所有员工信息
select * from emp where dept_id in (select did from dept where dname='财务部' or '市场部');
如
select * from `user` where password in (select distinct password from `user` where password in ('hello666','Password666'));
子查询select distinct password from `user` where password in ('hello666','Password666')内容为 多行单列
整体查询的结果为:
多行多列
子查询的结果为多行多列的内容
作为虚拟表与另一个表进行联查
select 字段列表 from (子查询) where 条件;
如查询入职日期是‘2011-11-11’之后的员工信息和部门信息
select *from (select * from emp where join_date>'2011-11-11') t1,dept where t1.dept_id =dept.did;
如:select * from (select * from `user` where password = 'hello666' ) t1;
事务
事务简介
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
事务操作
默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务。
查看/设置事务提交方式
select @@autocommit; --1为自动,0为手动,但这个设置是只是会话参数,只针对当前窗口有效。
set @@autocommit=0; --设置事务提交方式为手动提交
设置为手动提交后,DML都不会自动提交了。
我们选中一个事务的多条sql语句执行后,不会立即修改掉数据表中的数据,然后我们需要允许commit;才可。
当选中的一个事务中多条sql执行时中间有错误报错了,我们可以rollback;
start transaction;
/ begin;
DML;
commit/rollback;
ACID
原子性atomicity(同时成败)、一致性consistency(完成事务后,结果数据保持一致)、隔离性isolation(多个事务见操作可见性)、持久性durability(一旦提交或回滚,对数据库的改变是永久的)
Linux系统安装mysql
1、使用虚拟机加centos7系统,加finalshell作为环境
2、去官方下载linux版mysql安装包MySQL :: Download MySQL Community Server (Archived Versions)
mysql-8.0.26-1.el7.x86_64.rpm-bundle.tar
3、将安装包上传到linux,可使用finalshell的打开底栏,进行拖曳上传的方式
我们直接上传到/root目录即显示~的目录就行
4、解压缩
创建mysql文件夹,并解压缩进去
[root@192 ~]# mkdir mysql
[root@192 ~]# tar -xvf mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar -C mysql
mysql-community-client-8.0.33-1.el7.x86_64.rpm
mysql-community-client-plugins-8.0.33-1.el7.x86_64.rpm
mysql-community-common-8.0.33-1.el7.x86_64.rpm
mysql-community-debuginfo-8.0.33-1.el7.x86_64.rpm
mysql-community-devel-8.0.33-1.el7.x86_64.rpm
mysql-community-embedded-compat-8.0.33-1.el7.x86_64.rpm
mysql-community-icu-data-files-8.0.33-1.el7.x86_64.rpm
mysql-community-libs-8.0.33-1.el7.x86_64.rpm
mysql-community-libs-compat-8.0.33-1.el7.x86_64.rpm
mysql-community-server-8.0.33-1.el7.x86_64.rpm
mysql-community-server-debug-8.0.33-1.el7.x86_64.rpm
mysql-community-test-8.0.33-1.el7.x86_64.rpm
5、使用rpm包管理器安装
进入cd myqsl
ll 查看一下有很多需要安装的.rpm文件,我们使用下面的rpm安装一下,先安装client和server所依赖的库和组件,然后再安装client和server
安装通用组件和第三方所依赖的库
rpm -ivh mysql-community-common-8.0.33-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-plugins-8.0.33-1.el7.x86_64.rpm
继续安装 依赖
rpm -ivh mysql-community-libs-8.0.33-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-compat-8.0.33-1.el7.x86_64.rpm
rpm -ivh mysql-community-devel-8.0.33-1.el7.x86_64.rpm
如果报依赖检测失败:pkgconfig(openssl)被mysql-community-devel-8.0.26-1.el7.x86_64,可yum install openssl-devel 然后再次执行rpm -ivh mysql-community-devel-8.0.33-1.el7.x86_64.rpm 即可
rpm -ivh mysql-community-icu-data-files-8.0.33-1.el7.x86_64.rpm
安装客户端和服务端
rpm -ivh mysql-community-client-8.0.33-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-8.0.33-1.el7.x86_64.rpm
6、启动mysql服务
mysql安装好后,linux系统中会注册一个服务mysqld
[root@192 mysql]# systemctl start mysqld #启动
[root@192 mysql]# systemctl restart mysqld #重启
[root@192 mysql]# systemctl stop mysqld #停止
7、查看默认生成的root用户的rpm生成的随机密码
保存在了日志文件中了
cat /var/log/mysqld.log
立马有这句话: A temporary password is generated for root@localhost: 20t8mK.xsyh.
我们即可用root用户,用随机生成的20t8mK.xsyh.密码登录(包括后面的点)
8、登录客户端
mysql -u root -p
输入密码20t8mK.xsyh. 即可
使用时提示你需要改密码
mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
9、修改root用户的密码
密码要符合规则,数字字母加符号且长度不小于8位。但我们就像设置个简单的密码,所以我们可设置其密码校验的策略。可查看官方文档密码校验策略:如下:MySQL :: MySQL 8.0 Reference Manual :: 6.4.3.2 Password Validation Options and Variables
我们可设置其等级。
修改密码如下:
# 先按要求写一个8位以上大小写特殊符号数字的密码
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MIMA:root123';
Query OK, 0 rows affected (0.03 sec)
#然后修改密码校验规则
#先查看mysql8中的validate_password开头的变量
mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| validate_password.check_user_name | ON |
| validate_password.dictionary_file | |
| validate_password.length | 8 |
| validate_password.mixed_case_count | 1 |
| validate_password.number_count | 1 |
| validate_password.policy | MEDIUM |
| validate_password.special_char_count | 1 |
+--------------------------------------+--------+
#修改密码校验规则
mysql> set global validate_password.policy = 0; #校验等级0级即可
Query OK, 0 rows affected (0.00 sec)
mysql> set global validate_password.length = 7; #长度位7位即可
Query OK, 0 rows affected (0.00 sec)
#再次修改密码
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'root123'; #修改为简单一些的密码
Query OK, 0 rows affected (0.01 sec)
10、重新登录客户端
先exit退出,然后mysql -u root -p
输入新密码即可。
11、用户管理
当前用户只能本机访问,不能远程访问,这个用户也不能在windows中使用工具访问到该虚拟机的linux的mysql。
创建一个用于远程访问的用户
mysql> create user 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root123';
Query OK, 0 rows affected (0.01 sec)
分配权限
mysql> grant all on *.* to 'root'@'%';
Query OK, 0 rows affected (0.00 sec)
12、我们使用navicat或dbeaver或datagrip远程登录一下这个linux上的mysql服务器
如果连不通,需要先检查一下linux的防火墙有没有开放3306端口,或关闭linux防火墙。
navicat查看系统库的方法如下:
索引
sql优化很多围绕着索引,在sql进阶中很重要