Database

프로그래머스 조건에 맞는 회원수 구하기 MySQL (BETWEEN a AND b, COUNT() )

hihiha2 2023. 11. 14. 16:42

🧷링크

문제 설명

다음은 어느 의류 쇼핑몰에 가입한 회원 정보를 담은 USER_INFO 테이블입니다. USER_INFO 테이블은 아래와 같은 구조로 되어있으며 USER_IDGENDERAGEJOINED는 각각 회원 ID, 성별, 나이, 가입일을 나타냅니다.

GENDER 컬럼은 비어있거나 0 또는 1의 값을 가지며 0인 경우 남자를, 1인 경우는 여자를 나타냅니다.


문제

USER_INFO 테이블에서 2021년에 가입한 회원 중 나이가 20세 이상 29세 이하인 회원이 몇 명인지 출력하는 SQL문을 작성해주세요.

 

 

 

🙋‍♀️ 내 생각

우선, 몇명인지 수를 세어야하기 때문에 COUNT()를 사용해야겠다고 생각했다.

COUNT()는 행의 수를 세기위해 사용하는 다중행 집계함수이다.

그리고 가입일이 2021년이고 나이가 20-29세조건을 걸기위해서 WHERE절을 사용했다.

WHERE절 뒤조건식을 적음으로써 해당하는 값만을 얻을 수 있다.

 

 

✅  내 코드

SELECT COUNT(USER_ID) AS USERS
FROM USER_INFO
WHERE (JOINED BETWEEN '2021-01-01' AND '2021-12-31') AND (AGE BETWEEN 20 AND 29);

 

제일 먼저, 

 SELECT COUNT(USER_ID) 

 FROM USER_INFO 

만 적는다. 

이렇게 하면 USER_INFO에서 데이터를 가져와서 COUNT(USER_ID)SELECT해서 테이블을 보여준다.

 

🖥 COUNT() 집계함수

COUNT()는 지정된 기준과 일치하는 행 수를 반환한다.

- 다중행 집계함수

- COUNT(*): NULL 포함 행의 수

- COUNT(표현식): NULL 제외 행의 수

 

 

SELECT는 내가 원하는 데이터를 가져와서 테이블로 보여준다.

위의 코드는 COUNT(USER_ID)를 가져오는데 COUNT는 일치하는 행 수 반환하기 때문에 200을 반환한다.

✔️ COUNT(표현식)은 NULL이 있으면 그 행을 제외한다.

1. NULL이 있어도 결과값이 NULL이 아니라는 것, 2. NULL값은 제외하고 카운트하는 것을 기억하자!

 

그런데 위의 칼럼의 이름이 COUNT(USER_ID)이다.

이것을 USERS로 바꿔주어야 한다.

이를 위해서 AS를 사용한다.

 SELECT COUNT(USER_ID) AS USERS 

 FROM USER_INFO 

 

이렇게하면 위와 같이 칼럼명이 USERS로 바뀐 것을 확인할 수 있다.

 

그러고나서, 원하는 조건을 걸어주기 위해서 WHERE을 사용한다.

이 문제에서 제시하는 조건은 2가지이다.

1. 2021년에 가입

2. 20-29세 사이

 

🖥 BETWEEN a AND b

- a와 b값 사이를 나타내는 연산자

 

 

2021년에 가입했다는 것을 연산자를 통해서 나타내면 아래와 같다.

 JOINED BETWEEN '2021-01-01' AND '2021-12-31' 

JOINED 라는 행의 조건이 '2021-01-01'과 '2021-12-31'사이라는 의미이다.

✔️ 여기서 주의할 점은 날짜를 작은 따옴표('')로 감싸야 한다는 것이다.

날짜는 데이터베이스에서 문자열 형태로 저장되기 때문에 문자열로 비교해야 한다.

 

20-29세 사이는 아래와 같이 나타낼 수 있다.

 AGE BETWEEN 20 AND 29 

 

위의 두 코드를 바탕으로 조건식을 WHERE절로 적는다.

두 값을 모두 동시에 만족해야 하기때문에 두 개의 조건을 AND로 연결한다.

 WHERE (JOINED BETWEEN '2021-01-01' AND '2021-12-31') AND (AGE BETWEEN 20 AND 29);

➡️ 조건: JOINED의 날짜가 2021-01-01에서 2021-12-31사이이고, AGE가 20-29사이라는 의미.

 

코드를 실행해보면, 조건이 적용된 결과가 나온다.

 

다시 전체 코드를 보면 아래와 같다.

SELECT COUNT(USER_ID) AS USERS
FROM USER_INFO
WHERE (JOINED BETWEEN '2021-01-01' AND '2021-12-31') AND (AGE BETWEEN 20 AND 29);

 

 

🖥  BETWEEN a AND b비교연산자 >=, <=

BETWEEN a AND b 대신, 비교연산자 >=, <=를 써도 같은 값이 나온다.

위의 코드를 비교연산자를 사용한 코드로 바꾸면 아래와 같다.

SELECT COUNT(USER_ID) AS USERS
FROM USER_INFO
WHERE (JOINED>='2021-01-01' AND JOINED<='2021-12-31') AND (AGE>=20 AND AGE<=29);

결과값은 같지만, 위의 BETWEEN AND를 사용한 것보다 가독성이 떨어지는 것 같아서 나는 BETWEEN을 사용했다.

 

 

 

🙋‍♀️ 내 생각

SELECT를 통해서 원하는 데이터를 가져오는데, WHERE절을 통해서 그 데이터중에서도 조건을 걸어서 원하는 값만을 가져온다.

SQL을 공부하고 있는데 가장 많이 사용해야하는 것이 바로 SELECT문이다.

이 문제를 통해서 SELECT문을 연습하고, 또 그중에서도 자주 쓰는 다중행 집계함수인 COUNT()도 연습할 수 있었다.

WHERE절을 통해서 특정 조건을 걸어주는 것도 자주 쓰는 것이기때문에 익숙해져야겠다.

특히 날짜데이터를 가공하는 부분이 아직 어려워서 더 공부해봐야겠다.