クエリに参加
- 等価結合
- 彼らの接続
- 外部結合します
- マルチテーブル・ジョイン
まず、同等の接続
- 接続シンボル
"="
いくつかのアルゴリズムが動作可能に接続します
- ネストされたループ法(入れ子ループ)
- データ量は効率的ではない場合に対応するループの二つ
- 最初の表1の最初のタプルを見つけ、その後、すべてのタプル2開始からテーブルを横切ります。スプライシングテーブル後及び第二の組を見つけるために、表2、表1のタプルを見つけ、次に、表2を横切ります。
- 表1中のすべてのタプルが処理された知って、上記動作を繰り返します。
- ソートマージアルゴリズムに参加(SORT-MERGE)
- 一般参加ネストされたループの等同等の変異体に使用
- 接続による最初は表1と表2の属性
排序
- この場合には、表1及び表2のタプルへのポインタのポイントを設定し
表1指针为参照
、表2扫描
場合それらは一緒に動きを接続状態、二組のポインタ、およびスプライシングを満たします。 - そうでない場合は、場所
表2指针为参照
、表1扫描
(つまり教科書プットそれを:価値が少ないポインタが移動タプルの後に。) - 上記の手順を繰り返し(
核心:
表2シフトは、スキャンポインタを有します)
- 接続インデックス(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)