使用MySQLのON LEFTは、表データとWHREREの結合します

背景

左は、我々はMySQLのクエリは、このような多くの商品は、コメントに格納方法をどのように多くのコメントについての記事でブログ、どのように多くのなどのようなコメントとして、非常に一般的なように記述することができます使用するプロセスに参加します。しかし、参加による、今日、このような缶に精通していないなどのキーワードが結果は期待できないとして、時には原因ところ、そう、で、私はピットを避けるために一緒にまとめます。

ここで私は、シーンを与え、そしてあなたが読んでいないこの記事ではそれに答えることができれば、二つの質問を投げるしたいと思います。

あなたは、テーブルクラスがあり、クラスの管理アプリケーションを持っているすべてのクラスを保存したとし、次のように、特定のデータをすべての学生をテーブルの学生があり、保存された(オンラインSQL:https://www.liaoxuefeng.com/wiki/1177760294764384/ 1179611432985088):

SELECT * FROMクラス、
ID名
。1クラス
2番目のクラス
3つの三つのクラス
4の4つのクラス

学生FROM SELECT *;。
ID CLASS_ID性別名
。1. 1暁M
2 1赤F.
3シャオ6月1日M。。
4. 1キビF.。
5 2ホワイトF.。
6兵士2 M。
7 2小林M。
8. 3新しい小F.。
9. 3ワンM。
103メアリーF

:だから今2つの要件があります
1、女子学生の各クラスの名前と対応する番号を見つけるために
2は、クラスごとの生徒の総数を調べるために、

要件1については、ほとんどの人は躊躇せずに書き込み、次の2つのSQLを思い付くことができるようになります、私は右が何であるかを求めることができますか?

c.nameを選択、NUMとして(s.name)をカウント
するクラスCからは、学生の参加左
s.class_id = c.id上
とs.gender = 'F'
c.nameしてグループを
或者
SELECT c.name、(複数のカウント.nameの)NUMとして
クラスCからは、学生の参加左
s.class_id = c.id上
s.gender =「F」
c.nameしてグループを

大多数の人々のニーズのための2が書き込みの思考せずに、次の2つのSQLを思い付くことができ、私は右が何であるかを尋ねますか?

SELECT c.name、カウント数(s.name)AS NUMは、
クラスの生徒に参加し、左。S C
ON = c.IDはs.class_id
WHERE c.NAME = 'クラスの
c.NAMEによって、グループ
または
SELECT c.name、カウント数( s.name)AS NUMは
Cクラスから参加学生Sを左
s.class_id = c.ID ON
とc.name = 'クラスの
c.nameによってグループ
断るし続けないでください!あなた自身の答えを与えるためには、正しい答えは以下の通りです。








答えは2つの要件は、あなたが参加し、左の原則の実現のために配備されるのMySQL理解する必要があり、最初の文は、この問題を把握するために、正しい次のセクションであるです。

原則

同様のMySQLの左からネストされたループは、次の文の例として、プロセスに参加します。

LT左からSELECT *はRT ON JOIN P2(LT、RT)P1(LT、RT))
P1はフィルタに関する条件であることを特徴とする請求は、欠失もTRUEと見なされるP2がフィルタでTRUEを、欠落していると考えられます

実行論理文は次のように説明することができる:
LT {LT各行のため//反復左テーブルの各行
BOOL B = FALSE;
各行RT RT FORでそのPL(LT、RT){//反復各テーブルの右ライン、の条件を満足する行を結合
IF P2(LT、RT){ // 満たすフィルタ条件
T:= LT || RT;出力//マージ線こと
}
B = TRUE; //はRTで有するLT対応する行
}
RTは室温で、トラバースされ// IF(!B)は{ヌルフィルトライラインと、対応する行を発見していないLT
P2(LT、NULL)場合//充填ヌル後 { フィルタ満たします条件
T:= LT || NULL; //出力ラインLTヌルおよび補体
}
}
}
もちろん、比較ラインの数を減らすために最適化されたMySQLの方法バッファ実際に使用するが、これは重要なプロセスの実行に影響を与えないで、ていないこの資料の範囲内。

この擬似コードから、我々は2つのことを見ることができます:
1、ON右表の制限を
使用すると、右の表を制限したい場合は、データの欠如が生じることで条件に行わなければならない、左側につながりますテーブルには最終結果の行の行に一致せず、右の表に表示されていない、左の我々の理解に反してに参加します。左表のノー右表の一致行の用語は、右の表B = FALSEを横断しているため、NULLは、それが右の表を使用しようと満たされたが、満足していない場合は、この時点で我々は、右の表の行のP2の制約にNULLですP2(これはNULLでない限り、NULLは、一般に、制約条件を満たさない)、次いで、最終的な結果は、結果の欠如をもたらす、追加されません。
図2に示すように、規制左テーブル
該当する場合ならない関係なく限界までの左テーブルの状態の条件、左合成結果表は、各行が右テーブル場合、左側のテーブルの行の少なくとも一つの列を持っていません線、B = FALSEを通過した後、テーブルの右端には、NULLは、データラインを生成するために使用され、このデータは冗長です。テーブルをフィルタリングするには、左はだからここでなければなりません。

分析の概要

2人のエラー文ニーズや間違った理由の結果、次の展開:

必要
名NUMの
クラス2
番目のクラス1つの
三つのクラス2
欠落データが得られ、テーブルを制限する権利(結果として4つのクラスが0を有していなければならない)状態ので需要

要件2
名NUMの
4つの群
第二クラス0
三つのクラス0
の4つのクラス0
の冗長データが得られる左テーブル制限の条件に起因ニーズ2を、(他のクラスの結果が間違っていたこと出てきました)

症状とは、上記の分析によって、結論を描画することができます:
左が声明に参加し、左側のテーブルのフィルタ条件は、フィルタは、テーブルの上に置かれなければならない場所に配置しなければならない適切な条件

SQL音シンプルですが、その中の原則の多くの詳細がありますが、それは少し混乱の結果は予想通り、これは常に、これらの詳細原理に間違った時間を回避するための鍵を注意を払ってい原因となります。

転送:https://segmentfault.com/a/1190000020458807

おすすめ

転載: www.cnblogs.com/chen-chen-chen/p/11922438.html