詳細なOracle接続(接続が左右の接続、完全に接続されています...)
1つの説明:
言及したデータベースが結合操作を知っている必要があり、データベースクエリ操作で極めて重要な位置を占めるのこの部分の内容は、今日私が操作を言う人が参加します。
結合条件は、FROM句、ジョイン演算子SQL2結合型で指定された二つの部分カップリング条件に分割されている場合、結合動作はWHERE句で指定されてもよいが、FROM句で指定することができます。
カップリングタイプは、タプルと一致しない結合条件をどのように扱うかを決定します。
2接続動作:
条件が一致したものを2つの要素間の関係を決定しましょう。
タイプ参加 |
説明 |
INNER JOINは |
カップリングは、結果テーブルに一致する2つの結合行が参加します |
LEFT OUTER JOINは |
左ジョイン:結果は右表の非一致する行を含まない左テーブル(左端がJOIN句に出現)すべての行を含みます。 |
RIGHT OUTER JOINは |
右の接続:結果は右の表を含めるには、左の表と一致しない行を含めないで、すべての行に(右端JOIN句に表示されます)。 |
FULL OUTER JOINは |
完全に従事する:結果は、すべての行すべてにかかわらず、それらが一致するかどうかの、で参加しています。 |
CROSS JOINを |
クロスカップリング:表中の2つの結合列のすべての可能な組み合わせの結果。それは二つのテーブルのデカルト積を返すクロスコネクト。(Oracleがサポートしていません) |
NATURAL JOINは |
列名とデータ型を探し、自然の接続の際に二つのテーブルで同じフィールドで、自動的にそれらを一緒に接続しています。 |
言って人気:左と右の接続は、ベーステーブルとテーブルにあるとき、テーブルのすべての内容が表示され、その後、二つのテーブルの試合の内容を追加します。
ます。http://blog.csdn.net/caolaosanahnu/article/details/8080350にこの図参照
外部接続のために、オラクル(+)を示すために使用することができる、方法を用います。
1、(+)演算子は、WHERE句で発生することができ、かつ同時に使用し、外側の構文を結合することができません。
図2に示すように、外部接続(+)演算子を実行し、where句に含まれる複数の条件場合、すべての条件(+)演算子に含まれなければなりません。
3、(+)演算子は、カラムに適用することができ、発現に使用されません。
4、(+)演算子とと併用又はオペレータに使用することができません。
5、(+)演算子のみ左右外側を結ぶ外側を実装するために使用することができ、外部の接続は完全に達成使用することができません。
使用上の注意の自然な接続:
(1)は、2つの天然接続テーブルを行う場合は、それらが接続される条件として、満たすために、同じ名前とタイプを持つ複数のフィールドを有します。
(2)は、2つのテーブルのみ天然の同じフィールド名ではなく、同じデータ型は、エラーが返された場合。
ここで私はだけでなく、知識を補完するものとして、いくつかの接続を説明します:
1は、 自己が参加する接続から:
クエリデータを結合した後に接続を使用するので、別のテーブルのような、独自のテーブルを持つミラーは、処理されてもよいです。
2、 デカルト製品のの デカルト積
2つのテーブルの動作を接続されていない場合は、データのクエリの2つの表は、どのようにそれを取得するには?これは、2つのテーブルの直積です。
表には3の上に操作に参加します
共同マルチテーブルルックアップが実行されるときは、マルチテーブル操作が行われる参加でしょう、そしてこれらの接続は、3つのモードで動作します。
(ハッシュ結合)、ネストされたループは、ソートたちが参加する操作についての詳細を学ぶために助けることができるこれらの接続を理解するために、マージ結合ハッシュ結合、以下が一つずつ導入されました。
3.1 HASH JOINの(ハッシュ結合)
ときに、より一般的な方法の接続作業、オプティマイザデータより大きいん:ハッシュは、主にCBO(コストベース最適化のコストベース・オプティマイザは、オプティマイザ1 Oracleは、以下の説明がされるCBO)に参加ハッシュ結合メモリのハッシュテーブルに確立結合を(キーJOIN)を使用して、2つの小さなテーブル、そのテーブル(データソース以下の表)を使用する、列のデータは、ハッシュリストに格納され、大きなテーブルスキャン、同じあなたは試合の値を見つけることができ、マッチングをハッシュするテーブルにKEY JOINを、この時間注:ハッシュテーブルが比較的大きい場合は、いったんメモリに保存されていないがこれ以上のパーティション(セグメント)、ディスクに書き込まれた一時セグメントに分割されます、この時点で、パフォーマンスは効率を低下させることが、書かれたのコスト以上になります。
関連するコストパフォーマンスは、2つのアクセス性能の和であるが、これは主に、(メモリ内に配置することができる)、より小さなテーブルに適用されます。
USE_HASH(table_name1 table_name2)ヒントはハッシュ結合を使用して強制的にすることができます。
3.2 SORTのMERGE JOINは:ソートマージ・ジョイン
ソートマージ・ジョインマージ結合、二つのテーブルは、最初関連キー(KEYをJOIN)に従ってソートされ、そして別のソートテーブルと一致するように、それぞれのソートテーブルからデータを抽出します。
相対的に言って、ソート操作を完了する必要がマージ結合、それはより多くのパフォーマンスによって消費されますが、ソースがソートされている場合、それはより良いパフォーマンスが得られます。適用:非等価アソシエーションを(>、<、> =、<=、<>)、偽などHASH_JOIN_ENABLED =。
あなたは参加ソートマージの使用を強制するためにUSE_MERGE(table_name1のtable_name2)を使用することができます。
3.3ネストされたループ:ネストされたループ結合
ループネストネストされたループが、別のテーブルにアクセスし、表(テーブル駆動外側テーブル)からデータを読み出す動作の周期モードである、ジョイン(ルックアップテーブル内のテーブルは、所望の索引付けされます)。各内側駆動テーブルのレコードを有するテーブルリンクの各行(JOIN)。テーブル内の外観を駆動させ、テーブルの各行の外観は、操作に一致するので、クエリ結果セットが大きすぎることが最善ではありません。駆動テーブルのクエリ(外観)のようなデータテーブルの少量は、デフォルトのドライブプロンプトCBOテーブルを使用して注文することができます。
テーブルを駆動する小さい、ネストされたループの内側のテーブルが有効なインデックス(索引)にアクセスする必要があるが、比較的良好な参加。
使用USE_NL(table_name1 table_name2)が、CBOは、ネスト・ループ結合を実行余儀なくされました。
例4:
Oracleの二つのテーブル:部門情報テーブル:DEPTINFO、ユーザテーブル:USERINFO
INNER 4.1は、結合操作を登録しよう:
等価INNERは、他が接続されている動作と同等である接続として接続JOIN。
4.2 LEFT接続操作をJOIN。
USERINFOはDEPTINFOを接続する左、ベーステーブルをユーザー情報であろう結果は、すべてのコンテンツが表示されます。
Oracleは、接続の3種類があります、次のとおりです。
4.3 RIGHT操作リンクを登録しよう
USERINFO DEPTINFO正しい接続、結果は、すべての内容が表示され、ベース・テーブルをDEPTINFOう。
4.4 FULL OUTERは、接続操作を登録しよう:
USERINFOは完全に結果がUSERINFOなり、DEPTINFOを接続し、コンテンツDEPTINFOが表示されます。
4.5 NATURAL JION自然の接続
4.6接続操作を達成するために、(+)を使用して:
図1に示すように、何の(+)が接続されていません。
2、左(+)の接続:(同等の権利参加)
図3に示すように、右(+):(接続)が左参加対応します
注意:すべてではない程度のプラス(+)。
4.7セルフは自己結合と直積デカルト製品に参加します
自连接 笛卡儿积
1 说明:
提到数据库必须要知道联接操作,这部分的内容在数据库查询操作中占到举足轻重的地位,今天我就来说说这些联结操作。
联接操作可以在WHERE中指定,也可以在FROM子句中指定,在FROM子句中指定联接条件时,SQL2将联接操作符分为联接类型和联接条件两部分。
联接类型决定了如何处理联接条件中不匹配的元组。
2 连接操作:
联接条件决定了两个关系中那些元素该匹配。
联接类型 |
说明 |
INNER JOIN |
内联接,结果为两个联接表中的匹配行的联接 |
LEFT OUTER JOIN |
左联接:结果包括左表(出现在JOIN子句最左边)中的所有行,不包括右表中的不匹配行。 |
RIGHT OUTER JOIN |
右联接:结果包括右表(出现在JOIN子句最右边)中的所有行,不包括有左表中的不匹配的行。 |
FULL OUTER JOIN |
完全联接:结果包括所有联接中的所有行,不论他们是否匹配。 |
CROSS JOIN |
交叉联接:结果包括两个联接表中的所有可能的行组合。交叉连接返回的是两个表的笛卡儿积。(Oracle不支持) |
NATURAL JOIN |
自然连接时在两张表中寻找那些数据类型 和列名都相等的字段,然后自动地将他们连接起来。 |
通俗的说:在左连接和右连接时都会以一张表作为基表,该表的内容会全部的显示,然后加上两张表匹配的内容。
此图引用至:http://blog.csdn.net/caolaosanahnu/article/details/8080350
对于外连接,在Oracle中可以使用(+)来表示,使用的方式:
1、(+)操作符只可以出现在WHERE子句中,并且不可以和outer join语法同时使用。
2、当使用(+)操作符执行外连接时,如果在where子句中包含多个条件,则必须在所有的条件中都包含(+)操作符。
3、(+)操作符只能适用于列,而不能用在表达式上。
4、(+)操作符不能与or和in操作符一起使用。
5、(+)操作符只能用于实现左外连接和右外连接,而不能用于实现完全外连接。
自然连接的注意事项:
(1) 如果做自然连接的两个表中有多个字段都满足有相同名称和类型,那么他们都会被作为连接的条件。
(2) 如果自然两个表中仅字段名称相同,但是数据类型不同时,此时会返回一个错误。
这里我再说明几种连接方式,也当作一种补充知识了:
1、 Self joins自连接:
使用自连接,可以将自己表的一个镜像作为另一张表来对待,进行连接后查询出数据。
2、 Cartesian Products 笛卡尔积
当两个表没有连接操作时,对这两个表进行查询得到的数据是什么样的呢?是这两个表的笛卡儿积。
3 多表连接操作
在进行多表联合查找时,会发现多表会进行连接操作的,而这些连接操作包括三种方式:
Hash Join(散列连接)、Nested Loops、Sort Merge join,对于这些连接方式的了解可以方便我们对于连接操作的进一步了解,下面进行一一介绍。
3.1 HASH JOIN(散列连接)
Hash Join散列连接主要是CBO(CBO: Cost-Based Optimization 基于代价的优化器, Oracle优化器之一,后续会进行介绍)做数据量比较大时进行连接操作比较常用的一种方式,优化器会选用两个表中较小那个表(小一点表或者数据源),利用连接键(JOIN KEY)在内存中建立散列表,将列数据存储到hash列表中,然后扫描大的那个表,同样对JOIN KEY到hash表进行匹配,找出可以匹配的值,此时注意:如果HASH表比较大,无法一次存储到内存时则会分成不多个partition(段),写入磁盘的temporary segment,此时性能会多出一次写的代价,有可能会降低效率。
该内容主要适用于较小的表(可以放入内存),此时相关效能就是访问了两个的性能的成本总和。
可以用USE_HASH(table_name1 table_name2)提示来强制使用散列连接。
3.2 SORT MERGE JOIN:排序合并连接
Merge Join排序合并连接,是先将两个关联的表按照关联键(JOIN KEY)进行排序,然后从各自排序表中抽取数据,到另一个排序表中进行匹配。
相对来说,merge join需要完成排序操作,所以消耗的性能比较多,但是当源如果已经进行了排序,其将会取得较好的性能。适用于:不等价关联(>,<,>=,<=,<>)、HASH_JOIN_ENABLED=false等情况。
可以使用USE_MERGE(table_name1 table_name2)来强制使用排序合并连接.
3.3 NESTED LOOP:嵌套循环连接
Nested Loops嵌套循环连接,工作方式是循环从一张表中读取数据(驱动表 outer table),然后访问另一张表(被查找表 inner table, 希望有索引)。驱动表中每一行与inner表中相应记录进行链接(JOIN)。内表被外表驱动,外表中的每一行都会与内表进行匹配操作,所以查询结果集最好不要太大。将数据量小的表作为查询的驱动表(外表),可以利用ordered 来提示CBO默认的驱动表。
对于驱动表较小的情况时,嵌套循环连接相对比较好,同时inner表需要有效的访问索引(index)。
使用USE_NL(table_name1 table_name2)可是强制CBO 执行嵌套循环连接。
4 举例:
Oracle的两张表:部门信息表:DEPTINFO,用户表:USERINFO
4.1 INNER JOIN连接操作:
INNER JOIN连接作为一种等值连接,其操作相当于where中的等至连接。
4.2 LEFT JOIN连接操作:
USERINFO 左连接DEPTINFO,结果将以USERINFO为基表,其内容将全部显示。
Oracle包含了3种连接方式:分别是:
4.3 RIGHT JOIN链接操作
USERINFO右连接DEPTINFO,结果将以DEPTINFO为基表,将其内容全部显示出来。
4.4 FULL OUTER JOIN连接操作:
USERINFO 全连接DEPTINFO,结果将USERINFO以及DEPTINFO的内容都显示出来。
4.5 NATURAL JION自然连接
4.6 利用(+)来实现连接操作:
1、无(+)连接:
2、左(+)连接:(相当于Right Join)
3、右(+)连接:(相当于Left Join)
注意:不可以左右都加(+)。
4.7 Self Join 自连接以及Cartesian Products笛卡儿积
自连接 笛卡儿积