mysql基础学习视频:https://www.bilibili.com/video/BV1xW411u7ax?p=1
这里用docker来安装,版本是8.0.18。
# 拉取镜像
docker pull mysql:8.0.18
# 运行一(现在我用的mysql之前用的运行命令)
docker run -p 33060:3306 --name mysql8_33060 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.18
# 容器内mysql重要文件/目录位置
# /etc/mysql/my.cnf -> 映射配置文件
# /var/lib/mysql -> 映射数据
# 运行二 -v 对容器内的目录进行挂载
docker run -p 33060:3306 --name mysql8_33060 \
-v /home/docker/mysql8_33060/conf.d/my.cnf:/etc/mysql/my.cnf \
-v /home/docker/mysql8_33060/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.18
#在本地打开一个终端,进入容器的mysql(-h填linux的ip地址)
mysql -uroot -p123456 -h10.211.55.26 -P33060
#查看所有数据库
show databases;
#创建数据库
create database db01;
#切换数据库
use db01;
#查看此数据库下的所有表
show tables;
#创建表
create table user(id int not null,name varchar(20));
#插入数据
insert into user values(1,'张三');
#查看user表所有数据(显示的数据没有出现乱码)
select * from user;
show engines;
show variables like '%storage_engine%';
性能下降SQL慢:执行时间长,等待时间长。
左右表共有的部分
select
左表的全部:左右表共有的和左表独有的部分
select
左表独有的部分
select
右表的全部:左右表共有的和右独有的部分
select
右表独有的部分
select
全部
select
左表独有的和右表独有的部分
select
CREATE DATABASE db02;
USE db02;
#部门表
CREATE TABLE `tbl_dept` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`deptName` VARCHAR(30) DEFAULT NULL,
`locAdd` VARCHAR(40) DEFAULT NULL,
PRIMARY KEY(`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
#员工表
CREATE TABLE `tbl_emp` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) DEFAULT NULL,
`deptId` INT(11) DEFAULT NULL,
PRIMARY KEY(`id`)
#CONSTRAINT `fk_dept_id` FOREIGN KEY(`deptId`) REFERENCES `tbl_dept` (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
INSERT INTO `tbl_dept`(`deptName`,`locAdd`)VALUES('RD',11);
INSERT INTO `tbl_dept`(`deptName`,`locAdd`)VALUES('HR',12);
INSERT INTO `tbl_dept`(`deptName`,`locAdd`)VALUES('MK',13);
INSERT INTO `tbl_dept`(`deptName`,`locAdd`)VALUES('MIS',14);
INSERT INTO `tbl_dept`(`deptName`,`locAdd`)VALUES('FD',15);
INSERT INTO `tbl_emp`(`name`,`deptId`)VALUES('z3',1);
INSERT INTO `tbl_emp`(`name`,`deptId`)VALUES('z4',1);
INSERT INTO `tbl_emp`(`name`,`deptId`)VALUES('z5',1);
INSERT INTO `tbl_emp`(`name`,`deptId`)VALUES('w5',2);
INSERT INTO `tbl_emp`(`name`,`deptId`)VALUES('w6',2);
INSERT INTO `tbl_emp`(`name`,`deptId`)VALUES('s7',3);
INSERT INTO `tbl_emp`(`name`,`deptId`)VALUES('s8',4);
INSERT INTO `tbl_emp`(`name`,`deptId`)VALUES('s9',51);
内连接:select * from tbl_emp a inner join tbl_dept b on a.deptId = b.id;
左连接:select * from tbl_emp a left join tbl_dept b on a.deptId = b.id;
左连接(不包括公共部分):select * from tbl_emp a left join tbl_dept b on a.deptId = b.id where b.id is null;
右连接:select * from tbl_emp a right join tbl_dept b on a.deptId = b.id;
右连接(不包括公共部分):select * from tbl_emp a right join tbl_dept b on a.deptId = b.id where a.deptId is null;
全连接:select * from tbl_emp a left join tbl_dept b on a.deptId = b.id union select * from tbl_emp a right join tbl_dept b on a.deptId = b.id;
union自带去重。
全连接(不包括公共部分):select * from tbl_emp a left join tbl_dept b on a.deptId = b.id where b.id is null union select * from tbl_emp a right join tbl_dept b on a.deptId = b.id where a.deptId is null;
索引是数据结构,可以简单理解为“排好序、查找快的数据结构”,所以,对查找和排序都有影响。
官方文档:https://dev.mysql.com/doc/refman/8.0/en/explain-output.html
有三种情况:
显示这一行的数据是关于哪张表的。
system(系统表,基本不会出现)
eq_ref(多表主键联合查询,结果唯一)
const是单表唯一,where用主键中查询单条记录,而eq_ref是多表关联,上面多表查询的where条件是t1.id=t2.id,而此id只有一个,只能查到一条记录,而得到两张表的字段。
所以,const是单表查询结果唯一,而eq_ref是多表查询结果唯一。(如查找条件为主键)
5.7之后的版本就有了这个字段,不需要使用explain extended。这个字段表示存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例(百分比,不是具体记录数)。
因为接下来的索引优化篇幅有点长,所以单独放到了下一篇里。
下一篇笔记:MySQL高级——数据库优化(中)
学习视频(p1-p30):https://www.bilibili.com/video/BV1KW411u7vy?p=1