공부 기록장
프로그래머스 SQL 고득점 Kit의 문제들 풀면서 헷갈렸던 부분 정리 본문
날짜 포매팅
DATE_FORMAT(열 이름, '%Y-%m-%d)
- 반환값은 varchar
- 열 이름에 해당하는 부분 : DATE 포맷 포함하는 string이거나 날짜/시간 데이터 타입(DATE, TIMESTAMP, DATETIME)
특정 단어가 포함된 경우 찾기
LIKE '2021%'
↔ NOT LIKE ~
cf. col_name LIKE '%\_%' ESCAPE '\';
날짜에서 년,월,일 추출하기
YEAR(컬럼명), MONTH(컬럼명), DAYOFMONTH(컬럼명)
UNION과 UNION ALL 차이
- UNION : 중복 데이터 제거
- UNION ALL : 중복 포함 모두 반환
cf. FULL JOIN은 중복 제거
그냥 JOIN은 INNER JOIN과 같다
FROM 절 뒤에 TB1, TB2로 표현 시 → CROSS JOIN
ON과 WHERE
- ON : JOIN과 함께 쓰이면서 두 테이블 간의 결합 조건을 지정
- WHERE : 일반적으로는 단일 테이블의 `행 필터링`에 사용
NULL 처리 (다른 값으로 치환 시)
IFNULL(열 이름, 'N') AS 별칭
NULL인 행 찾기
열 이름 IS NULL
반올림
ROUND(반올림하려는 수, k)
k가 양수면, 소수점 아래 (k+1) 자리에서 반올림해서 k자리까지 표기
ex. ROUND(123.456, 1)의 결과값 : 123.5
k가 음수면, k=-1일 때는 10의 자리까지 표현, k=-2일 때는 100의 자리까지 표현 ...
ex. ROUND(123.456, -2)의 결과값 : 100
버림
TRUNCATE(54.29, 1) 의 결과값 : 54.2
⇒ 버림해서 소수점 아래 1의 자리까지 나타내기
TRUNCATE(54.29, -1)의 결과값 : 50
⇒ 1의 자리에서 버림
두 날짜의 일 수 차이 반환
DATEDIFF(date1, date2) : date1 - date2 일 수 반환
IF ~ ELSE문 활용
[기본]
IF (score >= 80, 'PASS', 'FAIL') AS RESULT
(조건식, 참일 때, 거짓일 때)
[활용]
IF (score >= 90, 'Excellent',
IF (score >= 80, 'pass',
IF (score >= 70, 'Average', 'Fail')
)
) AS RESULT
CASE WHEN문 활용
[기본]
CASE
WHEN score >= 80 THEN 'Pass'
ELSE 'Fail'
END AS Result
[활용]
CASE
WHEN score >= 90 THEN 'Excellent'
WHEN score >= 80 THEN 'Pass'
WHEN score >= 70 THEN 'Average'
ELSE 'Fail'
END AS Result
DATEDIFF와 TIMESTAMPDIFF
ⓘ DATEDIFF(date1, date2)
: date1 - date2의 일 수 계산 후 반환
(date1이 date2보다 더 미래 시제)
② TIMESTAMPDIFF(unit, date1, date2)
: date2 - date1의 unit 단위로의 계산값 반환
⇒ unit : SECOND, MINUTE, HOUR, DAY, WEEK, YEAR
상위 K개 레코드
LIMIT K
+ OFFSET L 과 함께 사용 가능
ex) LIMIT 5 OFFSET 5 : 6번째부터 10번째 레코드
시작점 L(인덱스 0부터 시작)로부터 K개의 레코드
⇒ 명시적으로 OFFSET 사용 안할 수도 있다
: OFFSET 5, 5
정수 범위 표현의 2가지 방식
- AGE >= 20 AND AGE <= 29
- AGE BETWEEN 20 AND 29
비트 연산자
& : AND 연산자
| : OR 연산자
# : XOR 연산자 (다를 때만 1)
~ : NOT 연산자 (뒤집기 0 → 1, 1 → 0)
ex) 6&3 = 2
6은 이진수로 110
3은 이진수로 011
&연산 진행 시, 010 = 2
⇒ 십진수로 연산자만 쓰면 내부적으로 비트 연산 수행 후, 십진수로 반환
⇒ 자리수가 1인지 0인지 판단하는 용도로도 사용 가능
2개의 열 기준으로 그룹화하기
... GROUP BY g1, g2
⇒ 동일한 g1, g2 조합을 가진 행들이 하나의 그룹으로 묶인다
cf) HAVING COUNT(*) >=2: 그룹화된 데이터에 대한 조건 지정
Alias 별칭 관련 주의사항
1) 별칭 설정 시, 띄어쓰기가 있으면 ' ' 필수2) 별칭을 다른 절에서 쓸 때는 ' ' 필요 X but 띄어쓰기가 있으면, ` `(백틱스)로 묶어주기
문자열 접합
CONCAT('Hello, ', 'World', '!')의 반환값 : Hello, World!
두 개 이상의 문자열 인수를 입력으로 받아 순서대로 이어 붙여 문자열로 결합
⇒ 정수가 들어가도, CONCAT 내부적으로 문자열 변환 후 이어붙임