2012-08-04 2 views
2

이 경우 왼쪽 조인은 오른쪽 조인과 동일합니까? 현재 데이터와오른쪽 조인 대 왼쪽 조인

mysql> 
mysql> 
mysql> use usenet;show tables;describe ARTICLE;describe NEWSGROUP; 
Database changed 
+------------------+ 
| Tables_in_usenet | 
+------------------+ 
| ARTICLE   | 
| NEWSGROUP  | 
+------------------+ 
2 rows in set (0.00 sec) 

+---------------+------------+------+-----+---------+----------------+ 
| Field   | Type  | Null | Key | Default | Extra   | 
+---------------+------------+------+-----+---------+----------------+ 
| ID   | bigint(20) | NO | PRI | NULL | auto_increment | 
| MESSAGENUMBER | int(11) | YES |  | NULL |    | 
| NEWSGROUP_ID | bigint(20) | YES | MUL | NULL |    | 
+---------------+------------+------+-----+---------+----------------+ 
3 rows in set (0.01 sec) 

+-----------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-----------+--------------+------+-----+---------+----------------+ 
| ID  | bigint(20) | NO | PRI | NULL | auto_increment | 
| NEWSGROUP | varchar(255) | YES |  | NULL |    | 
+-----------+--------------+------+-----+---------+----------------+ 
2 rows in set (0.00 sec) 

mysql> 
mysql> select * from ARTICLE right join NEWSGROUP on ARTICLE.NEWSGROUP_ID=NEWSGROUP.ID; 
+------+---------------+--------------+----+-------------------------------+ 
| ID | MESSAGENUMBER | NEWSGROUP_ID | ID | NEWSGROUP      | 
+------+---------------+--------------+----+-------------------------------+ 
| 1 |    4 |   1 | 1 | gwene.com.androidcentral  | 
| 2 |    5 |   1 | 1 | gwene.com.androidcentral  | 
| 3 |    6 |   1 | 1 | gwene.com.androidcentral  | 
| 4 |    7 |   1 | 1 | gwene.com.androidcentral  | 
| 5 |    8 |   1 | 1 | gwene.com.androidcentral  | 
| 6 |    9 |   1 | 1 | gwene.com.androidcentral  | 
| 7 |   10 |   1 | 1 | gwene.com.androidcentral  | 
| 8 |   11 |   1 | 1 | gwene.com.androidcentral  | 
| 9 |    4 |   2 | 2 | gwene.com.blogspot.emacsworld | 
| 10 |    4 |   3 | 3 | gwene.com.blogspot.googlecode | 
| 11 |    5 |   3 | 3 | gwene.com.blogspot.googlecode | 
| 12 |    6 |   3 | 3 | gwene.com.blogspot.googlecode | 
| 13 |    7 |   3 | 3 | gwene.com.blogspot.googlecode | 
| 14 |    8 |   3 | 3 | gwene.com.blogspot.googlecode | 
| 15 |    9 |   3 | 3 | gwene.com.blogspot.googlecode | 
| 16 |   10 |   3 | 3 | gwene.com.blogspot.googlecode | 
| 17 |   11 |   3 | 3 | gwene.com.blogspot.googlecode | 
| 18 |    4 |   4 | 4 | gwene.com.economist   | 
| 19 |    5 |   4 | 4 | gwene.com.economist   | 
| 20 |    6 |   4 | 4 | gwene.com.economist   | 
| 21 |    7 |   4 | 4 | gwene.com.economist   | 
| 22 |    8 |   4 | 4 | gwene.com.economist   | 
| 23 |    9 |   4 | 4 | gwene.com.economist   | 
| 24 |   10 |   4 | 4 | gwene.com.economist   | 
| 25 |   11 |   4 | 4 | gwene.com.economist   | 
+------+---------------+--------------+----+-------------------------------+ 
25 rows in set (0.00 sec) 

mysql> 
mysql> select * from ARTICLE left join NEWSGROUP on ARTICLE.NEWSGROUP_ID=NEWSGROUP.ID; 
+----+---------------+--------------+------+-------------------------------+ 
| ID | MESSAGENUMBER | NEWSGROUP_ID | ID | NEWSGROUP      | 
+----+---------------+--------------+------+-------------------------------+ 
| 1 |    4 |   1 | 1 | gwene.com.androidcentral  | 
| 2 |    5 |   1 | 1 | gwene.com.androidcentral  | 
| 3 |    6 |   1 | 1 | gwene.com.androidcentral  | 
| 4 |    7 |   1 | 1 | gwene.com.androidcentral  | 
| 5 |    8 |   1 | 1 | gwene.com.androidcentral  | 
| 6 |    9 |   1 | 1 | gwene.com.androidcentral  | 
| 7 |   10 |   1 | 1 | gwene.com.androidcentral  | 
| 8 |   11 |   1 | 1 | gwene.com.androidcentral  | 
| 9 |    4 |   2 | 2 | gwene.com.blogspot.emacsworld | 
| 10 |    4 |   3 | 3 | gwene.com.blogspot.googlecode | 
| 11 |    5 |   3 | 3 | gwene.com.blogspot.googlecode | 
| 12 |    6 |   3 | 3 | gwene.com.blogspot.googlecode | 
| 13 |    7 |   3 | 3 | gwene.com.blogspot.googlecode | 
| 14 |    8 |   3 | 3 | gwene.com.blogspot.googlecode | 
| 15 |    9 |   3 | 3 | gwene.com.blogspot.googlecode | 
| 16 |   10 |   3 | 3 | gwene.com.blogspot.googlecode | 
| 17 |   11 |   3 | 3 | gwene.com.blogspot.googlecode | 
| 18 |    4 |   4 | 4 | gwene.com.economist   | 
| 19 |    5 |   4 | 4 | gwene.com.economist   | 
| 20 |    6 |   4 | 4 | gwene.com.economist   | 
| 21 |    7 |   4 | 4 | gwene.com.economist   | 
| 22 |    8 |   4 | 4 | gwene.com.economist   | 
| 23 |    9 |   4 | 4 | gwene.com.economist   | 
| 24 |   10 |   4 | 4 | gwene.com.economist   | 
| 25 |   11 |   4 | 4 | gwene.com.economist   | 
+----+---------------+--------------+------+-------------------------------+ 
25 rows in set (0.00 sec) 

mysql> 
mysql> 
+1

설명 결합을 http://www.codinghorror.com/blog/ ([SQL 시각적 설명 조인] 2007/10/a-visual-explanation-of-sql-joins.html). – eggyal

+0

값 (NEWSGROUP.ID) = 값 (ARTICLE.NEWSGROUP_ID) –

+0

SQL에 대해 설명하기를 원합니다 –

답변

1

는, 그래 그들은 동일합니다. 그러나 NEWSGROUP_ID는 널 (NULL) 입력 가능하므로 데이터가 변경 될 때마다 다를 수 있습니다.

개인적으로 가능한 한 (기본 테이블에서 자식 테이블까지) 항상 LEFT JOIN을 사용합니다. 사실 SQL 개발에서 6 년 이상 동안 몇 번만 RIGHT JOIN을 사용해야했습니다.

4

RIGHT JOIN 및 LEFT JOIN은 대칭이므로 실제로는 그렇지 않습니다. 즉,

A LEFT JOIN B = B RIGHT JOIN A 

오른쪽 조인은 단지 구문 설탕입니다. 권리를 다시 작성할 수 있습니다 최적화가 왼쪽으로 가입 가입 :

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) 

참고 LEFT는 (테이블이 교체되는) 최적화 재 작성에 가입 :

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 RIGHT는 B 가입 공지 사항 것을 ! = A LEFT JOIN B). (A 내부 조인 B = 왼쪽 조인 B). 이는 A LEFT JOIN B가 A LEFT JOIN B와 대칭이 아니기 때문입니다 (B LEFT JOIN A와 대칭입니다).

귀하의 경우 조인하는 열에 NULL 값이 없으면 A RIGHT JOIN B는 A LEFT JOIN B와 같을 것입니다. NULL 값이 있으면 A LEFT JOIN B는 A RIGHT JOIN B와 같지 않습니다. 연관된 뉴스 그룹을 추가하지 않고 새 기사를 추가하면 (또는 그 반대) 결과도 변경됩니다.