複数のテーブルの結合クエリ

複数テーブルの結合クエリ

テーブル接続

複数のテーブルのフィールドをクエリする必要がある場合、テーブル接続を使用してそれを実現できます。テーブル結合は内部結合と外部結合に分けられます。

1. 内部結合: 2 つのテーブルのフィールドの結合関係が一致するレコード間の結合で、レコード セットを形成します。

2. 外部結合: 他の一致しないレコードが選択され、外部左結合と外部右結合に分割されます。

学習実験の前に、全員に 2 つのシミュレートされたデータ テーブルを用意しました:

1. ユーザー テーブルにはユーザー情報が格納されます

2. 注文テーブルにはどのユーザーがどの製品を購入したかが格納されます

ユーザー テーブル作成ステートメント

     CREATE TABLE IF NOT EXISTS user (
 uid int(11) NOT NULL,
 username varchar(30) NOT NULL,
 password char(32) NOT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    CREATE TABLE IF NOT EXISTS order_goods (
 oid int(11) NOT NULL,
 uid int(11) NOT NULL,
 name varchar(50) NOT NULL,
 buytime int(11) NOT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

user テーブルのデータは次のとおりです。

QQ截图20161009160016.png

QQ截图20161009160030.png

QQ截图20161009160042.png


注: 上記の order_goods テーブルでは、uid は user テーブルの uid フィールドを指します。上の表では、oid を持つデータ行は 1 で、uid を持つユーザーは 10 です。ユーザー テーブルの uid 10 を持つユーザーの場合: Gao Xiaofeng。ユーザーは Apple マウスを購入しました。購入時間 buytime は Unix タイムスタンプです。

内部結合

QQ截图20161009160110.png

注: 次の例では、from テーブルはテーブル エイリアスを使用します。

テーブル名が長すぎるため、記述するたびに間違いを犯しやすくなります。表の後に英語の短縮文字列を直接続けることができます。以前にフィールドを結合する場合は、省略形 string.field を使用してください。

mysql> select u.uid ,u.username as username,o.oid,o.uid,o.name as shopname from user u,order_goods o where u.uid = o.uid;
 +-----+-----------+-----+-----+---------------+
 | uid | username | oid | uid | shopname |
 +-----+-----------+-----+-----+---------------+
 | 10 | 高小峰 | 1 | 10 | 苹果鼠标 |
 | 3 | 李文凯 | 2 | 3 | iphone 12s |
 | 12 | 李小超 | 3 | 12 | 雪碧 |
 | 15 | 佟小刚 | 4 | 15 | |
 | 3 | 李文凯 | 5 | 3 | iphone 键盘 |
 +-----+-----------+-----+-----+---------------+
 5 rows in set (0.00 sec)

基本文法 2:

QQ截图20161009160138.png

結果は基本文法 1 と同じです。

mysql> select user.uid ,user.username as username,order_goods.oid,order_goods.uid,order_goods.name as shopname from user inner join order_goods on user.uid = order_goods.uid;
 +-----+-----------+-----+-----+---------------+
 | uid | username | oid | uid | shopname |
 +-----+-----------+-----+-----+---------------+
 | 10 | 高小峰 | 1 | 10 | 苹果鼠标 |
 | 3 | 李文凯 | 2 | 3 | iphone 12s |
 | 12 | 李小超 | 3 | 12 | 雪碧 |
 | 15 | 佟小刚 | 4 | 15 | |
 | 3 | 李文凯 | 5 | 3 | iphone 键盘 |
 +-----+-----------+-----+-----+---------------+
 5 rows in set (0.00 sec)

外部結合

QQ截图20161009160204.png

外部結合は、左結合と右リンクに分けられます。具体的な定義は次のとおりです。

左結合: 右側のテーブルに一致しないレコードも含め、左側のテーブルのすべてのレコードが含まれます

mysql> select * from user left join order_goods on user.uid = order_goods.uid;
 +-----+-----------+------------+------+------+---------------+-----------+
 | uid | username | password | oid | uid | name | buytime |
 +-----+-----------+------------+------+------+---------------+-----------+
 | 10 | 高小峰 | 3124qwqw | 1 | 10 | 苹果鼠标 | 1212313 |
 | 3 | 李文凯 | 1235531 | 2 | 3 | iphone 12s | 123121241 |
 | 12 | 李小超 | 311aqqee | 3 | 12 | 雪碧 | 13232333 |
 | 15 | 佟小刚 | 3cxvdfs | 4 | 15 | | 34242123 |
 | 3 | 李文凯 | 1235531 | 5 | 3 | iphone 键盘 | 12123413 |
 | 1 | 景甜 | 123456 | NULL | NULL | NULL | NULL |
 | 2 | 王小二 | 245667 | NULL | NULL | NULL | NULL |
 | 4 | 井柏然 | 123455 | NULL | NULL | NULL | NULL |
 | 5 | 范冰冰 | 5abcwa | NULL | NULL | NULL | NULL |
 | 6 | 黄晓明 | abcdeef | NULL | NULL | NULL | NULL |
 | 7 | anglebaby | caption | NULL | NULL | NULL | NULL |
 | 8 | TFBOYS | abcdwww | NULL | NULL | NULL | NULL |
 | 9 | 安小超 | 12tfddwd | NULL | NULL | NULL | NULL |
 | 11 | 李小强 | 323fxfvdvd | NULL | NULL | NULL | NULL |
 | 13 | 韩小平 | 121rcfwrfq | NULL | NULL | NULL | NULL |
 | 14 | 宋小康 | 123123tcsd | NULL | NULL | NULL | NULL |
 +-----+-----------+------------+------+------+---------------+-----------+
 16 rows in set (0.00 sec)

右結合: 右側のテーブルに一致しないレコードも含め、右側のテーブルのすべてのレコードが含まれます

QQ截图20161009160220.png

りー

サブクエリ

場合によっては、クエリを実行するときに、必要な条件が別の選択ステートメントの結果である場合、サブクエリを使用する必要があります。サブクエリに使用されるキーワードには、in、not in、=、!=、exists、notexists などが含まれます。


QQ截图20161009160240.png

例 1:

mysql> select * from user right join order_goods on user.uid = order_goods.uid;
 +------+-----------+----------+-----+-----+---------------+-----------+
 | uid | username | password | oid | uid | name | buytime |
 +------+-----------+----------+-----+-----+---------------+-----------+
 | 10 | 高小峰 | 3124qwqw | 1 | 10 | 苹果鼠标 | 1212313 |
 | 3 | 李文凯 | 1235531 | 2 | 3 | iphone 12s | 123121241 |
 | 12 | 李小超 | 311aqqee | 3 | 12 | 雪碧 | 13232333 |
 | 15 | 佟小刚 | 3cxvdfs | 4 | 15 | | 34242123 |
 | 3 | 李文凯 | 1235531 | 5 | 3 | iphone 键盘 | 12123413 |
 +------+-----------+----------+-----+-----+---------------+-----------+
 5 rows in set (0.00 sec)

例 2:

mysql> select * from user where uid in (1,3,4);
 +-----+-----------+----------+
 | uid | username | password |
 +-----+-----------+----------+
 | 1 | 景甜 | 123456 |
 | 3 | 李文凯 | 1235531 |
 | 4 | 井柏然 | 123455 |
 +-----+-----------+----------+
 3 rows in set (0.00 sec)
mysql> select * from user where uid in (select uid from order_goods);
 +-----+-----------+----------+
 | uid | username | password |
 +-----+-----------+----------+
 | 10 | 高小峰 | 3124qwqw |
 | 3 | 李文凯 | 1235531 |
 | 12 | 李小超 | 311aqqee |
 | 15 | 佟小刚 | 3cxvdfs |
 +-----+-----------+----------+
 4 rows in set (0.00 sec)

レコード Union

Union および Union All キーワードを使用して、特定のクエリ条件に従って 2 つのテーブルのデータをクエリし、マージします結果をまとめて表示します。 2 つの主な違いは、結果が直接マージされるのに対し、union は、union all の後に結果に対して個別の操作を実行し、重複レコードを削除した結果であることです。


QQ截图20161009160259.png

りー


学び続ける
||
<?php echo "Hello Mysql"; ?>
  • おすすめコース
  • コースウェアのダウンロード
現時点ではコースウェアはダウンロードできません。現在スタッフが整理中です。今後もこのコースにもっと注目してください〜