[SQL 2-2강 (1)] JOIN, NATURAL JOIN

2021. 5. 20.·🤓 기술 학습 & 공부 기록/컴퓨터 일반

[강의명]
패스트캠퍼스 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;

 

'🤓 기술 학습 & 공부 기록/컴퓨터 일반' 카테고리의 다른 글
  • [SQL 2-3강] GROUP BY, HAVING
  • [SQL 2-2강 (2)] JOIN, LEFT, CASE
  • [SQL 2-1강 (2)] SELF JOIN, FULL, CROSS
  • [SQL 2-1강 (1)] JOIN, INNER, OUTER, LEFT, RIGHT
지식물원
지식물원
지식이 자라는 식물원!
  • 지식물원
    지식물원
    지식물원
  • 전체
    오늘
    어제
    • 분류 전체보기 (516)
      • 🎨 프론트엔드 공부 (253)
        • JS & TS (92)
        • HTML & CSS (22)
        • React & Next (49)
        • Vue & Nuxt (22)
        • 기타 (68)
      • 🤓 기술 학습 & 공부 기록 (116)
        • Node.js (0)
        • Python (37)
        • 백엔드 (0)
        • 딥러닝 (1)
        • 컴퓨터 일반 (72)
        • 개발 인프라 (6)
      • 👨‍💻 프로젝트 경험 (6)
        • Work (0)
        • Toy (6)
      • ⚙️ 개발 팁 & 노하우 (21)
        • 프론트엔드 (6)
        • 기타 (15)
      • ☕️ 커리어 & 인터뷰 준비 (88)
        • 코딩 테스트 (88)
      • 📰 기술 트렌드 & 생각 정리 (4)
      • 📚 기타 (25)
        • 마케팅 (15)
        • 비개발서적 (10)
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

    • 모바일 접속 시 코드 하이라이팅 깨질 때
  • 인기 글

  • hELLO· Designed By정상우.v4.10.3
지식물원
[SQL 2-2강 (1)] JOIN, NATURAL JOIN
상단으로

티스토리툴바