프로그래머스 고득점 KIT 문제를 풀어보면서,
자주 나오는 MySQL 문법들을 정리해보았다.
LIMIIT
결과 개수 제한
ORDER BY ID
LIMIT 1 # 가장 상위 1개만을 조회한다.
* LIMIT 0, 3: 상위 0번째부터 3번째까지의 정보 조회
정렬
우선순위 별 다중 정렬
ORDER BY NAME, ID DESC
이름 오름차순 정렬, 이름이 같으면 ID 내림차순 정렬
LIKE
부분 일치
WHERE NAME LIKE 'A%' # A로 시작하는 NAME
WHERE NAME LIKE '%A' # A로 끝나는 NAME
WHERE NAME LIKE '%A%' # A가 포함된 NAME
DATE_FORMAT
날짜 형식 지정
SELECT DATE_FORMAT(DATE_TIME, '%Y-%m-%d')
날짜를 '2023-02-24' 형식으로 지정
DATEDIFF
두 날짜간의 일 차이 반환
SELECT DATEDIFF(END_DATE, START_DATE)+1
기간을 구하려면 +1을 해야한다.
SELECT IF(DATEDIFF(START_DATE, END_DATE) >=29, '장기 대여', '단기 대여') RENT_TYPE
대여 기간이 30일 이상이면 장기 대여, 아니면 단기 대여
IN
여러 값을 OR 관계로 묶어 나열하는 조건 대신 사용
SELECT WHERE NAME IN ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')
IFNULL
NULL인 컬럼값 처리
SELECT IFNULL(TLNO,"NONE") AS TLNO
TLNO값이 NULL이면 "NONE" 으로 표시
DISTINCT
중복 제거
SELECT COUNT(DISTINCT NAME) COUNT
중복된 NAME 제거하여 카운트
SUM, AVG, MAX, COUNT
집계 함수
SELECT AVG(DAILY_FEE) # 컬럼 내 레코드 값의 평균
SELECT SUM(DAILY_FEE) # 합
SELECT MAX(DAILY_FEE) # 최대값
SELECT COUNT(DAILY_FEE) # 해당 컬럼의 행의 수
ROUND
지정한 소수점 자리로 반올림
SELECT ROUND(3456.123) # 3456
SELECT ROUND(3456.123 ,1) # 3456.1
SELECT ROUND(3456.123 ,-1) # 3460
SELECT ROUND(3456.123 ,-2) # 3500
TRUNCATE
숫자를 버릴 자리수 아래로 버림
SELECT TRUNCATE(3456.1234567 ,1) # 3456.1
SELECT TRUNCATE(3456.1234567 ,4) # 3456.1234
SELECT TRUNCATE(3456.1234567 ,-1) # 3450
SELECT TRUNCATE(3456.1234567 ,-2) # 3400
IF
조건문
SELECT IF(SEX_UPON_INTAKE LIKE '%Spayed%', 'O', 'X') AS '중성화'
IF문 안에 IF문을 쓸 수도 있다.
SELECT IF(OUT_DATE <= '2022-05-01', '출고완료', IF(OUT_DATE IS NULL, '출고미정','출고대기')) AS '출고여부'
5월 1일까지 출고 완료로, 이후 날짜는 출고대기로 미정이면 출고미정으로 출력
CASE
조건문
SELECT
(CASE WHEN (SEX_UPON_INTAKE LIKE '%Spayed%')
THEN 'O' ELSE 'X'
END) AS '중성화'
-------------------------------
CASE
WHEN 조건
THEN '반환 값'
WHEN 조건
THEN '반환 값'
ELSE 'WHEN 조건에 해당 안되는 경우 반환 값'
END
조건에 맞으면 O, 안맞으면 X 출력
GROUP BY
특정 컬럼을 기준으로 그룹을 생성
SELECT USER_ID, PRODUCT_ID FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) >= 2
GROUP BY: 특정 컬럼을 그룹화
HAVING: 특정 컬럼을 그룹화한 결과에 조건을 검
JOIN
INNER JOIN
양쪽 테이블 모두에서 일치하는 레코드를 반환
SELECT F.FLAVOR
FROM FIRST_HALF F
JOIN ICECREAM_INFO I
ON F.FLAVOR = I.FLAVOR # 조건
LEFT JOIN
왼쪽 테이블의 모든 레코드와 오른쪽 테이블의 일치하는 레코드 반환
오른쪽에 일치하는 레코드 없으면 오른쪽 결과는 NULL
SELECT OUTS.ANIMAL_ID, OUTS.NAME
FROM ANIMAL_OUTS OUTS
LEFT OUTER JOIN ANIMAL_INS INS
ON OUTS.ANIMAL_ID = INS.ANIMAL_ID
RIGHT JOIN
오른쪽 테이블의 모든 레코드와 왼쪽 테이블의 일치하는 레코드 반환
왼쪽에 일치하는 레코드 없으면 왼쪽 결과는 NULL
SELECT OUTS.ANIMAL_ID, OUTS.NAME
FROM ANIMAL_INS INS
RIGHT OUTER JOIN ANIMAL_OUTS OUTS
ON OUTS.ANIMAL_ID = INS.ANIMAL_ID
UNION
2개 이상 테이블의 존재하는 같은 컬럼을 하나의 쿼리로 추출
SELECT SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
UNION ALL
SELECT SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
FROM OFFLINE_SALE
*SELECT하는 컬럼의 종류가 일치해야 한다.
UNION은 중복되지 않은 값만 추출해주고,
UNION ALL은 중복 허용하고 모든 값을 추출한다.
WITH
임시 테이블 생성
WITH TEMP_TABLE AS
(
SELECT NAME, count(NAME)
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME
ORDER BY NAME
)
SELECT * FROM TEMP_TABLE
WHERE COUNT > 1
'DB' 카테고리의 다른 글
[MYSQL] 같지 않음을 나타내는 부정 연산자(!=, NOT, <>) (0) | 2023.03.27 |
---|---|
[MySQL] 문자열 관련 함수 (0) | 2023.03.04 |
[MySQL] 프로그래머스 - 상품을 구매한 회원 비율 구하기(JOIN, DISTINCT) (0) | 2023.02.23 |
[MySQL] 프로그래머스 - 년, 월, 성별 별 상품 구매 회원 수 구하기 (0) | 2023.02.23 |
[MySQL] 프로그래머스 - 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (0) | 2023.02.22 |