MYSQL-マルチテーブル結合クエリ(グラフィック)

前書き

テーブル接続方法

  1. 内部結合は、2つのテーブルの交差データ、つまり主キーと外部キーに関連するデータをクエリします。キーワードの内部結合
  2. 外部結合は、左のテーブルのすべてのデータと、主キーおよび外部キーに関連するデータをクエリします。キーワード左外部結合オン、右外部結合オン
  3. 自己接続

テーブル接続例

ステップ1:2つのテーブル(departmentテーブルdeptおよびemployeeテーブル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    |                |
+-------+-------------+------+-----+---------+----------------+

ステップ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 |
+-----+-------+------+----------+

ステップ3:3つの接続方法のデモ

  • デカルト積(2つのテーブルの積)
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