[SQL 100제#39-46] JOIN, LEFT JOIN

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

[강의명]
패스트캠퍼스 SQL 100제 + 자격증 완성 온라인 완주반

[수강목록]

3주차 과제 풀이 (SQL 39~53번 문제)

 

[강의내용]

 

문제39번) 고객의 기본정보인 고객id, 이름, 성, 이메일과 함께 고객의 address, district, postal_code, phone을 함께 보여주세요.

 

고객id, 이름, 성, 이메일 컬럼은 customer 테이블에 존재한다. 그리고 address를 비롯한 나머지 컬럼들은 address 테이블에 존재한다.

다른 테이블을 한 쿼리에서 사용하기 위해 FROM뒤에 JOIN을 써서 추가할 테이블을 입력해준다.

그리고 ON 뒤에 두 테이블간의 공통 컬럼을 적어준다.

 

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;

 

쿼리 결과

이종 테이블의 정보가 함께 출력되는 것을 확인할 수 있다.

 

문제40번) 고객의 기본 정보인, 고객 id, 이름, 성, 이메일과 함께 고객의 address, district, postal_code, phone , city를 함께 알려주세요. 

 

이번에는 총 3개의 테이블을 JOIN해본다. city 컬럼은 city 테이블에 있기 때문에 customer - address - city 순으로 JOIN해주면 된다.

 

customer - address : address_id컬럼으로 JOIN

address - city : city_id컬럼으로 JOIN

 

SELECT c.customer_id, c.first_name, c.last_name, a.address, a.district, a.postal_code, a.phone, c2.city 
FROM customer c 
JOIN address a ON c.address_id = a.address_id
JOIN city c2 ON a.city_id = c2.city_id;

 

쿼리 결과

문제41번) Lima City에 사는 고객의 이름과, 성, 이메일, phonenumber에 대해서 알려주세요.

 

문제2번에서 만든 DB에서 city값이 'Lima'인 항목을 출력하면 된다.

 

SELECT c.customer_id, 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 c2 ON a.city_id = c2.city_id
WHERE c2.city in ('Lima');

 

쿼리 결과

 

문제42번) rental 정보에 추가로, 고객의 이름과, 직원의 이름을 함께 보여주세요.
- 고객의 이름, 직원 이름은 이름과 성을 fullname 컬럼으로만들어서 직원이름/고객이름 2개의 컬럼으로 확인해주세요.

 

총 3개 테이블의 JOIN + 텍스트 결합을 묻는 문제이다.

 

참고로 SELECT절은 쿼리 상 마지막 단계 (HAVING 뒤)에서 실행되기 때문에, Alias를 사용할 수 있다.

그래서 r.*는 rental 테이블의 모든내용(* : asterisk) 을 나타낸다.

 

SELECT r.*, c.first_name || ' ' || c.last_name AS cust_fullname,
		s.first_name || ' ' || s.last_name AS staff_fullname
FROM rental r 
JOIN staff s ON r.staff_id = s.staff_id 
JOIN customer c ON r.customer_id = c.customer_id;

 

쿼리 결과

 

문제43번) seth.hannon@sakilacustomer.org 이메일 주소를 가진 고객의 address, address2, postal_code, phone, city를 알려주세요.

 

문제3번에서 city = 'Lima'인 값을 조회한 것처럼, email = seth.hannon@sakilacustomer.org 인 값을 출력하면 된다.

 

SELECT a.address, a.address2, a.postal_code, a.phone, c2.city
FROM customer c 
JOIN address a ON c.address_id = a.address_id
JOIN city c2 ON a.city_id = c2.city_id
WHERE c.email = 'seth.hannon@sakilacustomer.org';

 

쿼리 결과

 

문제44번) Jon Stephens 직원을 통해 dvd대여를 한 payment 기록 정보를 확인하려고 합니다. 
- payment_id, 고객이름과 성, rental_id, amount, staff 이름과 성을 알려주세요. 

 

5번과 마찬가지로, 테이블 JOIN을 통한 DB준비 + WHERE절 조건 입력을 통해 해결할 수 있다.

 

SELECT p.payment_id, c.customer_id, c.first_name, r.rental_id, p.amount, s.first_name, s.last_name 
FROM rental r 
JOIN staff s ON r.staff_id = s.staff_id 
JOIN customer c ON r.customer_id = c.customer_id
JOIN payment p ON c.customer_id = p.customer_id 
WHERE s.first_name = 'Jon';

 

쿼리 결과

 

문제45번) 배우가 출연하지 않는 영화의 film_id, title, release_year, rental_rate, length 를 알려주세요.

 

배우가 출연하지 않는 영화는 무엇을 의미할까?

film_id와 actor_id가 각각 매핑된 film_actor 테이블에 존재하지 않는 film이라고 할 수 있다.

아직 actor 정보가 film_actor 테이블에 업로드되지 않은 것이라 생각할 수 있다.

 

모든 영화들이 film_actor 테이블에 존재하는 것이 아니기 때문에, INNER JOIN이 아닌 LEFT OUTER JOIN을 사용한다.

(INNER 와 OUTER 는 생략가능하다)

 

SELECT f.film_id, f.title, f.release_year, f.rental_rate, f.length
FROM film f 
LEFT JOIN film_actor fa ON f.film_id = fa.film_id 
WHERE fa.actor_id IS NULL;

 

이를 통해 공통항목이 없는 데이터도 불러올 수 있다.

(INNER JOIN에서는 공통항목이 없는 데이터는 불러오지 않는다)

 

쿼리 결과

 

해당 영화들은 film_actor 테이블에 존재하지 않는 영화들임을 알 수 있다.

 

문제46번) store 상점 id별 주소 (address, address2, district) 와 해당 상점이 위치한 city 주소를 알려주세요.

 

store_id 별 주소 이므로, SELECT절에서 맨 앞에 store_id를 써주는 것을 유의하면 된다.

 

SELECT s.store_id, address, address2, district, city
FROM store s
JOIN address a ON s.address_id = a.address_id 
JOIN city c ON a.city_id = c.city_id;

 

쿼리 결과

'🤓 기술 학습 & 공부 기록/컴퓨터 일반' 카테고리의 다른 글
  • [SQL 100제#54-66] SUM, COUNT, ROUND, CASE WHEN, 서브쿼리
  • [SQL 100제#47-53] JOIN, LEFT JOIN, CASE
  • [SQL 100제#30-38] OR, IN, IS NULL, IS NOT NULL
  • [SQL 100제#21-29] LIKE, BETWEEN, DATE
지식물원
지식물원
지식이 자라는 식물원!
  • 지식물원
    지식물원
    지식물원
  • 전체
    오늘
    어제
    • 분류 전체보기 (510)
      • 🎨 프론트엔드 공부 (247)
        • JS & TS (86)
        • 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 100제#39-46] JOIN, LEFT JOIN

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.