[SQL] SQL 코딩테스트

무1민·2023년 7월 22일
0

데이터베이스

목록 보기
6/11

1. SQL 쿼리 순서

## 적는 순서
SELECT - FROM - WHERE - GROUP BY - HAVING - ORDER BY - LIMIT

2. IN

식품분류별 가장 비싼 식품의 정보 조회하기

SELECT CATEGORY,PRICE as MAX_PRICE,PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE (PRICE) IN (SELECT MAX(PRICE) FROM FOOD_PRODUCT GROUP BY CATEGORY)
AND CATEGORY IN ('과자', '국', '김치', '식용유')
ORDER BY PRICE DESC

3. 문자열

  • 포함
'파닥%' : '파닥'으로 시작하는 문자열
'%파닥' : '파닥'으로 끝나는 문자열
'%파닥%' : '파닥'이 들어간 문자열
'_파닥' : 첫 글자 하나 있고 그 뒤에 '파닥'이 있는 문자열 (3글자)
'파닥_' : 처음에 '파닥'이 있고 맨 끝에 글자 하나 있는 문자열 (3글자)
'_파닥_' : 처음과 끝에 '파닥'이 있고, 그 가운데 '파닥'이 있는 문자열 (4글자)

ex. WHERE STRING LIKE '파닥%' (LIKE를 꼭 써주자)
  • 길이
    진짜 문자열 길이 -> CHAR_LENGTH
    Byte 길이 -> LENGTH
LENGTH('PADAKMON') => 8
LENGTH('파닥몬') => 9

CHAR_LENGTH('PADAKMON') => 8
CHAR_LENGTH('파닥몬') => 3
  • 소문자/대문자
LOWER(STR) ↔️ UPPER(STR)
  • 왼쪽/오른쪽/중간 기준 문자열 가져오기
// STR=HELLO
LEFT(STR, 2) => HE
RIGHT(STR, 2) => LO
SUBSTR(STR, 2,2) => EL
SUBSTR(STR, 시작 index, 가져올 개수)
  • 공백 제거
// LEFT
LTRIM(STR)
TRIM(LEADING FROM STR)
// RIGHT
RTRIM(STR)
TRIM(TRAILING FROM STR)
// BOTH
TRIM(STR)
  • 특정 문자 제거
// LEFT
TRIM(LEADING 지울문자열 FROM STR)
// RIGHT
TRIM(TRAILING 지울문자열 FROM STR)
// BOTH
TRIM(BOTH 지울문자열 FROM STR)

4. 조건문

  • SWITCH
CASE
...WHENTHEN의 반복
ELSE
END AS 칼럼명
SELECT ORDER_ID, PRODUCT_ID,OUT_DATE,
    CASE 
    WHEN OUT_DATE IS NULL 
    THEN '출고미정' 
    WHEN OUT_DATE<='2022-05-01' 
    THEN '출고완료' 
    ELSE '출고대기'
    END AS 출고여부
FROM FOOD_ORDER
ORDER BY ORDER_ID
  • IF
SELECT IF(조건, 참 값, 거짓 값)
  • IFNULL
// 해당 column의 값 중 NULL이 있으면, 대체값 입력
SELECT IFNULL(COLUMN, 대체값)
  • BETWEEN
SELECT ...
FROM ...
WHERE ID BETWEEN 10 AND 40

5. 숫자

  • 반올림

ROUND(숫자,반올림할 자릿수) - 숫자를 반올림할 자릿수 +1 자릿수에서 반올림
⇒ ROUND(123.3567,2) = 123.36

올림 => CEILING
내림 => FLOOR

  • 연산
// 제곱
POW(, 지수)
// 절댓값
ABS(숫자)

6. DATE

Date 관련 단위 :
초-분-시-일-주-월-분기-연
SECOND-MINUTE-HOUR-DAY-WEEK-MONTH-QUARTER-YEAR

# 각 연/월/일을 가져오기
YEAR(날짜), MONTH(날짜), DAY(날짜), DATE(날짜)

# 형 변환
1) DATE_FORMAT(날짜, 원하는 format) ex. %Y-%m-%d
2) TO_DATE(날짜, 원하는 format)

# format
Y = 2022, y=22, M=October, m=10

# 더하기/빼기
// (날짜, INTERVAL_더할/뺄 숫자_단위)
DATE_ADD(DATE, INTERVAL 1 HOUR)
DATE_SUB(DATE, INTERVAL 1 HOUR)

# 차이 구하기
DATEDIFF(날짜1, 날짜2) => '일(DAY)' 기준
TIMESTAMPDIFF(단위, 날짜1, 날짜2) => 단위 기준

7. 순위

SELECT A, B, C, RANK() OVER (ORDER BY salary DESC) "등수"
FROM TABLE;

RANK 관련 함수 3가지 (중복 순위를 어떻게 처리하냐의 차이)
1) RANK : 1-2-3-3-3-6
2) DENSE_RANK : 1-2-3-3-3-4
3) ROW_NUMBER : 1-2-3-4-5-6

8. 특정 개수 만큼 가져오기

SELECT ... FROM ...
LIMIT 가져올 개수
profile
야호

0개의 댓글