공부 기록장

프로그래머스 SQL 고득점 Kit의 문제들 풀면서 헷갈렸던 부분 정리 본문

언어/SQL

프로그래머스 SQL 고득점 Kit의 문제들 풀면서 헷갈렸던 부분 정리

빛나무 2024. 7. 27. 17:07

날짜 포매팅

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 내부적으로 문자열 변환 후 이어붙임