테이블 조회하기

테이블 조회하기 (Querying a Table)

이제 데이터를 넣었으니, 그 데이터를 다시 꺼내 보는 방법을 배울 차례예요. 테이블에서 데이터를 가져오는 것을 "쿼리(query)한다"고 말하는데, 이를 위해 SQL의 SELECT 문을 사용해요.

출처: PostgreSQL 공식 문서 — 2.5. Querying a Table

SELECT 문은 크게 세 부분으로 나뉘어요.

  • 선택 목록(select list) — 어떤 컬럼을 돌려받을지 나열하는 부분
  • 테이블 목록(table list) — 어느 테이블에서 데이터를 가져올지 나열하는 부분
  • 선택적 조건(qualification) — 어떤 제한을 걸지 지정하는 부분

weather 테이블의 모든 행을 가져오고 싶다면 이렇게 입력해요.

SELECT * FROM weather;

여기서 *는 **"모든 컬럼"**을 뜻하는 약칭이에요. 그래서 위 결과는 아래와 완전히 동일해요.

SELECT city, temp_lo, temp_hi, prcp, date FROM weather;

출력은 다음과 같을 거예요.

     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
 San Francisco |      46 |      50 | 0.25 | 1994-11-27
 San Francisco |      43 |      57 |    0 | 1994-11-29
 Hayward       |      37 |      54 |      | 1994-11-29
(3 rows)

꿀팁: SELECT *는 간단히 훑어볼 때는 유용하지만, 운영 코드에서는 나쁜 습관으로 널리 여겨져요. 왜냐하면 나중에 테이블에 컬럼이 하나 추가되면 결과도 함께 바뀌어 버리니까요.

단순 컬럼만이 아니라 표현식도!

선택 목록에는 단순한 컬럼 참조뿐 아니라 **표현식(expression)**도 쓸 수 있어요. 예를 들어 다음과 같이 하면 돼요.

SELECT city, (temp_hi+temp_lo)/2 AS temp_avg, date FROM weather;

결과는 이렇게 나와요.

     city      | temp_avg |    date
---------------+----------+------------
 San Francisco |       48 | 1994-11-27
 San Francisco |       50 | 1994-11-29
 Hayward       |       45 | 1994-11-29
(3 rows)

AS 절은 출력 컬럼의 이름을 다시 지어주는(relabel) 데 쓰여요. (AS 절은 없어도 되는 선택 사항이에요.) 여기서는 temp_avg라는 이름으로 평균 온도가 출력되는 걸 볼 수 있어요.

WHERE로 원하는 행만 골라내기

쿼리에 WHERE을 붙이면 어떤 행을 원하는지 조건을 걸 수 있어요. WHERE 절은 불리언(참/거짓) 표현식을 담는데, 그 불리언 표현식이 참(true)인 행들만 돌려받게 돼요. 조건 안에는 AND, OR, NOT 같은 일반적인 불리언 연산자를 쓸 수 있어요.

예를 들어 비 오는 날의 샌프란시스코 날씨를 가져오려면 이렇게 해요.

SELECT * FROM weather
    WHERE city = 'San Francisco' AND prcp > 0.0;

결과:

     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
 San Francisco |      46 |      50 | 0.25 | 1994-11-27
(1 row)

정렬해서 가져오기: ORDER BY

쿼리 결과를 정렬된 순서로 받고 싶을 수도 있어요. 그럴 땐 ORDER BY를 쓰면 돼요.

SELECT * FROM weather
    ORDER BY city;
     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
 Hayward       |      37 |      54 |      | 1994-11-29
 San Francisco |      43 |      57 |    0 | 1994-11-29
 San Francisco |      46 |      50 | 0.25 | 1994-11-27

이 예제에서는 정렬 순서가 완전히 지정되지 않아서, 샌프란시스코 두 행의 순서가 뒤바뀔 수도 있어요. 순서까지 완전히 고정하고 싶다면 아래처럼 정렬 기준을 여러 개 주면 돼요.

SELECT * FROM weather
    ORDER BY city, temp_lo;

이렇게 하면 위 결과가 항상 동일하게 나와요.

중복 제거하기: DISTINCT

쿼리 결과에서 중복된 행을 제거하고 싶을 때도 있죠. 그럴 땐 DISTINCT를 사용해요.

SELECT DISTINCT city
    FROM weather;
     city
---------------
 Hayward
 San Francisco
(2 rows)

여기서도 결과 행의 순서는 달라질 수 있어요. 항상 일관된 결과를 보장하려면 DISTINCTORDER BY를 함께 쓰면 돼요.

SELECT DISTINCT city
    FROM weather
    ORDER BY city;

참고: 옛날 PostgreSQL 버전을 포함한 일부 데이터베이스 시스템에서는 DISTINCT를 구현하면서 자동으로 행을 정렬해서 ORDER BY가 필요 없기도 했어요. 하지만 SQL 표준이 요구하는 건 아니고, 현재 PostgreSQL도 DISTINCT가 행을 정렬해 준다는 보장은 하지 않아요.

더 알아보기 (Learn more)