DB 다루면서 제일 많이 하는 시나리오 중 하나가 바로 리포트용 데이터 준비야. 상상해봐: 너가 대학교에서 일하는데, 너 상사(물론 SQL은 1도 모름)가 학생 리스트를 만들어 달라고 해. 이름이랑 성 합쳐서 보여주고, 생일은 DD-MM-YYYY 포맷으로 해달래. 뭔 말인지 알겠지? 데이터를 이쁘게 만들어야 해. 그리고 SQL이 바로 우리의 든든한 친구지.
예시 1: 이름과 성 합치기
먼저 우리 students 테이블에서 이름(first_name)이랑 성(last_name)을 합쳐보자.
SELECT
CONCAT(first_name, ' ', last_name) AS full_name
FROM
students;
여기서 뭐가 일어나냐면?
CONCAT()는 문자열을 합쳐주는 함수야. 이름이랑 성 사이에 공백 하나 넣어서 보기 쉽게 만든 거지.- 결과는
full_name이라는 새 컬럼에 저장돼.
결과는 이렇게 나올 수 있어:
| full_name |
|---|
| Otto Art |
| Anna Song |
| Pol Mac |
예시 2: 날짜 포매팅
이제 쿼리에 생일 포매팅도 추가해보자.
SELECT
CONCAT(first_name, ' ', last_name) AS full_name,
TO_CHAR(birth_date, 'DD-MM-YYYY') AS formatted_birth_date
FROM
students;
여기서 새로 나온 건:
TO_CHAR()함수를birth_date필드에 썼어.'DD-MM-YYYY'포맷은 날짜를 보기 좋게 바꿔줘 (예:25-12-2001).
결과:
| full_name | formatted_birth_date |
|---|---|
| Otto Art | 12-04-1995 |
| Anna Song | 03-08-1996 |
| Pol Mac | 21-11-1997 |
짜잔! 이제 이쁜 리포트가 완성됐어.
데이터 내보내기용 포매팅
예를 들어, 네 동료가 주문 데이터를 CSV 파일로 뽑아서 Excel에서 쓰고 싶어해. 근데 DB에 저장된 데이터 포맷이 불편해서, 영업팀에서 원하는 모양으로 바꿔달라고 하지. 예를 들어 total_price 필드 대신, 가격을 $100.00 이런 식으로 보고 싶대.
예시 3: 숫자를 화폐 포맷으로 변환
orders 테이블에서 주문 데이터를 내보내기 좋게 만들어보자:
SELECT
order_id,
TO_CHAR(total_price, 'FM$999,999.00') AS formatted_price
FROM
orders;
TO_CHAR()가 여기서 하는 일은?
FM(Fill Mode)은 쓸데없는 공백을 없애줘.$는 화폐 기호를 붙여줘.999,999.00은 천 단위 구분자랑 소수점 둘째 자리까지 포맷을 지정해.
결과:
| order_id | formatted_price |
|---|---|
| 1 | $1,000.00 |
| 2 | $2,500.50 |
| 3 | $10.00 |
이제 네 동료가 Excel로 데이터 쉽게 가져가서 회의 때 너 칭찬할 거야.
최종 과제
여기서부터 진짜 재밌는 부분! 지금까지 배운 거 다 합쳐보자.
과제
students 테이블에서 쿼리를 만들어서:
- 이름과 성을
full_name컬럼 하나로 합치기 - 생일을
DD-MM-YYYY포맷으로 변환 - 학생의 현재 나이 보여주기
쿼리는 대충 이렇게 생겼을 거야:
SELECT
CONCAT(first_name, ' ', last_name) AS full_name,
TO_CHAR(birth_date, 'DD-MM-YYYY') AS formatted_birth_date,
DATE_PART('year', AGE(birth_date)) AS age
FROM
students;
새로 나온 부분:
AGE(birth_date)는 오늘 날짜랑 생일 사이의 간격을 반환하는데, 연, 월, 일 형식이야.DATE_PART('year', AGE(birth_date))는 그 중에서 연도만 뽑아와.
결과:
| full_name | formatted_birth_date | age |
|---|---|---|
| Otto Art | 12-04-1995 | 28 |
| Anna Song | 03-08-1996 | 27 |
| Pol Mac | 21-11-1997 | 25 |
이런 리포트면 까다로운 동료들도 만족할걸?
특정 조건을 위한 포매팅
가끔은 포매팅이 조건이나 필터링에 필요할 때도 있어. 예를 들어, 이번 달에 생일인 학생만 뽑아보자.
예시 4: 월별 필터링
SELECT
CONCAT(first_name, ' ', last_name) AS full_name,
TO_CHAR(birth_date, 'DD-MM-YYYY') AS formatted_birth_date
FROM
students
WHERE
DATE_PART('month', birth_date) = DATE_PART('month', CURRENT_DATE);
이게 어떻게 동작하냐면?
DATE_PART('month', birth_date)는 생일에서 월만 뽑아와.CURRENT_DATE는 오늘 날짜고, 거기서도DATE_PART()로 월만 가져와서 비교하는 거지.
포매팅과 정렬 합치기
이제 배운 거 다 합쳐서 정렬까지 해보자. 예를 들어, 학생들을 생일 순으로 정렬해서 리스트 만들어보자.
예시 5: 생일로 정렬
SELECT
CONCAT(first_name, ' ', last_name) AS full_name,
TO_CHAR(birth_date, 'DD-MM-YYYY') AS formatted_birth_date
FROM
students
ORDER BY
birth_date ASC;
ASC 오름차순 정렬은 나이 많은 학생부터 보여주고, DESC 내림차순은 젊은 학생부터 보여줘.
유니크 값과 합치기
마지막으로 별표 문제! 우리 대학에 여러 도시 캠퍼스가 있다고 치고, 학생들이 사는 도시를 유니크하게, 그리고 알파벳 순으로 뽑아보자.
예시 6: 유니크 값과 정렬
SELECT DISTINCT
city
FROM
students
ORDER BY
city ASC;
DISTINCT가 하는 일은?
중복되는 값은 빼고, 각 도시를 한 번씩만 결과에 보여줘.
이게 왜 필요하냐고?
편리함과 이쁨. 데이터가 이쁘게 정리돼 있으면 일하기도 쉽고, 상사도 질문 덜 해.
실전 대비. 자동으로 리포트 만들고, 내보내기도 하고, 프레젠테이션도 멋지게 할 수 있어.
너의 가치 상승. SQL은 단순히 데이터만 다루는 게 아니야. 데이터를 이해하기 쉽고 쓸모 있게 만드는 거지.
이제 배운 걸로 그냥 쿼리만 쓰지 말고, 진짜 작품을 만들어봐! 다음 강의에서 PostgreSQL의 마법을 더 깊게 파볼 거야.
GO TO FULL VERSION