実際のビジネスでは、単にテーブルをクエリするだけではないことがよくあります。
電子商取引システムで、どのユーザーが商品を購入していないかをクエリします。
銀行は違反記録を照会し、同時にユーザーの
当選情報と当選者の基本情報を照会する場合があります。
上記は、2 つのテーブルを一緒にクエリする必要がある場合のみです。
上記のビジネスでは、結果を得るためにクエリを実行するために複数のテーブルを結合する必要があります。複数テーブルの結合クエリの本質は、テーブルの接続です。
テーブル結合
複数のテーブルのフィールドをクエリする必要がある場合は、テーブル結合を使用できます。テーブル結合は内部結合と外部結合に分けられます。
内部結合: 2 つのテーブルのフィールドに結合関係があるレコードを結合し、その結合関係を照合してレコード セットを形成します。
外部結合: 他の一致しないレコードが選択され、外部左結合と外部右結合に分割されます。
学習実験の前に、全員に2つの模擬データテーブルを用意しました:
- ユーザー情報を格納するUserテーブル
- どのユーザーがどの商品を購入したかを格納するOrderテーブル
userテーブル作成ステートメント
存在しない場合はテーブルを作成user
(
uid
int(11) NOT NULL,
username
varchar(30) NOT NULL,
password
char(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
存在しない場合はテーブルを作成 order_goods
(order_goods
(
oid
int(11) NOT NULL,
uid
int(11) NOT NULL,
name
varchar(50) NOT NULL,
buytime
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;
ユーザー テーブル データは次のとおりです: | | uid | username
password | | 1 | Jingtian
1 23456 | | 2 | 王暁爾
245667 | | 3 | 王宝強
1235531 | | 4 | ジン・ボラン
123455 | | 5 | ファン・ビンビン
5abcwa | | 6 | 黄暁明
abcdeef | | 7 | anglebaby
caption | | 8 | TFBOYS
abcdwww | | 9 | アンochao
12tfdd wd | | 10 | Gao Xiaofeng
3124qwqw | | 11 | 李小强
323fxfvdvd | | 12 | 李小超
311aqqee | | 13 | ハン・シャオピン
121rcfwr fq | | 14 | ソン・シャオカン
123123tcsd | | 15 | トン・シャオガン
3cxvdfs
🎜🎜🎜
order_goods データは次のとおりです:
oid | uid | name | buytime |
---|
1 | 10 | Apple Mouse | 1212 313 |
2 | 3 | iphone 12秒 | 123121241 |
3 | 12 | スプライト | 13232333 |
4 | 15 |
| 3 4242123 |
5 | 3 | iPhoneキーボード | 12123413 |
注: 上記の order_goods テーブルでは、uid は user テーブルの uid フィールドを指します。上の表では、oid を持つデータ行は 1 で、uid を持つユーザーは 10 です。ユーザー テーブルの uid 10 を持つユーザーの場合: Gao Xiaofeng。ユーザーは Apple マウスを購入しました。購入時間 buytime は Unix タイムスタンプです。
内部結合
基本構文 1:
カテゴリ | 詳細説明 |
基本構文 | select テーブル 1. フィールド [エイリアス]、テーブル n. テーブル 1 のフィールド [エイリアス] 】 ]、テーブル n where 条件 |
例 | user.uid 、user.username を username、order_goods.oid、order_goods.uid、order_goods.name を shopname として選択します (user.uid = order_goods.uid)。 ; |
説明例 | 製品テーブル内のどのユーザーが製品を購入したかをクエリし、ユーザー情報を表示します |
注: 次の例では、from テーブルはテーブル エイリアスを使用します。
テーブル名が長すぎるため、記述するたびに間違いを犯しやすくなります。表の後に英語の短縮文字列を直接続けることができます。以前にフィールドを結合する場合は、省略形 string.field を使用してください。
mysql> ユーザー名として u.uid、u.username、ショップ名として o.oid、o.uid、o.name をユーザー u,order_goods o から選択します (u.uid = o.uid;
)
+-----+----------+-----+-----+--------------+
|uid | ショップ名 |
+-----+----------+-----+-----+--------------+
| 10 | アップルマウス |
| 王宝強 2 |
| 12 | リー・シャオチャオ
15 | トン・シャオガン
| 李文凱 5 |
+-----+----------+-----+-----+--------------+
セットの5行(0.00秒)表 1 条件に基づく INNER JOIN テーブル n;
例
user.uid 上のユーザー内部結合 order_goods から user.uid 、user.username をユーザー名、order_goods.oid、order_goods.uid、order_goods.name をショップ名として選択します。 order_goods.uid;
説明例productテーブル内のどのユーザーが商品を購入したかをクエリし、ユーザー情報を表示します | | 結果は基本文法 1 と一致しています。
mysql> user.uid = order_goods.uid のユーザー内部結合 order_goods から user.uid 、user.username を username、order_goods.oid、order_goods.uid、order_goods.name として選択します。
+-----+----------+-----+-----+--------------+
|uid | ショップ名 |
+-----+----------+-----+-----+--------------+
| 10 | アップルマウス |
| 王宝強 2 |
| 12 | リー・シャオチャオ |
15 | トン・シャオガン
| 王宝強 5 |
+-----+----------+-----+-----+--------------+
セット内の 5 行 (0.00 秒) 外部結合 JOIN table n on 条件;
例
select * from user left join order_goods on user.uid = order_goods.uid;
例の説明左、商品を購入していないユーザーをクエリし、ユーザー情報を表示します | 外部結合は左結合と右リンクに分かれます。具体的な定義は次のとおりです。 左結合: 右側のテーブルに一致しないレコードも含めて、左側のテーブルのすべてのレコードが含まれます mysql> select * from user left join order_goods on user.uid = order_goods.uid; +-- - --+----------+-----+------+------+---- --- --------+----------+ | ユーザー名 | +-----+-- --- ------+-----------+------+------+------------- --+ -----------+ | 3124qwqw | 1235531 | 3121241 | 311aqqee | 342421 3 | 5 | 1235531 | null | null | | | 5abcwa | NULL | | | NULL | 12tfddwd | NULL | 123123tcsd完全| NULL | NULL ----------+-----+-----+-----+----- ---- --+ 16 行セット (0.00 秒)
右結合: 右のテーブルに一致しないレコードも含めて、右のテーブルのすべてのレコードが含まれます カテゴリ | 詳細な説明 |
---|
基本構文 | テーブル1を選択します。フィールド [エイリアスとして]、テーブル n。テーブル 1 のフィールドを条件に右結合テーブル n に結合します。 | 例 | select * from user right join order_goods on user.uid = order_goods.uid; | 例の説明 | 製品テーブル内のどのユーザーが製品を購入したかをクエリし、ユーザー情報を表示します |
mysql> select * from user right join order_goods on user.uid = order_goods.uid; +------+- - --------+----------+-----+-----+--------------+ - ----------+ | ユーザー名 | パスワード | +------+- -- -------+-----+-----+------+----------+ | 10 | 3124qwqw | 1235531 | 李暁朝11aqqee | 13232333 | | 3cxvdfs | 1235531 | +----- --- ---+----------+-----+-----+--------+---- -- ----+ セット内の 5 行 (0.00 秒)
サブクエリ
クエリを実行するときに、必要な条件が別の選択ステートメントの結果である場合、サブクエリを使用する必要がある場合があります。サブクエリに使用されるキーワードには、in、not in、=、!=、exists、notexists などが含まれます。 カテゴリ詳しい説明 | | 基本構文select field from table where field in (条件) | | 例1 select * from user where uid in (1 、3、 4); | | 例1の説明 idで指定されたユーザーをクエリ | | 例2 select * from user where uid in (select uid from order_goods); | | 例2の説明 情報グッズを購入したユーザーの割合が表示されます | | 例 1: mysql> select * from user where uid in (1,3,4);
+-----+----------+----------+
|ユーザー名 |
+-----+----------+----------+
| 123456 |
| 3 | 1235531 |
| ジン・ボラン | 123455 |
+-----+----------+----------+
セット内の 3 行 (0.00 秒)
例 2: mysql> select * from user where uid in (order_goods から uid を選択);
+-----+----------+----------+
|ユーザー名 |
+-----+----------+----------+
| 10 | 高暁峰 | 3124qwqw |
| 3 | 1235531 |
| 12 | 311aqqee |
| 15 | 3cxvdfs |
+-----+----------+----------+
セット内の 4 行 (0.00 秒)
mysql> select * from emp where deptno in (select deptno from dept);
レコード結合 以下に従って 2 つのテーブルのデータを結合するには、union および Union all キーワードを使用します。ある クエリ条件をクエリした後、結果が結合されて表示されます。 2 つの主な違いは、結果が直接マージされるのに対し、union は、union all の後に結果に対して個別の操作を実行し、重複レコードを削除した結果であることです。 カテゴリ詳しい説明 | | 基本構文select文1 Union[all] select文2 | 例 | select * from user where uid in (1 、3、4 ); | 例の説明 | productテーブルのユーザー情報の結果とuserテーブルのユーザー情報を結合します | | mysql> select uid from user Union select uid from order_goods;
+-----+
| UID |
+-----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
| 11 |
| 12 |
| 13 |
| 14 |
| 15 |
+-----+
15 行セット (0.00 秒)
次のセクション <?php
echo "Hello Mysql";
?> |
---|