MYSQL-多表连接查询(图文)

简介

表连接的方式

  1. 内连接 查询的是两张表交集数据,即主外键关联数据。关键字 inner join on
  2. 外连接 查询的是左表中所有数据和主外键关联数据。关键字 left outer join on,right outer join on
  3. 自连接

表连接示例

Step 1: 创建两张表:部门表dept 员工表emp,并将emp.dno外键关联到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: 初始化表数据

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:三种连接方式演示

  • 笛卡尔积(两张表的乘积)
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 |
+-----+--------+-----+-------+------+----------+
  • 内连接(显示内连接和隐式内连接只是写法不同,效果一样)
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)

阴影部分为查询结果

  • 外连接(左外连接和右外连接只是顺序不同)
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   |
+-----+-------+------+----------+------+--------+

阴影部分为查询结果阴影部分为查询结果

  • 自连接(比如需要查询员工表中在一个部门的员工)
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 | 王五  |

猜你喜欢

转载自blog.csdn.net/magentodaddy/article/details/108292049