데이터베이스 일반 2강. 쿼리와 SQL
쿼리는 데이터를 저장하지 않습니다. 질문만 저장하고 답은 열 때마다 새로 만듭니다.
풀고 시작
질문을 저장한다는 발상
엑셀에서 필터를 걸어 뽑은 결과를 다른 시트에 복사해 두면, 원본이 바뀌어도 그 사본은 그대로입니다. 어제의 답이 오늘도 남아 있죠.
액세스의 쿼리(query) 는 다르게 접근합니다. 결과를 저장하지 않고 질문을 저장합니다. "매출이 100만 원을 넘는 주문을 날짜순으로" 라는 질문을 저장해 두면, 열 때마다 그 순간의 데이터로 답이 다시 만들어집니다. 사본이 낡을 일이 없습니다.
쿼리에는 종류가 있습니다.
| 쿼리 | 하는 일 |
|---|---|
| 선택 쿼리 | 조건에 맞는 레코드를 골라 보여 줍니다 |
| 매개 변수 쿼리 | 실행할 때마다 조건 값을 물어봅니다 |
| 크로스탭 쿼리 | 행과 열로 교차 집계합니다. 피벗 테이블과 비슷합니다 |
| 테이블 만들기 쿼리 | 결과를 새 테이블로 만듭니다 |
| 추가 쿼리 | 결과를 기존 테이블에 덧붙입니다 |
| 업데이트 쿼리 | 조건에 맞는 레코드의 값을 한꺼번에 바꿉니다 |
| 삭제 쿼리 | 조건에 맞는 레코드를 지웁니다 |
뒤의 넷을 묶어 실행 쿼리라 부릅니다. 이것들은 원본 데이터를 실제로 바꾸고 되돌릴 수 없습니다. 삭제 쿼리를 조건 없이 실행하면 테이블이 통째로 빕니다. 그래서 실행 쿼리를 만들 때는 먼저 선택 쿼리로 대상이 맞는지 눈으로 확인한 뒤 종류를 바꾸는 습관이 안전합니다.
SQL은 문장의 순서가 정해져 있습니다
액세스는 디자인 보기에서 격자에 조건을 채워 쿼리를 만들지만, 그 뒤에서는 SQL(Structured Query Language) 문장이 만들어집니다. SQL 보기로 바꾸면 볼 수 있죠.
기본 구조는 이렇습니다.
SELECT 어떤 필드를 · FROM 어느 테이블에서 · WHERE 어떤 조건으로 · GROUP BY 무엇으로 묶어 · HAVING 묶은 결과에 어떤 조건으로 · ORDER BY 무엇으로 정렬해서
이 순서는 바꿀 수 없습니다. 그리고 WHERE와 HAVING의 차이가 시험 단골입니다. WHERE는 묶기 전 개별 레코드를 거르고, HAVING은 묶은 뒤의 그룹을 거릅니다. 그래서 합계나 개수 같은 집계 함수로 조건을 걸려면 HAVING을 써야 합니다.
ORDER BY는 오름차순이 기본(ASC)이고 내림차순은 DESC를 적습니다. DISTINCT를 붙이면 중복된 결과를 하나로 묶습니다.
조건에 쓰는 연산자도 정리해 두겠습니다. LIKE는 부분 일치를 봅니다. 액세스에서는 별표가 임의의 여러 글자, 물음표가 임의의 한 글자입니다. BETWEEN A AND B는 범위이고 양쪽 끝을 포함합니다. IN은 나열한 값 중 하나와 같은지 봅니다. IS NULL은 값이 비어 있는지 봅니다. 빈 값은 같다는 기호로 비교할 수 없어서 전용 연산자가 필요합니다.
여러 테이블을 이어 묻기
관계로 나눠 둔 표를 다시 합쳐 봐야 할 때가 옵니다. 이때 쓰는 것이 조인(join) 입니다.
내부 조인(inner join) 은 양쪽 모두에 짝이 있는 레코드만 가져옵니다. 주문한 적 있는 고객만 나오죠. 외부 조인(outer join) 은 한쪽을 다 가져오고 짝이 없으면 빈칸으로 둡니다. 왼쪽 외부 조인이면 고객 전체가 나오고, 주문이 없는 고객은 주문 칸이 비어 나옵니다.
"주문한 적 없는 고객을 찾아라" 같은 질문에는 외부 조인이 필요합니다. 내부 조인으로는 애초에 그런 고객이 결과에 등장하지 않으니까요. 왼쪽 외부 조인으로 고객 전체를 가져온 뒤 주문 쪽이 비어 있는 행만 남기면 됩니다. 이 발상이 시험에도 실무에도 자주 등장합니다.
인출 문제
이전: 데이터베이스 일반 1강 · 다음: 데이터베이스 일반 3강