나는 SQL을 처음 사용하고 두 JOIN
유형 의 차이점이 무엇인지 알고 싶 습니까?
SELECT *
FROM user u
INNER JOIN telephone t ON t.user_id = u.id
SELECT *
FROM user u
LEFT OUTER JOIN telephone t ON t.user_id = u.id
언제 하나를 사용해야합니까?
나는 SQL을 처음 사용하고 두 JOIN
유형 의 차이점이 무엇인지 알고 싶 습니까?
SELECT *
FROM user u
INNER JOIN telephone t ON t.user_id = u.id
SELECT *
FROM user u
LEFT OUTER JOIN telephone t ON t.user_id = u.id
언제 하나를 사용해야합니까?
답변:
첫 번째 예에서는 사용자에 대해 하나 이상의 전화 레코드가 존재하는 경우 사용자 및 전화 번호 목록 만 반환합니다.
두 번째 예에서는 모든 사용자 목록과 사용 가능한 경우 모든 전화 레코드를 반환합니다 (사용할 수없는 경우 NULL
전화 값을 얻음 ).
누군가이 질문을 할 때마다 대답이 있습니다 : http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
이해하는데 도움이 되길 바랍니다.
내부 조인 결합 가입 기준에 따라 할 수있다 반환 행. 외부 조인 ... 수익률이 모든 행을
A의 첫 번째 테이블에서 ... 가입 왼쪽
A의 두 번째 테이블에서 ... 바로 가입
... A의 두 테이블에서 전체 가입
어느 쪽을 사용할 것인지 선택하는 것은 필요한 데이터를 결정하는 문제입니다. 예를 들어 전화에서 user_ids가 user의 id와 일치하는 레코드 만 필요한 경우 내부 조인을 사용하십시오. 일치하는 전화 항목이없는 사용자의 행도 포함하려면 왼쪽 조인이 적합합니다.
자세한 내용은 StackOverflow에서이 질문을 참조하십시오 .
아래와 같은 2 개의 테이블이있는 경우 :
Table1 : A1 B1 Table2 : B2 C2
- - - -
1 2 1 1
2 4 2 4
3 5 5 2
Inner Join을 사용하면 다음과 같은 이점이 있습니다.
A1 B1 B2 C2
- - - -
1 2 2 4
3 5 5 2
전체 외부 조인을 사용하면 다음과 같은 이점이 있습니다.
A1 B1 B2 C2
- - - -
1 2 2 4
3 5 5 2
2 4 NULL NULL
NULL NULL 1 1
Left Outer Join을 사용하면 다음과 같은 이점이 있습니다.
A1 B1 B2 C2
- - - -
1 2 2 4
3 5 5 2
2 4 NULL NULL
외부 조인은 결과적으로 널을 생성하도록 명시 적으로 설계되었으므로 일반적으로 피해야합니다. 관계 적으로 말하자면, 일종의 산탄 총 결혼입니다. 문제의 테이블이 일반적인 유니온 요구 사항을 준수하지 않더라도 테이블을 일종의 유니온으로 만듭니다. 실제로 통합을 수행하기 전에 테이블 중 하나 또는 둘 다를 null로 채우면 결국 일반적인 요구 사항을 준수하게됩니다. 그러나이 예제에서와 같이 패딩이 null 대신 적절한 값으로 수행되지 않아야하는 이유는 없습니다.
SELECT SNO , PNO
FROM SP
UNION
SELECT SNO , 'nil' AS PNO
FROM S
WHERE SNO NOT IN ( SELECT SNO FROM SP )
또는 다음과 COALESCE
같이 와 함께 SQL 외부 조인 연산자를 사용하여 동일한 결과를 얻을 수 있습니다 .
SELECT SNO , COALESCE ( PNO , 'nil' ) AS PNO
FROM ( S NATURAL LEFT OUTER JOIN SP ) AS TEMP
CJ Date의 "SQL 및 관계 이론 : 정확한 SQL 코드 작성 방법"에서 외부 조인 (4.6)에 대한 설명
내부 조인은 키가 두 테이블 모두에있는 결과 만 표시되는 조인입니다. 외부 조인은 한 테이블의 모든 키에 대한 결과를 표시합니다 (첫 번째의 왼쪽 조인 및 두 번째의 오른쪽 조인). 예를 들면 다음과 같습니다.
table1에 (1, a), (2, b), (3, c) 기본 키와 데이터 쌍이 있다고 가정합니다.
또한 table2에 (1, fun), (3, can), (4, 일어날 수있는) 기본 키와 데이터 쌍이 있다고 가정 해 봅시다.
따라서 기본 키에서 table1과 table2의 내부 조인은 다음과 같은 결과 삼중 항을 생성합니다 (공통 기본 키, 첫 번째 테이블의 두 번째 항목 두 번째 및 두 번째 테이블의 두 번째 항목 세 번째) : (1, a, fun), ( 3, c, 캔)
기본 키에서 table1과 table2의 왼쪽 외부 조인은 다음과 같은 결과 트리플렛을 생성합니다 (위와 동일한 형식) : (1, a, fun), (2, b, NULL), (3, c, can)
기본 키에서 table1과 table2의 오른쪽 외부 조인은 다음과 같은 결과 삼중 항을 생성합니다 (위와 동일한 형식) : (1, a, fun), (3, c, can), (4, NULL, 발생)
이것이 개념을 잘 설명하기를 바랍니다.
언제 무엇을 사용할 것인지 물었으므로 여기에 쿼리 시나리오가 있습니다. 요구 사항에 따라 사용할 것을 선택하십시오.
데이터:
테이블 사용자에는 10 개의 레코드가 있습니다. 표 Phoneno에는 6 개의 레코드가 있습니다 (1 : 1 관계로 PhoneNo의 항목은 사용자의 한 항목 만 참조하고 PhoneNo의 한 항목 만 사용자의 특정 항목을 참조 할 수 있음).
요구 사항 1 : 모든 사용자에게 전화 번호를 표시하십시오. 전화 번호가없는 사용자는 무시하십시오.
질문:
SELECT u.uid, u.name, p.phonno
FROM user u
INNER JOIN phones p ON p.uid = u.uid
결과 : 전화 번호를 가진 6 명의 사용자를 표시합니다
요구 사항 2 : 모든 사용자에게 전화 번호를 표시하십시오. 사용자에게 전화 디스플레이 'N / A'가없는 경우 (사용할 수 없음)
질문:
SELECT u.uid, u.name, ifnull(p.phonno,'N/A')
FROM user u
LEFT OUTER JOIN phones p ON p.uid = u.uid
결과:
10 개의 레코드를 모두 표시
참고 : ifnull은 null 값을 변환하는 MySql 구문입니다. phonno가 null 일 때이 기능을 사용하여 DB 엔진에 'N / A'를 표시했습니다. 다른 DBMS를 사용하는 경우 적절한 기능을 찾으십시오. SQL Server에서는 CASE
명령문 을 사용해야합니다 .
이게 도움이 되길 바란다.