Home 프로그래머스 - SQL(JOIN-1) 없어진 기록 찾기
Post
Cancel

프로그래머스 - SQL(JOIN-1) 없어진 기록 찾기

SQL JOIN

SQL에서 JOIN이란 두 개 이상의 테이블(릴레이션)을 연결하여 데이터를 검색하는 방법으로 두 테이블에서 관련된 튜플을 결합하여 하나의 튜플로 만들어 출력합니다.

JOIN은 DML중 SELECT에서 조건을 추가할 때 사용하는 방법으로 보통 기본키(PK)와 외래키를 사용하여 JOIN을 합니다.

JOIN의 종류를 밴 다이어그램으로 표현하면 다음과 같습니다.

image

위 그림을 SQL로 표현하면 다음과 같습니다.

  SELECT <필드 명...>
  FROM [기준 테이블 명] LEFT JOIN [JOIN 되는 테이블]
  ON [기준 테이블.외래키] = [JOIN 테이블.기본키]
  • 꼭 외래키와 기본키일 필요는 없지만 대부분 외래키, 기본키를 이용하여 코드를 작성한다고 생각하여 위와 같이 작성했습니다.

  • RIGHT JOINLEFT JOIN에서 기준 테이블만 반대로 하면 되는거라서 자세하게 적지 않았습니다.

  • on 은 where와 같은 역할을 하지만 자세한 차이점은 on은 레코드가 생성될 때 레코드를 필터링하는 반면에, where는 조인작업이 완료될 때까지 기다리고 난 뒤에 필터링을 합니다.

문제

출처: https://programmers.co.kr/learn/courses/30/lessons/59042

image

image

image

풀이 및 오답 정리

image

이 문제는 ANIMAL_OUTS 테이블에는 동물들의 ID가 있는데 ANIMAL_INS에 없는 동물들의 ID를 찾는 방식으로 ANIMAL_OUTS 차집합을 찾아 풀어야합니다.

JOIN은 대부분 있을 때 A테이블에 있고 B테이블에 있을 때 =를 사용한다는 것을 파악했습니다.

이번 문제는 없는 경우를 찾는 것이라서 다음과 같이 작성하였습니다. != 문법이 없으면 에러가 발생할 것이라고 생각해서 다음과 같이 코드를 작성하고 결과를 보았습니다.

  SELECT ANIMAL_OUTS.ANIMAL_ID, ANIMAL_OUTS.NAME
  FROM ANIMAL_OUTS LEFT JOIN ANIMAL_INS
  ON ANIMAL_OUTS.ANIMAL_ID != ANIMAL_INS.ANIMAL_ID

결과는 다음과 같습니다.

image

중복된 값이 나오지만 제대로 출력이 나온다고 생각해서 !=에서는 문제가 없다고 생각해서 DISTINCT 만 추가하면 되는 줄 알았습니다.

하지만 DISTINCT를 추가해도 문제는 계속 틀렸습니다.

제가 착각하고 있었던 부분은 JOIN에서 기준 테이블의 키가 비교되는 테이블에 없으면 그 튜플은 출력이 안되는 줄 알았습니다.

하지만 아래 그림에서 처럼 NULL 값으로 대체되어 출력되는 것을 새롭게 알게 되었습니다.

!= 에서 문제가 있을 것이라고 생각하고 JOIN에 대한 여러 예제를 찾아보고 [w3schools]https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all 에서 기본 제공하는 테이블을 이용해서 직접 JOIN을 이용해서 튜플들을 출력해 보았습니다.

제가 사용한 두 개의 테이블은 다음과 같습니다.

  • Categories 테이블

    image

  • Shippers 테이블

    image

    결과는 다음과 같았습니다.

image

바로 값이 없는 경우 NULL을 출력하여 기준 테이블에 맞춰 튜플이 출력되는 것을 확인할 수 있었습니다. 그래서 이 경우는 NULL 존재하는 경우만 출력해야 합니다. 따라서 JOINWHERE절을 추가하고 값이 없는 경우, !=이 아니라 NULL 이라는 키워드를 사용해서 튜플이 없는 경우는 출력시키지 않아야 합니다.

정답 코드

  SELECT ANIMAL_OUTS.ANIMAL_ID, ANIMAL_OUTS.NAME
  FROM ANIMAL_OUTS
  LEFT JOIN ANIMAL_INS
  ON ANIMAL_OUTS.ANIMAL_ID = ANIMAL_INS.ANIMAL_ID
  WHERE ANIMAL_INS.ANIMAL_ID IS NULL

정답을 알고나면 쉬워 보이지만 처음 JOIN을 이용한 저로서는 왜 WHERE절이 필요한지 궁금증이 생겨 깊게 공부하고 그 내용을 정리하면서 글을 작성하게 되었습니다.

참고

http://aispiration.com/xwmooc-sc/novice/sql/07-join.html

SQL 실습 사이트

  1. [w3schools]https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all

    테이블이 여러 개 있어 JOIN등 튜플을 조합연습을 하기 좋은 사이트

  2. [sqltest]http://sqlfiddle.com/

    테이블 추가가 가능한 사이트

This post is licensed under CC BY 4.0 by the author.

스프링 입문 7 - 3.스프링 웹 개발 기초 - MVC와 템플릿 엔진

백준 2873 롤러코스터 (python)