什么是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算法的话,通过扩大一次缓存区的大小也能减小内循环的次数。由此又可得,设置合理的缓冲区大小能够提高连接效率