MySQL은 SELECT 구문들 그리고 여러 테이블 DELETE 와 UPDATE 구문들의 테이블 참조 부분에 대해 아래 JOIN 문법을 지원합니다.
   

table_references:
  table_reference [, table_reference] ...

table_reference:
  table_factor I join_table

table_factor:
  tbl_name [[AS] alias] [index_hint_list]
  | table_subquery [AS] alias
  l ( table_references )
  | { OJ table_reference LEFT OUTER JOIN table_reference
    ON conditional_expr }

join_table:
  table_reference [INNER | CROSS] JOIN table_factor [join_condition]
  | table_reference STRAIGHT_JOIN table_factor
  | table_reference STRAIGHT_JOIN table_factor ON conditional_expr
  | table_reference {LEFT | RIGHT}[OUTER] 
    JOIN table_reference join_condition
  | table_reference NATURAL [{LEFT | RIGHT}[OUTER]] JOIN table_factor

join_condition:
  ON conditional_expr
  | USING (column_list)

index_hint_list:
  index_hint [, index_hint] ...

index_hint_list:
  USE {INDEX | KEY}
    [{FOR {JOIN | ORDER BY | GROUP BY}] ([index_list]) 
  | IGNORE {INDEX | KEY}
    [{FOR {JOIN | ORDER BY | GROUP BY}] (index list)
  | FORCE {INDEX | KEY}
    [{FOR {JOIN | ORDER BY | GROUP BY}] (index_list)

index_list:
  index_name [, index_name] ...


하나의 table reference 는 join 표현으로 알려져 있습니다. table_factor 문법은 SQL 표준에 비해 확장적입니다. 

SQL 표준은 단지 table_reference 만 허용합니다. 

괄호 안에 table_reference 목록을 허용하지 않습니다. inner join 과 동일하게 table_reference 항목 목록에 각각 컴마를 사용한다면 이것은 보수적인 확장입니다.
   

SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
  | ON (t2.a=t1.a AND t3.b=t1.6 AND t4.c=t1.c)
= SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)
  | ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)


MySQL에서, CROSS JOIN은 문법적으로 INNER JOIN과 동일합니다.(CROSS JOIN은 각각을 대신할 수 있음). 

표준 SQL에서 이것은 동일하지 않습니다. INNDER JOIN은 ON 절과 함께 사용합니다. 하지만 CROSS JOIN은 그렇지 않습니다. 

일반적으로 괄호는 단지 inner join 연산만 가지는 join 표현에서는 무시될 수 있습니다. MySQL은 또한 nested join을 지원합니다. 

인덱스 힌트는 MySQL 옵티마이저가 인덱스 사용 방식에 영향을 주도록 지정할 수 있습니다.
   

SELECT left_tbl.*
  FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id
  = right_tbl.id WHERE right_tbl.id IS NULL;


0 댓글