SQL 30

[프로그래머스] 오랜 기간 보호한 동물(1)

SELECT A.NAME as NAME, A.DATETIME as DATETIME FROM ANIMAL_INS A LEFT OUTER JOIN ANIMAL_OUTS B ON A.ANIMAL_ID = B.ANIMAL_ID WHERE B.ANIMAL_ID IS NULL ORDER BY A.DATETIME limit 3; ANIMAL_ID를 기준으로 ANIMAL_INS를 왼쪽에 두고 LEFT OUTER JOIN을 실행한다. ANIMAL_INS에만 값이 존재하면 입양을 가지 못한 동물임을 뜻한다. 이때, ANIMAL_OUTS의 ANIMAL_ID는 NULL을 갖게 되므로 조건을 둔 후에 limit 명령어를 통해 3개만 조회되도록 한다. [실행결과]

Language/SQL 2022.07.05

[프로그래머스] 있었는데요 없었습니다

보호시작일 보다 입양일이 더 빠른 동물을 조회해야 하는 문제다. ANIMAL_INS의 DATETIME은 보호시작일, ANIMAL_OUTS의 DATETIME은 입양일이다. SELECT A.ANIMAL_ID as ANIMAL_ID, A.NAME as NAME FROM ANIMAL_INS A INNER JOIN ANIMAL_OUTS B ON A.ANIMAL_ID = B.ANIMAL_ID WHERE A.DATETIME >= B.DATETIME ORDER BY A.DATETIME; ANIMAL_ID가 같은 것을 기준으로 ANIMAL_INS와 ANIMAL_OUTS 테이블 INNER JOIN 한 후, A.DATETIME (ANIMAL_INS의 DATETIME -> 보호 시작일)보다 B.DATETIME(입양일)이 더 ..

Language/SQL 2022.07.05

[프로그래머스] 없어진 기록 찾기

SELECT ANIMAL_ID, NAME FROM ANIMAL_OUTS where ANIMAL_ID not in (select ANIMAL_ID from ANIMAL_INS); 위 코드는 내 생각대로 작성한 코드이다. ANIMAL_OUTS 테이블에는 값이 있고 ANIMAL_IN 테이블에는 값이 없어야 하므로 차집합을 생각했다. 검색해보니, mysql에는 차집합 연산이 없어 서브쿼리로 진행해야 한다고 한다. 위 코드는, ANIMAL_OUTS의 ANIMAL_ID 중 ANIMAL_INS의 ANIMAL_ID와 겹치지 않는 (없는) 값들을 조회하도록 했다. [실행결과] 다음은, 구글링 후 JOIN 연산자를 사용하여 문제를 해결한 코드다. INNER JOIN과 LEFT OUTER JOIN이 많이 쓰인다고 한다. S..

Language/SQL 2022.07.05

[프로그래머스] 입양 시각 구하기(2)

SELECT hour(DATETIME) HOUR, count(DATETIME) COUNT FROM ANIMAL_OUTS GROUP BY HOUR ORDER BY HOUR; 위 코드는 잘못된 코드이다. 문제는 0~23시까지 모든 시가 출력되길 원하기 때문이다. SET 명령어를 사용해야 한다. SET 명령어는 변수에 특정한 값을 넣어줄 때 사용한다. @은 변수명 앞에 써주어야 한다. (ex. @HOUR) :=는 대입 연산자로, SET명령어에서는 =, := 둘다 대입 연산자로 인식된다. SET을 제외한 다른 쿼리문(ex. SELECT)은 '='를 비교연산자로 인식한다. SET @HOUR = -1; SELECT (@HOUR := @HOUR + 1) HOUR, (SELECT count(DATETIME) COUNT..

Language/SQL 2022.07.04