0
点赞
收藏
分享

微信扫一扫

MySql系列:JOIN的原理和算法小总结

奋斗De奶爸 2021-09-21 阅读 6

什么是JOIN?

JOIN的含义就如英文单词“join”一样,连接两张表,大致分为内连接,外连接,右连接,左连接,自然连接。这里描述先甩出一张用烂了的图,然后插入测试数据。

笛卡尔积:CROSS JOIN

要理解各种JOIN首先要理解笛卡尔积。笛卡尔积就是将A表的每一条记录与B表的每一条记录强行拼在一起。所以,如果A表有n条记录,B表有m条记录,笛卡尔积产生的结果就会产生nm条记录。*

建表:(想查询先建表)

CREATE DATABASE db0206;
USE db0206;

CREATE TABLE `db0206`.`tbl_dept`(  
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `deptName` VARCHAR(30),
  `locAdd` VARCHAR(40),
  PRIMARY KEY (`id`)
) ENGINE=INNODB CHARSET=utf8mb4;

CREATE TABLE `db0206`.`tbl_emp`(  
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(20),
  `deptId` INT(11),
  PRIMARY KEY (`id`),
  FOREIGN KEY (`deptId`) REFERENCES `db0206`.`tb_dept`(`id`)
) ENGINE=INNODB CHARSET=utf8mb4;
/*插入数据*/
INSERT INTO tbl_dept(deptName,locAdd) VALUES('CC',21);
INSERT INTO tbl_dept(deptName,locAdd) VALUES('MM',21);
INSERT INTO tbl_dept(deptName,locAdd) VALUES('SC',22);
INSERT INTO tbl_dept(deptName,locAdd) VALUES('SC',23);
INSERT INTO tbl_dept(deptName,locAdd) VALUES('EH',65);

INSERT INTO tbl_emp(NAME,deptId) VALUES('c1',1);
INSERT INTO tbl_emp(NAME,deptId) VALUES('c2',1);
INSERT INTO tbl_emp(NAME,deptId) VALUES('c3',1);

INSERT INTO tbl_emp(NAME,deptId) VALUES('m5',2);
INSERT INTO tbl_emp(NAME,deptId) VALUES('m6',2);

INSERT INTO tbl_emp(NAME,deptId) VALUES('s7',3);

INSERT INTO tbl_emp(NAME,deptId) VALUES('s8',4);


下列查询与该表数据有异请自行忽略


内连接:

左外连接:

右外连接:

左连接:

右连接:

全连接:

两张表中都没有出现的数据集:

表连接算法

ested Loop Join(NLJ)算法:

foreach row1 from t1
    foreach row2 from t2
        if row2 match row1 //row2与row1匹配,满足连接条件
            join row1 and row2 into result //连接row1和row2加入结果集

Block Nested Loop Join(BNLJ)算法:

影响性能的因素

另外,如果使用Block Nested Loop Join算法的话,通过扩大一次缓存区的大小也能减小内循环的次数。由此又可得,设置合理的缓冲区大小能够提高连接效率

✨引用

如何使用

举报

相关推荐

0 条评论