MYSQL-Multi-table join query (graphic)

Introduction

Table connection method

  1. The inner join queries the intersection data of the two tables, that is, the primary and foreign key related data. Keyword inner join on
  2. 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
  3. 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)

The shaded part is the query result

  • 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   |
+-----+-------+------+----------+------+--------+

The shaded part is the query resultThe shaded part is the query result

  • 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 | 王五  |

Guess you like

Origin blog.csdn.net/magentodaddy/article/details/108292049