まず、基本的な
1.1 SQLクエリの根拠
まず、単一テーブルのクエリ:レコードテーブルの状態、中間テーブル(テーブルの中央には、ユーザには見えない)フィルタによれば、そして列は、適切な列を選択しSELECT選択に基づいて最終結果を返します。
第二は、クエリ二つのテーブルを結合する2つの直交(デカルト積)のテーブルを濾過し、中間体シートをON状態と接続タイプで形成され、中間テーブルのレコードは、その後、WHERE条件に応じて、濾過し、指定されたカラム選択に基づいてクエリ結果を返します。
第三には、マルチテーブルクエリに参加:2 -テーブル内のクエリに参加させることが第一及び第二のテーブル上の最初のすべてのテーブルがこれまでに接続されるまで、その後、クエリ結果とクエリと第三のテーブルに参加しない、というように、中間結果テーブルを形成し、その後、記録中間テーブルWHERE条件に応じて、濾過し、SELECT指定された列に基づいて、クエリの結果を返します。
SQLクエリは、SQLの最適化のための理論的基礎を理解するプロセスです。
後者の条件1.2 ON(オン状態)との間の差条件及び
ON状態は:
フィルタのデカルト積は、テーブルの中央の2つのリンクされたテーブル上の制約に形成されています。
WHERE条件:
SELECT文でON条件はテーブルの制約真ん中をフィルタリングしていること。
単一テーブルクエリONの非存在下で、物理テーブルまたはクエリが返すレコードの制約の中間結果を制限します。
制約は、接続テーブル内の2つの以上のテーブルの最後の中間結果テーブルリターンを形成して制限されます。
条件が不適切であるWHERE ONバックに、ここから見ることができます。お勧めは、次のとおりです。ONフィルタのみが唯一の中間テーブルを記録接続作業のために。
第二に、クエリに参加
コネクタ、外部コネクタ、クロスコネクト:オペレータは三種類に分け合成マルチテーブルクエリを達成するための重要な方法を接続するために使用されます。
2.1接続 INNER JOINを
コネクタ(内部結合)は、テーブル内の2つ、明示的および暗黙的な、接続されたバック行を有し、クエリの接続条件を満たしています。(いわゆるリンクテーブルは、データベースのクエリフォームを行うには、テーブルの真ん中)。
比較テーブル間の操作、および条件に一致するクエリデータ接続(=、>、<、<>、> =、<= ,!>と<!を含む)接続比較演算子。使用される比較方法に応じて、接続は、接続、接続および自己連結等価天然3分割されています。
ステートメント1:コネクタ内の暗黙の、内部結合なしでは、中間テーブルは、二つのテーブルのデカルト積に形成されています。
O.id SELECT、O.ORDER_NUMBER、c.ID、c.name
O CUSTOMERS C、ORDERS FROM
WHERE c.ID = O.CUSTOMER_ID。
ステートメント2:一般にコネクタ内呼ば示すコネクタ、そこINNER JOINは、中間テーブルは、ON状態に通して濾過二つのテーブルのデカルト積として形成されます。
O.id SELECT、O.ORDER_NUMBER、c.IDは、c.name
; ORDERS顧客C = O ON c.ID O.CUSTOMER_ID JOIN INNER FROM
クエリステートメントの結果文3,4。
等価結合
「=」関係テーブルクエリを接続して、クエリの結果は、記載されている接続テーブル内にあるすべてのための列と、繰り返しカラム。
SELECT PM_ACT_JOB_RLS。*、PM_ACT_RLS。* FROM PM_ACT_JOB_RLS INNER JOINをPM_ACT_RLS ON PM_ACT_JOB_RLS.RlsPK = PM_ACT_RLS.RlsPK
ナチュラル接続
等価が重複する列の接続を外し、接続が形成されています。
本当に、そのような接続クエリ値は、それがSQL2が標準で定義されているので、それはそれを見るために例を示します、ありません。同じカラム名二つのテーブルかどうかをカラム接続、SQLチェックを指定して、それらが接続条件を使用すると仮定することなく自然の接続、および1つの列のみが接続状態で接続されている含まれています。文が許可されていませんON、表示列を指定することはできません、列のみを(下ORACLE環境*が示す表示できるテストです)。各接続タイプ(クロスコネクトを除く)のために、NATURALを指定することができます。
SELECT PM_ACT_JOB_RLS.JobPK、PM_ACT_RLS.RlsPK、RlsName FROM PM_ACT_JOB_RLS 自然INNER JOINをPM_ACT_RLS ON PM_ACT_JOB_RLS.RlsPK = PM_ACT_RLS.RlsPK
语句1:
SELECT *
ORDERS FROMはO NATURAL INNERが顧客CをJOIN。
语句2:
SELECT *
ORDERS FROMはO NATURAL LEFT OUTERは、顧客CをJOIN。
语句3:
SELECT *
ORDERS FROMはO NATURAL RIGHT OUTERが顧客CをJOIN。
语句4:
SELECT *
ORDERS FROMはO NATURAL FULL OUTERが顧客CをJOIN。
接続以来
接続クエリが、2つのテーブルは同じテーブルに設計されていた場合は、このクエリが呼び出された自己結合クエリを。
- C1、C2、論理的に2つのテーブルが、テーブルには、物理的にSELECTで c1.CategoryID、 c1.CategoryName FROM 。[DBO] [カテゴリ] C1 ···ON C1、C2 INNER [DBO] [カテゴリ] JOIN [区分] = C2。〔のParentID]
ジョイント接続(UNION JOINを)
これはまれな接続です。完全外部結合識別との間の差内のすべての行を接続します。Oracle、MySQLはその役割はにある、サポートしていません。このトラブルシューティングは、より一般的なデータ分析に使用されます。この機能は、データベース操作のセットを使用することによって実現してもよいです。
ステートメント1:ユニオンクエリ(UNION JOINは)文は、実行可能なSQL環境を発見していません。
O.id SELECT1、O.ORDER_NUMBER、O.CUSTOMER_ID、c.ID、c.name
O ORDERS FROM UNIONはJOIN 顧客C = O.CUSTOMER_ID c.ID ONの
ステートメント2:図11は、DB2の下に等価の文を達成します。DB2 11の文にそれをサポートするかどうかわかりません!
O.id SELECT、O.ORDER_NUMBER、O.CUSTOMER_ID、c.ID、c.name
FULL FROM O c.ID ON OUTERがC = O.CUSTOMER_ID顧客JOIN ORDERS
EXCEPT
SELECTはo.id、O.ORDER_NUMBER、O.CUSTOMER_IDをc.IDは、c.name
; ORDERS顧客からINNER O = C c.ID上O.CUSTOMER_ID登録しよ
Oracleの実装で1つの同等のステートメント:文3を。
O.id SELECT、O.ORDER_NUMBER、O.CUSTOMER_ID、c.ID、c.name
FULLからの注文O c.IDをON OUTER JOIN C = O.CUSTOMER_ID CUSTOMERS
MINUS
SELECT O.ID、O.ORDER_NUMBER、O.CUSTOMER_ID、C.ID、C.NAME
O INNER顧客C ON C.ID = O.CUSTOMER_IDをJOIN ORDERS FROM。
2.2外側コネクタ
接続線は、条件を満たすように、リターンデータにのみ接続されており、条件を接続する外部接続線が一致のみ記載されているが、(左テーブル(左外側コネクタ)、右テーブル(右外側の接続)、または2つの表に記載されています完全外部)は、検索条件行に一致するすべてのデータを結合します。
左の外側に外部結合に参加分け、右外リンク、完全外部3に参加します。
1)LEFTはJOINまたはLEFT OUTER JOINは、
結果セットがすべての行を、だけでなくマッチング列行を左外部結合句左テーブルを指定含む左外部結合します。あなたが行の右の表の行がテーブルに残って一致しない場合は、nullで右表の列に関連付けられた結果セットの行のすべてのリストを選択します。
2)RIGHT JOINまたはRIGHT OUTER JOIN
参加右外側は左外側のリバースリンクは加入あります。右の表のすべての行を返します。一致する行が行に存在しない場合は、テーブルを左右の表は、左テーブルのNULL値を返します。
3)FULLはJOINまたはFULL OUTER JOINは
完全外部を右表の左テーブルのすべての行を返すように加入。行が別のテーブルの行と一致しない場合は、他の選択リストの列にはNULL値が含まれています。テーブルの間に一致がある場合には、結果セット全体の行は、ベーステーブルのデータ値を含みます。
语句1:左外连接(LEFT OUTER JOINを)
SELECT O.ID、O.ORDER_NUMBER、O.CUSTOMER_ID、C.ID、C.NAME
FROM ORDERS O LEFT OUTERは、顧客をJOIN C ON C.ID = O.CUSTOMER_ID。
ステートメント2:右の外部結合(RIGHT OUTER JOINを)
SELECTがo.id、O.ORDER_NUMBER、O.CUSTOMER_ID、c.ID、c.name
ORDERS O C = ON c.ID O.CUSTOMER_ID顧客をOUTER JOIN右から;
注:クエリ結果の背面にON WHERE条件は同じではありません。例えば:
语句3:WHERE条件独立
SELECT O.ID、O.ORDER_NUMBER、O.CUSTOMER_ID、C.ID、C.NAME
FROM ORDERS O LEFT OUTERは、顧客C ON C.ID = O.CUSTOMER_ID JOIN
WHERE O.ORDER_NUMBER <>」をMIKE_ORDER001' ;
ステートメント4:バックONに条件7陳述。
O.id SELECT、O.ORDER_NUMBER、O.CUSTOMER_ID、c.ID、c.name
LEFT OUTER O c.ID顧客ON = C O.CUSTOMER_ID AND O.ORDER_NUMBER <> 'MIKE_ORDER001'をJOIN ORDERS FROM。
文のクエリ文3と4の結果から、それは明らかであることは同じではありませんが、結果は8文が不可解であることを示しました。WHERE句に書かれているの背後にのみONの接続条件、制約およびテーブルの真ん中に条件で、クエリの接続を書くときにそのため、それが推奨されます。
完全外部(FULL OUTER JOINを)に参加します
注:MySQLは、全体の外のためにここに与えられた文言の接続をサポートしていないのOracleとDB2を。しかし、完全外部を取得するには、左と右の外側外需のコレクションをクエリの結果を結合します。
O.id SELECT、O.ORDER_NUMBER、O.CUSTOMER_ID、c.ID、c.name
FULL FROM O c.ID ON OUTER顧客C = O.CUSTOMER_IDを結合順序を、
左外収集及び右外側
実際には、上記のクエリの結果と完全外部ジョインステートメントと同様である
O.ORDER_NUMBER、O.CUSTOMER_ID、c.IDは、c.name、SELECTはo.id
LEFT OUTER O c.ID顧客ON = C O.CUSTOMER_IDをJOIN ORDERS FROM
UNION
SELECTは、O.ORDER_NUMBER、O.CUSTOMER_ID、c.ID、c.name o.id
ORDERS O C = ON c.ID O.CUSTOMER_ID顧客をOUTER JOIN右から。
2.3クロスコネクト
クロスコネクト(CROSS JOINは):明示的および暗黙の2があります。ON句がなければ、リターンは、二つのテーブルの積であるデカルト積とも呼ばれるが、。
ステートメント1:暗黙のクロスコネクト、CROSS JOINはなし。
O.id SELECT、O.ORDER_NUMBER、c.ID、c.name
ORDERS Oから、C CUSTOMERS
WHERE o.id = 1。
安全2:CROSS JOINをクロスコネクト明示的に使用します。
O.id SELECT、O.ORDER_NUMBER、c.ID、
c.name
クロスO C CUSTOMERS JOIN ORDERS FROM
WHERE o.id = 1;
ステートメントの結果1及び2は、同じ文であります
1.4例
(A) 実施例1
テーブル | Bテーブル | |||
ID | 名前 | ID | ジョブ | PARENT_ID |
1 | 張3 | 1 | 23 | 1 |
2 | ジョン・ドウ | 2 | 34 | 2 |
3 | 王呉 | 3 | 34 | 4 |
接続された1)
を選択します。*、B. * 内側からはa.id = b.parent_idにBを結合する
結果である
23 1 1 3
2 34がジョン・ドウ2 2であり、
2)左に接続
を選択します。*、B. *左からa.idにBに参加 = b.parent_id
結果は
23である。1 3 1
2 2 34は、ジョン・ドウ2
王呉ヌル
。3)右に接続された
選択。*、B *右ジョインBから上a.id = b.parent_id
結果は
1. 1. 3。23れる
2 2 34ジョン・ドウは2で
ヌル34れている。4. 3
。4)が完全に接続されている
。*、B *を選択 a.id = b.parent_idに完全参加Bから
結果は
23である。1 3 1
2 2 34は、ジョン・ドウ2
ヌル34である。4. 3
。3ワング・ウヌル
(II) 実施例2
データベースのバージョン:オラクル
表2 TESTA、TESTB、TESTC、それぞれA、B
A. エン
コネクタ、即ち、例えば最も一般的同等接続:
SELECT
*
FROM
TESTA,TESTB
WHERE
TESTA.A=TESTB.A
結果:
外部接続B.
左外側に分け、右外部結合および完全外部結合、外部結合に参加します。
1。外側の左または外側の左は左結合に参加します
左の外側の一致ではないプラスプライマリ・テーブルデータ、同等の関連に基づいて、例えば:
SELECT
*
FROM
TESTA
LEFT
OUTER
JOIN
TESTB
ON
TESTA.A=TESTB.A
結果:
3つのテーブルには、外部のリンクを行うには、左:
SELECT
*
FROM
TESTA
LEFT
OUTER
JOIN
TESTB
ON
TESTA.A=TESTB.A
LEFT
OUTER
JOIN
TESTC
ON
TESTA.A=TESTC.A
2。右外部結合または右に参加する権利外側に参加
右の外側の接続は、接続するプラスの表は、等価結合に基づいてデータと一致していません
SELECT
*
FROM
TESTA
RIGHT
OUTER
JOIN
TESTB
ON
TESTA.A=TESTB.A
3.完全な外部結合またはフル完全外部結合に参加します
完全な外部接続は、非マッチングデータの等価結合に基づいており、左右のテーブルがあるプラス。
SELECT
*
FROM
TESTA
FULL
OUTER
JOIN
TESTB
ON
TESTA.A=TESTB.A
より高度な方法で第2などのストアド・プロシージャおよび関数、
わずかに
第三に、要約
(1)、外側のコネクタの区別
唯一の定義では、我々は明確に区別することができます。
Enは:接続結果は、結合条件を満たしている行のみが含まれていることをいい、二つのテーブルは、接続に関与している結合条件を満たさなければなりません。それがあることを、表2に戻り、各テーブル内のフィールドの完全修飾された記録内容は、それぞれのテーブルからのものです。
外部接続:接続の結果だけ会う結合条件列が含まれている、だけでなく、ラインの条件を満たしていない、独自のが含まれていません。これは、左外側、右外側連結総外部接続を含みます。、2つの完全修飾テーブルレコード、自分の記録に加えて2つのテーブルを返された場合には、結果セットが一つだけのフィールドレコードテーブルには、別のテーブルのフィールドがヌルヌルフィルを使用している、です。
(2)の2つの表は、選択の種類に基づいてクエリ、クエリに参加します
クエリに参加し、実際のニーズに応じて接続タイプのコネクタを選択するクエリ、SQLクエリの中核です。あなたが適切に選択した場合、クエリのパフォーマンスを向上させることはできませんが、いくつかのロジックエラーやパフォーマンスの低下をもたらすだけではなく。
関連するデータテーブルに接続されている1、二つの等しいチェック欄。
図2に示すように、Col_Lサブセットの右外側Col_Rに接続されています。
図3に示すように、Col_Rサブセットの左外側Col_Lに接続されています。
4、Col_R Col_L及び交差点の別のセットを持ってではなく、互いに全体サブ外層別。
図5に示すように、ジョイント問い合わせ操作を差分。
場合は、複数のテーブルのクエリは、これらの異なる接続タイプは、1を書き込むことができます。例えば:
SELECT T1.C1、T2.CX、T3.CY
TlのFROM TAB1
INNER JOIN TAB2 T2 ON(= T1.C1 T2.C2)
INNER JOIN TAB3 T3(= T1.C1 t2.c3)ON
LEFT OUTER JOIN TAB4 ON (T2.C2 = T3.C3);
T1.x> T3.Y、
この例示的なSQLクエリ上記マルチテーブルの結合です。