Introduction
Table connection method
- The inner join queries the intersection data of the two tables, that is, the primary and foreign key related data. Keyword inner join on
- The outer join queries all the data in the left table and the primary and foreign key related data. Keywords left outer join on, right outer join on
- Self-connection
Table connection example
Step 1: Create two tables: department table dept and employee table emp, and associate the foreign key of emp.dno to dept.did
CREATE TABLE `dept` (
`did` int(10) NOT NULL AUTO_INCREMENT,
`dname` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`did`),
UNIQUE KEY `dname` (`dname`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
CREATE TABLE `emp` (
`eid` int(10) NOT NULL AUTO_INCREMENT,
`ename` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL,
`dno` int(10) DEFAULT NULL,
`sal` double(7,2) DEFAULT NULL,
PRIMARY KEY (`eid`),
KEY `fk_dno_did` (`dno`),
CONSTRAINT `fk_dno_did` FOREIGN KEY (`dno`) REFERENCES `dept` (`did`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
mysql> desc dept;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| did | int(10) | NO | PRI | NULL | auto_increment |
| dname | varchar(255) | NO | UNI | NULL | |
+-------+--------------+------+-----+---------+----------------+
mysql> desc emp;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| eid | int(10) | NO | PRI | NULL | auto_increment |
| ename | varchar(30) | YES | | NULL | |
| dno | int(10) | YES | MUL | NULL | |
| sal | double(7,2) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
Step 2: Initialize table data
insert into dept values (1,'技术部'),(2,'人事部'),(3,'销售部'),(4,'客服部');
insert into emp values (1,'张三',1,10000),(2,'李四',2,20000),(3,'王五',3,10000),(4,'赵六',3,10000),(5,'胡七',null,10000),(6,'朱八',null,10000);
mysql> select * from dept order by did;
+-----+--------+
| did | dname |
+-----+--------+
| 1 | 技术部 |
| 2 | 人事部 |
| 3 | 销售部 |
| 4 | 客服部 |
+-----+--------+
mysql> select * from emp order by eid;
+-----+-------+------+----------+
| eid | ename | dno | sal |
+-----+-------+------+----------+
| 1 | 张三 | 1 | 10000.00 |
| 2 | 李四 | 2 | 20000.00 |
| 3 | 王五 | 3 | 10000.00 |
| 4 | 赵六 | 3 | 10000.00 |
| 5 | 胡七 | NULL | 10000.00 |
| 6 | 朱八 | NULL | 10000.00 |
+-----+-------+------+----------+
Step 3: Three connection methods demonstration
- Cartesian product (product of two tables)
mysql> select * from dept,emp;
+-----+--------+-----+-------+------+----------+
| did | dname | eid | ename | dno | sal |
+-----+--------+-----+-------+------+----------+
| 2 | 人事部 | 1 | 张三 | 1 | 10000.00 |
| 4 | 客服部 | 1 | 张三 | 1 | 10000.00 |
| 1 | 技术部 | 1 | 张三 | 1 | 10000.00 |
| 3 | 销售部 | 1 | 张三 | 1 | 10000.00 |
| 2 | 人事部 | 2 | 李四 | 2 | 20000.00 |
| 4 | 客服部 | 2 | 李四 | 2 | 20000.00 |
| 1 | 技术部 | 2 | 李四 | 2 | 20000.00 |
| 3 | 销售部 | 2 | 李四 | 2 | 20000.00 |
| 2 | 人事部 | 3 | 王五 | 3 | 10000.00 |
| 4 | 客服部 | 3 | 王五 | 3 | 10000.00 |
| 1 | 技术部 | 3 | 王五 | 3 | 10000.00 |
| 3 | 销售部 | 3 | 王五 | 3 | 10000.00 |
| 2 | 人事部 | 4 | 赵六 | 3 | 10000.00 |
| 4 | 客服部 | 4 | 赵六 | 3 | 10000.00 |
| 1 | 技术部 | 4 | 赵六 | 3 | 10000.00 |
| 3 | 销售部 | 4 | 赵六 | 3 | 10000.00 |
| 2 | 人事部 | 5 | 胡七 | NULL | 10000.00 |
| 4 | 客服部 | 5 | 胡七 | NULL | 10000.00 |
| 1 | 技术部 | 5 | 胡七 | NULL | 10000.00 |
| 3 | 销售部 | 5 | 胡七 | NULL | 10000.00 |
| 2 | 人事部 | 6 | 朱八 | NULL | 10000.00 |
| 4 | 客服部 | 6 | 朱八 | NULL | 10000.00 |
| 1 | 技术部 | 6 | 朱八 | NULL | 10000.00 |
| 3 | 销售部 | 6 | 朱八 | NULL | 10000.00 |
+-----+--------+-----+-------+------+----------+
- Inner connection (display inner connection and implicit inner connection are just different in writing, the effect is the same)
mysql> select * from dept d inner join emp e on d.did = e.dno;
+-----+--------+-----+-------+-----+----------+
| did | dname | eid | ename | dno | sal |
+-----+--------+-----+-------+-----+----------+
| 1 | 技术部 | 1 | 张三 | 1 | 10000.00 |
| 2 | 人事部 | 2 | 李四 | 2 | 20000.00 |
| 3 | 销售部 | 3 | 王五 | 3 | 10000.00 |
| 3 | 销售部 | 4 | 赵六 | 3 | 10000.00 |
+-----+--------+-----+-------+-----+----------+
mysql> select * from dept d,emp e where d.did = e.dno;
+-----+--------+-----+-------+-----+----------+
| did | dname | eid | ename | dno | sal |
+-----+--------+-----+-------+-----+----------+
| 1 | 技术部 | 1 | 张三 | 1 | 10000.00 |
| 2 | 人事部 | 2 | 李四 | 2 | 20000.00 |
| 3 | 销售部 | 3 | 王五 | 3 | 10000.00 |
| 3 | 销售部 | 4 | 赵六 | 3 | 10000.00 |
+-----+--------+-----+-------+-----+----------+
4 rows in set (0.05 sec)
- Outer join (left outer join and right outer join are just different in order)
mysql> select * from dept d left join emp e on d.did = e.dno;
+-----+--------+------+-------+------+----------+
| did | dname | eid | ename | dno | sal |
+-----+--------+------+-------+------+----------+
| 1 | 技术部 | 1 | 张三 | 1 | 10000.00 |
| 2 | 人事部 | 2 | 李四 | 2 | 20000.00 |
| 3 | 销售部 | 3 | 王五 | 3 | 10000.00 |
| 3 | 销售部 | 4 | 赵六 | 3 | 10000.00 |
| 4 | 客服部 | NULL | NULL | NULL | NULL |
+-----+--------+------+-------+------+----------+
mysql> select * from emp e left join dept d on e.dno = d.did;
+-----+-------+------+----------+------+--------+
| eid | ename | dno | sal | did | dname |
+-----+-------+------+----------+------+--------+
| 1 | 张三 | 1 | 10000.00 | 1 | 技术部 |
| 2 | 李四 | 2 | 20000.00 | 2 | 人事部 |
| 3 | 王五 | 3 | 10000.00 | 3 | 销售部 |
| 4 | 赵六 | 3 | 10000.00 | 3 | 销售部 |
| 5 | 胡七 | NULL | 10000.00 | NULL | NULL |
| 6 | 朱八 | NULL | 10000.00 | NULL | NULL |
+-----+-------+------+----------+------+--------+
- Self-join (for example, you need to query employees in a department in the employee table)
mysql> select a.eid,a.ename from emp a,emp b where a.dno = b.dno and a.ename <> b.ename;
+-----+-------+
| eid | ename |
+-----+-------+
| 4 | 赵六 |
| 3 | 王五 |