ホームページ >バックエンド開発 >PHPチュートリアル >on の使用と mysql をフィルタリングする場所の違いを解析する left(right) join_PHP チュートリアル

on の使用と mysql をフィルタリングする場所の違いを解析する left(right) join_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:06:00855ブラウズ

mysqlクエリでmysqlのleft(right)joinフィルタ条件を使用してonとwhereの間でクエリされたデータに違いがあるかどうかについての質問があります。
2 つのキーワードを見るだけでは問題が見つからないかもしれません。実際の例を使用して、違いがあるかどうかを確認してみましょう。

たとえば、2つのテーブル構造があります
テーブル構造1

コードをコピーします コードは次のとおりです:

drop table if EXISTS A (
ID int( 1) NOT NULL、
PRIMARY KEY (ID)
) ENGINE=MyISAM DEFAULT CHARSET=latin1; テーブル構造 2
CREATE TABLE B (
ID int(1) NOT NULL、
PRIMARY KEY (ID)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
テーブル 1 にデータを挿入
コードをコピーする
コードは次のとおりです:


A 値に挿入 ( 1 );
A 値に挿入);
A 値に挿入 ( 3 );
A 値に挿入 ( 6 ; ;

)完了後のテーブル A と B のデータは次のようになります:
ステートメント1




コードをコピー

コードは次のとおりです:

AからA.IDをAIDとして、B.IDをBIDとして選択します。 A left join B on A.ID = B.ID where B. ID<3
ステートメント 2
コードをコピー

コードは次のとおりです:

A から A.ID を AID として選択し、B.ID を BID として選択し、A で B を結合します。ID = B .ID と B.ID
上記 2 つのステートメントのクエリ結果は一貫していますか?
とにかく、私はこれら 2 つのクエリの違いに気づきませんでした [これまでにこのような SQL を書いたことはありませんでした]。
実際の結果を見てみましょう
ステートメント 1 のクエリ結果

ステートメント 2 のクエリ結果は次のとおりです:

2 つのクエリの間に違いが見つかりました。

なぜ違いがあるのでしょうか? これは on と where のクエリ順序に関係しています。

標準的なクエリキーワードの実行順序は、from->where->group by->having->order by であることがわかっています[はっきりとは覚えていません]

左結合は from range クラスにあるため、テーブルは最初に on 条件によってフィルターされ、次に 2 つのテーブルに対して左結合が実行されます。

どこで、左側の結合結果が再度フィルタリングされます。

最初のSQLステートメントのクエリプロセスは次のとおりです:
1: 最初の左結合

コードをコピーします コードは次のとおりです:

select A.ID as AID, B.ID as BID from A left join B on A.ID = B.ID

クエリ結果は以下の通りです


2: クエリ結果から B.ID または BID

これが上で見た結果です。

2 番目の SQL ステートメントのクエリ プロセスは次と同等です:

1: 最初に on 条件に従ってテーブルをブラッシングすることは、最初に B テーブルをフィルタリングすることと同じです:

2: 前のクエリ結果とテーブル A に対して左結合を実行します。これが、2 番目のクエリの SQL がテーブル A を保持していることがわかる理由です。
ON を使用する場合とその場所に注意してください:
(1): ON の背後にあるフィルター条件は主に関連テーブル用です (ただし、メイン テーブルのブラシ選択条件は適用されません)。
例:

コードをコピーします コードは次のとおりです:

AからA.IDをAIDとして、B.IDをBIDとして選択します。A.ID = B.IDおよびA.ID = 3でBを左結合します

クエリ結果は
です


予想と異なる結果が得られ、AID=3のデータがふるいにかけられたのには驚きました。

しかし、AIDのAID 1と2に対応する値はNULLであり、関連付けられたテーブルはテーブルAのフィルタリング条件を満たす値のみを取ることもわかりました。

つまり、メインテーブルの条件がon以降の場合、アタッチされたテーブルはメインテーブルの選択条件を満たす値のみを取り、メインテーブルは丸められたテーブルのままになります。

(2): メインテーブルのフィルター条件は ON の後ではなく where の後に配置する必要があります

(3): 関連テーブルを別の方法で扱う必要があります。接続する前に条件をクエリする必要がある場合は、クエリ部分を追加する必要があります

後ろに置きます。

接続完了後にフィルタリングしたい場合は、whereの後に条件を置く必要があります

(4):

関連テーブルの場合、実際には最初にサブクエリを実行してから結合することができますしたがって、2番目のSQLは以下と同等です
コードをコピーします

コードは次のとおりです: A. ID を AID として選択し、B1.ID を BID として選択します A から左結合 (B から B.ID を選択、ここで B.ID

上記はすべて完了していますmysql5.1 でテスト済み



http://www.bkjia.com/PHPjc/327641.html

www.bkjia.com

http://www.bkjia.com/PHPjc/327641.html技術記事 mysqlクエリでmysqlのleft(right)joinフィルタ条件を使用してonとwhereの間でクエリされたデータに違いがあるかどうかについての質問があります。 2つのキーワードを見ただけでは問題が見えないかもしれません。 ...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。