ホームページ >データベース >mysql チュートリアル >MySQL での結合の使用状況の分析

MySQL での結合の使用状況の分析

黄舟
黄舟オリジナル
2017-02-27 11:54:421851ブラウズ


MySQLにおける結合の使用状況の分析


インスタンスデータベースは以下の通りです:
studentテーブル:

mysql> select * from student;
+-----------+-----------+------+------+-------+
| Sno       | Sname     | Ssex | Sage | Sdept |
+-----------+-----------+------+------+-------+
| 201215121 | 李勇      | 男   |   22 | CS    |
| 201215122 | 刘晨      | 女   |   19 | CS    |
| 201215123 | 王敏      | 女   |   18 | MA    |
| 201215125 | 张立      | 男   |   19 | IS    |
| 201215128 | 陈冬      | 男   |   18 | IS    |
| 201215126 | 张成民    | 男   |   18 | CS    |
+-----------+-----------+------+------+-------+6 rows in set (0.00 sec)

scテーブル:

mysql> select * from sc;
+-----------+------+-------+
| Sno       | Cno  | Grade |
+-----------+------+-------+
| 201215121 |    1 |    92 |
| 201215121 |    2 |    85 |
| 201215121 |    3 |    88 |
| 201215122 |    2 |    90 |
| 201215122 |    3 |    80 |
| 201215128 |    1 |    78 |
+-----------+------+-------+6 rows in set (0.00 sec)

LEFT JOIN(左結合)

MySQL での結合の使用状況の分析
SQL文は以下の通り:

select * from student left join sc on student.Sno=sc.Sno;

実行結果は次のとおりです:

+-----------+-----------+------+------+-------+-----------+------+-------+
| Sno       | Sname     | Ssex | Sage | Sdept | Sno       | Cno  | Grade |
+-----------+-----------+------+------+-------+-----------+------+-------+
| 201215121 | 李勇      | 男   |   22 | CS    | 201215121 |    1 |    92 |
| 201215121 | 李勇      | 男   |   22 | CS    | 201215121 |    2 |    85 |
| 201215121 | 李勇      | 男   |   22 | CS    | 201215121 |    3 |    88 |
| 201215122 | 刘晨      | 女   |   19 | CS    | 201215122 |    2 |    90 |
| 201215122 | 刘晨      | 女   |   19 | CS    | 201215122 |    3 |    80 |
| 201215128 | 陈冬      | 男   |   18 | IS    | 201215128 |    1 |    78 |
| 201215123 | 王敏      | 女   |   18 | MA    |      NULL | NULL |  NULL |
| 201215125 | 张立      | 男   |   19 | IS    |      NULL | NULL |  NULL |
| 201215126 | 张成民    | 男   |   18 | CS    |      NULL | NULL |  NULL |
+-----------+-----------+------+------+-------+-----------+------+-------+

この例では、左の結合は Student テーブルのレコードに基づいており、Student テーブルは左のテーブルと見なすことができ、sc テーブルは右のテーブルと見なすことができます。左側のテーブルのレコードが完全に表示され、さらに一致します。 左側のテーブルが一致しない場合、残りの部分は null になります。

USING 文

using 文は on 文と似ていますが、結果は少し異なります。
例:

mysql> select student.Sno,Sname,Grade from student left join sc on student.Sno=sc.Sno;
+-----------+-----------+-------+
| Sno       | Sname     | Grade |
+-----------+-----------+-------+
| 201215121 | 李勇      |    92 |
| 201215121 | 李勇      |    85 |
| 201215121 | 李勇      |    88 |
| 201215122 | 刘晨      |    90 |
| 201215122 | 刘晨      |    80 |
| 201215128 | 陈冬      |    78 |
| 201215123 | 王敏      |  NULL |
| 201215125 | 张立      |  NULL |
| 201215126 | 张成民    |  NULL |
+-----------+-----------+-------+
9 rows in set (0.00 sec)

上記は、場所を変えた

select Sno,Sname,Grade from student left join sc using(Sno);
+-----------+-----------+-------+
| Sno       | Sname     | Grade |
+-----------+-----------+-------+
| 201215121 | 李勇      |    92 |
| 201215121 | 李勇      |    85 |
| 201215121 | 李勇      |    88 |
| 201215122 | 刘晨      |    90 |
| 201215122 | 刘晨      |    80 |
| 201215128 | 陈冬      |    78 |
| 201215123 | 王敏      |  NULL |
| 201215125 | 张立      |  NULL |
| 201215126 | 张成民    |  NULL |
+-----------+-----------+-------+

と同等です。例:

select * from student left join sc on student.Sno=sc.Sno;
+-----------+-----------+------+------+-------+-----------+------+-------+
| Sno       | Sname     | Ssex | Sage | Sdept | Sno       | Cno  | Grade |
+-----------+-----------+------+------+-------+-----------+------+-------+
| 201215121 | 李勇      | 男   |   22 | CS    | 201215121 |    1 |    92 |
| 201215121 | 李勇      | 男   |   22 | CS    | 201215121 |    2 |    85 |
| 201215121 | 李勇      | 男   |   22 | CS    | 201215121 |    3 |    88 |
| 201215122 | 刘晨      | 女   |   19 | CS    | 201215122 |    2 |    90 |
| 201215122 | 刘晨      | 女   |   19 | CS    | 201215122 |    3 |    80 |
| 201215128 | 陈冬      | 男   |   18 | IS    | 201215128 |    1 |    78 |
| 201215123 | 王敏      | 女   |   18 | MA    |      NULL | NULL |  NULL |
| 201215125 | 张立      | 男   |   19 | IS    |      NULL | NULL |  NULL |
| 201215126 | 张成民    | 男   |   18 | CS    |      NULL | NULL |  NULL |
+-----------+-----------+------+------+-------+-----------+------+-------+
select * from student left join sc using (sno);
+-----------+-----------+------+------+-------+------+-------+
| Sno       | Sname     | Ssex | Sage | Sdept | Cno  | Grade |
+-----------+-----------+------+------+-------+------+-------+
| 201215121 | 李勇      | 男   |   22 | CS    |    1 |    92 |
| 201215121 | 李勇      | 男   |   22 | CS    |    2 |    85 |
| 201215121 | 李勇      | 男   |   22 | CS    |    3 |    88 |
| 201215122 | 刘晨      | 女   |   19 | CS    |    2 |    90 |
| 201215122 | 刘晨      | 女   |   19 | CS    |    3 |    80 |
| 201215128 | 陈冬      | 男   |   18 | IS    |    1 |    78 |
| 201215123 | 王敏      | 女   |   18 | MA    | NULL |  NULL |
| 201215125 | 张立      | 男   |   19 | IS    | NULL |  NULL |
| 201215126 | 张成民    | 男   |   18 | CS    | NULL |  NULL |
+-----------+-----------+------+------+-------+------+-------+

on文を使用すると繰り返しSno列が2回出力されます

RIGHT JOIN(右結合)

同じLEFT JOIN として、右のテーブルに基づいています。例:

 select * from student right join sc using (sno);
+-----------+------+-------+--------+------+------+-------+
| Sno       | Cno  | Grade | Sname  | Ssex | Sage | Sdept |
+-----------+------+-------+--------+------+------+-------+
| 201215121 |    1 |    92 | 李勇   | 男   |   22 | CS    |
| 201215121 |    2 |    85 | 李勇   | 男   |   22 | CS    |
| 201215121 |    3 |    88 | 李勇   | 男   |   22 | CS    |
| 201215122 |    2 |    90 | 刘晨   | 女   |   19 | CS    |
| 201215122 |    3 |    80 | 刘晨   | 女   |   19 | CS    |
| 201215128 |    1 |    78 | 陈冬   | 男   |   18 | IS    |
+-----------+------+-------+--------+------+------+-------+

INNER JOIN (等価結合または内部結合)

MySQL での結合の使用状況の分析

は誰が基準であるかは表示されず、条件を満たすレコードのみが表示されます。

 select * from student inner join sc on student.Sno=sc.Sno;
+-----------+--------+------+------+-------+-----------+------+-------+
| Sno       | Sname  | Ssex | Sage | Sdept | Sno       | Cno  | Grade |
+-----------+--------+------+------+-------+-----------+------+-------+
| 201215121 | 李勇   | 男   |   22 | CS    | 201215121 |    1 |    92 |
| 201215121 | 李勇   | 男   |   22 | CS    | 201215121 |    2 |    85 |
| 201215121 | 李勇   | 男   |   22 | CS    | 201215121 |    3 |    88 |
| 201215122 | 刘晨   | 女   |   19 | CS    | 201215122 |    2 |    90 |
| 201215122 | 刘晨   | 女   |   19 | CS    | 201215122 |    3 |    80 |
| 201215128 | 陈冬   | 男   |   18 | IS    | 201215128 |    1 |    78 |
+-----------+--------+------+------+-------+-----------+------+-------+

上記のステートメントは次と同等です:

select * from student,sc where student.Sno=sc.Sno;
+-----------+--------+------+------+-------+-----------+------+-------+
| Sno       | Sname  | Ssex | Sage | Sdept | Sno       | Cno  | Grade |
+-----------+--------+------+------+-------+-----------+------+-------+
| 201215121 | 李勇   | 男   |   22 | CS    | 201215121 |    1 |    92 |
| 201215121 | 李勇   | 男   |   22 | CS    | 201215121 |    2 |    85 |
| 201215121 | 李勇   | 男   |   22 | CS    | 201215121 |    3 |    88 |
| 201215122 | 刘晨   | 女   |   19 | CS    | 201215122 |    2 |    90 |
| 201215122 | 刘晨   | 女   |   19 | CS    | 201215122 |    3 |    80 |
| 201215128 | 陈冬   | 男   |   18 | IS    | 201215128 |    1 |    78 |
+-----------+--------+------+------+-------+-----------+------+-------+

Extension

テーブル A からいくつかのレコードを取得するだけで、テーブル B は含まない場合

MySQL での結合の使用状況の分析

left join の後に where ステートメントを追加できます

select * from student left join sc using(Sno) where sc.Sno is null;
+-----------+-----------+------+------+-------+------+-------+
| Sno       | Sname     | Ssex | Sage | Sdept | Cno  | Grade |
+-----------+-----------+------+------+-------+------+-------+
| 201215123 | 王敏      | 女   |   18 | MA    | NULL |  NULL |
| 201215125 | 张立      | 男   |   19 | IS    | NULL |  NULL |
| 201215126 | 张成民    | 男   |   18 | CS    | NULL |  NULL |
+-----------+-----------+------+------+-------+------+-------+

差分集合

MySQL での結合の使用状況の分析

は結合可能 共用体句については、この例では、右側のものはすでにすべて対応しているため、表示される結果は前のものと同じです。

select * from student left join sc using(Sno) where student.Sno is null union 
select * from student left join sc using(Sno) where sc.Sno is null;
+-----------+-----------+------+------+-------+------+-------+
| Sno       | Sname     | Ssex | Sage | Sdept | Cno  | Grade |
+-----------+-----------+------+------+-------+------+-------+
| 201215123 | 王敏      | 女   |   18 | MA    | NULL |  NULL |
| 201215125 | 张立      | 男   |   19 | IS    | NULL |  NULL |
| 201215126 | 张成民    | 男   |   18 | CS    | NULL |  NULL |
+-----------+-----------+------+------+-------+------+-------+

FULL JOIN

MySQL での結合の使用状況の分析

 select * from student left join sc on student.Sno=sc.Sno union  select * from student right join sc on student.Sno=sc.Sno;
+-----------+-----------+------+------+-------+-----------+------+-------+
| Sno       | Sname     | Ssex | Sage | Sdept | Sno       | Cno  | Grade |
+-----------+-----------+------+------+-------+-----------+------+-------+
| 201215121 | 李勇      | 男   |   22 | CS    | 201215121 |    1 |    92 |
| 201215121 | 李勇      | 男   |   22 | CS    | 201215121 |    2 |    85 |
| 201215121 | 李勇      | 男   |   22 | CS    | 201215121 |    3 |    88 |
| 201215122 | 刘晨      | 女   |   19 | CS    | 201215122 |    2 |    90 |
| 201215122 | 刘晨      | 女   |   19 | CS    | 201215122 |    3 |    80 |
| 201215128 | 陈冬      | 男   |   18 | IS    | 201215128 |    1 |    78 |
| 201215123 | 王敏      | 女   |   18 | MA    |      NULL | NULL |  NULL |
| 201215125 | 张立      | 男   |   19 | IS    |      NULL | NULL |  NULL |
| 201215126 | 张成民    | 男   |   18 | CS    |      NULL | NULL |  NULL |
+-----------+-----------+------+------+-------+-----------+------+-------+

注: 左結合 B は B 右結合 A と同等です

mysql> select * from student left join sc using(Sno);
+-----------+-----------+------+------+-------+------+-------+
| Sno       | Sname     | Ssex | Sage | Sdept | Cno  | Grade |
+-----------+-----------+------+------+-------+------+-------+
| 201215121 | 李勇      | 男   |   22 | CS    |    1 |    92 |
| 201215121 | 李勇      | 男   |   22 | CS    |    2 |    85 |
| 201215121 | 李勇      | 男   |   22 | CS    |    3 |    88 |
| 201215122 | 刘晨      | 女   |   19 | CS    |    2 |    90 |
| 201215122 | 刘晨      | 女   |   19 | CS    |    3 |    80 |
| 201215128 | 陈冬      | 男   |   18 | IS    |    1 |    78 |
| 201215123 | 王敏      | 女   |   18 | MA    | NULL |  NULL |
| 201215125 | 张立      | 男   |   19 | IS    | NULL |  NULL |
| 201215126 | 张成民    | 男   |   18 | CS    | NULL |  NULL |
+-----------+-----------+------+------+-------+------+-------+
9 rows in set (0.00 sec)mysql> select * from sc right join student using(Sno);
+-----------+-----------+------+------+-------+------+-------+
| Sno       | Sname     | Ssex | Sage | Sdept | Cno  | Grade |
+-----------+-----------+------+------+-------+------+-------+
| 201215121 | 李勇      | 男   |   22 | CS    |    1 |    92 |
| 201215121 | 李勇      | 男   |   22 | CS    |    2 |    85 |
| 201215121 | 李勇      | 男   |   22 | CS    |    3 |    88 |
| 201215122 | 刘晨      | 女   |   19 | CS    |    2 |    90 |
| 201215122 | 刘晨      | 女   |   19 | CS    |    3 |    80 |
| 201215128 | 陈冬      | 男   |   18 | IS    |    1 |    78 |
| 201215123 | 王敏      | 女   |   18 | MA    | NULL |  NULL |
| 201215125 | 张立      | 男   |   19 | IS    | NULL |  NULL |
| 201215126 | 张成民    | 男   |   18 | CS    | NULL |  NULL |
+-----------+-----------+------+------+-------+------+-------+

MySQL での結合使用法の分析

データベースの例は次のとおりです:
student テーブル:

mysql> select * from student;
+-----------+-----------+------+------+-------+
| Sno       | Sname     | Ssex | Sage | Sdept |
+-----------+-----------+------+------+-------+
| 201215121 | 李勇      | 男   |   22 | CS    |
| 201215122 | 刘晨      | 女   |   19 | CS    |
| 201215123 | 王敏      | 女   |   18 | MA    |
| 201215125 | 张立      | 男   |   19 | IS    |
| 201215128 | 陈冬      | 男   |   18 | IS    |
| 201215126 | 张成民    | 男   |   18 | CS    |
+-----------+-----------+------+------+-------+
6 rows in set (0.00 sec)

scテーブル:

mysql> select * from sc;
+-----------+------+-------+
| Sno       | Cno  | Grade |
+-----------+------+-------+
| 201215121 |    1 |    92 |
| 201215121 |    2 |    85 |
| 201215121 |    3 |    88 |
| 201215122 |    2 |    90 |
| 201215122 |    3 |    80 |
| 201215128 |    1 |    78 |
+-----------+------+-------+
6 rows in set (0.00 sec)

LEFT JOIN (左結合)

MySQL での結合の使用状況の分析
SQL ステートメントは次のとおりです:

select * from student left join sc on student.Sno=sc.Sno;

実行結果は次のとおりです:

+-----------+-----------+------+------+-------+-----------+------+-------+
| Sno       | Sname     | Ssex | Sage | Sdept | Sno       | Cno  | Grade |
+-----------+-----------+------+------+-------+-----------+------+-------+
| 201215121 | 李勇      | 男   |   22 | CS    | 201215121 |    1 |    92 |
| 201215121 | 李勇      | 男   |   22 | CS    | 201215121 |    2 |    85 |
| 201215121 | 李勇      | 男   |   22 | CS    | 201215121 |    3 |    88 |
| 201215122 | 刘晨      | 女   |   19 | CS    | 201215122 |    2 |    90 |
| 201215122 | 刘晨      | 女   |   19 | CS    | 201215122 |    3 |    80 |
| 201215128 | 陈冬      | 男   |   18 | IS    | 201215128 |    1 |    78 |
| 201215123 | 王敏      | 女   |   18 | MA    |      NULL | NULL |  NULL |
| 201215125 | 张立      | 男   |   19 | IS    |      NULL | NULL |  NULL |
| 201215126 | 张成民    | 男   |   18 | CS    |      NULL | NULL |  NULL |
+-----------+-----------+------+------+-------+-----------+------+-------+

この例では、左結合は Student テーブル内のレコードに基づいています。 Student テーブルは左側のテーブル、SC テーブルは右側のテーブルとみなすことができます。左側のテーブルのレコードがすべて表示され、左側のテーブルが一致しない場合は、残りのテーブルが表示されます。部分は null として表示されます。

USING 文

using 文は on 文と似ていますが、結果は少し異なります。
例:

mysql> select student.Sno,Sname,Grade from student left join sc on student.Sno=sc.Sno;
+-----------+-----------+-------+| Sno       | Sname     | Grade |
+-----------+-----------+-------+| 201215121 | 李勇      |    92 |
| 201215121 | 李勇      |    85 |
| 201215121 | 李勇      |    88 |
| 201215122 | 刘晨      |    90 |
| 201215122 | 刘晨      |    80 |
| 201215128 | 陈冬      |    78 |
| 201215123 | 王敏      |  NULL |
| 201215125 | 张立      |  NULL || 201215126 | 张成民    |  NULL |
+-----------+-----------+-------+9 rows in set (0.00 sec)

上記は、場所を変えた

select Sno,Sname,Grade from student left join sc using(Sno);
+-----------+-----------+-------+| Sno       | Sname     | Grade |
+-----------+-----------+-------+| 201215121 | 李勇      |    92 |
| 201215121 | 李勇      |    85 |
| 201215121 | 李勇      |    88 |
| 201215122 | 刘晨      |    90 |
| 201215122 | 刘晨      |    80 |
| 201215128 | 陈冬      |    78 |
| 201215123 | 王敏      |  NULL |
| 201215125 | 张立      |  NULL || 201215126 | 张成民    |  NULL |
+-----------+-----------+-------+

と同等です。例:

select * from student left join sc on student.Sno=sc.Sno;
+-----------+-----------+------+------+-------+-----------+------+-------+
| Sno       | Sname     | Ssex | Sage | Sdept | Sno       | Cno  | Grade |
+-----------+-----------+------+------+-------+-----------+------+-------+
| 201215121 | 李勇      | 男   |   22 | CS    | 201215121 |    1 |    92 |
| 201215121 | 李勇      | 男   |   22 | CS    | 201215121 |    2 |    85 |
| 201215121 | 李勇      | 男   |   22 | CS    | 201215121 |    3 |    88 |
| 201215122 | 刘晨      | 女   |   19 | CS    | 201215122 |    2 |    90 |
| 201215122 | 刘晨      | 女   |   19 | CS    | 201215122 |    3 |    80 |
| 201215128 | 陈冬      | 男   |   18 | IS    | 201215128 |    1 |    78 |
| 201215123 | 王敏      | 女   |   18 | MA    |      NULL | NULL |  NULL |
| 201215125 | 张立      | 男   |   19 | IS    |      NULL | NULL |  NULL |
| 201215126 | 张成民    | 男   |   18 | CS    |      NULL | NULL |  NULL |
+-----------+-----------+------+------+-------+-----------+------+-------+
select * from student left join sc using (sno);
+-----------+-----------+------+------+-------+------+-------+
| Sno       | Sname     | Ssex | Sage | Sdept | Cno  | Grade |
+-----------+-----------+------+------+-------+------+-------+
| 201215121 | 李勇      | 男   |   22 | CS    |    1 |    92 |
| 201215121 | 李勇      | 男   |   22 | CS    |    2 |    85 |
| 201215121 | 李勇      | 男   |   22 | CS    |    3 |    88 |
| 201215122 | 刘晨      | 女   |   19 | CS    |    2 |    90 |
| 201215122 | 刘晨      | 女   |   19 | CS    |    3 |    80 |
| 201215128 | 陈冬      | 男   |   18 | IS    |    1 |    78 |
| 201215123 | 王敏      | 女   |   18 | MA    | NULL |  NULL |
| 201215125 | 张立      | 男   |   19 | IS    | NULL |  NULL |
| 201215126 | 张成民    | 男   |   18 | CS    | NULL |  NULL |
+-----------+-----------+------+------+-------+------+-------+

on文を使用すると繰り返しSno列が2回出力されます

RIGHT JOIN(右結合)

同じLEFT JOIN として、適切なテーブルに基づいています。例:

 select * from student right join sc using (sno);
+-----------+------+-------+--------+------+------+-------+
| Sno       | Cno  | Grade | Sname  | Ssex | Sage | Sdept |
+-----------+------+-------+--------+------+------+-------+
| 201215121 |    1 |    92 | 李勇   | 男   |   22 | CS    |
| 201215121 |    2 |    85 | 李勇   | 男   |   22 | CS    |
| 201215121 |    3 |    88 | 李勇   | 男   |   22 | CS    |
| 201215122 |    2 |    90 | 刘晨   | 女   |   19 | CS    |
| 201215122 |    3 |    80 | 刘晨   | 女   |   19 | CS    |
| 201215128 |    1 |    78 | 陈冬   | 男   |   18 | IS    |
+-----------+------+-------+--------+------+------+-------+

INNER JOIN (等価結合または内部結合)

MySQL での結合の使用状況の分析

は、誰がそれに基づいているかは表示されず、条件を満たすレコードのみが表示されます。表示される

 select * from student inner join sc on student.Sno=sc.Sno;
+-----------+--------+------+------+-------+-----------+------+-------+
| Sno       | Sname  | Ssex | Sage | Sdept | Sno       | Cno  | Grade |
+-----------+--------+------+------+-------+-----------+------+-------+
| 201215121 | 李勇   | 男   |   22 | CS    | 201215121 |    1 |    92 |
| 201215121 | 李勇   | 男   |   22 | CS    | 201215121 |    2 |    85 |
| 201215121 | 李勇   | 男   |   22 | CS    | 201215121 |    3 |    88 |
| 201215122 | 刘晨   | 女   |   19 | CS    | 201215122 |    2 |    90 |
| 201215122 | 刘晨   | 女   |   19 | CS    | 201215122 |    3 |    80 |
| 201215128 | 陈冬   | 男   |   18 | IS    | 201215128 |    1 |    78 |
+-----------+--------+------+------+-------+-----------+------+-------+

上記のステートメントは次と同等です:

select * from student,sc where student.Sno=sc.Sno;
+-----------+--------+------+------+-------+-----------+------+-------+
| Sno       | Sname  | Ssex | Sage | Sdept | Sno       | Cno  | Grade |
+-----------+--------+------+------+-------+-----------+------+-------+
| 201215121 | 李勇   | 男   |   22 | CS    | 201215121 |    1 |    92 |
| 201215121 | 李勇   | 男   |   22 | CS    | 201215121 |    2 |    85 |
| 201215121 | 李勇   | 男   |   22 | CS    | 201215121 |    3 |    88 |
| 201215122 | 刘晨   | 女   |   19 | CS    | 201215122 |    2 |    90 |
| 201215122 | 刘晨   | 女   |   19 | CS    | 201215122 |    3 |    80 |
| 201215128 | 陈冬   | 男   |   18 | IS    | 201215128 |    1 |    78 |
+-----------+--------+------+------+-------+-----------+------+-------+

Extension

テーブル A からいくつかのレコードをフェッチするだけでテーブル B は含まない場合

MySQL での結合の使用状況の分析

左結合の後に where ステートメントを追加できます

select * from student left join sc using(Sno) where sc.Sno is null;
+-----------+-----------+------+------+-------+------+-------+
| Sno       | Sname     | Ssex | Sage | Sdept | Cno  | Grade |
+-----------+-----------+------+------+-------+------+-------+
| 201215123 | 王敏      | 女   |   18 | MA    | NULL |  NULL |
| 201215125 | 张立      | 男   |   19 | IS    | NULL |  NULL |
| 201215126 | 张成民    | 男   |   18 | CS    | NULL |  NULL |
+-----------+-----------+------+------+-------+------+-------+

差分集合

MySQL での結合の使用状況の分析

は結合可能 Union句については、この例では右辺のものが全て対応しているため、表示される結果は前と同じになります。

select * from student left join sc using(Sno) where student.Sno is null union 
select * from student left join sc using(Sno) where sc.Sno is null;
+-----------+-----------+------+------+-------+------+-------+
| Sno       | Sname     | Ssex | Sage | Sdept | Cno  | Grade |
+-----------+-----------+------+------+-------+------+-------+
| 201215123 | 王敏      | 女   |   18 | MA    | NULL |  NULL |
| 201215125 | 张立      | 男   |   19 | IS    | NULL |  NULL |
| 201215126 | 张成民    | 男   |   18 | CS    | NULL |  NULL |
+-----------+-----------+------+------+-------+------+-------+

FULL JOIN

MySQL での結合の使用状況の分析

 select * from student left join sc on student.Sno=sc.Sno union  select * from student right join sc on student.Sno=sc.Sno;
+-----------+-----------+------+------+-------+-----------+------+-------+
| Sno       | Sname     | Ssex | Sage | Sdept | Sno       | Cno  | Grade |
+-----------+-----------+------+------+-------+-----------+------+-------+
| 201215121 | 李勇      | 男   |   22 | CS    | 201215121 |    1 |    92 |
| 201215121 | 李勇      | 男   |   22 | CS    | 201215121 |    2 |    85 |
| 201215121 | 李勇      | 男   |   22 | CS    | 201215121 |    3 |    88 |
| 201215122 | 刘晨      | 女   |   19 | CS    | 201215122 |    2 |    90 |
| 201215122 | 刘晨      | 女   |   19 | CS    | 201215122 |    3 |    80 |
| 201215128 | 陈冬      | 男   |   18 | IS    | 201215128 |    1 |    78 |
| 201215123 | 王敏      | 女   |   18 | MA    |      NULL | NULL |  NULL |
| 201215125 | 张立      | 男   |   19 | IS    |      NULL | NULL |  NULL |
| 201215126 | 张成民    | 男   |   18 | CS    |      NULL | NULL |  NULL |
+-----------+-----------+------+------+-------+-----------+------+-------+

注: 左結合 B は B 右結合 A と同等です

mysql> select * from student left join sc using(Sno);
+-----------+-----------+------+------+-------+------+-------+
| Sno       | Sname     | Ssex | Sage | Sdept | Cno  | Grade |
+-----------+-----------+------+------+-------+------+-------+
| 201215121 | 李勇      | 男   |   22 | CS    |    1 |    92 |
| 201215121 | 李勇      | 男   |   22 | CS    |    2 |    85 |
| 201215121 | 李勇      | 男   |   22 | CS    |    3 |    88 |
| 201215122 | 刘晨      | 女   |   19 | CS    |    2 |    90 |
| 201215122 | 刘晨      | 女   |   19 | CS    |    3 |    80 |
| 201215128 | 陈冬      | 男   |   18 | IS    |    1 |    78 |
| 201215123 | 王敏      | 女   |   18 | MA    | NULL |  NULL |
| 201215125 | 张立      | 男   |   19 | IS    | NULL |  NULL |
| 201215126 | 张成民    | 男   |   18 | CS    | NULL |  NULL |
+-----------+-----------+------+------+-------+------+-------+
9 rows in set (0.00 sec)mysql> select * from sc right join student using(Sno);
+-----------+-----------+------+------+-------+------+-------+
| Sno       | Sname     | Ssex | Sage | Sdept | Cno  | Grade |
+-----------+-----------+------+------+-------+------+-------+
| 201215121 | 李勇      | 男   |   22 | CS    |    1 |    92 |
| 201215121 | 李勇      | 男   |   22 | CS    |    2 |    85 |
| 201215121 | 李勇      | 男   |   22 | CS    |    3 |    88 |
| 201215122 | 刘晨      | 女   |   19 | CS    |    2 |    90 |
| 201215122 | 刘晨      | 女   |   19 | CS    |    3 |    80 |
| 201215128 | 陈冬      | 男   |   18 | IS    |    1 |    78 |
| 201215123 | 王敏      | 女   |   18 | MA    | NULL |  NULL |
| 201215125 | 张立      | 男   |   19 | IS    | NULL |  NULL |
| 201215126 | 张成民    | 男   |   18 | CS    | NULL |  NULL |
+-----------+-----------+------+------+-------+------+-------+

上記は、MySQL での結合使用の分析です。さらに関連する内容については、PHP 中国語に注意してください。ウェブサイト (www.php.cn)!


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。