oracle sqlマルチテーブル埋め込みサブクエリ接続クエリー、join where existinの違い


sqlにおけるexitsとinの違い
回転:http://hi.baidu.com/delphi_relive/blog/item/d7c0034a49c4932208f7ef21.html
inとexistsもよく違います.
inは集合演算子です.
a in {a,c,d,s,d....}
この演算では、前は1つの要素で、後ろは1つの集合で、集合の中の要素のタイプは前の要素と同じである.
existsは存在判断であり、後のクエリに結果がある場合、existsは真であり、そうでない場合は偽である.
in演算は文に用いられ、その後ろに付いているselectはselect*ではなくフィールドを選択するに違いない.
例えば、あるクラスに「明ちゃん」という学生がいるかどうかを判断するには、in演算を使うことができます.
「明ちゃん」in(select sname from student)
このように(select sname from student)はクラス全員の名前の集合を返し、inは「明ちゃん」がこの集合のデータであるかどうかを判断するために使用される.
また、exists文も使用できます.
exists(select*from student where sname="明")
この2つの含数は差が少ないが、最適化案の違いにより、通常、NOT EXISTSはNOT INよりも速いが、NOT EXISTSは結合アルゴリズムを用いることができるため、NOT INはだめであり、EXISTSはINよりも速くない.この場合、INは結合アルゴリズムをより多く使用する可能性があるからである.
select*fromテーブルA where exists(select*fromテーブルB whereテーブルB.id=テーブルA.id)
この文は
select*fromテーブルA where id in(select id fromテーブルB)
テーブルAの各データについてselect*fromテーブルB whereテーブルB.id=テーブルA.idの存在性判定を行い、テーブルBにテーブルAの現在の行と同じidが存在する場合、existsは真であり、その行は表示され、そうでなければ表示されない
exitsは内小外大のクエリーに適し、inは内大外小のクエリーに適している
INは、与えられた値がサブクエリまたはリストの値と一致するかどうかを決定する.
EXISTSはサブクエリを指定し、ローの存在を検出します.
EXISTSとINを使用したクエリの比較
この例では、2つの意味が似ているクエリを比較します.1番目のクエリはEXISTS、2番目のクエリはINを使用します.2つのクエリは同じ情報を返すことに注意してください.
USE pubs GO SELECT DISTINCT pub_name FROM publishers WHERE EXISTS (SELECT * FROM titles WHERE pub_id = publishers.pub_id AND type = 'business') GO
-- Or, using the IN clause:
USE pubs GO SELECT distinct pub_name FROM publishers WHERE pub_id IN (SELECT pub_id FROM titles WHERE type = 'business') GO
次のいずれかのクエリの結果セットを示します.
pub_name ---------------------------------------- Algodata Infosystems New Moon Books
(2 row(s) affected)
exitsは存在量詞に相当する:集合が存在することを表す、すなわち集合が空ではなく1つの集合しか作用しない.例えばexistPはPが空でない場合が真であることを表す.not exist Pはpが空の場合真inはスカラーと一元関係の関係を表す.例えば、s in Pは、sとPのいずれかの値が等しい場合に真であることを示す.s not in Pは、sとPのそれぞれの値が等しくない場合を真とする
 
 
二、接続クエリー 
  SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM Persons INNER JOIN Orders ON Persons.Id_P = Orders.Id_P ORDER BY Persons.LastName
異なるSQL JOIN  返される結果セットが異なります
 
上記の例で使用したINNER JOIN(イントラコネクション)の他にもいくつかのコネクションを使用することができます.
使用できるJOINタイプと、それらの違いを以下に示します.
  • JOIN:テーブルの少なくとも1つが一致している場合は、ローを返します. 
  • LEFT JOIN:右のテーブルに一致がない場合でも、左のテーブルからすべての行
  • を返す.
  • RIGHT JOIN:左のテーブルに一致がない場合でも、右のテーブルからすべての行
  • を返す.
  • FULL JOIN:いずれかのテーブルに一致がある限り、行
  • に戻る
  • 注記:INNER JOINはJOINと同じです.

  •   簡単に言えば   ,2つのテーブルのように、結果セットがどのようになっているかを見てみましょう.  person およびorder  せつぞく     :
                         personとorderが連絡している記録だけを見たいならorder.idを満たすp=person.idのレコード他の一致しないものはすべてinner joinで表示します
                        left joinはinnerに戻っている  joinの結果セットに基づいて左のテーブルpersonテーブルの残りのレコードを返します(これらの表示されたレコード行はorderテーブルに関連するすべてのバーが空です.一致関係を満たしていないためです).
                       同理  ,right join  および  full join
     
    3)ネストされたサブクエリ
    select t.deptno,count(*) from emp t,(select avg(e.sal) avgsal from emp e) a where t.sal>a.avgsal group by t.deptno
     
           where演算子(=,<,>,>=,<=,<>)where演算子(in,not in,exists,not exists,all,any)
    関連サブクエリとは、親クエリの一部のテーブルまたは一部のカラムを参照したサブクエリです(ただし、親クエリはサブクエリのテーブルまたはカラムを参照できません).親クエリはselect、update、delete句であってもよい.
     
     
    4)sql  の集約関数のネスト   使用
                   集計関数は、他のほとんどのリレーショナル・データベース製品と同様に、PostgreSQLでは集計関数をサポートします.1つの集計関数は、複数の入力行から1つの結果を計算します.たとえば,count(数),sum(総和),avg(平均値),max(最大値),min(最小値)を1行の集合で計算する関数がある.例えば、SELECT max(temp_lo)FROM weather、SELECT max(temp_lo)FROM weather、SELECT max(temp_lo)FROM weather、SELECT max(temp_lo)FROM weather、SELECT maxmax -----   46(1 row)どの都市で起きたか知りたいなら、SELECT city FROM weather WHERE temp_を使うかもしれません.lo = max(temp_lo);     -- 間違いだ!しかし、この方法は動作しません.集計関数maxはWHERE句に使用できないからです.この制限は、WHERE句がどの行が集約段階に入ることができるかを決定するためである.したがって、関数を集計する前に計算する必要があります.しかし、私たちは他の方法でこの目的を実現することができます.ここではサブクエリを使用します:SELECT city FROM weather    WHERE temp_lo = (SELECT max(temp_lo) FROM weather);     city----------San Francisco(1 row)は、サブクエリが独立した計算であり、外部クエリから独立して独自の集約を計算するため、このようにすることができます.集約は同様にGROUP BY句にもよく用いられる.例えば、各都市の低温の最高値:SELECT city,max(temp_lo)を得ることができます.    FROM weather     GROUP BY city;     city      | max ---------------+----- Hayward       |  37 San Francisco |  46(2 rows)は、都市ごとに出力されます.各集計結果は、都市に一致する行で計算されます.私たちはHAVINGでこれらのグループを濾過することができます:groupbyはhavingがなくてhavingがgroupbyの後ろについてSELECT city,max(temp_lo)を濾過しなければなりません    FROM weather     GROUP BY city     HAVING max(temp_lo) < 40;  city   | max ---------+----- Hayward |  37(1 row)これでtemp_しか与えられませんlo値はかつて40度未満の都市があった.最後に、「S」で始まる都市だけに関心を持っていれば、SELECT city,max(temp_lo)を使うことができます.    FROM weather     WHERE city LIKE 'S%'     GROUP BY city     HAVING max(temp_lo) < 40;文中のLIKE実行モードマッチングは,節9.7で説明する.集約とSQLのWHEREとHAVING句の関係を理解することが重要です.WHEREとHAVINGの基本的な違いは以下の通りである:WHEREはパケットと集計計算の前に入力行(どの行が集計計算に入るかを制御する)を選択し、HAVINGはパケットと集計の後に出力行を選択する.したがって、WHERE句には集約関数を含めることはできません.集計関数でそれらの行が集計演算に入力されると判断しようとするのは意味がないからです.逆に、HAVING句には常に集約関数が含まれます.もちろん、集まったHAVING句を使わないで書くことができますが、同じ条件でWHERE段階にもっと効果的に使えるので、メリットはありません.前の例では、WHEREに都市名制限を適用することができます.それは集約する必要がないからです.これにより、HAVINGで制限を追加するよりも効率的になります.これは、WHEREチェックを通過していないローのグループ化と集計計算を回避するためです.
       (11) 集約関数のネストの使用