sql >> データベース >  >> RDS >> Mysql

右結合と左結合

    RIGHTJOINとLEFTJOINは対称であるため、実際にはそうではありません。つまり:

    A LEFT JOIN B = B RIGHT JOIN A
    

    RIGHT JOINは、単なるシンタックスシュガーです。オプティマイザは、右結合を左結合に書き換えることができます:

    mysql> explain extended select * from t right join t t2 using (c1)\G
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: t2
             type: index
    possible_keys: NULL
              key: c2
          key_len: 5
              ref: NULL
             rows: 4201
         filtered: 100.00
            Extra: Using index
    *************************** 2. row ***************************
               id: 1
      select_type: SIMPLE
            table: t
             type: eq_ref
    possible_keys: PRIMARY
              key: PRIMARY
          key_len: 4
              ref: test.t2.c1
             rows: 1
         filtered: 100.00
            Extra: 
    2 rows in set, 1 warning (0.00 sec)
    

    オプティマイザの書き直しのLEFTJOINに注意してください(テーブルが交換されます):

    mysql> show warnings\G
    *************************** 1. row ***************************
      Level: Note
       Code: 1003
    Message: select `test`.`t2`.`c1` AS `c1`,`test`.`t2`.`c2` AS `c2`,`test`.`t`.`c2` AS
    `c2` from `test`.`t` `t2` left join `test`.`t` on((`test`.`t`.`c1` = `test`.`t2`.`c1`))  where 1
    1 row in set (0.00 sec) 
    

    (A INNER JOIN B =A LEFT JOIN B)でない限り、(A RIGHT JOIN B!=A LEFT JOIN B)に注意してください。これは、A RIGHTJOINBがALEFTJOIN Bと対称ではないためです(B LEFT JOIN Aと対称です)。

    あなたの場合、結合している列にNULL値がない限り、A RIGHTJOINBはALEFTJOINBと同じになります。 NULL値がある場合、A LEFTJOINBはARIGHTJOIN Bと同じにはなりません。関連するニュースグループを追加せずに新しい記事を追加すると(またはその逆)、結果も変更されます。



    1. Oracle、PDO_OCIとOCI8

    2. SQLServer2012の列IDの増分が7番目のエントリで6から1000+にジャンプ

    3. psycopg2ライブラリがロードされていないインポート:libssl.1.0.0.dylib

    4. PyramidでSalesForceをデータソースとして接続する方法