오늘은 PostgreSQL에서 진짜 강력한 도구 중 하나인 배열에 대해 좀 얘기해볼게. 배열은 한 컬럼 안에 같은 타입의 값 리스트를 저장할 수 있게 해줘. 더 자세한 건 다음 단계에서 다룰 거야.
“배열”이라고 하면 바로 리스트가 떠오르지? 마치 장 보러 가기 전에 쇼핑 리스트 적는 것처럼: 사과, 바나나, 우유, 빵. PostgreSQL에서 배열은 이런 리스트랑 비슷해. 여러 값을 한 필드에 저장할 수 있고, 각 값은 같은 데이터 타입이야. 예를 들어 숫자 배열, 텍스트 배열, 날짜 배열 등등.
예시 몇 개 보여줄게.
숫자 배열:
{1, 2, 3, 4}
문자열 배열:
{"사과", "바나나", "체리"}
날짜 배열:
{2024-10-01, 2024-10-02, 2024-10-03}
배열을 쓰면 여러 값을 한 필드에 넣을 수 있어서 테이블 공간도 아끼고, 쿼리도 더 유연하게 할 수 있어.
배열이 왜 필요할까? 주요 장점
데이터를 컴팩트하게 저장: 여러 값을 한 필드에 저장할 수 있어. 서로 논리적으로 연결된 데이터에 특히 좋아. 예를 들어, 글의 태그 리스트나 학생의 점수 리스트 같은 거. 태그 두 개 때문에 별도 테이블 만들기 귀찮잖아?
쿼리 편의성: 배열 덕분에 한 필드에서 바로 값 리스트를 꺼낼 수 있고, 배열의 특정 요소도 쉽게 다룰 수 있어.
성능: 어떤 상황에서는 관련 데이터를 위한 추가 테이블을 만들 필요가 없어서 DB 구조가 단순해지고 개발도 빨라져. 이거 꽤 기분 좋지.
PostgreSQL에서 배열 다루기
SELECT에서 배열 만들기
배열을 만들 때는 ARRAY[] 생성자를 써. 예시 볼래?
-- 숫자 배열 예시
SELECT ARRAY[1, 2, 3, 4];
-- 문자열 배열 예시
SELECT ARRAY['사과', '바나나', '체리'];
너무 쉽지? 이제 테이블을 만들어서 뭔가 뽑아보자.
배열 컬럼이 있는 테이블 만들기
먼저, 컬럼 중 하나가 배열인 테이블을 만들어보자.
| id | name - VARCHAR(50) | subjects - TEXT[] |
|---|---|---|
| 1 | Alex | {수학,물리} |
| 2 | Maria | {화학,생물,영어} |
| 3 | Peter | {정보} |
결과를 한번 볼까:
SELECT * FROM students;
| id | name | subjects |
|---|---|---|
| 1 | Alex | {수학,물리} |
| 2 | Maria | {화학,생물,영어} |
| 3 | Peter | {정보} |
배열에서 데이터 꺼내기
PostgreSQL에서는 배열에서 데이터를 꺼낼 수 있는 함수랑 연산자가 몇 개 있어.
배열 요소 꺼내기
배열에서 인덱스로 값을 꺼낼 때는 대괄호 []를 써. 참고로 인덱스는 1부터 시작해(대부분 프로그래밍 언어는 0부터 시작하는데 PostgreSQL은 1이야).
-- 각 학생의 첫 번째 과목 가져오기
SELECT name, subjects[1] AS 첫_과목 FROM students;
결과는 이렇게 나와:
| name | 첫_과목 |
|---|---|
| Alex | 수학 |
| Maria | 화학 |
| Peter | 정보 |
배열 전체 꺼내기
배열의 모든 요소를 가져오려면 그냥 SELECT 쓰면 돼:
SELECT name, subjects FROM students;
배열 안에서 값 찾기
가끔 배열에 특정 값이 있는지 확인하고 싶을 때가 있지. 이럴 땐 ANY 연산자를 써.
-- "수학"을 배우는 학생 찾기
SELECT name
FROM students
WHERE '수학' = ANY(subjects);
쿼리 결과:
| name |
|---|
| Alex |
PostgreSQL에는 배열 다루는 함수랑 연산자가 진짜 많은데, 이건 다음 단계에서 더 배울 거야 :P
배열 쓸 때 흔히 하는 실수
0과 1 인덱스 헷갈리기.
PostgreSQL에서 배열 인덱스는 1부터 시작해. Python이나 JavaScript 같은 언어에 익숙하면 헷갈릴 수 있어.
빈 배열.
빈 배열 {}이랑 NULL은 PostgreSQL에서 완전 다른 거야. 배열 비교할 때 이거 헷갈리지 마.
큰 배열 다루기.
엄청 많은 데이터를 배열에 넣으면 쿼리 속도가 느려질 수 있어. 배열은 소량 데이터에만 쓰는 게 좋아.
GO TO FULL VERSION