자연 조인과 내부 조인의 차이점은 무엇입니까?
자연 조인과 내부 조인의 차이점은 무엇입니까?
답변:
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제목으로. )
NATURAL JOIN을 파멸시킬 것인지 , 예상치 못한 이유, 그리고 어떤 세상에 있는지 더 자세히 설명 할 수 있습니까 ?
Customers과 Employees에 합류 EmployeeID. Employees또한 ManagerID필드가 있습니다. 모든것이 괜찮아. 그런 다음 언젠가 누군가가 테이블에 ManagerID필드를 추가 Customers합니다. 당신의 조인은 깨지지 않을 것입니다 (자비가 될 것입니다). 대신 이제는 두 번째 필드를 포함하고 잘못 작동 합니다. 따라서 겉보기에 무해한 변화는 먼 관련이있는 것을 깨뜨릴 수 있습니다. 아주 나쁜. 자연스러운 조인의 유일한 단점은 약간의 타이핑을 절약하는 것이며 단점은 상당합니다.
SELECT * FROM TableA INNER JOIN TableB USING (Column1)4 열 을 제공 한다고 명시했습니다 . 때문에 정확하지 SELECT * FROM TableA INNER JOIN TableB USING (Column1)와 SELECT * FROM TableA NATURAL JOIN TableB동일 둘주고 3 열.
natural left또는 natural right)로 조인 조건을 가정하는 경우 두 테이블 경기에서 같은 이름의 열자연 조인은 다음과 같이 전염병과 같은 자연 조인을 사용하지 않습니다.
NATURAL JOIN Checkouts"은 데이터베이스 명명 규칙이 공식적이고 시행 될 때만 가능합니다 ...."
id는 쓸모가 없습니다. 일반적인 외래 키 이름은 tablename_id입니다. 자연스러운 조인은 나쁜 아이디어입니다.
자연스러운 조인은 조인이 단순하고 동일한 이름의 필드와 일치한다고 가정하여 입력을 피하는 바로 가기입니다.
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)
NATURAL JOIN ... USING ()? 표준 중 하나입니다 a NATURAL JOIN b또는a JOIN b USING (c)
room_number있고 내부 조인에는라는 두 개의 열이 있습니다 room_number.
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;
** 관계형 자연 결합은 동일하지 않으며 하나의 투영입니다. – 필립스
NATURAL가입이 단지 짧은 구문은 특정 INNER 또는 "동등 조인"- -와, 구문이 풀어지면 모두 동일한 관계 대수 동작을 나타내는 가입. OUTER( LEFT/ RIGHT) 또는 CROSS조인 의 경우와 같이 조인의 "다른 종류"가 아닙니다 .
Wikipedia 의 equi-join 섹션을 참조하십시오 .
자연스러운 조인은 동등 조인의 추가 전문화를 제공합니다. 결합 술어 는 결합 된 테이블에서 동일한 컬럼 이름을 갖는 두 테이블의 모든 컬럼을 비교하여 내재적으로 발생합니다 . 결과 결합 된 테이블에는 동일한 이름을 가진 각 열 쌍에 대해 하나의 열만 포함됩니다.
대부분의 전문가들은 자연 관절이 위험하므로 사용을 강력히 권장하지 않는다는 데 동의 합니다. 다른 열과 같은 새 열을 실수로 추가하면 위험이 발생합니다 ...
즉, 모두 NATURAL로 기록 될 수 있습니다 조인 INNER조인 (그러나 그 반대는 사실이 아니다). 그렇게하려면, 술어를 명시 적으로 작성하십시오 ( 예 : USING또는) ON, Jonathan Leffler가 지적한대로 원하는 결과 세트 열을 선택하여 원하는 경우 "중복"을 피하십시오.
행복한 코딩.
합니다 ( NATURAL키워드에도 적용될 수 LEFT와 RIGHT합류하고 마찬가지이다. A는 NATURAL LEFT/RIGHTA의 짧은 구문 조인 특정는 LEFT/RIGHT 가입).
자연 조인은 모든 공통 열을 기준으로 2 개의 테이블이 조인되는 곳입니다.
공통 열 : 두 테이블에서 동일한 이름을 가진 열 + 두 테이블에서 호환되는 데이터 유형이 있습니다. = 연산자 만 사용할 수 있습니다
내부 조인은 ON 절에 언급 된 공통 열을 기준으로 2 개의 테이블이 조인되는 곳입니다.
공통 열 : 두 테이블 모두에서 호환 가능한 데이터 유형이 있지만 동일한 이름을 가질 필요는없는 열입니다. 당신은 같은 단지 어떤을 비교 한 연산자를 사용할 수 =, <=, >=, <, >,<>
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)