1. 安装
使用的为Ubantu系统,安装mysql的步骤如下所示:
1. 更新系统软件包
sudo apt update
2. 执行安装命令
sudo apt install mysql-server
安装的版本的msql-8.0.40,安装此版本的时候,mysql不会提示用户设置root密码;安装完成后,首先查看mysql服务是否启动:
sudo service mysql status
sudo systemctl status mysql
以上2条指令均可以查看mysql服务的状态。
如果mysql服务未启动,可启动mysql服务:
sudo service mysql start
sudo systemctl start mysql
mysql服务启动后,需要执行如下命令,对数据库进行初始化操作:
# 执行安全初始化脚本以增强安全性(例如:禁用匿名用户、删除测试数据库等)
sudo mysql_secure_installation
根据提示进行操作,包括设置root账户的新密码(可能不会提示)、禁止远程登录(如果不希望允许)、删除匿名用户、清空权限表、加载这些更改到MySQL服务器等。
进行完初始化操作之后,可登录root用户:
mysql -u root
可直接登录root用户(本人在实际操作时,不需要密码即可登录),登录root用户之后,需要执行如下命令,修改root用户的密码:
FLUSH PRIVILEGES;
alter user 'root'@'localhost' identified with mysql_native_password by 'xxxxx';
FLUSH PRIVILEGES;
2. 基本概念
- 数据库:数据库时关系表的集合,一个数据库里面可以有多张关系表
- 数据表:表是数据的矩阵,在一个数据库中的表看起来像一个简单的电子表格
- 行:一行称为一条记录
- 列:一列包含了相同的数据
- 冗余:存储两倍数据,降低了性能,但是提高了数据的安全性
- 主键:主键是唯一的,一个数据表中只能有一个主键,可以通过主键来查询数据
- 外键:外键用于关联两个表
- 复合键:也称为组合键,将数据表中的多个列作为一个索引键,一般用于复合索引
- 索引:使用索引可以快速访问数据库表中的特定信息,索引是对数据表中的一列或者多列进行排序的一种结构,类似于书籍的目录。
3. 基本操作
mysql命令参数:
- -s: 去边框,是指去掉show databases,show tables等命令输出内容的边框
- -N:去标题,去边框,去标题后输出的数据,可以方便程序直接处理(虽然会导致可读性变差)
- -e:可以指定登录后执行的mysql命令,mysql -u root -p 123 -e 'show databases;' ,登录之后就会显示所有数据库
例如:
mysql -s -N -u root -p 123 -e 'show databases;'
# 将内容以xml的格式输出
mysql -s -N -u root -p 123 -e 'show databases;' -X
# 将输出内容保存至文件
mysql -s -N -u root -p 123 -e 'show databases;' -X >> /tmp/dbs.xml
登录数据库后输出,以无边框,无标题的形式输出所有数据库;也可以保存至文件。
显示帮助命令:
\h
显示所有数据库
show databases;
创建数据库
#创建数据库mydb
create database mydb charset utf8;
删除数据库
drop database if exist db_name
drop database db_name
查看数据表:
show tables;
创建数据表:
to be continue...
删除数据表:
# 立即删除指定的数据表,同时也删除与数据表相关联的索引、触发器和约束等。
drop table table_name;
# 会删除数据表中的所有数据,但保留数据表结构和与数据表相关联的索引、触发器
# 和约束等。请注意,这个方法只是删除数据,而不是删除整个数据表。
delete from table_name;
4. mysql日志
mysql有几种不同的日志文件,通常包括:
- 错误日志 :记录mysql服务端在运行时产生的错误信息,以及启动,停止h的时间
- 二进制日志:记录对数据库的增,删,改的SQL操作,可以使用这个日志做增量备份。
- 查询日志:记录客户端连接和执行的语句
- 慢查询日志:慢查询时间阈值,以秒为单位,如果超过这个阈值,就是慢查询,比如查询某条数据耗时大于2秒,大型查询
- 事务日志:每次增删改操作时,都会把sql语句写进事务日志,只有innodb引擎才支持事务日志
- 主从复制日志:relay-binlog,从机器从主机器复制过来的日志,根据日志来做数据同步
这些日志可以帮助我们定位mysql内部发生的事件,数据库性能故障,记录数据的变更历史等。
执行mysql指令,查询数据库中的版本信息:
# 通常用来查询mysql里面的配置
show variables like '%version%';
4.1 二进制日志管理
二进制日志(bin_log)记录了所有的增删改语句,但是不包括数据查询语句(查询语句记录在查询日志里面)。二进制日志描述数据更改的过程,该日志的主要功能为:数据恢复和数据复制。
二进制日志信息查询:
show variables like '%bin%';
可以看到bin_log是打开的状态。
bin_log是二进制文件,直接查看会出现乱码:
可以现在mysql中执行命令,查看所有的bin_log文件信息:
show binary_logs;
bin_log日志的属性:
在一下三种情况下,会生成新的bin_log日志:
- 日志大小超过1G
- 关闭mysql服务
- 执行截断日志指令
flush logs;
二进制日志管理:
待补充 ....
4.2 查询日志
首先查看查询日志的信息:
show variables like '%general%';
可以看到查询日志的打开状态,以及日志文件的路径信息。
开启查询日志开启:
set @@global.general_log=1;
设置之后查看状态,已处于打开状态:
4.3 错误日志
错误日志默认是开启的,且应该无法关闭。
show variables like '%error%';

4.4 慢查询日志
慢查询日志是记录所有执行时间超过long_query_time的sql语句日志。在查询过程中,为了获得表锁而等待的时间,不算做sql语句的执行时间。可以通过slow_query_log来启动慢查询日志功能。可以通过慢查询日志的分析,来对sql语句进行优化。
show variables like '%slow%';
慢查询日志默认是关闭的,可通过如下的方式进行开启:
set @@global.slow_query_log=1;
慢查询的时间阈值:
修改变量long_query_time,即可修改慢查询的时间阈值。
5. sql使用
sql主要对数据库进行增删查改操作
5.1 创建数据表:
create database luno;
create table luno.user(id int, name varchar(10), age decimal(10, 2));
常用变量:
- varchar 不定长字符串,所占内存为实际字符串的长度
- char 定长字符串,所占内存为指定的固定长度
- int 整型类型
- decimal(10, 2) 十进制数,长度为10,小数点后两位
创建完成后,可查看数据表的结构:
describe user;
插入一条数据:
insert into user set id=1, name="zhangsan", age=30.5;
查询user数据表中的数据:
通过图下命令,可以创建一张结构和user一模一样的表,但是不会复制user表中的数据
create table user01 like user;
# 如果需要把数据复制进去
insert into user01 select * from user;
5.2 创建用户
创建用户,且不同的用户对数据库有不同的操作权限;
# 创建一个本机用户
create user username@'localhost' identified by 'password';
# 创建一个远程的用户,需要指定用户的hostname(ip地址)
create user username@'198.120.1.1' identified by 'password';
可以为创建的用户修改密码:
set password for username@'localhost'=password('123456');
例如,可通过以下命令实现用户创建:
create user opa@'localhost' identified by '123456@Mysql';
修改用户密码:
较新版本的sql数据库,使用set password命令设置用户密码会报错。
5.3 查看所有用户
Mysql数据库的用户都存储在mysql库的user数据表中,可通过如下命令进行查看:
select * from mysql.user\G;
select User, Host from mysql.user;
其中,/G表示对输出结果进行格式化,使其可读性更好。

5.4 用户权限
通过如下命令查看数据库中用户的权限:
show grants;
5.5 删除,修改数据库对象
- 删除数据库
- 删除数据表
- 删除用户
- 修改数据库编码方式
# 删除用户
drop user 'opa'@'localhost';
# 修改数据库字符集
alter database luno default character set latin1;
查看修改后的数据库字符集:
show create database luno;
修改数据表的属性,通过alter table指令修改数据表:
# 为数据表新增字段,first表示将新增字段放到数据表最前面
alter table user add dept varchar(20) first;
同样也可以通过alter table 指令 + drop 删除数据表的字段:
修改数据表的列名和数据类型:
# 修改数据表的id列名为ID, 数据类型修改为bigint
alter table user change id ID bigint
# 修改数据表某一列的数据类型为int
alter table user modify ID int;
# 重命名数据库
alter table user rename user01;
# 查看数据库有哪些存储引擎
show engines;
# 修改数据表的存储引擎
alter table user01 engine MyISAM;
可以通过指令以下命令,查看数据库支持的所有存储引擎:
show engines;
可通过show create table user01来查看数据库的存储引擎;
5.6 插入数据
insert into user01 set ID=2, name='lisi', age=12.4;
如果需要重复插入多条,可采用如下的命令,更加快速方便:
insert into user01(ID, name, age) values (3,'serman', 22), (5, 'xsc', 12), (6,'wangwu', 56.23);
也可以只插入某些字段的值;
可以通过如下命令,将一张表中满足条件的数据,重新插入一张新的表,达到数据筛选的目的
insert into user02 select * from user01 where ID>4;
将user01表中ID大于4的数据查询出来,插入到新的表user02中。
5.7 修改数据表的记录
通过update命令,可以对数据库中的值进行修改。
update user01 set name='yucgy' where id=5;
5.8 删除数据表中的记录
通过delete指令可以删除数据表中的记录
# 清空特定的记录,筛选条件
delete from user01 where id=1;
# 清空所有记录
delete from user01;
truncate也可以删除数据表中的记录,而且速度更快,且操作不会被记录到事务日志中(bin_log)
# 删除表中的特定记录
truncate user01 where id=3;
# 删除表中的所有记录
truncate user01;
5.9 查询语句
查询语句支持通配符与排序:
通配符
- % 匹配0个或者任意多个字符
- _ 匹配一个字符
- = 精确匹配
- like 模糊匹配
- regexp 正则表达式匹配
排序:
- order by 排序 [ asc | desc ]
- group by 聚合
- distinct 去除重复的行
select * from user01 where name like 'zhan%';
select * from user01 where name like 'lis_';
select * from user01 where name regexp '^z';
select * from user01 where id=4;
select * from user01 order by age desc limit 4;
# group by 不能使用where作为条件
select * from user01 group by age having id >= 20;
select id, name, (math+eng) as sum from testu order by sum desc;
select id, name, max(math+eng) as sum from testu;
聚合函数:
函数 | 作用 |
COUNT | 计算数据表中的记录 |
SUM | 计算表中数据列的和 |
AVG | 计算表中数据列的平均值 |
MIN | 计算表中数据列的最小值 |
MAX | 计算表中数据列的最大值 |
逻辑运算:
- and
- or
- not
逻辑运算可以连接多个条件语句进行查询。
select * from testu where math>=60 and eng>=60;
select * from testu where math>=60 or eng>=60;
select子查询:
select * from testu where eng in (select min(eng) from testu);
5.10 数据表连接方式
笛卡尔积
select * from t1.t2;
多表查询,必须加上条件,负责输出的就是输出笛卡尔积
select t1.id, t1.name, t2.score from t1, t2 where t1.id=t2.id;
左连接(以左表为标准,连接右表)
select * from t1 left outer join t2 on t1.id=t2.id;
右连接(以有表为标准,连接左表)
select * from t1 right outer join t2 on t1.id=t2.id;
内连接(取两个表之间的交集)
select * from t1 inner join t2 on t1.id=t2.id;
纵向连接(直接将两个表都打印出来)
select * from t1 union select * from t2;
5.11 列类型(字段类型)
- tinyint(M) 小整数 范围0-255,-128-127; M可选项为:UNSIGNED,ZEROFILL
- mediumint(M) 中等大小的整数, M可选项为:UNSIGNED,ZEROFILL
- int(M) 普通大小的整数 ,M可选项为:UNSIGNED,ZEROFILL,integer与之同含义
- bigint 大整数,M可选项为:UNSIGNED,ZEROFILL
- decimal(7, 3) 浮点数,表示最大支持7位,小数点后精确到3位
- date 表示日期
- datetime 表示日期时间
- time 表示时间
5.12 表约束
表约束是一种限制,它通过对表的行或者列作出限制,来确保表数据的完整性和唯一性,在mysql中,一般有以下几种约束:
- 非空约束 (如注册账户,用户名,密码) not null,创建表时指定
- 唯一约束 (如注册账户,用户名,用户名不能重复注册) unique
- 主键约束 PRIMARY KEY, 一般用于和外部其他数据表进行关联
- 自增长 AUTO_INCREMENT
- 默认约束
- 外键约束 (用于关联表)
- 表结构操作 (alter table tabname [add | drop | modify | change | rename])
唯一性约束:
# id 唯一约束
alter table user02 add unique(id);
主键约束:
主键保证记录的唯一性,主键自动为NOT NULL
每张数据表只能存在一个主键
当一张表没有主键的时候,第一个出现的具有非空,唯一约束的列,会被视为主键。
create table user02(id int primary key, age tinyint unsigned not null, name varchar(20));
自增长:
AUTO_INCREMENT自动编号,必须与主键组合使用,默认情况下,起始值为1,每次增量为1。在数据表中插入数据时,如果为AUTO_INCREMENT数据列明确指定了一个值,则会出现以下情况:
- 插入的值与已有的编号重复,则会出现错误信息,因为AUTO_INCREMENT数据列的值必须是唯一的。
- 如果插入的值大于已有的编号,则会把该数据插入到表中,并且下一个插入的编号将从这个值开始,也就是说,这样插入会跳过一些编号。
默认约束:
为数据表的某一列设置默认值,在插入数据时,如果此列没有指定值,则会将设置的默认值插入对应的列中。
alter table user01 alter age set default 0;
外键约束:
外键约束要求数据表的存储引擎必须是innoDB;只有innoDB引擎支持外键约束。
可以在mysql配置文件中,修改数据库的配置文件,来执行数据表的默认存储引擎:
# 查看当前mysql数据库支持的所有引擎
show engines;
# 打开mysql配置文件
cat /etc/mysql/mysql.cnf
#新增默认配置
default-storage=engine=INNODB
# 保存文件
# 重启mysql服务
sudo service mysql restart
可以通过创建以下两张表,展示外键 约束:
# 创建数据表teacher
create table teacher(id int primary key auto_increment, name varchar(20) not null);
# 创建数据表student
create table student(id int primary key auto_increment, name varchar(20) not null, teacher_id int, foreign key(teacher_id) references teacher(id));
插入老师数据到数据库中:
insert into teacher(name) values('zhang'), ('lisi'), ('wangwu'), ('lily'), ('tom');
插入学生数据到数据库中:
insert student(name, teacher_id) values ('ql1', 1), ('xsd', 3), ('ghj', 5);
例如,查找某个学校的老师:
select * from teacher where id=(select id from student where name='xsd');
5.13 数据表的关系