Mysql
 sql >> Baza danych >  >> RDS >> Mysql

prawe sprzężenie kontra lewe sprzężenie

Nie bardzo, ponieważ RIGHT JOIN i LEFT JOIN są symetryczne. To znaczy:

A LEFT JOIN B = B RIGHT JOIN A

RIGHT JOIN to tylko cukier składniowy. Optymalizator może przepisać sprzężenie prawe na sprzężenie lewe:

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)

Zwróć uwagę na LEFT JOIN w przepisaniu optymalizatora (tabele są zamienione):

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) 

Zauważ, że (A RIGHT JOIN B !=A LEFT JOIN B), chyba że (A INNER JOIN B =A LEFT JOIN B). Dzieje się tak, ponieważ A RIGHT JOIN B nie jest symetryczne z A LEFT JOIN B (jest symetryczne z B LEFT JOIN A).

W twoim przypadku A RIGHT JOIN B będzie takie samo jak A LEFT JOIN B, chyba że w kolumnach, do których dołączasz, znajdują się wartości NULL. Jeśli są wartości NULL, to A LEFT JOIN B NIE będzie tym samym, co A RIGHT JOIN B. Jeśli dodasz nowe artykuły bez dodawania powiązanej grupy dyskusyjnej (lub odwrotnie), wyniki również ulegną zmianie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak sprawić, by klucz podstawowy zaczynał się od 1000?

  2. ZAMÓW WEDŁUG DATY I GODZINY PRZED GRUPOWANIEM WEDŁUG nazwy w mysql

  3. Czy można utworzyć kolumnę id automatycznego przyrostu w widoku mysql?

  4. Jak ustawić maksymalną liczbę procesów lub wątków MySQL?

  5. Czy JavaScript może łączyć się z MySQL?