ネストされたクエリとクエリに参加

クエリに参加

  1. 等価結合
  2. 彼らの接続
  3. 外部結合します
  4. マルチテーブル・ジョイン

まず、同等の接続

  • 接続シンボル "="

いくつかのアルゴリズムが動作可能に接続します

  1. ネストされたループ法(入れ子ループ)
    • データ量は効率的ではない場合に対応するループの二つ
    • 最初の表1の最初のタプルを見つけ、その後、すべてのタプル2開始からテーブルを横切ります。スプライシングテーブル後及び第二の組を見つけるために、表2、表1のタプルを見つけ、次に、表2を横切ります。
    • 表1中のすべてのタプルが処理された知って、上記動作を繰り返します。
  2. ソートマージアルゴリズムに参加(SORT-MERGE)
    • 一般参加ネストされたループの等同等の変異体に使用
    • 接続による最初は表1と表2の属性排序
    • この場合には、表1及び表2のタプルへのポインタのポイントを設定し表1指针为参照表2扫描場合それらは一緒に動きを接続状態、二組のポインタ、およびスプライシングを満たします。
    • そうでない場合は、場所表2指针为参照表1扫描(つまり教科書プットそれを:価値が少ないポインタが移動タプルの後に。)
    • 上記の手順を繰り返し(核心:表2シフトは、スキャンポインタを有します)
  3. 接続インデックス(INDEX-登録しよう)好像很少用,网上关于它的信息很少
    • また、同等の変種にネステッド・ループを与えます
    • フィールドを接続することで、インデックスのための表2
    • テーブルの各タプルに対して、インデックス・ルックアップ・テーブル2が続きます。

第二に、自己連結

  • 独自のに接続されているテーブルには、特殊なコネクタであり、
  • テーブルの必要があるので、别名違いを表示します
  • すべての属性名が同じ名前の財産ですので、あなたが使用する必要があります别名前缀

例1各コースの。前提条件を直接クエリ名

SELECT FIRST.Cname , SECOND.Cname
FROM Course FIRST , Course SECOND
WHERE FIRST.Cpno=SECOND.Cno;

結果:
ここに画像を挿入説明

第三に、外部接続

共通の外部接続の区別に接続されています

  • 唯一の一般的な接続タプルの条件を満たすように出力
  • 主な接続として指定されたテーブルへの外部接続、テーブルの対象は、一緒にも出力をタプルを満たしていない(それを言うためにどのように?)
  • 左外部結合します:
    • すべては関係のタプルに左側に記載されています
  • 右の外部結合します
    • すべてのタプルの右の関係に上場

2例:

//普通连接
SELECT Student.Sno,Sname, Cno 
FROM Student , SC
WHERE Student.Sno = SC.Sno;

//左外连接
SELECT Student.Sno,Sname, Cno 
FROM Student LEFT OUT JOIN  SC ON
	(Student.Sno = SC.Sno);    //WHERE都省去了
这样写会出现 ‘OUT’ 不是可以识别的 join 选项 的报错。需要将OUT改成OUTER,或者将OUT去掉也行。

//左外连接 ,有些商业系统更简介的表达
SELECT Student.Sno,Sname, Cno 
FROM Student , SC
WHERE Student.Sno (+= SC.Sno;

ここに画像を挿入説明

第四に、マルチテーブルの結合

  • 二つ以上のテーブルを接続します

**例3:**問い合わせ各学生番号、名前、名前、および選択科目の結果

SELECT Student.Sno,Sname,Cname,Grade
FROM Student,SC,Course
WHERE Student.Sno = SC.Sno
		AND SC.Cno = Course.Cno;

ここに画像を挿入説明

第五に、ネストされたクエリ

  • サブクエリの制限:結果がのために使用されているので、あなたは、ORDER BY句を使用することはできません
    無関係なクエリ
  • サブクエリの外側のクエリ、内側から層によるクエリレイヤに依存しません
  • 带IN谓词的子查询

ラインでの生徒の学習における〔例3.55]クエリ「劉チェン。」
方法の一つ:完全にステップバイステップ
部署名①OK「劉チェン」:

SELECT  Sdept  
FROM  Student                            
WHERE  Sname= '刘晨';

結果:CSは
②の学部で勉強し、すべてのCSの学生を探します:

SELECT   Sno, Sname, Sdept     
FROM   Student                 
WHERE   Sdept= 'CS';

方法2:クエリの第二段階で照会条件を埋め込むための第一歩

SELECT Sno, Sname, Sdept
FROM Student
WHERE Sdept IN
      (SELECT Sdept
       FROM Student
       WHERE Sname= '刘晨');

方法3:自己連結

SELECT  S1.Sno, S1.Sname,S1.Sdept
FROM  Student S1,Student S2
WHERE  S1.Sdept = S2.Sdept 
       AND S2.Sname = '刘晨';
  • 比較演算子を持つサブクエリ
    可能な比較の単一の値を返すようにする場合、内側のクエリを正確に知ることができます(>、<、=、> =、<= ,! =、または<>)。
    学生が一つだけのシステムを学ぶことがあるため、[例3.55]では、それはIN =に置き換えることができます。
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept =
      (SELECT Sdept
      FROM Student
      WHERE Sname='刘晨');

[例3.57]はコースの彼の選択科目の成績評価点の平均数を介して、各学生を識別します。

SELECT Sno, Cno
FROM SC x
WHERE Grade >=(SELECT AVG(Grade)
               FROM SC y
               WHERE y.Sno=x.Sno);

相関サブクエリ親クエリに依存クエリサブクエリは:
WHERE句であれば第一の内側層と、内側クエリ処理クエリに対するその関連値に応じて、外部クエリテーブル内の最初のタプルを取得、trueを返し、これは、結果表のタプルに取り込まれます。そして、外側のテーブルで次のタプルを取ります。すべてが外部表まで確認されるまで、このプロセスが繰り返されます。

実行:
タプルX(201215121)、外部クエリからスノ値をタプルX SCを取り外し、内側のクエリに転送されます。

SELECT AVG(Grade)
FROM SC y
WHERE y.Sno='201215121;

インナークエリの実行、取得した88の値(約)、内側のクエリの代わりに使用される値は、外側のクエリが取得します:

SELECT Sno,Cno
FROM SC x
WHERE Grade >=88;

でクエリ結果を実行します。

201215121,1)
(201215121,3

外部クエリは、次のタプルリピートを③、処理されたすべてのタプルまで外層SCに上記ステップを①取り出します。結果は以下のとおりです。

201215121,1)
(201215121,3)
(201215122,2
公開された22元の記事 ウォンの賞賛0 ビュー145

おすすめ

転載: blog.csdn.net/weixin_42649617/article/details/104898633