2.5. 테이블에 있는 자료 조회하기

입력한 자료를 찾아보려면, 테이블을 질의해 보아야 하는데, 이것을 데이터베이스 용어로 쿼리라고 합니다. (주, 질의, 쿼리 같은 낯선 용어들이 쓰이지만, 여기서는 그냥 자료 조회라고 생각하고 넘어가면 됩니다) 이런 자료 조회를 할 때 사용하는 SQL 구문이 SELECT 구문입니다. 이 구문은 크게 세 부분으로 구성되는데, 첫번째는 원하는 자료의 칼럼들을 지정하고, 두번째는 그 칼럼들이 있는 테이블들 - from 절이라고 하고, 그 다음은 원하는 부분을 지정하는 조건절 - where 절이라고 합니다. 이 where 절은 선택적으로 사용됩니다. where 절이 생략되면 지정한 테이블의 모든 자료를 보여줍니다. 예제로 weather 테이블에 저장된 모든 자료를 보려면 다음과 같이 입력합니다.

SELECT * FROM weather;

여기서 * 문자는 "모든 칼럼"을 의미합니다. [1] 그래서, 아래 쿼리와 같은 결과를 보여줍니다:

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 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 예약어는 생략되어도 되고, 이것은 그 칼럼의 새로운 이름을 지정할 때 사용합니다.

쿼리 문장은 WHERE 절을 사용해서, 검색 결과의 조건을 지정할 수 있습니다. WHERE 절에 사용할 조건은 불린 조건(참이냐 거짓이냐) 들의 집합으로 구성됩니다. 일반적으로 불린 조건은 불린 연산자(AND, OR, NOT)를 이용해서, WHERE 절 전체의 조건을 구성합니다. 다음 예제는 San Francisco에서 비온 날을 찾는 구문입니다:

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)

출력 순서를 바꾸고 싶다면, 다음과 같이 정렬 조건을 추가합니다:

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;

같은 값에 대한 중복을 없애려면, 다음과 같이 합니다:

SELECT DISTINCT city
    FROM weather;

     city
---------------
 Hayward
 San Francisco
(2 rows)

다시, 이 쿼리의 결과에서 도시 이름별 정렬은 되지 않습니다. 그래서 정렬이 필요하다면, DISTINCT 조건과 함께, ORDER BY 절도 함께 사용해야 합니다: [2]

SELECT DISTINCT city
    FROM weather
    ORDER BY city;

주석

[1]

SELECT * 구문은 임시로 조회할 때 유용하게 사용되지, 실재 응용 프로그램 내에서 사용할 때는 고려해야할 사항이 많습니다. 왜냐하면, 테이블의 칼럼이 있다가 없어지기도 하고, 그 칼럼이 바뀌기도 해서 원하는 결과가 항상 같을 수 없기 때문입니다.

[2]

몇 데이터베이스 시스템과, PostgreSQL 오래된 버전에서는 DISTINCT 조건을 사용하면 자동으로 그 칼럼에 대한 ORDER BY 조건이 적용되어 굳이 ORDER BY 절을 사용하지 않아도 되지만, 최근 PostgreSQL 버전에서는 DISTINCT 조건 만으로는 그 칼럼의 정렬을 보장하지 않습니다.