SQL_(JOIN)

JOIN

  1. 없어진 기록 찾기

참고블로그1 참고블로그2_leftjoin

left join의 기본 구문

SELECT colunm_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name
  • left join : 조인문의 왼쪽에 있는 테이블의 모든 결과를 가져온 후, 오른쪽테이블의 데이터를 매칭하고, 매칭되는 데이터가 없는 경우, NULL로 표시한다.
SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_OUTS as A LEFT JOIN ANIMAL_INS as B ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.ANIMAL_ID IS NULL
  • ANIMAL_OUTS에 left join ANIMAL_INS를 하여
  • ANIMAL_OUTS의 모든 결과를 가져오는데, ANIMAL_INS와 매칭되는 데이터가 없는, 즉 유실된 데이터를 가져오는 조건을 추가한다
  • 그게 WHERE B.ANIMAL_ID IS NULL이 된다.

  • 기존엔 ANIMAL_INS 테이블에서 없었던 내용들은 ID가 NULL처리되어 들어오기기 때문에, WHERE 절에 IS NULL을 추가하면, ANIMAL_OUTS에는 있지만, ANIMAL_INS에는 없는 값들만 출력할 수 있다.
  1. 있었는데요 없었습니다.
SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_INS as A, ANIMAL_OUTS as B
WHERE A.ANIMAL_ID = B.ANIMAL_ID and A.DATETIME > B.DATETIME
ORDER BY A.DATETIME
  1. 오랜 기간 보호한 동물(1)
SELECT A.NAME, A.DATETIME
FROM ANIMAL_INS as A LEFT JOIN ANIMAL_OUTS as B ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.ANIMAL_ID IS NULL
ORDER BY A.DATETIME LIMIT 3
  1. 보호소에서 중성화한 동물
SELECT A.ANIMAL_ID, A.ANIMAL_TYPE, A.NAME
FROM ANIMAL_INS as A, ANIMAL_OUTS as B
WHERE A.ANIMAL_ID = B.ANIMAL_ID and A.SEX_UPON_INTAKE != B.SEX_UPON_OUTCOME
ORDER BY A.ANIMAL_ID

-> 이건 편법인 것 같다.

  • 다른 방법
SELECT A.ANIMAL_ID, A.ANIMAL_TYPE, A.NAME
FROM ANIMAL_INS A, ANIMAL_OUTS B
WHERE A.ANIMAL_ID = B.ANIMAL_ID AND A.SEX_UPON_INTAKE LIKE 'Intact%' AND ( B.SEX_UPON_OUTCOME LIKE 'Spayed Female' OR B.SEX_UPON_OUTCOME LIKE 'Neutered Male' )
ORDER BY A.ANIMAL_ID

출처: https://murra.tistory.com/142 [Murra Blog]
  • Like 연사산자란?
  • where 절 안에서 쓰이는데 특정한 패턴에 부함하는 부분을 찾으려 할 때 쓴다
  • %: 0, 1, 혹은 하나 이상의 char
  • _: 한 개의 char

  • LIKE 'a%' “a”로 시작하는 모든 값
  • LIKE '%a' “a”로 끝나는 모든 값
  • LIKE '%or% “or”이 있는 모든 값
  • LIKE '_r% 두 번째 인덱스에 “r”이 있는 모든 값
  • LIKE 'a%% a로 시작하며 최소 3글자 이상인 모든 값
  • LIKE 'a%o% “a”로 시작하여 “o”로 끝나는 모든 값

  • G로 시작하지 않는 값은 NOT LIKE '%G'

참고자료 프로그래머스 코딩테스트 연습 (sql)

0%