JOIN
- 없어진 기록 찾기
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에는 없는 값들만 출력할 수 있다.
- 있었는데요 없었습니다.
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)
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
- 보호소에서 중성화한 동물
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)