Consulta de combinación de tablas múltiples MYSQL (gráfico)

Introducción

Método de conexión a la mesa

  1. La combinación interna consulta los datos de intersección de las dos tablas, es decir, los datos relacionados con la clave principal y externa. Unión interna de palabra clave en
  2. La combinación externa consulta todos los datos de la tabla de la izquierda y los datos relacionados con la clave principal y externa. Palabras clave combinación externa izquierda activada, combinación externa derecha activada
  3. Auto-conexión

Ejemplo de conexión de mesa

Paso 1: Cree dos tablas: departamento de tabla de departamento y tabla de empleado emp, y asocie la clave externa de emp.dno a 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    |                |
+-------+-------------+------+-----+---------+----------------+

Paso 2: inicializar los datos de la tabla

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

Paso 3: demostración de tres métodos de conexión

  • Producto cartesiano (producto de dos tablas)
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 |
+-----+--------+-----+-------+------+----------+
  • Conexión interna (la conexión interna de la pantalla y la conexión interna implícita son simplemente diferentes en la escritura, el efecto es el mismo)
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)

La parte sombreada es el resultado de la consulta.

  • Unión externa (la combinación externa izquierda y la combinación externa derecha son simplemente diferentes en orden)
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   |
+-----+-------+------+----------+------+--------+

La parte sombreada es el resultado de la consulta.La parte sombreada es el resultado de la consulta.

  • Autounión (por ejemplo, necesita consultar a los empleados de un departamento en la tabla de empleados)
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 | 王五  |

Supongo que te gusta

Origin blog.csdn.net/magentodaddy/article/details/108292049
Recomendado
Clasificación