복붙노트

[SQL] 어떤 장점이있다 : 자연 USING 절 대 가입 대 내부 가입?

SQL

어떤 장점이있다 : 자연 USING 절 대 가입 대 내부 가입?

나는 다음과 같은 두 가지 간단한 테이블을 가지고 상상 :

CREATE TABLE departments(dept INT PRIMARY KEY, name);
CREATE TABLE employees(id PRIMARY KEY, fname, gname,
    dept INT REFERENCES departments(dept));

(물론, 단순화).

나는 다음 문 중 하나를 할 수 :

SELECT * FROM employees e INNER JOIN departments d ON e.dept=d.dept;
SELECT * FROM employees e NATURAL JOIN departments d;
SELECT * FROM employees e JOIN departments d USING(dept);

동작하는 예제는 여기에서 찾을 수 있습니다 : SQL 바이올린 : http://sqlfiddle.com/#!15/864a5/13/10

확실히 같은 행을 - 그들은 모두 같은 결과를 거의 제공합니다.

나는 항상 때문에 유연성, 가독성과 예측의 첫 번째 양식을 선호 - 당신은 명확 무엇에 연결되어 정의합니다.

이제 떨어져 첫 번째 양식이 중복 된 열이 있다는 사실에서, 다른 두 형태의 진정한 장점이있다? 아니면 그들은 단지 문법 설탕인가요?

나는 후자 형태의 단점은 당신이 항상 실용적이지 못하다 기본 및 외래 키 같은, 이름 것으로 예상된다는 것입니다 볼 수 있습니다.

해결법

  1. ==============================

    1.TL; DR 자연은 일반적인 SQL 스타일보다 간단 관계형 프로그램의 특정 스타일에 사용되는 가입하세요. (SQL에 포함되면 있지만 그것은 SQL 쿼리 구문의 나머지를 부담한다.)가 직접 술어 논리의 간단한 사업자 (소프트웨어 공학 포함) 공학 정밀도의 언어, 과학을 사용 1. 때문에 이제 (컴퓨터 과학 포함) 그건 및 수학, 또한 2. 동시에 다른 방법으로는 직접 관계 대수의 간단한 연산자를 사용합니다.

    TL; DR 자연은 일반적인 SQL 스타일보다 간단 관계형 프로그램의 특정 스타일에 사용되는 가입하세요. (SQL에 포함되면 있지만 그것은 SQL 쿼리 구문의 나머지를 부담한다.)가 직접 술어 논리의 간단한 사업자 (소프트웨어 공학 포함) 공학 정밀도의 언어, 과학을 사용 1. 때문에 이제 (컴퓨터 과학 포함) 그건 및 수학, 또한 2. 동시에 다른 방법으로는 직접 관계 대수의 간단한 연산자를 사용합니다.

    자연 가입에 대한 일반적인 불만 공유 열을 명시 적으로하지 않기 때문에, 스키마 변경 후 부적합한 열 페어링이 발생할 수 있다는 것이다. 그리고 그 특정 개발 환경의 경우 일 수 있습니다. 그러나이 경우 특정 열 접합과 자연이 프로젝트가 적절하지 않았다없이 가입하는 요구가 있었다. 그래서 이러한 주장은 자연이 부적절하게 사용되는 가입 있다고 가정합니다. 더욱이 arguers은 요구 사항을 무시하고 있는지조차 인식하지 못합니다. 이러한 불만은 그럴듯한 있습니다. (또한, 사운드 소프트웨어 엔지니어링 설계 원칙은 specificiatons와 인터페이스를 구비하지 이어질).

    같은 캠프의 또 다른 관련 잘못 이해 그럴듯한 불만 "자연도 고려 외래 키 관계를 고려하지 않습니다 가입"는 것이다. 그러나 어떤 때문에 테이블 의미가 아닌 제약이 가입 할 수 있습니다. 제약 조건은 쿼리에 필요하지 않습니다. 제약 조건이 첨가되어있는 경우 쿼리는 올바른 남아있다. 제약 조건은 다음 삭제 경우에 의존하는 쿼리가 잘못되고 변화에 없었을 것에 의존하지 않는 말씨로 변경해야합니다. 이것은 가입 자연과는 아무 상관이 없습니다.

    당신은 효과의 차이를 설명했다 : 각 공통 칼럼의 한 사본이 반환됩니다.

    에서 사람이 읽을 수있는 설명에서 구조의 SQL 쿼리에 엄지 손가락의 규칙이 있나요?

    커드 1970 예 :

    이 답변에서 :

    SQL에 대해 추론하는 반면 그렇지는 ... "자연"하지 :

    SQL의 SELECT 문이 대수적 1로 암시 적으로 TC에 (아마도 암시)의 상관 관계 이름 T와 테이블의 각 열 C를 RENAMEing 생각 될 수있다, 그 다음 2 CROSS은 당 제한 4. 다음 INNER ON 당 제한 다음, 3. 가입 WHERE 다음 5. SELECT 당 암시 한 후, 7 TS를 삭제 대수 사업자는 또한 자신의 조건과 같은 논리 연산자와 테이블 이름으로 간주 할 수있는 T.-RENAMEings 사이 TS 나머지 드롭 RENAMEing SELECT 당 다음 6 RENAMEing을 투사 : T는 가입 ... 직원 T.EMPLOYEE이 이름 T.NAME을 가지고 ... 그리고 .... 그러나 개념적으로 SELECT 문 안쪽에 이중 RENAME 유도 CROSS 외부 테이블 동안 열 이름에 대한 T.Cs을 가진 테이블을 조인 대 열 이름에 대한 고사가있다.

    다른 방법으로는 SQL SELECT 문을 참조 TC를 사용하여, 다음 2 정량화 T의 값을 참조 상관 관계 이름 T 및 기본 이름 또는 하위 쿼리의 E 당 전체 문 주위에 FORSOME T IN E 도입 1로 논리적으로 생각 될 수는 C 부분 등 FROM 다음 4. FORSOMEs의 범위를 이탈 한 후 4. SELECT 절 당 결과 행 열 명명 당 T.Cs에서 다음 3 건물 결과 행. 다시 대수 연산자는 논리 연산자와 자신의 조건과 같은 테이블 이름으로 생각되고있다. 다시하지만, 이것은 개념적으로 상관 관계 이름이오고가는 T.C의 내부가 선택하지만 C의 외부 있습니다.

    이 두 SQL의 해석이 갑자기 근처 단지 상호 교환, 등, 가입 또는 AND 사용하는 등 간단 등입니다. (당신은 간단 동의 할 필요는 없지만, 거기에 자연이 가입하고 UNION이 / 해당 EXCEPT 이유의 인식입니다.) (사용 목적의 컨텍스트 외부에서이 스타일을 비판 인수 그럴듯한 있습니다.)

    자연에 한 발 중간 고아의 일종 캠프와 CROSS 한 조인 사용 가입하세요. 중복 열 이름이 없기 때문에 그것은 이전의 실제 역할이 없습니다. 후자가 더 많거나 적은 단지 조건을 가입하고 절을 SELECT 축약이다.

    PK와 (기본 키), FKS (외래 키) 및 다른 제약 질의 필요하지 않습니다. (열을 아는 것은 다른 사람의 함수 스칼라 서브 쿼리 할 수 ​​있습니다,하지만 당신은없이 구 항상 수 있습니다.) 또한 두 테이블이 의미있게 결합 할 수 있습니다. 당신이 두 개의 열이 필요하면 자연과 같은 이름은 SELECT AS를 통해 이름을 변경 합류한다.

  2. ==============================

    2.타자는 기본적으로 가입 내부 수행 가입하세요. 그래서:

    타자는 기본적으로 가입 내부 수행 가입하세요. 그래서:

    SELECT * FROM employees e INNER JOIN departments d USING(dept);
    

    동등

    SELECT * FROM employees e JOIN departments d USING(dept);
    

    당신은 결과에 하나의 부서 열이있을 것이다.

    같은 방법으로

    SELECT * FROM employees e INNER JOIN departments d ON e.dept=d.dept;
    

    동등

    SELECT * FROM employees e JOIN departments d ON e.dept=d.dept;
    

    하지만 당신은 결과에 중복 부서 열이있을 것이다.

    INNER은 쿼리가 다른이에 포함 된 유형 (왼쪽 또는 오른쪽 또는 ..)에 가입해야 특히, 읽기 쉽게 가입.

    자연은 가입 둘 다 테이블 경기에서 같은 이름의 열을 가정합니다. 당신이 자연을 할 수 있도록 조인 열이 "부서"라는 당신의 조인 열이 "부서"라는 직원 테이블과 부서 테이블에 예를 들어 경우 가입

  3. ==============================

    3.자연의 가장 큰 장점은 단지 SQL '중복 열을'생성하지 않는 조인 조인.

    자연의 가장 큰 장점은 단지 SQL '중복 열을'생성하지 않는 조인 조인.

    모든 자연 이외의 SQL 언어에서 제거 된 JOIN 종류에 가입하는 경우, 그것은 여전히 ​​관계형으로 완성 될 것입니다. 자연은있는 단지를 입력 가입이 필요 가입.

    그러나 자연은 SQL92 때까지 SQL에 도입되지 않은 JOIN. SQL의 초기에, 언어 디자이너가 선택한 다른 유형에 가입하고 결과적으로 '중복 된 열'을 다루는 방법을 찾아야했다.

    의 결과를 고려

    employees e CROSS JOIN departments d
    

    각 테이블은 열 이름 DEPT 즉 '중복 열'때문에 부서라는 두 개의 열을 포함한다.

    '중복 열'문제에 대한 솔루션을 선택 범위의 변수, 상기 예에서 E 및 D였다. 범위 변수가 아니라 테이블보다 행을 나타 내기 때문에 [대부분의 SQL 민속) cnfusing되는 '테이블 별칭'을 부른다. 이 상황에서 무엇을 '상관 관계'수단을 분명하지 않다 불구하고 SQL 표준 호출을 '상관 관계 이름'. 크리스 날짜 및 LINQ는 그 변수를 다양하고 그래서 할 전화!] 유형을 '유산'조인 사용 범위 변수를 생략하면, 범위 변수 이름은 아마도합니다 ( '테이블 aiias'착오의 루트 사용되는 테이블의 이름과 동일 ?).

    영업의 예를 사용 :

    SELECT * FROM employees e INNER JOIN departments d ON e.dept=d.dept;
    

    투사는 SELECT *이 '중복 열을'이 (가) 포함됩니다. 열 및 결과에 자신의 순서가 SQL 표준 주소로 시도하지 않는 것들 중 하나의 이름; 표준화를 시도하는 이미 너무 많은 분기 구현이 있었다. SQL에서 서버 나 중복 된 이름 [한숨]을 얻는다.

    아마 이러한 이유 때문에 대부분의 SQL의 사람들이 말하는, 일반적인 접근 방식은 모든 열 및 '멀리 프로젝트의 모든 중복을 지정하는 것 등 "SELECT *를 사용하지 마십시오." [I는 SELECT ALL하지만 생각 <열 세트> 기능은 좋은 것입니다하지만 난 SQL 민속 하루 이겼다 생각합니다.]

    자연이 조인을 사용하면 따라서 변수가 필요하지 않은 범위, 거기에는 '중복 된 열은'멀리 프로젝트 '에없는 어떠한 조건을 가입 할 수 있습니다. 따라서 영업 이익의 예는 다음과 같이 다시 작성해야합니다 :

    SELECT * FROM employees NATURAL JOIN departments;
    

    이 사람이 독점적으로 사용하는 경우 자연이 가입하고 다른 모든 피하고이 유형은 다음 변수는 더 이상 필요 다양하지 가입 사실이지만, SQL 때로는 여전히 필요합니다. , philipxy의 시나리오 @ 사용 "당신이 두 개의 열이 필요하면하면 SELECT AS를 통해 이름을 변경 JOIN 자연과 같은 이름을 가질 수 있습니다"- 당신의 SQL 구현이 공통 테이블 표현식이 부족하고 SQL은을 필요로 다음 파생 테이블의 이름 변경을하도록 강요하는 경우 파생 테이블은 다시 참조하지 않습니다에도 불구하고 다양한 변수를 할당 할!

    하자가 영업 이익의 예에서 각 테이블은 자연에 대한 '거리 프로젝트'하나 개의 요구는 목적으로 가입 무의미한 GUID 열을 가지고 말 :

    SELECT *
      FROM ( SELECT dep, name, FROM employees ) e 
           NATURAL JOIN ( SELECT dept, fname, gname departments ) d;
    

    이 경우, 범위 변수 전자 않고와 SQL이 유효하지 않을 거라고 (당신은 구문 분석 오류를 얻을 것). 는 SQL 구현은 범위 변수 (그리고 한 경우에도 내부적으로 자리를 생성 할 수 있습니다!)하지만, SQL 언어 때문에 어떤 기능이 어느 제거하거나 사용되지 않으며 SQL의 '호환성의 족쇄'그들을 필요로 필요하지 않습니다.

  4. ==============================

    4.Oracle 문서에서 :

    Oracle 문서에서 :

    TableA JOIN tableB USING(column)
    

    당신이 언급 한 바와 같이, 단순히 문법 설탕입니다

    TableA JOIN tableB ON tableA.column = tableB.column
    
  5. ==============================

    5.NATURAL는 넓게 (즉하지 SQL 서버)에서 지원하지도 USING 가입하지되는 JOIN

    NATURAL는 넓게 (즉하지 SQL 서버)에서 지원하지도 USING 가입하지되는 JOIN

    가입 나쁜 생각되는 자연에 대한 많은 논쟁이있다. 개인적으로 나는 명시 적으로 초대 조인 재해 가지 이름을 지정하지 생각합니다.

    자연은 완전히 다른 무언가를 갑자기 가입 할 때 '자연 조인'에 맞게 일어나는 것을 실현하지 않고 테이블에 열을 추가하는 경우 예를 들어, 예기치 않은 코드 오류가있을 수 있습니다. 당신은 아무것도 손상되지 열을 추가 생각할 것입니다하지만 심하게 서면 의견을 깰 수 및 자연 조인.

    당신이 시스템을 구축 할 때 당신의 크리프에 대한 위험의 이러한 종류를 허용해서는 안됩니다. 그것은 모든 컬럼에 테이블 별칭없이 여러 테이블에서 뷰를 생성하고 열 목록없이 삽입을 사용하는 것과 동일합니다.

    당신은 지금 SQL을 학습하는 경우 그 이유를 들어, 다음을 사용하는 습관 나가.

  6. from https://stackoverflow.com/questions/35032696/inner-join-vs-natural-join-vs-using-clause-are-there-any-advantages by cc-by-sa and MIT license