MySQL実践-接続テーブル-内部接続(一)
6147 ワード
説明
MySQLの接続とその構文はMySQLの重要な部分であり、接続を理解するには、リレーショナル・テーブルの基礎知識を理解する必要があります.製品カタログ情報を含むデータベース・テーブルがあり、各カテゴリの品目が1行を占め、製品の説明と価格、および製品を生産する仕入先情報が格納されていると仮定します.現在、複数の製品が同じベンダーで生産されている場合、これらのベンダーの情報はどこに格納されますか?製品情報と一緒に置くと、必ず同じ表に同じ仕入先情報(異なる製品)が重複して格納されます.また、仕入先情報が変更されると、変更のたびに何度も変更され、重複データの一貫性が保証されます.これらはデータの管理に不利な場所です.そのため、データの表分けは比較的良い案です.上記の例では、製品情報テーブル(products)とベンダー情報テーブル(vendors),
ないぶせつぞく
内部接続は等値接続とも呼ばれ、クエリーする2つのテーブルに接続され、2つのテーブル間の等しいテストに基づいて取得されます.内部接続を作成するのは簡単です.次のようにします.
実行結果は、上で使用した
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
およびproducts
のvend_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
と同じです.