자연 조인과 내부 조인의 차이점


197

자연 조인과 내부 조인의 차이점은 무엇입니까?


3
이 질문은 INNER vs NATURAL 조인에 관한 것이기 때문에 다른 질문과 중복되지 않습니다.

1
한 번에 이것은 왼쪽, 오른쪽, 외부 및 내부 조인의 차이점무엇입니까? 의 복제본으로 닫혔 지만 그 질문은 내부 조인과 자연 조인의 차이점을 다루지 않습니다.
Jonathan Leffler

답변:


250

INNER JOIN과 NATURAL JOIN의 중요한 차이점 중 하나는 반환 된 열 수입니다.

치다:

TableA                           TableB
+------------+----------+        +--------------------+    
|Column1     | Column2  |        |Column1  |  Column3 |
+-----------------------+        +--------------------+
| 1          |  2       |        | 1       |   3      |
+------------+----------+        +---------+----------+

INNER JOIN열 1에 TableA의와 TableB의의 반환합니다

SELECT * FROM TableA AS a INNER JOIN TableB AS b USING (Column1);
SELECT * FROM TableA AS a INNER JOIN TableB AS b ON a.Column1 = b.Column1;
+------------+-----------+---------------------+    
| a.Column1  | a.Column2 | b.Column1| b.Column3|
+------------------------+---------------------+
| 1          |  2        | 1        |   3      |
+------------+-----------+----------+----------+

NATURAL JOIN열 1에 TableA의와 TableB의의 반환합니다 :

SELECT * FROM TableA NATURAL JOIN TableB
+------------+----------+----------+    
|Column1     | Column2  | Column3  |
+-----------------------+----------+
| 1          |  2       |   3      |
+------------+----------+----------+

반복되는 열은 피합니다.

표준 문법에서 AFAICT를 사용하면 자연 조인에서 조인 열을 지정할 수 없습니다. 조인은 이름을 기반으로합니다. Wikipedia 도 참조하십시오 .

( 내부에서 속임수가있다는 출력에 가입하며 a.b.부품 열 이름에 없을 것입니다, 당신은 바로이 것 column1, column2, column1, column3제목으로. )


2
TableA (Column1, Column2)와 TableB (Column2, Column3)의 두 테이블이 있습니다.
2 8

16
출력에서 접는 열은 자연스러운 조인의 가장 중요한 측면입니다. 알아야 할 사항은 (A) 동일한 이름의 필드에 자동으로 참여하며 (B) 가장 기대하지 않을 때 ***를 표시합니다. 내 세상에서는 자연스러운 조인을 사용하는 것이 해고의 사유입니다.

8
@JonofAllTrades 정확히 무엇 NATURAL JOIN을 파멸시킬 것인지 , 예상치 못한 이유, 그리고 어떤 세상에 있는지 더 자세히 설명 할 수 있습니까 ?
Bryson

35
이것은 user166390의 답변에서 다소 해결되었습니다. 당신은 자연 사이에 결합이 말 CustomersEmployees에 합류 EmployeeID. Employees또한 ManagerID필드가 있습니다. 모든것이 괜찮아. 그런 다음 언젠가 누군가가 테이블에 ManagerID필드를 추가 Customers합니다. 당신의 조인은 깨지지 않을 것입니다 (자비가 될 것입니다). 대신 이제는 두 번째 필드를 포함하고 잘못 작동 합니다. 따라서 겉보기에 무해한 변화는 먼 관련이있는 것을 깨뜨릴 수 있습니다. 아주 나쁜. 자연스러운 조인의 유일한 단점은 약간의 타이핑을 절약하는 것이며 단점은 상당합니다.

2
@Jonathan, 귀하의 답변과 관련하여 SELECT * FROM TableA INNER JOIN TableB USING (Column1)4 열 을 제공 한다고 명시했습니다 . 때문에 정확하지 SELECT * FROM TableA INNER JOIN TableB USING (Column1)SELECT * FROM TableA NATURAL JOIN TableB동일 둘주고 3 열.
Pacerier

81
  • 내부 조인 테이블에 일치하는 행은 첫 번째 테이블에서 행에 필요한 하나를 리턴하는 조인
  • 외부 조인 테이블에 일치하는 행이고 가입은 하나 하지 반환되는 첫 번째 테이블에서 다른 행에 필요한
  • 자연 조인은가 (당신도 할 수 있습니다 조인 natural left또는 natural right)로 조인 조건을 가정하는 경우 두 테이블 경기에서 같은 이름의 열

자연 조인은 다음과 같이 전염병과 같은 자연 조인을 사용하지 않습니다.

  • 표준 SQL이 아님 [SQL 92] 따라서 이식성이 없으며 특히 읽을 수 없으며 (대부분의 SQL 코더가 읽을 수 없음) 다양한 도구 / 라이브러리에서 지원되지 않을 수 있음
  • 유익하지 않은; 스키마를 참조하지 않고 조인되는 열을 알 수 없습니다
  • 조인 조건은 스키마 변경에 눈에 띄게 취약합니다. 여러 자연 조인 열이 있고 해당 열 중 하나가 테이블에서 제거되면 쿼리는 계속 실행되지만 올바르게 작동하지 않을 수 있으며 이러한 동작 변경은 자동으로 수행됩니다.
  • 노력할 가치가 거의 없다. 약 10 초만 입력하면됩니다.

2
외부에 대한 왼쪽 / 오른쪽을 언급해야한다고 생각합니다. 그러나 그렇지 않으면 훌륭하고 간결합니다. SQL 레코드 다이어그램의 예만 빠져 있습니다.

2
자연 왼쪽과 자연 오른쪽도 존재합니다. 그러나 여전히 피하십시오.
MatBailie 2012 년

1
@Bohemian, "전염병처럼 피하십시오"와 관련하여 자연스럽게 조인 할 수있는 실제 사용 사례가 있습니다. mariadb.com/kb/en/sql-99/natural-join "... 캐주얼 한"책 NATURAL JOIN Checkouts"은 데이터베이스 명명 규칙이 공식적이고 시행 될 때만 가능합니다 ...."
Pacerier

2
@ sqlvovel 귀하의 의견에 많은 잘못이 있습니다. 특히 잘못되었습니다. 조인 열 "선택 목록에 지정" 할 수 없습니다 . 자연 조인의 정의는 * 모든 이름이 같은 열 * 에서 조인하는 것입니다. MySQL 문서에서 : 두 테이블의 NATURAL [LEFT] JOIN은 두 테이블에 존재하는 모든 열의 이름을 지정하는 USING 절이있는 INNER JOIN 또는 LEFT JOIN과 의미 적으로 동일하게 정의됩니다. . 그리고 또 다른 것-실제로 id는 쓸모가 없습니다. 일반적인 외래 키 이름은 tablename_id입니다. 자연스러운 조인은 나쁜 아이디어입니다.
보헤미안

2
내 쿼리에 이중 반환 열이 없습니다. NJ 의미의 장점 중 하나는 중복 된 열이 반환되지 않는다는 것입니다. 이전 쿼리는 "a"라는 열이 t2에 추가되면 실패 할 것이기 때문에 내 쿼리보다 "안전하지 않습니다". NJ에 대한 편견은 표준 SQL이 올바르게 지원되는 제품에서 시도하지 않았다는 사실에 근거한 것 같습니다. 여기서 질문은 MySQL이 아니라 SQL에 관한 것입니다. 귀하는 여전히 표준이 아닌 것에 대한 답변을 수정하지 않았습니다.
nvogel

27

자연스러운 조인은 조인이 단순하고 동일한 이름의 필드와 일치한다고 가정하여 입력을 피하는 바로 가기입니다.

SELECT
  *
FROM
  table1
NATURAL JOIN
  table2
    -- implicitly uses `room_number` to join

와 같다...

SELECT
  *
FROM
  table1
INNER JOIN
  table2
    ON table1.room_number = table2.room_number

그러나 바로 가기 형식으로 할 수없는 것은보다 복잡한 조인입니다.

SELECT
  *
FROM
  table1
INNER JOIN
  table2
    ON (table1.room_number = table2.room_number)
    OR (table1.room_number IS NULL AND table2.room_number IS NULL)

2
@JonathanLeffler-MySQL에서는 확실합니다.
MatBailie 2012 년

3
좋아-흥미 롭다. 나는 SQL 표준이 이것을 허용하지 않는 것 때문에 물었습니다 (그러나 확장은 항상 가능합니다).
Jonathan Leffler

이 비표준 구문을 허용하는 DBMS : NATURAL JOIN ... USING ()? 표준 중 하나입니다 a NATURAL JOIN b또는a JOIN b USING (c)
ypercubeᵀᴹ

1
"입력을 피하는 바로 가기"는 잘못된 표현입니다. 가장 중요한 특징은 열이 중복되지 않는다는 것입니다.
19

... 예를 들어, 자연 조인을 사용하는 쿼리 결과에는라는 열이 하나만 room_number있고 내부 조인에는라는 두 개의 열이 있습니다 room_number.
19

13

SQL은 여러 가지 방법으로 관계형 모델에 충실하지 않습니다. 중복 이름, '익명'(명명되지 않은) 열, 중복 행, 널 등의 열이있을 수 있으므로 SQL 쿼리의 결과는 관계가 아닙니다. SQL은 열 순서 등에 의존하기 때문에 테이블을 관계로 취급하지 않습니다.

NATURAL JOINSQL 의 기본 개념 은 관계형 모델에보다 충실 할 수 있도록하는 것입니다. NATURAL JOIN두 테이블 의 결과는 이름별로 중복 제거 된 열을 가지므로 익명 열은 없습니다. 이와 유사하게, UNION CORRESPONDING그리고 EXCEPT CORRESPONDING기존의 열 순서에 주소 SQL의 의존도에 제공되는 UNION구문.

그러나 모든 프로그래밍 기술과 마찬가지로 훈련이 유용해야합니다. NATURAL JOIN동일한 이름을 가진 열에 조인이 내포되어 있기 때문에 성공하기위한 일관된 이름의 열이 필요 합니다 (SQL에서 열 이름을 바꾸는 구문은 장황하지만 기본 테이블에서 열의 이름을 지정할 때 징계를 장려하는 것은 부끄러운 일입니다. VIEWs :)

는 SQL을 참고하는 것은 NATURAL JOIN입니다 동등 조인 ** 그러나이 유용성에 더 바 없다. NATURAL JOINSQL에서 지원되는 유일한 조인 유형 인 경우 에도 여전히 관계식으로 완료 될 것 입니다.

실제로 어떤 것이 저작 과 투사 ( )를 NATURAL JOIN사용하여 쓰여질 수 있다는 것은 사실이지만, 어떤 것은 상품 ( )과 제한 ( )을 사용하여 쓰여질 수도 있습니다 . 또한 공통 열 이름이없는 테이블 간은와 동일한 결과를 제공합니다 . 따라서 관계형 결과에만 관심이 있다면 (그리고 왜 그렇지 않습니까?!) 필요한 유일한 조인 유형입니다. 물론, 그것은 사실입니다 언어 디자인 관점 shorthands에서 같은 과INNER JOINSELECTINNER JOINCROSS JOINWHERENATURAL JOINCROSS JOINNATURAL JOININNER JOINCROSS JOIN 그 가치 거의 모든 SQL 쿼리를 구문 적으로는 다르지만 의미 적으로 동등한 10 가지 방식으로 작성할 수 있으며 SQL 최적화 프로그램을 매우 어렵게 만드는 방법도 고려하십시오. 개발합니다.

여기에 (사용하여 몇 가지 예를 들어 쿼리있는 일반적인 부품 공급 업체 데이터베이스 의미 동일)

SELECT *
  FROM S NATURAL JOIN SP;

-- Must disambiguate and 'project away' duplicate SNO attribute
SELECT S.SNO, SNAME, STATUS, CITY, PNO, QTY
  FROM S INNER JOIN SP 
          USING (SNO);                        

-- Alternative projection
SELECT S.*, PNO, QTY
  FROM S INNER JOIN SP 
          ON S.SNO = SP.SNO;

-- Same columns, different order == equivalent?!
SELECT SP.*, S.SNAME, S.STATUS, S.CITY
  FROM S INNER JOIN SP 
      ON S.SNO = SP.SNO;

-- 'Old school'
SELECT S.*, PNO, QTY
  FROM S, SP 
 WHERE S.SNO = SP.SNO;

** 관계형 자연 결합은 동일하지 않으며 하나의 투영입니다. – 필립스


관계형 자연 결합은 동일하지 않으며 하나의 투영입니다. SQL 자연 조인은 SQL equijoin입니다 (중복 가능). 사용하는 내부 조인 측면에서 정의됩니다.
philipxy 2018

@ philipxy : 고마워, 나는 수정했다. 오해와 오해에 대해이 글 또는 내 답변 중 하나를 자유롭게 수정하십시오. 나는 아직도 당신에게서 배우고 있습니다 :)
언젠가

9

NATURAL가입이 단지 짧은 구문은 특정 INNER 또는 "동등 조인"- -와, 구문이 풀어지면 모두 동일한 관계 대수 동작을 나타내는 가입. OUTER( LEFT/ RIGHT) 또는 CROSS조인 의 경우와 같이 조인의 "다른 종류"가 아닙니다 .

Wikipedia 의 equi-join 섹션을 참조하십시오 .

자연스러운 조인은 동등 조인의 추가 전문화를 제공합니다. 결합 술어 는 결합 된 테이블에서 동일한 컬럼 이름을 갖는 두 테이블의 모든 컬럼을 비교하여 내재적으로 발생합니다 . 결과 결합 된 테이블에는 동일한 이름을 가진 각 열 쌍에 대해 하나의 열만 포함됩니다.

대부분의 전문가들은 자연 관절이 위험하므로 사용을 강력히 권장하지 않는다는 데 동의 합니다. 다른 열과 같은 새 열을 실수로 추가하면 위험이 발생합니다 ...

즉, 모두 NATURAL로 기록 될 수 있습니다 조인 INNER조인 (그러나 그 반대는 사실이 아니다). 그렇게하려면, 술어를 명시 적으로 작성하십시오 ( 예 : USING또는) ON, Jonathan Leffler가 지적한대로 원하는 결과 세트 열을 선택하여 원하는 경우 "중복"을 피하십시오.

행복한 코딩.


합니다 ( NATURAL키워드에도 적용될 수 LEFTRIGHT합류하고 마찬가지이다. A는 NATURAL LEFT/RIGHTA의 짧은 구문 조인 특정는 LEFT/RIGHT 가입).


2
"NATURAL 조인은 [snipped]"equi-join "의 짧은 구문입니다. 일단 구문이 랩핑 해제되면 둘 다 동일한 관계형 대수를 나타냅니다."-맞습니다 : 관계형 대수학에 해당하지만 답은 무너집니다. 그 후 예를 들어 "대부분의 전문가들은 자연 관절이 위험하고 따라서 사용을 강력히 거부한다는 데 동의합니다"라고 관계형 대수학 전문가들은 말합니다.
onedaywhen

2

자연 조인 : 두 테이블에있는 모든 열의 조합 또는 결합 결과입니다. 두 번째 테이블과 관련하여 첫 번째 테이블의 모든 행을 반환합니다.

내부 조인 :이 조인은 열 이름이 두 테이블에서 일치하지 않는 한 작동합니다.


3
귀하의 답변이 충분히 명확하지 않다고 생각하고 수정하기 위해 큰 재 작성이 필요합니다.
1

0

자연 조인은 모든 공통 열을 기준으로 2 개의 테이블이 조인되는 곳입니다.

공통 열 : 두 테이블에서 동일한 이름을 가진 열 + 두 테이블에서 호환되는 데이터 유형이 있습니다. = 연산자 만 사용할 수 있습니다

내부 조인은 ON 절에 언급 된 공통 열을 기준으로 2 개의 테이블이 조인되는 곳입니다.

공통 열 : 두 테이블 모두에서 호환 가능한 데이터 유형이 있지만 동일한 이름을 가질 필요는없는 열입니다. 당신은 같은 단지 어떤을 비교 한 연산자를 사용할 수 =, <=, >=, <, >,<>


-2

차이점은 natuarl 조인 공통 열 win에서 단일 시간으로 표시되는 inner (equi / default) 조인 및 자연 조인 int이지만 공통 열은 double 시간으로 표시됩니다.


-2

내부 조인과 자연 조인은 거의 동일하지만 약간의 차이가 있습니다. 차이점은 자연 조인의 경우 조건을 지정할 필요가 없지만 내부 조인 조건은 필수입니다. inner join에 조건을 지정하면 결과 테이블은 직교 곱과 같습니다.


조인 조건을 지정할 필요가없는 이유는 무엇입니까? 어떤 상황에서 내부 조인에 조건을 지정하면 데카르트 제품과 같은 결과가 발생합니까?
19

외부와 내부 조인을 "거의 동일하게"부르는 것은 약간의 과소 평가입니다.
TMOTTM

-3
mysql> SELECT  * FROM tb1 ;
+----+------+
| id | num  |
+----+------+
|  6 |   60 |
|  7 |   70 |
|  8 |   80 |
|  1 |    1 |
|  2 |    2 |
|  3 |    3 |
+----+------+
6 rows in set (0.00 sec)

mysql> SELECT  * FROM tb2 ;
+----+------+
| id | num  |
+----+------+
|  4 |   40 |
|  5 |   50 |
|  9 |   90 |
|  1 |    1 |
|  2 |    2 |
|  3 |    3 |
+----+------+
6 rows in set (0.00 sec)

내부 가입 :

mysql> SELECT  * FROM tb1 JOIN tb2 ; 
+----+------+----+------+
| id | num  | id | num  |
+----+------+----+------+
|  6 |   60 |  4 |   40 |
|  7 |   70 |  4 |   40 |
|  8 |   80 |  4 |   40 |
|  1 |    1 |  4 |   40 |
|  2 |    2 |  4 |   40 |
|  3 |    3 |  4 |   40 |
|  6 |   60 |  5 |   50 |
|  7 |   70 |  5 |   50 |
|  8 |   80 |  5 |   50 |
.......more......
return 36 rows in set (0.01 sec) 
AND NATURAL JOIN :

    mysql> SELECT  * FROM tb1 NATURAL JOIN tb2 ;
    +----+------+
    | id | num  |
    +----+------+
    |  1 |    1 |
    |  2 |    2 |
    |  3 |    3 |
    +----+------+
    3 rows in set (0.01 sec)

-4

내부 조인, 열 이름이 동일한 두 테이블을 조인하십시오.

자연 결합, 열 이름과 데이터 유형이 동일한 두 테이블을 결합하십시오.


이것은 완전히 잘못되었습니다. NATURAL JOIN몇 년 전에 여러 사람들이 지적했듯이 A 는 열 이름이 동일한 곳입니다. 데이터 유형이 같을 필요는 없습니다. INNER JOIN필요에 사용되는 필드 이름이 같을 필요는 없습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.