第14章サブクエリを使用して
サブクエリ
例:クエリ注文した商品のすべての顧客情報TNT2
//1:检索包含物品TNT2的所有订单的编号
SELECT order_num
FROM orderitems
WHERE prod_id = 'TNT2';
//2检索具有前一步骤列出的订单编号的所有客户的id
SELECT cust_id
FROM orders
WHERE order_num IN (20005,20007);
//3检索上一步所有客户id的全部信息
SELECT cust_name,cust_contact
FROM customers
WHERE cust_id IN (10001,10004);
//将上面3步合并
SELECT cust_name,cust_contact
FROM customers
WHERE cust_id IN (SELECT cust_id
FROM orders
WHERE order_num IN (SELECT order_num
FROM orderitems
WHERE prod_id = 'TNT2'));
計算フィールドとしてサブクエリを使用します
各顧客の顧客の表示テーブルの受注数の合計
SELECT cust_id,
cust_name,
cust_state,(SELECT count(*)
FROM orders
WHERE orders.cust_id = customers.cust_id) AS num_order
FROM customers
ORDER BY num_order
テーブルの結合
リンクの作成
別のテーブルの主キーを含むテーブルへの外部キーは、2つのテーブル間の関係定義
の利点を
- サプライヤー情報がないように廃棄物の時間と空間に、繰り返されていません。
- サプライヤー情報が変更された場合、ベンダーはテーブル内の単一のレコードだけを更新することができ、関連するテーブルからのデータは変更されません。
- 無重複データので、明らかデータは、簡単にデータを処理することができた、一貫しています。
SELECT vend_name,prod_name,prod_price
FROM vendors v,products p
WHERE v.vend_id = p.vend_id
ORDER BY vend_name,prod_name
デカルト積デカルト積によって返される条件を結合していない結果テーブル関係から(デカルト積)。検索された行の数は、第二のテーブルの行数を乗じた最初のテーブル内の行の数です。
SELECT vend_name,prod_name,prod_price
FROM vendors v,products p
//将显示笛卡儿积
等価リンク
我々は2つのテーブル間の平等のテストに基づいており、これまでと呼ばれる同等のカップリングリンク(等価結合)を、使用されるように。このリンクは、内部リンクとして知られています。実際には、そのようなリンクのために明示的にリンクの種類を指定するには、少し異なる構文を使用することができます。前の例では、まったく同じデータ次のSELECT文を返します:
SELECT vend_name,prod_name,prod_price
FROM vendors v
INNER JOIN products p ON v.vend_id = p.vend_id
ORDER BY vend_name,prod_name
複数のテーブルを結合
SELECT prod_name,vend_name,prod_price,quantity
FROM products p, orderitems o,vendors v
WHERE p.vend_id =v.vend_id
AND o.prod_id = p.prod_id
AND o.order_num = 20005;
章XVIは、高度なリンクを作成します。
一般的なフィールドを算出した列名とエイリアスに加えて、SQLをすることができますテーブル名の別名。そうするための2つの主な理由があります:
- SQL文を短くし、
- SELECT文で同じ単一のテーブルの複数の使用を許可します。
異なるタイプのリンクを使用して
リンクの4つの種類:協会の同等の、自己結合、ナチュラルリンクと外部リンク。
自己結合
あなたは(ID DTNTR付き)の記事の問題、および物品の他のサプライヤーによって生産された財の生産は、これらの問題があるかどうかを疑問に思っを見つけた場合。このクエリでは、まず、ID DTNTRアイテムの生産のためのサプライヤーを見つけるベンダー、他の記事を見つけることが必要です。
SELECT p1.prod_id,p1.prod_name
FROM products p1, products p2
WHERE p1.vend_id = p2.vend_id
AND p2.prod_id = 'DTNTR';
自己結合の代わりにサブクエリを同じクエリ内のテーブルからデータを取得するときに自己結合ステートメントは、外側代替コドンの使用として一般的に用いられています。が最終的な結果は同じであるが、時にははるかに高速サブクエリを処理以外の処理を結びます。あなたは、より良い性能であるかを決定するために2つのアプローチを試してみてください。
ナチュラルリンク
あなたがテーブルに参加するたびに、少なくとも今複数のテーブル(リンクする列)が記載されているがあるはずです。標準的なカップリングは、複数回のすべてのデータも同じ列を返します。自然なリンクを除外しますので、各列を返すように一度だけ、複数回表示されます。
外部リンク
SELECT c.cust_id,o.order_num
FROM customers c
LEFT JOIN orders o ON c.cust_id = o.cust_id