编译安装mysql/mariadb文档:mysql编译/mariadb编译
yum安装mysql 8.0
vi /etc/yum.repos.d/mysql.repo
[mysql]
name=mysql8.0
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-8.0-community-el7-x86_64/
gpgcheck=0
yum -y install mysql-community-server
systemctl start mysqld
systemctl enable mysqld
mysql 8.0需要手动查看密码,然后修改密码后才能登录
cat /var/log/mysqld.log |grep password
mysql -u root -p'
alter user 'root'@'localhost'IDENTIFIED BY 'Test12#$'; 修改密码,重新登录后即可使用
官网文档:CREATE-DATABASE
HELP CREATE 查看帮助
HELP CREATE DATABASE
CREATE DATABASE test1; 创建数据库,(按数据库默认字符集和排序创建)
CREATE DATABASE test2 CHARACTER SET utf8mb4 collate utf8mb4_0900_ai_ci; 指定数据库字符集为utf8mb4,排序规则为utf8mb4_0900_ai_ci
官网文档:CREATE-TABLE
表格的字段类型:字段类型
HELP CREATE TABLE
进入数据库才能创建表格
use test1;
创建student表,字段(列)为id,name,age,gender,后面的是字段类型和属性
create table student (id int unsigned primary key auto_increment,name varchar(10),age tinyint unsigned,gender enum('M','F') default 'M');
unsigned 不设置符号
primary key 设置为主键,不能为空
auto_increment 自动增长
tinyint 单个字节整数
int 整数
enum('M','F') 单选项
default 'M' 默认值
官网文档:CREATE-USER
HELP CREATE USER
创建账户aa,密码为Test12#$,访问IP段为192.168.116.%
CREATE USER 'aa'@'192.168.116.%' IDENTIFIED BY 'Test12#$';
mysql 8.0的密码插件默认是caching_sha2_password,指定老版本的密码插件方式为mysql_native_password
CREATE USER 'bb'@'192.168.116.%' IDENTIFIED WITH mysql_native_password BY 'Test12#$';
SELECT user,host,plugin FROM mysql.user; 查询某个表格的部分数据
use test2; 进入数据库
将查询的部分表格数据保存为视图(其实相当于另存为表格,不过格式有所不同)
CREATE VIEW t_view AS SELECT user,host,plugin FROM mysql.user;
SHOW TABLES; 查看视图生成
SELECT * FROM t_view; 查看视图的内容
创建一个表格
CREATE TABLE t1 (tid int,name varchar(20));
INSERT t1(tid,name)VALUES('1','aa'),('2','bb'),('3','cc');
mysql 8.0版本需要开启这个才能自定义函数
set global log_bin_trust_function_creators=ON;
use test2; 进入数据库
创建函数 //开始,//结尾
DELIMITER //
CREATE FUNCTION deleteT1(id SMALLINT UNSIGNED) RETURNS VARCHAR(20)
BEGIN
DELETE FROM t1 WHERE tid = id;
RETURN (SELECT COUNT(*) FROM t1);
END//
DELIMITER ;
SELECT deleteT1(1); 调用函数,删除t1中tid为1的行
SELECT * FROM t1; 再次查看t1表格
函数解析:
DELIMITER // 表示把原本的结束符;改为//
下面表示创建一个函数deleteT1,里面有2个字段
CREATE FUNCTION deleteT1(id SMALLINT UNSIGNED) RETURNS VARCHAR(20)
BEGIN 这个表示函数开始
DELETE FROM t1 WHERE tid = id; 定义当t1表格的tid=函数的id的值时,删除行
RETURN (SELECT COUNT(*) FROM t1); 返回t1表格剩下的行数
END// 结束符
DELIMITER ; 将//还原为;
mysql 8.0版本需要开启这个才能自定义函数
set global log_bin_trust_function_creators=ON;
use test2; 进入数据库
创建表格
CREATE TABLE t1(id int auto_increment primary key,name char(10),age int);
创建存储过程
delimiter $$
create procedure PRt1()
begin
declare i int;
set i = 1;
while i < 1001
do insert into t1(name,age) values (concat('aa',i),i);
set i = i +1;
end while;
end$$
delimiter ;
存储过程解析
delimiter $$ #将结束符;转换为$$
create procedure PRt1() #创建存储过程PRt1
begin #开始存储过程
declare i int; #定义变量i,类型为整数型
set i = 1; #设置i的初始值
while i < 1001 #定义循环,当i<1001
#当i<1001时,不断插入数据到t1表格
do insert into t1(name,age) values (concat('aa',i),i);
set i = i +1; #定义i=i+1,不断递增
end while; #结束while循环
end$$ #结束存储过程
delimiter ; #将结束符$$还原为;
call PRt1; 调用存储过程
SELECT count(*) FROM t1; 查看插入了1000条数据
触发器:当某个条件发生时,触发另外一个条件
创建2个表格
CREATE TABLE t1(id int,name varchar(20)); 创建t1表,2个字段
CREATE TABLE t2(t1_count int DEFAULT 0); 创建t2表
INSERT INTO t2(t1_count)VALUES(0); 插入t2的第一行的值为0
SELECT * FROM t1; 查看t1表为空
SELECT * FROM t2; 查看t2表的行值为0
CREATE TRIGGER t1_insert
AFTER INSERT
ON t1 FOR EACH ROW
UPDATE t2 SET t1_count=t1_count+1;
触发器解析
CREATE TRIGGER t1_insert #创建触发器t1_insert
AFTER INSERT #通过插入触发
ON t1 FOR EACH ROW #当t1表格每个行增加时
UPDATE t2 SET t1_count=t1_count+1; #更新t2表格的值+1
INSERT t1(id,name)VALUES('1','aa'),('2','bb'); 对t1表格插入2条数据
SELECT * FROM t1; 查看数据生成
SELECT * FROM t2; 因为触发器,所以变成了2
官网文档:CREATE-INDEX
创建普通索引
普通索引:列中的值可以为空,可以重复。
创建表格
CREATE TABLE i1(id int,name char(10));
对i1表格的id列做索引,名字为i1idx
CREATE INDEX i1idx ON i1(id);
SHOW INDEXES FROM i1\G 查看表格全部索引和属性
这里的索引属性是B树索引的意思,mysql默认是B+树索引
Index_type: BTREE
创建唯一索引
唯一索引:列中的值不能相同,必须唯一值,但是可以为空
CREATE UNIQUE INDEX i1 ON i1(name); 创建唯一索引
SHOW INDEXES FROM i1\G
创建表格
CREATE TABLE i2(id int,name char(10),INDEX i2idx(id));
INDEX i2idx(id) 表示创建索引,名字叫i2idx,索引的字段是id
SHOW INDEXES FROM i2\G
CREATE TABLE test1(id int,name char(10),age int,extra varchar(20));
CREATE INDEX i1idname ON test1(id,name); 指定id,name做成复合索引i1idname
SHOW INDEXES FROM test1\G 查看列的索引名字都是一样
官网SHOW文档:SHOW
SHOW DATABASES; 查看全部数据库名字
use test1; 进入数据库
SHOW TABLES; 查看数据中的全部表格名字
查看创建数据库时的属性
SHOW CREATE DATABASE test1; 查看test1数据库创建时的字符集和排序规则等属性
use test1; 进入数据库
SHOW CREATE TABLE student; 查看创建student表格时设置的字段属性和其他属性
SHOW BINARY LOGS; 查看二进制日志的全部文件
SHOW BINLOG EVENTS IN 'binlog.000002'; 指定二进制文件名查看文件内容
查看账户权限
SHOW GRANTS FOR aa@localhost;
查看mysql进程
SHOW PROCESSLIST; 查看mysql进程
use test2; 进入数据库
SHOW TABLE STATUS LIKE 't_view'\G 查看视图信息
这个Comment: VIEW 定义了这个表格为视图
SHOW FUNCTION STATUS\G 查看全部自定义函数
SHOW CREATE FUNCTION deleteT1\G; 查看指定自定义函数创建信息
SHOW PROCEDURE STATUS\G; 查看全部存储过程
SHOW CREATE PROCEDURE PRt1; 查看指定的存储过程创建方式
SHOW TRIGGERS\G; 查看全部触发器
SHOW CREATE TRIGGER t1_insert\G; 查看指定触发器的创建方式
SHOW VARIABLES\G
查看全部全局变量
SHOW GLOBAL VARIABLES\G
SHOW INDEXES FROM i1\G 查看表格全部索引和属性
官网文档:INSERT
use test1; 进入数据库
插入一条数据到student表格,前面指定字段(列),后面输入内容
INSERT student(id,name,age,gender)VALUES('1','aa','18','M');
*代表所有,表示查看表格所有内容,表格少量数据可以使用这个,大量不用使用,要不然可能会卡死
SELECT * FROM student;
use test1; 进入数据库
INSERT student(id,name,age,gender)VALUES('2','bb','18','F'),('3','cc','17','M');
SELECT * FROM student;
官网文档:DELETE
增加qq这一行
use test1; 进入数据库
INSERT student(id,name,age,gender)VALUES('4','qq','18','M');
SELECT * FROM student;
DELETE FROM student WHERE id='4';
SELECT * FROM student;
创建一个表格
use test1;
CREATE TABLE t1 (id int primary key auto_increment,name varchar(20));
INSERT t1(id,name)VALUES('1','AA');
INSERT t1(id,name)VALUES('2','BB');
SELECT * FROM t1;
清空表格,但是不删除表格
DELETE FROM t1;
SELECT * FROM t1; 可以看到数据不见了
SHOW TABLES; 可以看到表格还在
官网文档:UPDATE
use test1; 进入数据库
指定更新id为1的name字段内容
SET 指定数据更新的列和值,WHERE指定老的列和值
UPDATE student SET name='dd' WHERE id='1';
SELECT * FROM student;
UPDATE和USER(修改账户密码),这种只适合mysql 5.7以下版本修改密码
CREATE USER 'bb'@'localhost' IDENTIFIED BY 'Test12#$'; 创建账户
指定账户信息,通过修改表格方式修改密码
UPDATE mysql.user set password=password('BBbb12#$') where user='bb' AND host='localhost';
FLUSH PRIVILEGES; 指定表格方式修改密码需要刷新权限
exit
mysql -u bb -p'BBbb12#$' 测试登录
官网文档:SELECT
查询mysql数据库中user表的user,host字段(列)的内容
SELECT user,host FROM mysql.user;
SELECT name,age FROM student WHERE age<=20;
指定范围查询内容,默认前后都包括
SELECT name,age FROM student WHERE age>=18 AND age<=20;
SELECT name,age FROM student WHERE age BETWEEN 18 AND 20;
SELECT name,age FROM student WHERE age in (17,18);
INSERT student(id,name,gender)VALUES('4','dd','M'); 插入一条包括空值数据
SELECT name,age FROM student WHERE age is null; 查看空值数据
SELECT name,age FROM student WHERE age is not null; 查看非空值数据
SELECT name,age FROM student WHERE age='18';
INSERT student(id,name,age,gender)VALUES('5','daa','19','M');
SELECT name,age FROM student WHERE name like 'd%';
SELECT count(id) FROM student; 统计字段出现有多少行
SELECT avg(age) FROM student; 统计字段的平均值
SELECT max(age) FROM student; 统计字段的最大值
SELECT min(age) FROM student; 统计字段的最小值
SELECT CURRENT_USER(); 查看当前登录账户
指定age,统计age相同的人数
SELECT age 年龄,count(*) 数量 FROM student GROUP BY age;
age 年龄 后面的年龄是为了输出时显示,不会修改原本表格数据
count(*) 数量 count(*)内置函数,可以统计列的全部值
正序和倒序
表格创建时会带有排序规则,所以具体要看排序规则的方式排序,不一定都是按照从A-Z这种方式排序
SELECT * FROM student ORDER BY id; 默认是从小到大,正序排序
SELECT * FROM student ORDER BY id desc; 指定desc为倒序排序
SELECT * FROM student; 默认是以id排序
SELECT * FROM student ORDER BY id LIMIT 3; 指定以id排序,输出前3个
跳序查询
表格创建时会带有排序规则,所以具体要看排序规则的方式排序,不一定都是按照从A-Z这种方式排序
SELECT * FROM student ORDER BY age;
跳过前面3个,输出第4,5这2个
SELECT * FROM student ORDER BY age LIMIT 3,2;
查看mysql版本号
SELECT VERSION();
SELECT CURRENT_USER();
SELECT DATABASE();
官网文档:ALTER-DATABASE
修改数据库属性最好是空的数据库,要不然原本数据库的表格可能会发生乱码错误
SHOW CREATE DATABASE test2; 查看数据库创建时的字符集和排序规则等属性
ALTER DATABASE test2 character set gbk; 修改test2数据库的字符集
ALTER DATABASE test2 COLLATE=gbk_chinese_ci; 修改test2数据库的排序规则
SHOW CREATE DATABASE test2; 再次查看数据库属性
官网文档:ALTER-TABLE
修改表格字符集和排序规则
创建一个表格,新的表格的字符集和排序规则由创建表格的数据库的创建数据定义,也就是说表格的数据库的字符集和排序规则是什么,表格的属性就是什么。
use test3;
CREATE TABLE t1 (id int primary key auto_increment,name varchar(20));
INSERT t1(id,name)VALUES('1','AA');
INSERT t1(id,name)VALUES('2','BB');
SELECT * FROM t1;
SHOW CREATE TABLE t1; 查看表格属性
一般表格和数据库的字符集和排序规则一致,最好不要修改
ALTER TABLE t1 character set gbk; 修改t1表格字符集
ALTER TABLE t1 COLLATE=gbk_chinese_ci; 修改t1表格的排序规则
SELECT * FROM t1; 原本只有2个字段(列)id和name
指定在id后面增加新的列age
ALTER TABLE t1 add age int AFTER id;
SELECT * FROM t1;
SELECT * FROM t1; 查看原本表格字段
ALTER TABLE t1 DROP COLUMN age; 指定删除age字段
SELECT * FROM t1; 确认删除age字段
指定将name字段修改为mingzi字段
注意:修改字段需要注意字段类型,要不然可能会出现乱码
ALTER TABLE t1 CHANGE COLUMN name mignzi char(12);
SELECT * FROM t1;
官网文档:ALTER-USER
创建账户
创建账户aa,设置密码和登录方式
CREATE USER 'aa'@'localhost' IDENTIFIED BY 'Test12#$';
mysql -u aa -p'Test12#$'
exit
ALTER USER aa@'localhost' identified by 'AAaa12#$'; 修改aa@'localhost'的密码
mysql -u aa -p'Test12#$' 重新用老密码不能登录
mysql -u aa -p'AAaa12#$' 新密码可以登录
SET PASSWORD FOR 'bb'@'localhost' = PASSWORD('Test12#$'); 修改密码
mysql -u bb -p'Test12#$' 重新登录,可以看到密码修改成功
SELECT CURRENT_USER(); 查看当前登录账户
ALTER user user() identified by 'Test12#$'; 默认没有root权限不能修改别人密码,但是可以用这个命令修改自己密码
mysql -u aa -p'AAaa12#$' 老密码不能登录
mysql -u aa -p'Test12#$' 新密码可以,修改密码成功
ALTER USER 'aa'@'localhost' ACCOUNT LOCK; 锁定账户'aa'@'localhost'
ALTER USER 'aa'@'localhost' ACCOUNT UNLOCK; 解锁账户
SELECT user,host,plugin FROM mysql.user; 查看老的账户信息
ALTER USER 'aa'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Test12#$'; 修改插件
SELECT user,host,plugin FROM mysql.user; 查看账户信息
对表格添加索引
CREATE TABLE A1(id int,name char(10)); 创建表格
ALTER TABLE A1 ADD INDEX a1idx(id); 对A1表格的字段id添加索引a1idx
SHOW INDEX FROM A1\G
ALTER TABLE A1 DROP INDEX a1idx; 删除表格索引a1idx
SHOW INDEX FROM A1\G
CREATE TABLE M1(id int,name char(10)); 创建表格,name字段长度为10
ALTER TABLE M1 MODIFY name char(15); 修改name字段长度为15
SHOW CREATE TABLE M1; 确认修改成功
添加主键时,主键对应的列的数据不能为空,一个表只能有一个主键
CREATE TABLE Z1(id int,name char(10)); 创建表格
ALTER TABLE Z1 MODIFY id int NOT NULL; 设置主键不为空
ALTER TABLE Z1 ADD PRIMARY KEY (id); 创建主键
因为主键也是索引的一种,所以这样查看
SHOW INDEX FROM Z1; 查看表格主键信息
ALTER TABLE Z1 DROP PRIMARY KEY; 删除主键,只有一个,不用指定字段名
SHOW INDEX FROM Z1; 查看表格主键信息
官网文档:DROP-DATABASE
DROP DATABASE test1; 删除数据库test1
官网文档:DROP-TABLE
创建一个表格
use test2;
CREATE TABLE t2 (id int primary key auto_increment,name varchar(20));
INSERT t2(id,name)VALUES('1','AA');
INSERT t2(id,name)VALUES('2','BB');
SELECT * FROM t2;
SHOW TABLES;
DROP TABLE t2;
SHOW TABLES; 可以看到表格已经被删除
SELECT user,host,plugin FROM mysql.user; 查看全部账户
DROP USER bb@'localhost'; 删除指定账户
SELECT user,host,plugin FROM mysql.user; 再次查看
use test2;
SHOW TABLE STATUS LIKE 't_view'\G 查看视图信息
通过这个Comment: VIEW 可以看到这个表格实际是视图,不是平常的表格
DROP VIEW t_view; 删除视图
删除自定义函数
use test2;
DROP FUNCTION deleteT1; 删除自定义函数
use test2;
SHOW CREATE PROCEDURE PRt1\G; 查看指定的存储过程创建方式
DROP PROCEDURE PRt1; 删除存储过程
SHOW CREATE TRIGGER t1_insert\G; 查看触发器
DROP TRIGGER t1_insert; 删除触发器
官网文档:GRANT
创建账户和数据库
创建t1账户
CREATE USER 't1'@'localhost' IDENTIFIED BY 'Test12#$';
CREATE DATABASE t1; 创建t1数据库
授权t1账户对t1数据库有所有权限
GRANT ALL ON t1.* TO t1@'localhost';
创建t2数据库
CREATE DATABASE t2;
授权t1账户对t2账户具有查询权限
GRANT SELECT ON t2.* TO t1@'localhost';
CREATE TABLE t2(id int,name char(10));
INSERT t2(id,name)VALUES('1','aa');
SELECT * FROM t2;
测试权限是否授权成功
查看t1账户对t1数据库的权限
mysql -u t1 -p'Test12#$' 用t1账户登录
use t1; 进入t1数据库
CREATE TABLE t1(id int,name char(10)); 创建表格
INSERT t1(id,name)VALUES('1','aa'); 插入数据到表格
SELECT * FROM t1; 查看表格数据
DROP TABLE t1; 删除表格
mysql -u t1 -p'Test12#$' 用t1账户登录t2数据库
CREATE TABLE t2(id int,name char(10)); 没有新建权限
INSERT t2(id,name)VALUES('2','bb'); 没有插入权限
SELECT * FROM t2; 只有查询权限
官网文档:REVOKE
REVOKE ALL PRIVILEGES,GRANT OPTION FROM t1@'localhost'; 撤销全部权限
SHOW GRANTS FOR t1@localhost; 查看权限列表
这个是默认账户登录权限,必须要有才能使用账户
GRANT USAGE ON *.* TO `t1`@`localhost`
mysql -u t1 -p'Test12#$' 重新登录
use t1; 可以看到没有t1数据库的权限
GRANT ALL ON t1.* TO t1@'localhost'; 先授权t1账户对t1数据库有全部权限
SHOW GRANTS FOR t1@localhost; 查看权限
REVOKE INSERT ON t1.* FROM t1@'localhost'; 撤销对t1数据库的插入权限
SHOW GRANTS FOR t1@localhost; 查看权限
mysql -u t1 -p'Test12#$' 登录
use t1; 进入数据库
CREATE TABLE t1(id int,name char(10)); 有新建权限
INSERT t1(id,name)VALUES('1','aa'); 没有插入权限
SELECT * FROM t1; 有查询权限
SHOW TABLES; 表格也有生成
SET设置变量文档:SET
自定义临时变量
SET @var_t1=11; 设置变量@var_t1,值为11
SELECT @var_t1; 查看变量
mysql -u tt1 -p'Test12#$' 退出登录后,自定义变量不会保存到数据库
SELECT @var_t1; 因为没保存,所以值为空
系统变量
文档:SET-VARIABLE
Option File 这里的Yes表示这个内容是选项,需要去配置文件修改
System Var 这里的Yes表示这个内容是变量,可以直接在mysql客户端修改值
如果这2个都是Yes,代表可以在配置文件修改,也可以在mysql客户端修改值
查看默认系统字符集的变量
SELECT @@character_set_results;
set character_set_results="utf8mb3"; 当前终端修改默认字符集值,退出登录自动恢复
SELECT @@character_set_results;
SHOW GLOBAL VARIABLES LIKE 'log_bin_trust_function_creators';
set global log_bin_trust_function_creators=OFF; 设置全局变量
SHOW GLOBAL VARIABLES LIKE 'log_bin_trust_function_creators';
官网文档:EXPLAIN
EXPLAIN输出内容文档:EXPLAIN-OUT
主要关注列:
type:表格的连接类型,通过这个判断索引是否被用到(从最优到最差):
possible_keys:可能使用到的索引,但是实际不一定使用到。为空则没有使用索引。
key:一定使用到的索引,为空则没有使用索引。
ref:(该ref列显示将哪些列或常量与列中指定的索引进行比较以 key从表中选择行。)
rows:此次查询扫描了多少行
Extra:(额外信息,通过这个对索引进一步优化)
具体看官网文档:EXPLAIN-Extra
注意:以下结果有时候会同时出现。
常见输出:
ORDER BY语句和索引优化:索引-ORDER BY
GROUP BY语句和索引优化:索引-GROUP BY
创建表格和索引
CREATE TABLE e1(id int,name char(10)); 创建表格
CREATE INDEX e1idx ON e1(id); 创建索引
插入数据
INSERT e1(id,name)VALUES('1','aa'),('2','bb'),('11','aa1'),('12','bb1');
SELECT * FROM e1;
EXPLAIN SELECT id FROM e1 WHERE id='1'; 使用了索引
可以看到type为ref,key为e1idx
EXPLAIN SELECT * FROM e1 WHERE id LIKE 'a%'; 没有使用到索引
可以看到type为ALL和key为NULL,通过rows为4行,也可以看出进行了全表扫描
Using where表示使用到了where语句,但是不一定使用到索引
查看Using index condition和Using filesort
EXPLAIN SELECT * FROM e1 WHERE id in (1,11); 使用了索引
type为range,key为e1idx证明使用到了索引,Using index condition表示使用了索引和条件
EXPLAIN SELECT * FROM e1 ORDER BY id;
type为NULL,key为NULL,Using filesort表示是一个ORDER BY语句
EXPLAIN SELECT id,name FROM e1 WHERE id='1'; 使用了索引,但是不是最优
可以看到WHERE已经定义了只查找id为1的行,就不需要在写name了
EXPLAIN SELECT id FROM e1 WHERE id='1'; 最优使用索引方式
EXPLAIN SELECT id FROM e1 WHERE id in (1,11);
可以看到使用到了索引和wehere条件
create table student (id int unsigned primary key auto_increment,name varchar(10),age tinyint unsigned,gender enum('M','F') default 'M');
DESC student; 2种都可以查看表结构
DESCRIBE student;
CREATE VIEW t_view AS SELECT user,host,plugin FROM mysql.user; 创建视图
DESC t_view; 查看视图结构
RENAME 修改账户名字
把账户名字从t1@'localhost' 改为tt1@'localhost'
RENAME USER t1@'localhost' TO tt1@'localhost';
SELECT user,host FROM mysql.user;