문제 설명
다음은 어느 의류 쇼핑몰에 가입한 회원 정보를 담은 USER_INFO 테이블입니다. USER_INFO 테이블은 아래와 같은 구조로 되어있으며 USER_ID, GENDER, AGE, JOINED는 각각 회원 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절을 통해서 특정 조건을 걸어주는 것도 자주 쓰는 것이기때문에 익숙해져야겠다.
특히 날짜데이터를 가공하는 부분이 아직 어려워서 더 공부해봐야겠다.
'Database' 카테고리의 다른 글
프로그래머스 상위 n개 레코드 MySQL, Oracle, SQL Server (원하는 만큼의 행의 수를 가져오고 싶을 때 / LIMIT, ROWNUM, TOP ) (1) | 2023.11.14 |
---|