複數(shù)のテーブルの結(jié)合クエリ
複數(shù)テーブルの結(jié)合クエリ
テーブル接続
複數(shù)のテーブルのフィールドをクエリする必要がある場(chǎng)合、テーブル接続を使用してそれを?qū)g現(xiàn)できます。テーブル結(jié)合は內(nèi)部結(jié)合と外部結(jié)合に分けられます。
1. 內(nèi)部結(jié)合: 2 つのテーブルのフィールドの結(jié)合関係が一致するレコード間の結(jié)合で、レコード セットを形成します。
2. 外部結(jié)合: 他の一致しないレコードが選択され、外部左結(jié)合と外部右結(jié)合に分割されます。
學(xué)習(xí)実験の前に、全員に 2 つのシミュレートされたデータ テーブルを用意しました:
1. ユーザー テーブルにはユーザー情報(bào)が格納されます
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 を持つユーザーの場(chǎng)合: Gao Xiaofeng。ユーザーは Apple マウスを購入しました。購入時(shí)間 buytime は Unix タイムスタンプです。
內(nèi)部結(jié)合
注: 次の例では、from テーブルはテーブル エイリアスを使用します。
テーブル名が長(zhǎng)すぎるため、記述するたびに間違いを犯しやすくなります。表の後に英語の短縮文字列を直接続けることができます。以前にフィールドを結(jié)合する場(chǎng)合は、省略形 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 | 蘋果鼠標(biāo) | | 3 | 李文凱 | 2 | 3 | iphone 12s | | 12 | 李小超 | 3 | 12 | 雪碧 | | 15 | 佟小剛 | 4 | 15 | | | 3 | 李文凱 | 5 | 3 | iphone 鍵盤 | +-----+-----------+-----+-----+---------------+ 5 rows in set (0.00 sec)
基本文法 2:
結(jié)果は基本文法 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 | 蘋果鼠標(biāo) | | 3 | 李文凱 | 2 | 3 | iphone 12s | | 12 | 李小超 | 3 | 12 | 雪碧 | | 15 | 佟小剛 | 4 | 15 | | | 3 | 李文凱 | 5 | 3 | iphone 鍵盤 | +-----+-----------+-----+-----+---------------+ 5 rows in set (0.00 sec)
外部結(jié)合
外部結(jié)合は、左結(jié)合と右リンクに分けられます。具體的な定義は次のとおりです。
左結(jié)合: 右側(cè)のテーブルに一致しないレコードも含め、左側(cè)のテーブルのすべてのレコードが含まれます
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 | 蘋果鼠標(biāo) | 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 | 李小強(qiáng) | 323fxfvdvd | NULL | NULL | NULL | NULL | | 13 | 韓小平 | 121rcfwrfq | NULL | NULL | NULL | NULL | | 14 | 宋小康 | 123123tcsd | NULL | NULL | NULL | NULL | +-----+-----------+------------+------+------+---------------+-----------+ 16 rows in set (0.00 sec)
右結(jié)合: 右側(cè)のテーブルに一致しないレコードも含め、右側(cè)のテーブルのすべてのレコードが含まれます
サブクエリ
場(chǎng)合によっては、クエリを?qū)g行するときに、必要な條件が別の選択ステートメントの結(jié)果である場(chǎng)合、サブクエリを使用する必要があります。サブクエリに使用されるキーワードには、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 | 蘋果鼠標(biāo) | 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 つのテーブルのデータをクエリし、マージします結(jié)果をまとめて表示します。 2 つの主な違いは、結(jié)果が直接マージされるのに対し、union は、union all の後に結(jié)果に対して個(gè)別の操作を?qū)g行し、重複レコードを削除した結(jié)果であることです。