mysql的基础使用

文章详细介绍了MySQL5.7的下载、安装步骤,包括配置环境变量、初始化数据库、创建服务以及启动和停止服务。接着讲解了SQL的基本语法,如DDL、DML、DQL和DCL,涉及数据类型、函数、日期处理、权限控制以及索引等内容。此外,还提到了Linux环境下安装MySQL的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下载

 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防火墙。

参考:linux怎么关闭防火墙服务-茶猫云

navicat查看系统库的方法如下: 

索引

sql优化很多围绕着索引,在sql进阶中很重要

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值