MySQL実践-接続テーブル-内部接続(一)

6147 ワード

説明
MySQLの接続とその構文はMySQLの重要な部分であり、接続を理解するには、リレーショナル・テーブルの基礎知識を理解する必要があります.製品カタログ情報を含むデータベース・テーブルがあり、各カテゴリの品目が1行を占め、製品の説明と価格、および製品を生産する仕入先情報が格納されていると仮定します.現在、複数の製品が同じベンダーで生産されている場合、これらのベンダーの情報はどこに格納されますか?製品情報と一緒に置くと、必ず同じ表に同じ仕入先情報(異なる製品)が重複して格納されます.また、仕入先情報が変更されると、変更のたびに何度も変更され、重複データの一貫性が保証されます.これらはデータの管理に不利な場所です.そのため、データの表分けは比較的良い案です.上記の例では、製品情報テーブル(products)とベンダー情報テーブル(vendors),vendorsテーブルにすべてのベンダーの情報を格納し、各ベンダーが1行を占め、各ベンダーがプライマリ・キーとして一意のIDを有し、productsテーブルにすべての製品の情報を格納する2つのテーブルを構築することができる.また、各製品に対して対応する仕入先IDのみを外部キーとして保存し、対応する製品の仕入先情報を問い合わせる必要がある場合は、製品情報テーブルの仕入先IDを介して仕入先テーブルに問い合わせることにより、仕入先情報を重複記憶することなく、空き時間と時間を節約し、また仕入先情報の変動時に製品情報テーブルを変更することなく、重複データがないため、使用メンテナンスに便利です.上記の例では、リレーショナル・データベースにおいて、合理的な設計と組織データ・ストレージ形式がデータベースの拡張性を大幅に向上させることも説明しています.これもリレーショナル・データベースの利点の一つです.上記の例について、productsテーブルデータは以下の通りである.
mysql> SELECT * FROM products;
+---------+---------+----------------+------------+----------------------------------------------------------------+
| prod_id | vend_id | prod_name      | prod_price | prod_desc                                                      |
+---------+---------+----------------+------------+----------------------------------------------------------------+
| ANV01   |    1001 | .5 ton anvil   |       5.99 | .5 ton anvil, black, complete with handy hook                  |
| ANV02   |    1001 | 1 ton anvil    |       9.99 | 1 ton anvil, black, complete with handy hook and carrying case |
| ANV03   |    1001 | 2 ton anvil    |      14.99 | 2 ton anvil, black, complete with handy hook and carrying case |
| DTNTR   |    1003 | Detonator      |      13.00 | Detonator (plunger powered), fuses not included                |
| FB      |    1003 | Bird seed      |      10.00 | Large bag (suitable for road runners)                          |
| FC      |    1003 | Carrots        |       2.50 | Carrots (rabbit hunting season only)                           |
| FU1     |    1002 | Fuses          |       3.42 | 1 dozen, extra long                                            |
| JP1000  |    1005 | JetPack 1000   |      35.00 | JetPack 1000, intended for single use                          |
| JP2000  |    1005 | JetPack 2000   |      55.00 | JetPack 2000, multi-use                                        |
| OL1     |    1002 | Oil can        |       8.99 | Oil can, red                                                   |
| SAFE    |    1003 | Safe           |      50.00 | Safe with combination lock                                     |
| SLING   |    1003 | Sling          |       4.49 | Sling, one size fits all                                       |
| TNT1    |    1003 | TNT (1 stick)  |       2.50 | TNT, red, single stick                                         |
| TNT2    |    1003 | TNT (5 sticks) |      10.00 | TNT, red, pack of 10 sticks                                    |
+---------+---------+----------------+------------+----------------------------------------------------------------+
14 rows in set (0.00 sec)
vendors表は次のように設計されています.
mysql> SELECT * FROM vendors;
+---------+----------------+-----------------+-------------+------------+----------+--------------+
| vend_id | vend_name      | vend_address    | vend_city   | vend_state | vend_zip | vend_country |
+---------+----------------+-----------------+-------------+------------+----------+--------------+
|    1001 | Anvils R Us    | 123 Main Street | Southfield  | MI         | 48075    | USA          |
|    1002 | LT Supplies    | 500 Park Street | Anytown     | OH         | 44333    | USA          |
|    1003 | ACME           | 555 High Street | Los Angeles | CA         | 90046    | USA          |
|    1004 | Furball Inc.   | 1000 5th Avenue | New York    | NY         | 11111    | USA          |
|    1005 | Jet Set        | 42 Galaxy Road  | London      | NULL       | N16 6PS  | England      |
|    1006 | Jouets Et Ours | 1 Rue Amusement | Paris       | NULL       | 45678    | France       |
+---------+----------------+-----------------+-------------+------------+----------+--------------+
6 rows in set (0.00 sec)

ないぶせつぞく
内部接続は等値接続とも呼ばれ、クエリーする2つのテーブルに接続され、2つのテーブル間の等しいテストに基づいて取得されます.内部接続を作成するのは簡単です.次のようにします.SELECT vend_name, prod_name, prod_price FROM vendors, products WHERE vendors.vend_id = products.vend_id ORDER BY vend_name,prod_name上の文は2つのテーブルに接続され、WHERE句を使用して正しい接続を確保します.ここで、WHEREは、MySQLマッチングvendorsテーブルのvend_idおよびproductsvend_idを示すために使用される.すなわち、MySQLは、接続テーブルの際に、実際には第1のテーブルの各ローと第2のテーブルの各ローとをマッチングし、マッチング条件を満たすものを接続結果とし、WHERE句を指定してマッチング条件を制限しない場合、接続の結果は、2つのテーブルの行数の積であり、デカルト積とも呼ばれ、私たちが望んでいる結果ではありません.内部ジョインの場合、MySQLは次のように専用の構文を提供します.
mysql> SELECT vend_name, prod_name, prod_price FROM vendors INNER JOIN products ON vendors.vend_id = products.vend_id;
+-------------+----------------+------------+
| vend_name   | prod_name      | prod_price |
+-------------+----------------+------------+
| Anvils R Us | .5 ton anvil   |       5.99 |
| Anvils R Us | 1 ton anvil    |       9.99 |
| Anvils R Us | 2 ton anvil    |      14.99 |
| LT Supplies | Fuses          |       3.42 |
| LT Supplies | Oil can        |       8.99 |
| ACME        | Detonator      |      13.00 |
| ACME        | Bird seed      |      10.00 |
| ACME        | Carrots        |       2.50 |
| ACME        | Safe           |      50.00 |
| ACME        | Sling          |       4.49 |
| ACME        | TNT (1 stick)  |       2.50 |
| ACME        | TNT (5 sticks) |      10.00 |
| Jet Set     | JetPack 1000   |      35.00 |
| Jet Set     | JetPack 2000   |      55.00 |
+-------------+----------------+------------+
14 rows in set (0.00 sec)

実行結果は、上で使用したWHEREと同じです.