複数のテーブルの結合クエリ
複数テーブルの結合クエリ
テーブル接続
複数のテーブルのフィールドをクエリする必要がある場合、テーブル接続を使用してそれを実現できます。テーブル結合は内部結合と外部結合に分けられます。
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 テーブルのデータは次のとおりです。
注: 上記の order_goods テーブルでは、uid は user テーブルの uid フィールドを指します。上の表では、oid を持つデータ行は 1 で、uid を持つユーザーは 10 です。ユーザー テーブルの uid 10 を持つユーザーの場合: Gao Xiaofeng。ユーザーは Apple マウスを購入しました。購入時間 buytime は Unix タイムスタンプです。
内部結合
注: 次の例では、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:
結果は基本文法 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)
外部結合
外部結合は、左結合と右リンクに分けられます。具体的な定義は次のとおりです。
左結合: 右側のテーブルに一致しないレコードも含め、左側のテーブルのすべてのレコードが含まれます
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)
右結合: 右側のテーブルに一致しないレコードも含め、右側のテーブルのすべてのレコードが含まれます
りーサブクエリ
場合によっては、クエリを実行するときに、必要な条件が別の選択ステートメントの結果である場合、サブクエリを使用する必要があります。サブクエリに使用されるキーワードには、in、not in、=、!=、exists、notexists などが含まれます。
例 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 の後に結果に対して個別の操作を実行し、重複レコードを削除した結果であることです。