프로그래머스에서 SQL 문제를 풀면서 나왔던 함수들을 정리해 보았다. 

 

☑️SQL 함수/필터링 기능 예시

 

 IS NULL / IS NOT NULL

: WHERE 컬럼명 IS NOT NULL

위 SQL문의 경우 컬럼명이 NULL이 아닌 데이터만 조회한다. 

 

 LIKE

: WHERE 컬럼명 LIKE "글자 형식"

WHERE 절의 조건으로 문자열 타입에 대해 더 구체적인 조건으로 필터링할 때 사용한다. 

예를 들어 특정 단어를 포함하는 경우에도 글자 형식을 잘 지정해서 사용할 수 있다. 아래 SQL문은 ADDRESS의 값이 서울-로 시작하는 레코드만 조회한다. 

WHERE ADDRESS LIKE "서울%"

LIKE의 자세한 사용에 대해서는 문서를 참고하자. 

LIKE는 주로 어떤 단어를 앞이나 뒤에 포함하는 레코드를 필터링할 때 많이 사용된다. 

 

"단어%" : '단어'로 시작하는 레코드

"%단어" : '단어'로 끝나는 레코드

"%단어%" : '단어'를 포함하는 레코드

 

 DATE_FORMAT

: DATE_FORMAT(컬럼명, "바꾸려는 형식")

컬럼이 날짜 타입일 경우 문제에서 요구하는 출력 형식이 따로 있을 때 주로 사용한다. 

예를 들어 '2022-03-05 01:13:00' 인 날짜 형식을 '2022-03-05'로 출력해야 하는 경우가 있다. 

두 번째 매개변수에서는 날짜 타입의 컬럼명을 어떤 형식으로 출력하고 싶은지를 명시해 준다. 자세한 정보는 공식문서에 나와 있지만 많이 사용되는 값들은 정해져 있다. 대소문자가 구별되니 주의하자. 

 

%Y: 연도를 4자리 값으로 출력

%m: 월을 숫자로 출력

%d: 일을 숫자로 출력

 

앞선 예시처럼 출력하려면 다음과 같이 입력하면 된다. 

DATE_FORMAT(DATETIME, "%Y-%m-%d")

 

 

✅ YEAR, MONTH, DAY

: YEAR(컬럼명), MONTH(컬럼명), DAY(컬럼명)

날짜 데이터에서 년, 월, 일 데이터를 추출해 준다. 시간이나 분 정보를 추출해 주는 함수(HOUR, MINUTE 등)도 있지만 위의 함수들이 더 많이 쓰인다. 

# DATETIME = '2022-05-26'
YEAR(DATETIME)	# 2022
MONTH(DATETIME) # 5
DAY(DATETIME) # 26

 

 

 IFNULL

: IFNULL(컬럼명, "출력할 값")

NULL값인 데이터를 다른 값으로 출력해 준다. 

아래 예시의 경우 NAME의 값이 NULL이면 "NO NAME"으로, NULL이 아니면 원래 값으로 출력한다. 

IFNULL(NAME, "NO NAME")

 

MAX, MIN

: MAX(컬럼명), MIN(컬럼명)

해당 컬럼에서 가장 큰 값, 가장 작은 값을 출력해 준다. 

아래 예시의 경우 STUDENT_SCORE 테이블의 SCORE 컬럼 데이터들 중 가장 큰 값을 출력하고, 이때 컬럼 이름은 MAX_SCORE로 출력한다. 

SELECT MAX(SCORE) AS MAX_SCORE FROM STUDENT_SCORE

 

 SUM, AVG, COUNT

: SUM(컬럼명), AVG(컬럼명), COUNT(컬럼명)

해당 컬럼의 합, 평균, 레코드 개수를 구할 수 있다. 

아래 예시의 경우 STUDENT_SCORE 테이블의 SCORE 컬럼 데이터들의 평균값을 반올림한 값을 보여주고, 컬럼 이름은 AVG_SCORE로 출력한다. 

SELECT ROUND(AVG(SCORE)) AS AVG_SCORE FROM STUDENT_SCORE

 

참고한 포스트

https://www.w3schools.com/sql/sql_like.asp

 

'server-side > SQL' 카테고리의 다른 글

SQL 기본 문법 정리  (0) 2023.03.05

☑️TIP

더 많은 SQL 문제들 찾아보기

 

☑️계기

원래 SQL과는 접점이 없는 사람이었는데 이번에 코테를 준비하면서 처음 SQL 문제를 접하게 되었다. 단기간에 공부하는 데는 프로그래머스의 SQL 고득점 Kit가 효과적이라는 말을 들어서 무작정 연습문제를 풀면서 공부했다. 

 

그 결과 어렵고 복잡한 문제는 아직 못 풀지만 초급-초중급 난이도까지의 문제는 간단한 문법으로 풀리는 것 같아서 까먹기 전에 내용을 정리해 보려고 한다. 

 

SQL 문법 정리

1. 기본 조회

특정 조건을 걸지 않고 모든 데이터를 조회한다. 

 

✅ 전체 컬럼의 전체 데이터 조회

: SELECT * FROM 테이블명

데이터베이스의 모든 컬럼에 대해서 모든 데이터를 조회하는 SQL문이다.

*을 사용하면 모든 컬럼 이름을 나열하지 않고 전체를 불러올 수 있다. 

SELECT * FROM ANIMAL_INS

 

 

✅ 특정 컬럼의 전체 데이터 조회

: SELECT 컬럼1, 컬럼2, ... 컬럼N FROM 테이블명

해당 SQL문을 실행하면 USER_INFO 테이블의 컬럼 중에서 USER_ID, USER_NAME, USER_ADDRESS 컬럼의 데이터만 불러온다. 

SELECT USER_ID, USER_NAME, USER_ADDRESS FROM USER_INFO

 

✅ 특정 컬럼의 이름을 바꿔서 조회

: SELECT 컬럼1 AS C1, 컬럼2 AS C2, ... 컬럼N AS CN FROM 테이블명

위의 SQL문과 리턴하는 데이터는 같지만 리턴할 때의 컬럼 명이 다르다. 

SELECT USER_ID AS UID, USER_NAME AS UNAME, USER_ADDRESS AS UADDRESS FROM USER_INFO

보통 컬럼 이름을 그냥 바꾸지는 않는다. 컬럼에 다른 SQL 함수를 적용하면 컬럼 이름이 변경되는데, 다시 원래 컬럼 이름으로 출력하기 위해서도 사용한다. 

 

2. 조건 추가

주어진 조건에 맞는 데이터만 불러온다. 

WHERE 키워드를 사용하고, SELECT와 FROM 바로 뒤에 조건을 붙인다. 

 

✅ 조건 명시하기

: SELECT 컬럼명 FROM 테이블명 WHERE 조건

아래 예시의 경우, 전체 데이터들 중 나이가 9세 이상인 유저 데이터만 불러온다. 

SELECT UID, UNAME, UAGE FROM USER_INFO WHERE UAGE >= 9

 

✅ 조건 여러 개를 동시에 만족하는 데이터 추출하기

: SELECT 컬럼명 FROM 테이블명 WHERE 조건1 AND 조건2

아래 예시의 경우, ID가 10 미만이고 나이가 9세 이상인 유저 데이터만 불러온다. 

SELECT UID, UNAME, UAGE FROM USER_INFO WHERE UID < 10 AND UAGE >= 9

 

✅ 조건 여러 개 중 하나 이상 만족하는 데이터 추출하기

: SELECT 컬럼명 FROM 테이블명 WHERE 조건1 OR 조건2

아래 예시의 경우, ID가 10 미만이거나 나이가 9세 이상인 유저 데이터만 불러온다.

SELECT UID, UNAME, UAGE FROM USER_INFO WHERE UID < 10 OR UAGE >= 9

 

3. 정렬

ORDER BY 키워드를 사용한다. 여러 컬럼을 기준으로 오름차순(ASC) 또는 내림차순(DESC)으로 정렬할 수 있다. 

지정된 순서가 있는 것은 아니지만 보통 맨 마지막에 쓰는 것이 일반적이다. 

: ORDER BY 컬럼A ASC, 컬럼B DESC

위의 커맨드는 컬럼A의 값을 오름차순대로 정렬한 다음, 컬럼A의 값이 같은 데이터가 있는 경우 컬럼B의 값을 기준으로 내림차순으로 정렬해 준다.

 

4. 그룹별로 데이터 묶기

GROUP BY 키워드를 사용한다.

데이터를 추출한 뒤 특정 컬럼의 값이 같은 레코드들을 묶을 수도 있다. 보통 컬럼별로 그룹을 묶어서 제시할 때 사용한다. 

: GROUP BY 컬럼명

GROUP BY를 사용하는 경우 맨 처음에 SELECT 뒤에는 일반 컬럼명보다는 SQL 함수를 적용한 컬럼들이 오는 경우가 많다. 보통 그룹별로 데이터를 제시할 때는 그룹별 데이터의 평균, 합, 최댓값 등을 제시하기 때문이다. 

 

아래 예시에서는 상품코드별로 가장 비싼 상품의 가격을 조회한다. 

SELECT PRODUCT_CODE, MAX(PRICE)
FROM PRODUCTS
GROUP BY PRODUCT_CODE

 

5. 여러 개의 테이블 데이터 묶기

JOIN 키워드를 사용한다. 

테이블 A와 테이블 B가 있을 때, 두 테이블이 같은 컬럼을 공유하는 경우 사용할 수 있다. 

:

SELECT A.컬럼1, B.컬럼2

FROM 테이블A (AS) A

JOIN 테이블B (AS) B ON A.공유컬럼 = B.공유컬럼

위의 SQL문은 '공유컬럼'이라는 같은 컬럼을 공유한 테이블A와 테이블B를 조인해서 A의 컬럼1과 B의 컬럼2에 대한 데이터를 조회한다. 

 

아래 SQL문은 BOOK_ID라는 컬럼을 공유하는 BOOK_INFO 테이블과 BORROW_INFO 테이블을 조인한 뒤, BOOK_NAME과 BORROW_ID 두 컬럼에 대한 데이터를 조회한다. 

SELECT A.BOOK_NAME, B.BORROW_ID
FROM BOOK_INFO A
JOIN BORROW_INFO B ON A.BOOK_ID = B.BOOK_ID

 

사실 JOIN에 대해서는 INNER JOIN, OUTER JOIN 등 여러 가지가 있고 내용이 많지만 초중급 단계의 문제는 그 이상을 다루지는 않았던 것 같다. 기회가 된다면 JOIN 기능에 대해서도 자세히 정리해 보고 싶다. 

 

6. 그룹별 데이터 필터링

HAVING 키워드를 사용한다. 

필터링이라는 점에서 WHERE과 기능이 유사하지만, HAVING은 항상 GROUP BY 이후에 사용한다는 점이 다르다. 

즉 WHERE 문은 데이터를 그룹별로 나타내기 전에, 어떤 조건의 데이터를 GROUP BY에 적용할지를 필터링한다. 

반면 HAVING문은 데이터를 그룹별로 나타낸 이후, 어떤 조건의 그룹화된 데이터를 최종 조회할지를 필터링한다. 

WHERE과 HAVING의 자세한 차이는 여기를 참고하자. 

 

 

참고한 포스트

https://cocoon1787.tistory.com/684

https://www.javatpoint.com/where-vs-having

https://www.w3schools.com/sql/func_mysql_date_format.asp

 

'server-side > SQL' 카테고리의 다른 글

SQL 함수 정리  (0) 2023.03.05

+ Recent posts