[강의명]
패스트캠퍼스 SQL 100제 + 자격증 완성 온라인 완주반
[수강목록]
23. 조인과 집계 데이터 - 07. NATURAL 조인
생각대로 SQL - 3
[강의내용]
23. 조인과 집계 데이터 - 07. NATURAL 조인
두개의 테이블에서 같은 이름을 가진 컬럼간의 INNER JOIN 집합 결과를 출력한다.
SQL문 자체가 간소해지는 방법이다.
[샘플데이터 확인]
[실습1]
NATURAL JOIN을 실행해본다.
SELECT *
FROM PRODUCTS A
NATURAL JOIN CATEGORIES B;
NATURAL JOIN에는 ON을 붙여 조인 컬럼을 명시할 필요가 없다.
결과를 보면 동일 조건의 컬럼인 category_id가 맨 앞으로 이동하고, A, B 순으로 결합한다.
위의 NATURAL JOIN은 아래의 INNER JOIN 코드와 같게 할 수 있다.
SELECT A.CATEGORY_ID, A.PRODUCT_ID,
A.PRODUCT_NAME, B.CATEGORY_NAME
FROM PRODUCTS A
INNER JOIN CATEGORIES B ON (A.CATEGORY_ID = B.CATEGORY_ID);
또한 JOIN없이도 표현할 수 있다.
SELECT A.CATEGORY_ID, A.PRODUCT_ID,
A.PRODUCT_NAME, B.CATEGORY_NAME
FROM PRODUCTS A, CATEGORIES B
WHERE A.CATEGORY_ID = B.CATEGORY_ID;
[실습2]
dvdrental 데이터셋의 city테이블과 country테이블로 NATURAL JOIN을 실행해본다.
city_id라는 동일한 컬럼이 있어 연결될 것이라 생각했지만
SELECT *
FROM CITY A
NATURAL JOIN COUNTRY B;
어떤 데이터도 출력되지 않는다.
이유는 last_update라는 컬럼이 양쪽에 모두 있어서이다. last_update컬럼의 값도 동일해야 JOIN이 이루어진다.
이 경우 INNER JOIN에서 조인 컬럼을 명시해주면 연결된다.
이러한 이유로 NATURAL JOIN은 실무에 잘 사용되지 않는다.
생각대로 SQL - 3
문제1번) 고객의 기본 정보인, 고객 id, 이름, 성, 이메일과 함께 고객의 주소 address, district, postal_code, phone 번호를 함께 보여주세요.
고객 id, 이름, 성, 이메일은 customer 테이블에 있고, address, district, postal_code, phone은 address 테이블에 있다.
두 컬럼에 공통으로 존재하는 address_id를 기준으로 조인을 실행하면 된다.
SELECT c.customer_id, c.first_name, c.last_name, a.address, a.district, a.postal_code, a.phone
FROM customer c
JOIN address a ON c.address_id = a.address_id;
문제2번) 고객의 기본 정보인, 고객 id, 이름, 성, 이메일과 함께 고객의 주소 address, district, postal_code, phone , city 를 함께 알려주세요.
city컬럼은 city 테이블에 존재한다. 1번에서 작성한 쿼리에 city 테이블을 추가로 조인하면 된다.
address테이블과 city테이블에 공통으로 존재하는 city_id 컬럼을 이용한다.
SELECT c.customer_id, c.first_name, c.last_name, a.address, a.district, a.postal_code, a.phone, ct.city
FROM customer c
JOIN address a ON c.address_id = a.address_id
JOIN city ct ON a.city_id = ct.city_id;
문제3번) Lima City에 사는 고객의 이름과, 성, 이메일, phonenumber에 대해서 알려주세요.
고객이름, 성, 이메일은 customer 테이블에, phone은 address 테이블에 있다.
WHERE절에서 city name = 'Lima'를 찾으려면 city 테이블도 조인되어야 한다.
SELECT c.first_name, c.last_name, c.email, a.phone
FROM customer c
JOIN address a ON c.address_id = a.address_id
JOIN city ct ON a.city_id = ct.city_id
WHERE ct.city = 'Lima';
문제4번) rental 정보에 추가로, 고객의 이름과, 직원의 이름을 함께 보여주세요.
고객의 이름, 직원 이름은 이름과 성을 fullname 컬럼으로만들어서 직원이름/고객이름 2개의 컬럼으로 확인해주세요.
rental 테이블에 customer_id와 staff_id 컬럼이 존재하므로 customer 컬럼을 조인하여 풀네임을 불러오고, staff 컬럼을 조인하여 풀네임을 불러온다.
SELECT r.*, c.first_name || ' ' || c.last_name fullname_cst,
s.first_name || ' ' || s.last_name fullname_sta
FROM rental r
JOIN staff s ON r.staff_id = s.staff_id
JOIN customer c ON r.customer_id = c.customer_id;