\r\n\r\n
MySQLのようなリレーショナルデータベースを使用する最大の利点は、そのリレーショナル構造により、複数のテーブルにまたがる情報の保存と問い合わせが容易にできることです。
ここでは、複数のデータベーステーブルから必要なデータを正確に取得する方法と、必要な結果を正確に抽出するためのさまざまなリンクについて説明します。
これは必須ではありませんが、この記事の例に従うのであれば、以下のターミナルコマンドを使用して、ローカルでサンプルデータベースを初期化することができます。
git clone https://github.com/mdizak/sample-select-db.gitcd sample-select-dbsudo mysql < store.sqlsudo mysql sampledbmysql> SELECT COUNT(*) FROM customers;顧客テーブルに2000行あるという結果が得られるはずです。
MySQLデータベースで使用されるデフォルトの結合は内部結合と呼ばれ、最も一般的で簡単な結合です。この結合は、両方のテーブルで一致するレコードをすべて返し、それ以外のレコードはすべてキャンセルします。
例えば、お客様の姓名、注文金額、注文日を確認したい場合(1000ドル以上の全注文の場合)、次のようなSQL文を使用することができます。
SELECTc.id, c.first_name, c.last_name, o.amount, o.created_atFROMcustomers c, orders oWHEREo.customer_id = c.id AND o.amount >= 1000;以上、いくつか注意点を挙げました。
同じクエリを書くのに別の、より技術的な構文アプローチは次のようになります。
SELECTc.id, c.first_name, c.last_name, o.amount, o.created_atFROMcustomers c INNER JOIN orders oONcustomer_id = c.idWHEREo.amount >= 1000;上記のクエリは、customersテーブルとordersテーブルの間の結合を簡単に見ることができ、読みやすくなっています。しかし、この2つのクエリは同じものであり、全く同じ行を生成します。
左結合では、左側のテーブルで右側のテーブルのレコードと一致するすべてのレコードが返され、それ以外のレコードは削除されます。例えば、データベース内の各商品の売上合計を見るには、以下のクエリを使用してみてください。
SELECTp.name, sum(item.amount) AS tamountFROMorders_items item LEFT JOIN products pONitem.product_id = p.idGROUP BY item.product_id ORDER BY tamount DESCこれにより、商品名と総売上高を表示する2段組のビューが作成され、期待通りに動作します。このクエリは、ordersanthus items テーブルのすべての製品を検索し、products テーブルのレコードと関連付け、各製品の合計売上高を返します。
上記の例では、データベースにある合計22の商品のうち、上記のクエリでは19行しか返されないことに注意してください。これは、クエリが ordersu items テーブルから始まり、products テーブルに結合するためで、一部の製品は一度も注文されていないので、ordersu items テーブルにそのレコードは存在しません。
まだ注文していない商品も含めて、売上金額のある全商品の一覧を取得したい場合はどうすればよいでしょうか。以下のクエリで右結合を試してみてください。
SELECTp.name, sum(item.amount) AS tamountFROMorders_items item RIGHT JOIN products pONitem.product_id = p.idGROUP BY p.id ORDER BY tamount DESCこれは、productsテーブルへのジョインのメインテーブルとしてordersu itemsを使用する代わりに、右のジョインでオーダーを反転させ、productsテーブルをordersu itemsテーブルにジョインするためです。
時には、特定の結果を得るために3つ以上のテーブルを結合する必要があります。
例えば、電子レンジ(製品ID#1)を購入したすべての顧客のリスト(名前と注文日を含む)が必要な場合があります。これは3つのテーブルにわたって選択する必要があり、次のクエリに2つのジョインを使用することで実現できます。
SELECTc.first_name, c.last_name, o.amount, o.created_atFROMcustomers c INNER JOIN orders oONc.id = o.customer_id INNER JOIN orders_items itemONitem.order_id = o.idWHEREitem.product_id = 1 ORDER BY o.created_at;このクエリは、電子レンジの注文426件すべてを返し、期待通りに動作します。まず、すべての顧客とそれぞれの注文を照合し、さらに、すべての注文とorders#itemsテーブルのマイクロ波製品(id#1)を含む注文のみを照合して、結果セットを照会する。
のようなSQLクエリでサブクエリを使用することは、いかなる場合にも避けるべきであることに注意してください。
SELECT first_name,last_name FROM customers WHERE id IN (SELECT customer_id FROM orders WHERE status = 'approved' AND amount < 100);上記のようなクエリーは非効率的であり、多くのリソースを消費するため、絶対に避けるべきものです。その代わり、上記のセクションで説明したように、正しい結合を使用してください。例えば、上記のクエリは次のように書き換える必要があります。
SELECT c.first_name, c.last_name FROM customers c LEFT JOIN orders o ON o.customer_id = c.id WHERE o.status = 'approved' AND o.amount < 100;この記事は、MySQLなどのリレーショナル・データベースの威力と、クエリ内で複数のテーブルからレコードを取得するために結合を使用するSQLクエリの構築方法を理解し、必要な結果を正確に取得するのに役立つことを期待しています。
SQLにおける3種類の結合、カラム名やテーブル名のエイリアスの作成方法、1つのクエリで複数の結合を使用する方法、サブクエリを避けるべき理由などについて学習しました。異なるデータセットを手作業で1つにまとめるのはやめて、結合を使用して同僚に好印象を与え、時間を節約しましょう。