データベース学習シリーズ:結合のオンと場所の違い

シーン

実際の作業でjoinはよく使われます。それらの中で、onそしてwhereしばしば一緒に使用されます。ただし、用途によってjoin結果は異なりますこのブログは主に違いについてです。

周囲

ソフトウェア バージョン
mysql 5.7.27

テキスト

1.データの準備

1.テーブルステートメントを作成します

CREATE TABLE userone  ( 
	username	varchar(255) NULL,
	sex     	smallint(255)  COMMENT '1.男;2.女'  NULL,
	score   	int(255) NULL 
);
CREATE TABLE usertwo  ( 
	username	varchar(255) NULL,
	sex     	smallint(255)  COMMENT '1.男;2.女'  NULL,
	score   	int(255) NULL 
);

2.データの挿入

INSERT INTO userone(username, sex, score)
  VALUES('name0', 1, 123);
INSERT INTO userone(username, sex, score)
  VALUES('name1', 2, 12);
INSERT INTO userone(username, sex, score)
  VALUES('name2', 1, 2);
INSERT INTO userone(username, sex, score)
  VALUES('name3', 2, 3);
INSERT INTO userone(username, sex, score)
  VALUES('name0', 2, 333);

INSERT INTO usertwo(username, sex, score)
  VALUES('name0', 1, 31);
INSERT INTO usertwo(username, sex, score)
  VALUES('name1', 2,22);
INSERT INTO usertwo(username, sex, score)
  VALUES('name4', 1, 42);
INSERT INTO usertwo(username, sex, score)
  VALUES('name5', 2, 53);

二、テスト

ここでは、ケースを使用して分析します。

  1. 私たちは、テーブル内のデータを取得したい場合useroneusertwo同じ名前として性別男性である、テーブル、どのようにSQL我々はそれを書くことができますか?

    SELECT a.username,a.sex,a.score,b.username,b.sex,b.score 
    FROM userone a join usertwo b on a.username=b.username
    where a.sex=1
    
    SELECT a.username,a.sex,a.score,b.username,b.sex,b.score 
    FROM userone a join usertwo b on a.username=b.username and a.sex=1
    

    結果に関してはSQL上記の2行の結果は一貫しています。結果は次のとおりです。
    ここに画像の説明を挿入します

  2. テーブルuseroneデータを取得し、テーブルusertwoと同じ名前のデータを強調表示したいが、性別が男性である場合、どのようSQLに記述できますか?誰かが次のようSQL書くかもしれません

    -- SQL1
    SELECT a.username,a.sex,a.score,case when b.username is not null then '存在' else '不存在' end as '标记'
    FROM userone a left join usertwo b on a.username=b.username and a.sex=1
    -- SQL2
    SELECT a.username,a.sex,a.score,case when b.username is not null then '存在' else '不存在' end as '标记'
    FROM userone a left join usertwo b on a.username=b.username
    where a.sex=1
    

    結果に関する限り、上記の2つの行の結果にSQLは一貫性がなく、SQL1得られた結果は次のとおりです。
    ここに画像の説明を挿入します

    SQL2得られた結果は次のとおり
    ここに画像の説明を挿入します
    です。指定されたタイトルについて、必要な結果は、SQL1すべてのデータを取得するためであり、usertwoテーブルと同じ名前でデータを示す必要がありますが、性別は男性です。これは違いに反映さjoinonていwhereます。読者がもっと注意を払うと、後者の2つSQLは左結合を使用していることがわかりますleft join左側の接続は、左側のテーブルをベンチマークとして使用することを意味し、条件が満たされていない場合でも、それを関連付けとして結果セットに入れる必要があります。on条件が満たされていない場合でも、左右の接続の要件に応じて、メインテーブルで条件を満たしていないデータがメインテーブルに置かなければならないので、後者の条件は、メインテーブルには有効ではありません。whereキーワードは、フィルタリングされた結果セットをフィルタリングし、全体のために有効です。だから、SQL1およびSQL2視点の違いが、結果は非常に異なっています。

総括する

joinこれonは、2つのテーブルのフィルタリングのデカルト積でwhereあり、フィルターからのデータの最終結果に関連付けられています。左右の接続の場合on、内部の条件はメインテーブルの満たされていないデータを無視し、フィルタリングしません。代わりに、where左右の関連付けを考慮せずに、関連付けられた結果セットをフィルタリングします。

賞賛を求める

私の記事がすべての人に役立つ場合は、記事の下部にある[いいね]または[お気に入り]をクリックできます。
良いディスカッションがある場合はメッセージを残すことができます。
今後の記事を引き続き表示する場合は、[フォロー
する]をクリックしてください。次のQRコードをスキャンして、私の公開アカウントをフォローできます:Fengye Zhixuege、私の最新の共有をチェックしてください!
ここに画像の説明を挿入します
バイバイ

おすすめ

転載: blog.csdn.net/u013084266/article/details/113702591