복붙노트

[SQL] 때 왼쪽 외부 조인을 사용 하는가?

SQL

때 왼쪽 외부 조인을 사용 하는가?

나는 왼쪽 외부 조인의 개념을 이해하지 못하고, 오른쪽 외부 조인, 또는 참으로 왜 우리는 전혀 조인을 사용합니다! 내가에서 일하고 테이블과 함께 고민하고 문제는 여기에 있습니다 : 링크

질문 3 (b)

그것은을 채택했다 이유를 설명, 다음 쿼리를 해결하기 위해 SQL에서 명령을 구축 (외)에 가입 방법. [5 마크] "어떤 경우 각 직원의 이름과 그 / 그녀의 의존 배우자 찾기"

질문 3 (C) -

가입 방법, 및 (I)을 이용하여, 다음의 질의를 해결하기 위해 SQL에서 명령을 구성하는 (ⅱ) 하위 쿼리 방법. [10 마크] "는에 20 시간 이상을 근무하고 각 직원의 ID 이름 찾기 전산화 프로젝트 "

사람이 단순히 나에게 이것을 설명시겠습니까?

해결법

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

    1.조인 두 개의 관련 테이블을 결합하는 데 사용됩니다.

    조인 두 개의 관련 테이블을 결합하는 데 사용됩니다.

    당신의 예에서, 당신은과 같이 Employee 테이블과 부서 테이블을 결합 할 수 있습니다 :

    SELECT FNAME, LNAME, DNAME
    FROM
    EMPLOYEE INNER JOIN DEPARTMENT ON EMPLOYEE.DNO=DEPARTMENT.DNUMBER
    

    이 같은 레코드 될 것입니다 :

    FNAME   LNAME   DNAME
    -----   -----   -----
    John    Smith   Research
    John    Doe     Administration
    

    나는 INNER 위의 가입 사용. INNER 두 테이블에서 일치와 레코드 만 표시하고, 그들이 (부서 테이블에 DNUMBER, 직원의 필드 DNO) 부서 번호,이 경우 결합되도록 두 개의 테이블을 결합하여 결합합니다.

    LEFT는 당신이 첫 번째 테이블의 레코드가 있지만 두 번째 테이블의 레코드가 없을 수 있습니다 때 두 테이블을 결합 할 수 있도록 합류했다. 예를 들어, 당신은 모든 직원, 플러스 부양의 목록을 원하는 가정 해 봅시다 :

    SELECT EMPLOYEE.FNAME as employee_first, EMPLOYEE.LNAME as employee_last, DEPENDENT.FNAME as dependent_last, DEPENDENT.LNAME as dependent_last
    FROM
    EMPLOYEE INNER JOIN DEPENDENT ON EMPLOYEE.SSN=DEPENDENT.ESSN
    

    문제는 여기에 직원이 종속이없는 경우, 그들의 기록이 전혀 나타나지 않을 것입니다 - 종속 테이블에 일치하는 레코드가 없기 때문에.

    그래서, 당신은 왼쪽이 "오른쪽"(두 번째 테이블)에 일치하는 데이터의 "왼쪽"(즉, 첫 번째 테이블)에 모든 데이터를 유지하고 당기는 조인을 사용 :

    SELECT EMPLOYEE.FNAME as employee_first, EMPLOYEE.LNAME as employee_last, DEPENDENT.FNAME as dependent_first, DEPENDENT.LNAME as dependent_last
    FROM
    EMPLOYEE LEFT JOIN DEPENDENT ON EMPLOYEE.SSN=DEPENDENT.ESSN
    

    이제 우리는 직원의 모든 레코드를 얻을. 해당 직원에 대한 일치 의존 (들)가없는 경우, dependent_first 및 dependent_last 필드는 null가됩니다.

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

    2.예를 들어 (귀하의 예제 테이블을 사용하지 :-)

    예를 들어 (귀하의 예제 테이블을 사용하지 :-)

    나는 렌터카 회사가 있습니다.

    Table car
    id: integer primary key autoincrement
    licence_plate: varchar
    purchase_date: date
    
    Table customer
    id: integer primary key autoincrement
    name: varchar
    
    Table rental
    id: integer primary key autoincrement
    car_id: integer
    bike_id: integer
    customer_id: integer
    rental_date: date
    

    간단한 권리? 내가 10 차를 가지고 있기 때문에 나는 자동차에 대한 10 개 개의 레코드가 있습니다. I 1000 개 고객을 가지고, 그래서 나는 10 년 동안이 사업을 실행했습니다. 그리고 나는 = 10 년 10 차 × 20 = 2000 임대료를 X 차 당 연간 20 배에 대해 차를 임대.

    나는 하나 개의 큰 테이블에 모든 것을 저장하는 경우 나는 10x1000x2000 = 2000 만 기록을 가지고있다. 내가 3 개 테이블에 저장하면 나는 10 + 1000 + 2000 = 3010 개 기록을 가지고있다. 즉, 크기 3 개 주문의 내가 3 개 테이블을 사용하는 이유의 그렇게.

    내가 3 개 테이블을 사용하기 때문에 사용이 데이터를 다시 얻기 위해 조인에하지만 내가 가진 (공간과 시간을 절약하기 위해) (적어도 나는 숫자 대신 이름과 번호판을 원하는 경우).

    내부 조인 사용

    고객 (345)에 대한 모든 대여?

    SELECT * FROM customer
    INNER JOIN rental on (rental.customer_id = customer.id)
    INNER JOIN car on (car.id = rental.car_id)
    WHERE customer.id = 345.
    

    우리가 실제로 무슨 일이 있었 고객에 연결 대여에 링크 된 자동차에 대해 알고 싶어하기 때문에 즉, 내부 조인입니다.

    공지 사항 우리는 또한 차 테이블하지만 서로 다른 꽤 유사하다 자전거 테이블에 연결하는 bike_id이 있는지 확인하십시오. 우리는 어떻게 고객 (345)에 대한 모든 자전거 + 렌터카를 얻을 것입니다. 우리는 시도하고이 작업을 수행 할 수 있습니다

    SELECT * FROM customer
    INNER JOIN rental on (rental.customer_id = customer.id)
    INNER JOIN car on (car.id = rental.car_id)
    INNER JOIN bike on (bike.id = rental.bike_id)
    WHERE customer.id = 345.
    

    하지만 그 빈 세트를 줄 것이다! 임대 중 하나를 동시에 bike_rental 또는 car_rental 있지만 모두가 될 수 있기 때문이다. 그리고는 작동하지 않는 내부 쿼리는 우리가 자전거와 같은 트랜잭션에서 차량을 모두 임대 모든 대여에 대한 결과를 줄 것이다 가입 할 수 있습니다. 우리가 얻으려고 노력하고 부울 OR 관계는 부울 AND 조인을 사용.

    외부 조인 사용

    이 문제를 해결하기 위해 우리는 외부 조인이 필요합니다.

    의 왼쪽 참여로 해결하자

    SELECT * FROM customer
    INNER JOIN rental on (rental.customer_id = customer.id) <<-- link always
    LEFT JOIN car on (car.id = rental.car_id) <<-- link half of the time
    LEFT JOIN bike on (bike.id = rental.bike_id) <<-- link (other) 0.5 of the time.
    WHERE customer.id = 345.
    

    그것을 이런 식으로 봐. 조인 내부는 AND이며, 좌측은은 또는 다음의 의사 코드로 조인

    if a=1 AND a=2 then {this is always false, no result}
    if a=1 OR a=2 then  {this might be true or not}
    

    당신은 테이블을 생성하고 쿼리를 실행하면 결과를 볼 수 있습니다.

    용어에

    A는 왼쪽 왼쪽 외부 조인 같은 조인. A는 여분의 접두사는 내부 조인입니다 함께 가입 또한 전체 외부 조인이있다. 프로그래밍 25 년 동안 나는 그것을 사용한 적이 없으니까.

    왜 왼쪽 가입

    잘 관련된 두 개의 테이블이있다. 이 예에서 우리는 연결 고객 테이블 오른쪽 : 임대 테이블 내부에 임대에 고객은 내부가 두 테이블을 연결해야합니다 가입에 너무 왼쪽 차이가 없다, 가입 할 수 있습니다.

    임대 및 오른쪽 : 자동차 다음 링크는 왼쪽 왼쪽 사이에 조인했다. 왼쪽에서 모든 행이 연결해야하고 오른쪽 그들이 필요가 없습니다. 그것은 왼쪽 가입 왜이다

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

    3.당신은 당신이 다른 테이블 여부에 일치하는 행이 있는지, 중 하나의 결과를 모두 필요로 테이블을 조인 할 때 외부 조인을 사용합니다.

    당신은 당신이 다른 테이블 여부에 일치하는 행이 있는지, 중 하나의 결과를 모두 필요로 테이블을 조인 할 때 외부 조인을 사용합니다.

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

    4.나는 질문 3의 (b)는 전체 전제 잘못 때문에 혼란 생각 : 당신이 "쿼리를 해결"에 대한 조인 예를 외부를 사용할 필요가 없습니다 생각이 (시험 논문에서 구문의 스타일을 다음과 현명한 아마도)

    나는 질문 3의 (b)는 전체 전제 잘못 때문에 혼란 생각 : 당신이 "쿼리를 해결"에 대한 조인 예를 외부를 사용할 필요가 없습니다 생각이 (시험 논문에서 구문의 스타일을 다음과 현명한 아마도)

    SELECT FNAME, LNAME, DEPENDENT_NAME
      FROM EMPLOYEE, DEPENDENT
     WHERE SSN = ESSN
           AND RELATIONSHIP = 'SPOUSE'
    UNION 
    SELECT FNAME, LNAME, NULL
      FROM EMPLOYEE
    EXCEPT 
    SELECT FNAME, LNAME, DEPENDENT_NAME
      FROM EMPLOYEE, DEPENDENT
     WHERE SSN = ESSN
           AND RELATIONSHIP = 'SPOUSE'
    
  5. ==============================

    5.일반적으로 : 함께 관절 두 테이블을 조인. 당신이 어떤 특정 컬럼의 상세 정보를 백업 모습처럼, "찾아"싶어 할 때 사용 INNER가 가입. 당신이 "설명"하고 싶어 할 때 사용 OUTER 목록처럼 두 테이블의 모든 정보 가입하세요.

    일반적으로 : 함께 관절 두 테이블을 조인. 당신이 어떤 특정 컬럼의 상세 정보를 백업 모습처럼, "찾아"싶어 할 때 사용 INNER가 가입. 당신이 "설명"하고 싶어 할 때 사용 OUTER 목록처럼 두 테이블의 모든 정보 가입하세요.

  6. from https://stackoverflow.com/questions/5874733/when-to-use-a-left-outer-join by cc-by-sa and MIT license