DB

[MySQL] 자주 나오는 문법 정리

연듀 2023. 2. 25. 11:05

프로그래머스 고득점 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