[SQL] 혼공단_3주차_Chapter 04

Haeun Noh·2023년 7월 23일
0
post-thumbnail

0724


기본 미션 : p. 195의 확인 문제 4번 풀고 인증하기

선택 미션 : p. 183 [좀 더 알아보기] 손코딩 실행하고 결과화면 인증하기

현재 마무리된 글을 제목을 안 썼다는 이유로 시원하게 날려먹어서 멘붕이 왔습니다. 그래도 혼공단 완주를 위해서는 다시 또 또 써야겠죠. 나름 자세히 잘 썼다고 만족하고 제목을 입력하고 있었을 뿐인데, 세상이 절 억까하는 중입니다. 하지만 해야겠죠.. 아득바득

분명 몇 시간 전만 해도 여기에는 시간이 참 빠르네요 이런 말들이 가득이었는데 말입니다. 어쩌겠습니까, 제목 작성을 먼저 하지 않은 제 잘못인걸요.

이번을 계기로 벨로그는 제목 작성을 하지 않으면 자동저장이 안 된다는 사실을 알게되었네요. 긍정적으로 복습을 해서 외부조인과 내부조인을 완벽하게 알 수 있게 됐다고 생각하는 것이 좋겠습니다. 하하 참 유익한 3주차네요.



기본 미션 : p. 195의 확인 문제 4번 풀고 인증하기

이 문제는 회원가입은 하였지만 구매를 한 번도 한 적이 없는 회원의 목록을 조회하는 문제입니다.

저는 정답을 4번, WHERE B.prod_name IS NULL로 했는데요, 그 이유가 무엇인지 코드와 함께 천천히 자세히 알아가봅시다.


SELECT DISTINCT M.mem_id, B.prod_name, M.mem_name, M.addr
  • SELECT : 조회한다.
  • DISTINCT M.mem_id, : member테이블의 중복되지 않은 회원 아이디와
  • B.prod_name, : buy테이블의 구매하는 품목의 이름과
  • M.mem_name, : member테이블의 회원의 이름과
  • M.addr : member테이블의 회원의 집주소를

	FROM member M
		LEFT OUTER JOIN buy B
		ON B.mem_id = M.mem_id
  • FROM member M : M이라는 별칭을 가지고 있는 member테이블을 기준으로
  • LEFT OUTER JOIN buy B : B라는 별칭을 가지고 있는 buy테이블을 외부조인한다.
    • LEFT : buy테이블의 왼쪽에 있는 member테이블을 기준으로
    • OUTER JOIN buy B : buy테이블을 외부 조인한다.
  • ON B.mem_id = M.mem_id : buy테이블의 mem_idmember테이블의 mem_id가 같다면

👀 왜 외부조인을 사용하였을까?

내부조인 - 두 테이블에 모두 데이터가 있어야만 결과가 나옴
외부조인 - 한 테이블에만 필요한 데이터가 있어도 결과가 나옴

이 문제는 회원가입은 하였지만 구매는 하지않은 회원을 조회하는 것입니다.

다시 말해, member 테이블에는 데이터가 존재하지만, buy 테이블에는 없는 데이터가 있다는 뜻입니다.

내부조인은 두 테이블에 모두 데이터가 있어야 한다면 외부조인은 member테이블에만 데이터가 존재해도 조인이 가능하기 때문에 외부조인을 사용한 것이죠.


    WHERE B.prod_name IS NULL
  • buy테이블의 품목이름이 null이라면 (외부조인을 한다.)

앞서 말했듯, 외부조인을 할 때는 한 테이블에만 데이터가 있어도 됩니다.

그말인즉슨 member테이블과 buy테이블을 외부조인했을 때, member테이블에는 있지만 buy테이블에는 없는 데이터는 NULL값으로 조인이 될 것입니다.

따라서 회원가입은 했지만 결제를 하지 않은 회원을 찾기 위한 조건식으로 WHERE B.prod_name IS NULL를 선택한 것이죠.


ORDER BY M.mem_id;
  • member테이블의 mem_id를 기준으로 오름차순 정렬합니다.
    • 문제를 해결할 때 큰 영향을 주지 않습니다.

SELECT DISTINCT M.mem_id, B.prod_name, M.mem_name, M.addr
	FROM member M
		LEFT OUTER JOIN buy B
		ON B.mem_id = M.mem_id
    WHERE B.prod_name IS NULL
ORDER BY M.mem_id;
  • 전체 코드


선택 미션 : p. 183 [좀 더 알아보기] 손코딩 실행하고 결과화면 인증하기

Q. 한 번이라도 구매 기록이 있는 회원 조회하기

SELECT DISTINCT M.mem_id, M.mem_name, M.addr
  • SELECT : 조회한다.
  • DISTINCT M.mem_id, : member테이블의 중복되지 않은 회원 아이디와
  • M.mem_name, : member테이블의 회원의 이름과
  • M.addr : member테이블의 회원의 집주소를

	FROM buy B
	INNER JOIN member M
	ON B.mem_id = M.mem_id
  • FROM member M : B이라는 별칭을 가지고 있는 buy테이블을 기준으로
  • INNER JOIN member M : M라는 별칭을 가지고 있는 member테이블을 내부조인한다.
  • ON B.mem_id = M.mem_id : buy테이블의 mem_idmember테이블의 mem_id가 같다면

👀 왜 내부조인을 사용하였을까?

이 문제는 회원가입이 되어 있으면서 구매를 한 회원을 조회하는 것입니다.

다시 말해, 이것은 member테이블과 buy테이블에 동일하게 데이터가 있다는 것을 의미합니다.

때문에 두 테이블 중 한 테이블에만 데이터가 있어도 괜찮은 외부조인 대신,
두 테이블에 모두 데이터가 있어야 하는 내부조인을 사용한 것입니다.


ORDER BY M.mem_id;
  • member테이블의 mem_id를 기준으로 오름차순 정렬합니다.
    • 문제를 해결할 때 큰 영향을 주지 않습니다.

SELECT DISTINCT M.mem_id, M.mem_name, M.addr
	FROM buy B
	INNER JOIN member M
	ON B.mem_id = M.mem_id
ORDER BY M.mem_id;
  • 전체 코드


profile
기록의 힘을 믿는 개발자, 노하은입니다!

2개의 댓글

comment-user-thumbnail
2023년 7월 23일

잘 읽었습니다. 좋은 정보 감사드립니다.

1개의 답글