sql >> Database >  >> RDS >> Mysql

rechter join versus linker join

Niet echt, want RIGHT JOIN en LEFT JOIN zijn symmetrisch. Dat is:

A LEFT JOIN B = B RIGHT JOIN A

RIGHT JOIN is slechts syntactische suiker. De optimizer kan een rechter join herschrijven naar een linker 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)

Let op de LEFT JOIN in het herschrijven van de optimizer (de tabellen zijn verwisseld):

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) 

Merk op dat (A RIGHT JOIN B !=A LEFT JOIN B) tenzij (A INNER JOIN B =A LEFT JOIN B). Dit komt omdat A RIGHT JOIN B niet symmetrisch is met A LEFT JOIN B (hij is symmetrisch met B LEFT JOIN A).

In uw geval is A RIGHT JOIN B hetzelfde als A LEFT JOIN B, tenzij er NULL-waarden zijn in de kolommen die u samenvoegt. Als er NULL-waarden zijn, dan is A LEFT JOIN B NIET hetzelfde als A RIGHT JOIN B. Als u nieuwe artikelen toevoegt zonder de bijbehorende nieuwsgroep toe te voegen (of omgekeerd), dan veranderen de resultaten ook.



  1. Vervolgkeuzelijst invullen - PHP Ajax MySQL

  2. Hoe ORA-06512 op regelnummer op te lossen

  3. Hoe kan ik de grootte van de kolom in een MySQL-tabel wijzigen?

  4. Verschil tussen #temptable en ##TempTable?