이번에 sw마에스트로 지원을 해서 코딩 테스트를 보게 되었다.
SQL 문제 대비로 풀이.
전체 문제가 아니라, 내가 기록하고 싶었던 것 위주로 남긴다.
시험 전에 다시 훑어볼 용도.
SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS
ORDER BY NAME, DATETIME DESC
SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME ASC
LIMIT 1
LIMIT 1, 10
이거는 두번째 (인덱스=1) 부터 10개의 튜플을 가져옴.SELECT COUNT(DISTINCT NAME) AS 'count'
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
COUNT(DISTINT 컬럼명)
DISTINCT A, B FROM 테이블명
SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE) AS 'count'
FROM ANIMAL_INS
-- WHERE ANIMAL_TYPE = 'Cat' OR ANIMAL_TYPE = 'Dog'
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE
SELECT NAME, COUNT(NAME) AS 'COUNT'
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT(NAME) >= 2
ORDER BY NAME
SELECT HOUR(DATETIME) AS 'HOUR', COUNT(HOUR(DATETIME)) AS 'COUNT'
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) >= 9 AND HOUR(DATETIME) < 20
GROUP BY HOUR(DATETIME)
ORDER BY HOUR(DATETIME)
SET @HOUR = -1;
SELECT (@HOUR := @HOUR +1) AS HOUR,
(SELECT COUNT(HOUR(DATETIME))
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME)=@HOUR) AS COUNT
FROM ANIMAL_OUTS
WHERE @HOUR < 23;
SET @변수명
SELECT ANIMAL_TYPE, IFNULL(NAME, 'No name') AS NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
IFNULL(대상컬럼명, 채울내용)
우선 이 사진을 보자. 이 사진에 모든 답이 나와 있다.
추가로 다음과 같은 것을 주의한다.
A.NAME
WHERE B.ID IS NULL
이렇게 쓴다.SELECT O.ANIMAL_ID, O.ANIMAL_TYPE, O.NAME
FROM ANIMAL_INS I
RIGHT JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.SEX_UPON_INTAKE LIKE 'Intact%' AND
(O.SEX_UPON_OUTCOME LIKE 'Spayed%' OR
O.SEX_UPON_OUTCOME LIKE 'Neutered%');
=
로 검사하나, 포함 같은 경우엔 LIKE
사용.%
Intact%
: Intact로 시작하는 문자열 (Intact 그자체도 가능)%intact
: intact로 끝나는 문자열 (intact 그자체도 가능)SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE LOWER(NAME) LIKE '%el%' AND ANIMAL_TYPE='Dog'
ORDER BY NAME;
%
의 사용 방법 주목LOWER
걸어서 변환 후 소문자로 LIKE 서치SELECT ANIMAL_ID, NAME, IF(REGEXP_LIKE (SEX_UPON_INTAKE, 'Neutered|Spayed'), 'O', 'X') AS '중성화'
FROM ANIMAL_INS
생소한 함수들이라 두번째로 어려웠던 문제
IF(조건, 참일때, 거짓일때채울값)
REGEXP_LIKE()
정규표현식을 이용한 LIKE문.
앞서 REGEXP_LIKE 쓰기 전엔 이렇게 표현했었음.
O.SEX_UPON_OUTCOME LIKE 'Spayed%' OR
O.SEX_UPON_OUTCOME LIKE 'Neutered%'
정규표현식에 대해서
A
IF의 결과가 하나의 컬럼이므로, 그대로 SELECT에 갖다붙인다.
SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_INS I
JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID = O.ANIMAL_ID
ORDER BY DATEDIFF(O.DATETIME, I.DATETIME) DESC
LIMIT 2
SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, '%Y-%m-%d') AS "날짜"
FROM ANIMAL_INS
DATE(DATETIME)
이렇게 하면 원하는 대로 안 나옴.DATE_FORMAT
함수에 주목. 그리고 Y만 대문자다.%y
(소문자)라면 16-04-19 이렇게 연도에서 두자리만 나온다.%M
(대문자)라면 숫자 04 대신 April 이라고 나온다.%D
(대문자)라면 숫자 19 대신 19th라고 나온다.