테이블 조회하기
테이블 조회하기 (Querying a Table)
이제 데이터를 넣었으니, 그 데이터를 다시 꺼내 보는 방법을 배울 차례예요. 테이블에서 데이터를 가져오는 것을 "쿼리(query)한다"고 말하는데, 이를 위해 SQL의 SELECT 문을 사용해요.
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)
여기서도 결과 행의 순서는 달라질 수 있어요. 항상 일관된 결과를 보장하려면 DISTINCT와 ORDER BY를 함께 쓰면 돼요.
SELECT DISTINCT city
FROM weather
ORDER BY city;
참고: 옛날 PostgreSQL 버전을 포함한 일부 데이터베이스 시스템에서는
DISTINCT를 구현하면서 자동으로 행을 정렬해서ORDER BY가 필요 없기도 했어요. 하지만 SQL 표준이 요구하는 건 아니고, 현재 PostgreSQL도DISTINCT가 행을 정렬해 준다는 보장은 하지 않아요.
더 알아보기 (Learn more)
- 2.4. 테이블에 행 채우기 (Populating a Table With Rows) — 데이터 넣기
- 2.6. 테이블 간 조인 (Joins Between Tables) — 여러 테이블 합쳐 조회하기
- SELECT (SQL 명령) — 공식 명령 레퍼런스
- 쿼리 작성 (Chapter 7. Queries) — 쿼리 심화