前書き
テーブル接続方法
- 内部結合は、2つのテーブルの交差データ、つまり主キーと外部キーに関連するデータをクエリします。キーワードの内部結合
- 外部結合は、左のテーブルのすべてのデータと、主キーおよび外部キーに関連するデータをクエリします。キーワード左外部結合オン、右外部結合オン
- 自己接続
テーブル接続例
ステップ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つの接続方法のデモ
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 | 王五 |