Ch3. 컴퓨터활용능력 1급 — 데이터베이스(Access) 완전 정복
이번 강의 학습 목표
컴퓨터활용능력 1급의 두 번째 실기 과목인 **데이터베이스(MS Access)**는 스프레드시트와 별도로 45분이 주어지는 독립 시험입니다. 테이블 설계부터 쿼리, 폼, 보고서까지 전 범위를 체계적으로 정복합니다.
Access 개요와 시험 출제 비중
MS Access란
MS Access는 마이크로소프트 오피스에 포함된 **관계형 데이터베이스 관리 시스템(RDBMS)**입니다. 파일 기반으로 동작하므로 서버 없이 단독 사용이 가능하며, GUI 기반의 폼·보고서 디자인 기능이 강점입니다. 컴활 1급 실기에서는 Access 2016/2019 버전을 기준으로 출제됩니다.
컴활 1급 데이터베이스 실기 출제 비중
| 영역 | 출제 비중 | 주요 작업 |
|---|---|---|
| 테이블 | 약 20% | 필드 속성, 기본 키, 인덱스, 유효성 검사 |
| 쿼리 | 약 40% | 선택·크로스탭·매개변수·실행 쿼리, SQL |
| 폼 | 약 20% | 컨트롤 배치, 속성, 이벤트 프로시저 기초 |
| 보고서 | 약 20% | 그룹화·정렬, 집계 함수, 레이아웃 |
쿼리가 전체의 40%를 차지하므로 쿼리를 집중적으로 숙달하는 것이 합격의 핵심입니다.
테이블 설계
필드 속성(Field Properties)
Access 테이블 디자인 보기에서 각 필드에 설정할 수 있는 주요 속성입니다.
필드 크기(Field Size)
- 텍스트: 1~255 문자(기본 255)
- 정수(Integer): -32,768 ~ 32,767
- 긴 정수(Long Integer): -2,147,483,648 ~ 2,147,483,647
형식(Format)
- 날짜/시간: yyyy-mm-dd, yyyy년 mm월 dd일 등
- 숫자: #,##0 (천 단위 쉼표), 0.00 (소수 2자리)
- 예/아니요: True/False, 예/아니요
입력 마스크(Input Mask)
- 000-0000-0000 : 전화번호 형식 강제 입력
- >LLLL : 4글자 영문 대문자만 허용
캡션(Caption): 폼·보고서에서 표시되는 레이블 이름
기본값(Default Value): 새 레코드 추가 시 자동으로 채워지는 값
유효성 검사 규칙: >=0 (0 이상만 허용), Like "K*" (K로 시작하는 텍스트만)
유효성 검사 텍스트: 규칙 위반 시 표시할 오류 메시지
필수(Required): 빈 값 허용 여부 (예/아니요)
빈 문자열 허용(Allow Zero Length): "" 입력 허용 여부
기본 키(Primary Key)
기본 키는 테이블의 각 레코드를 고유하게 식별하는 필드입니다.
- 중복 값 불가 (Unique)
- NULL 값 불가 (NOT NULL)
- 기본 키가 설정된 필드에는 자동으로 인덱스(중복 불가) 생성
복합 기본 키: 두 개 이상의 필드를 합쳐 기본 키로 설정 → 두 필드를 동시 선택(Shift+클릭) 후 기본 키 설정
인덱스(Index)
인덱스는 검색 및 정렬 속도를 향상시키는 색인입니다.
| 인덱스 종류 | 설명 |
|---|---|
| 중복 불가 | 기본 키 필드에 자동 적용, 같은 값 두 번 입력 불가 |
| 중복 가능 | 자주 검색하는 필드에 설정, 같은 값 허용 |
| 없음 | 인덱스 미설정 |
인덱스 설정 방법: 디자인 보기 → 필드 선택 → 하단 [인덱싱] 속성에서 선택
관계 설정 (Relationships)
관계의 종류
데이터베이스에서 테이블 간의 연결을 **관계(Relationship)**라고 합니다.
| 관계 유형 | 설명 | 예시 |
|---|---|---|
| 1:1 (일대일) | 한 레코드가 상대 테이블의 딱 한 레코드에만 대응 | 직원 — 직원상세정보 |
| 1:N (일대다) | 한 레코드가 상대 테이블의 여러 레코드에 대응 | 고객 — 주문 |
| N:M (다대다) | 양쪽 모두 여러 레코드에 대응 (중간 테이블 필요) | 학생 — 강좌 |
N:M 관계 구현: Access에서는 N:M을 직접 표현할 수 없으므로 중간 **연결 테이블(Junction Table)**을 생성합니다.
예: 학생-강좌 N:M 관계
→ [학생] 1:N [수강신청] N:1 [강좌]
학생테이블(학생ID) — 수강신청(학생ID, 강좌ID) — 강좌테이블(강좌ID)
참조 무결성(Referential Integrity)
관계를 설정할 때 참조 무결성을 적용하면 데이터 일관성이 보장됩니다.
- 관련 필드 모두 업데이트: 기본 키 값 변경 시 관련 레코드 자동 업데이트
- 관련 레코드 모두 삭제: 기본 키 레코드 삭제 시 관련 레코드 자동 삭제
- 참조 무결성 없이 삭제 시 → 고아 레코드(Orphan Record) 발생
관계 설정 방법: [데이터베이스 도구] → [관계] → 필드 드래그로 연결 → 참조 무결성 옵션 체크
쿼리(Query) 종류와 활용
선택 쿼리 (Select Query)
가장 기본적인 쿼리로, 조건에 맞는 레코드를 조회합니다.
쿼리 디자인 보기 구성 요소:
- 필드(Field): 표시할 열 선택
- 테이블(Table): 필드가 속한 테이블
- 정렬(Sort): 오름차순/내림차순
- 표시(Show): 결과에 표시 여부(체크박스)
- 조건(Criteria): 필터 조건 입력
조건 입력 예시:
- 같음: "서울" 또는 ="서울"
- 비교: >=100, <50
- 범위: Between 10 And 50
- 포함: Like "*서울*"
- 비어 있음: Is Null
- 비어있지 않음: Is Not Null
- AND: 같은 행에 여러 조건
- OR: 다른 행에 조건 입력
계산 필드 추가: 필드 행에 직접 수식 입력
총점: [국어]+[영어]+[수학]
평균: ([국어]+[영어]+[수학])/3
등급: IIf([점수]>=90,"A",IIf([점수]>=80,"B","C"))
크로스탭 쿼리 (Crosstab Query)
데이터를 행과 열 기준으로 교차 집계하는 쿼리입니다. 피벗테이블과 유사한 결과를 만듭니다.
쿼리 마법사 사용:
[만들기] → [쿼리 마법사] → [크로스탭 쿼리 마법사]
구성:
- 행 머리글: 세로 기준 필드 (예: 지역)
- 열 머리글: 가로 기준 필드 (예: 분기)
- 값: 집계 필드와 함수 선택 (예: 판매액의 합계)
- 행 합계: 행별 집계 추가 가능
매개변수 쿼리 (Parameter Query)
쿼리 실행 시 사용자에게 입력값을 요청하는 쿼리입니다. 유연한 조회가 필요할 때 활용합니다.
조건 입력 방법:
조건 행에 대괄호로 메시지 입력
예: [검색할 지역을 입력하세요]
[시작일을 입력하세요] 형식으로 작성
숫자 범위 매개변수:
>= [최소값] And <= [최대값]
날짜 매개변수:
Between [시작일] And [종료일]
실행 쿼리 (Action Query)
데이터를 수정·삭제·추가·생성하는 쿼리입니다. 실행 전 반드시 백업 권장.
| 종류 | 기능 | 주의사항 |
|---|---|---|
| 업데이트 쿼리 | 기존 레코드의 필드 값 수정 | 되돌릴 수 없음 |
| 삭제 쿼리 | 조건에 맞는 레코드 삭제 | 복구 불가 |
| 추가 쿼리 | 다른 테이블에 레코드 추가 | 필드 형식 일치 필요 |
| 테이블 만들기 쿼리 | 쿼리 결과를 새 테이블로 저장 | 기존 테이블 덮어씀 |
업데이트 쿼리 작성 예시:
[만들기] → [쿼리 디자인] → 테이블 추가
[쿼리 형식] → [업데이트]
업데이트 대상 필드 선택
'업데이트' 행: 새로운 값 입력
예: [단가]*1.1 ← 단가를 10% 인상
조건 행: 조건 입력 (예: [지역]="서울")
SQL 기초
SELECT 문
Access 쿼리 디자인 보기는 내부적으로 SQL로 변환됩니다. SQL 보기에서 직접 작성도 가능합니다.
-- 기본 SELECT
SELECT 필드1, 필드2 FROM 테이블명;
-- 조건 검색 (WHERE)
SELECT 이름, 점수 FROM 학생
WHERE 점수 >= 80;
-- 정렬 (ORDER BY)
SELECT 이름, 점수 FROM 학생
ORDER BY 점수 DESC; -- 내림차순
-- 두 조건 AND
SELECT * FROM 주문
WHERE 지역="서울" AND 금액>=100000;
-- OR 조건
SELECT * FROM 학생
WHERE 학과="컴공" OR 학과="전자";
-- 범위 (BETWEEN)
SELECT * FROM 상품
WHERE 가격 BETWEEN 10000 AND 50000;
-- 패턴 검색 (LIKE)
SELECT * FROM 고객
WHERE 이름 LIKE "김*"; -- 김으로 시작하는 이름
GROUP BY와 집계 함수
-- 그룹별 집계
SELECT 지역, COUNT(*) AS 인원수, AVG(점수) AS 평균점수
FROM 학생
GROUP BY 지역;
-- HAVING: 그룹 집계 후 조건 (WHERE는 집계 전)
SELECT 지역, SUM(판매금액) AS 총매출
FROM 판매
GROUP BY 지역
HAVING SUM(판매금액) >= 1000000;
-- 주요 집계 함수
COUNT(*): 레코드 수
COUNT(필드): NULL 제외 개수
SUM(필드): 합계
AVG(필드): 평균
MAX(필드): 최대값
MIN(필드): 최소값
조인(JOIN)
-- INNER JOIN: 양쪽 테이블에 모두 존재하는 데이터만
SELECT 고객.이름, 주문.금액
FROM 고객 INNER JOIN 주문
ON 고객.고객ID = 주문.고객ID;
-- LEFT JOIN: 왼쪽 테이블 전체 + 오른쪽에 있으면 포함
SELECT 고객.이름, 주문.금액
FROM 고객 LEFT JOIN 주문
ON 고객.고객ID = 주문.고객ID;
폼(Form) 컨트롤 종류
폼이란
**폼(Form)**은 테이블이나 쿼리의 데이터를 입력·조회·수정하기 위한 사용자 인터페이스입니다. 디자인 보기에서 다양한 컨트롤을 배치합니다.
주요 컨트롤 종류
| 컨트롤 | 용도 | 특징 |
|---|---|---|
| 레이블 | 텍스트 표시(입력 불가) | 컨트롤 이름 표시, 클릭 무반응 |
| 텍스트 상자 | 데이터 입력·표시 | 필드와 연결(바운드) 또는 수식 입력(언바운드) |
| 콤보 상자 | 드롭다운 목록 선택 | 직접 입력도 허용 |
| 목록 상자 | 목록에서 선택 | 드롭다운 없이 항상 펼쳐진 상태 |
| 체크 박스 | 예/아니요 값 입력 | 예/아니요, True/False 필드 연결 |
| 옵션 단추(라디오) | 상호 배타적 선택 | 옵션 그룹 안에서 하나만 선택 |
| 옵션 그룹 | 라디오 버튼 묶음 컨테이너 | 선택된 값이 숫자로 저장 |
| 명령 단추 | 클릭 시 작업 실행 | 매크로 또는 VBA 이벤트 연결 |
| 이미지 | 그림 삽입 | OLE 개체 또는 파일 경로 |
| 탭 컨트롤 | 탭 페이지 형태로 구성 | 공간 절약, 그룹화 |
| 하위 폼 | 폼 안에 다른 폼 삽입 | 1:N 관계 데이터 표시에 유용 |
컨트롤 주요 속성
이름(Name): 코드에서 참조할 컨트롤 식별자
컨트롤 원본(Control Source): 연결된 필드 이름 또는 수식 (=[단가]*[수량])
형식(Format): 숫자/날짜 표시 형식
기본값(Default Value): 새 레코드 시 자동 채움
잠금(Locked): True이면 읽기 전용
사용 가능(Enabled): False이면 비활성화(회색)
탭 정지(Tab Stop): False이면 Tab 키로 이동 건너뜀
보고서(Report) 그룹화와 집계
보고서 구성 영역
| 영역 | 표시 위치 | 용도 |
|---|---|---|
| 보고서 머리글 | 전체 보고서 맨 위 | 제목, 로고 |
| 페이지 머리글 | 매 페이지 상단 | 열 제목 |
| 그룹 머리글 | 각 그룹 시작 | 그룹 기준값 표시 |
| 본문(세부 레코드) | 레코드마다 반복 | 실제 데이터 |
| 그룹 바닥글 | 각 그룹 끝 | 그룹 소계 |
| 페이지 바닥글 | 매 페이지 하단 | 페이지 번호 |
| 보고서 바닥글 | 전체 보고서 맨 아래 | 총계 |
그룹화 설정
[보고서 디자인] → [그룹화 및 정렬] 창
→ 그룹화할 필드 선택
→ 정렬 방향 설정
→ 그룹 머리글/바닥글 표시 여부
그룹 바닥글에 집계 함수 추가:
=Sum([판매금액]) ← 그룹별 소계
=Count(*) ← 그룹별 건수
=Avg([점수]) ← 그룹별 평균
보고서 집계 함수
보고서 바닥글의 총계:
=Sum([금액]) ← 전체 합계
=Count([주문번호]) ← 전체 건수
페이지 번호:
=[Page] & " / " & [Pages] ← "3 / 10" 형태
현재 날짜:
=Date() 또는 =Now()
조건부 표시:
=IIf([점수]>=90, "우수", "보통")
핵심 개념 카드
쿼리 조건: AND vs OR ★★★★★ : 같은 행에 입력한 조건은 AND 관계, 다른 행에 입력한 조건은 OR 관계. 선택 쿼리 설계 시 가장 자주 실수하는 부분. 암기 포인트: “같은 줄 = AND, 다른 줄 = OR” — 고급 필터 조건 범위와 동일한 원칙
업데이트 쿼리 실행 순서 ★★★★★ : ① 선택 쿼리로 먼저 작성 → ② 결과 확인 → ③ [쿼리 형식] → [업데이트]로 변환 → ④ 업데이트 행 입력 → ⑤ 실행. 되돌리기 불가이므로 선택 쿼리 확인 필수. 암기 포인트: 실행 전 항상 “데이터 시트 보기”로 대상 레코드 먼저 확인
기본 키의 3가지 조건 ★★★★☆ : ① 고유(Unique) — 중복 불가 / ② NOT NULL — 빈 값 불가 / ③ 불변 — 자주 변경되지 않아야 함. Access에서는 일련번호(AutoNumber) 필드가 기본 키로 자주 사용됨. 암기 포인트: 기본 키 = “유일무이하고 비어있지 않은 식별자”
참조 무결성 ★★★★☆ : 외래 키 값은 반드시 참조 테이블의 기본 키에 존재해야 함. 위반 시 입력 오류 발생. “관련 필드 모두 업데이트/삭제” 옵션으로 연쇄 업데이트·삭제 설정 가능. 암기 포인트: 자식 테이블에 없는 부모 기본 키를 참조하면 무결성 위반
GROUP BY vs HAVING ★★★☆☆ : WHERE는 레코드 집계 전 필터, HAVING은 GROUP BY 집계 후 필터. 집계 함수 조건은 반드시 HAVING 사용. 암기 포인트: “집계 전 = WHERE, 집계 후 = HAVING”
실전 퀴즈
Q1. [주문] 테이블에서 “서울” 지역의 주문 중 금액이 50,000원 이상인 레코드를 조회하는 선택 쿼리를 작성하라. 결과는 금액 기준 내림차순으로 정렬한다.
쿼리 디자인 보기에서 [주문] 테이블을 추가한다. [지역] 필드의 조건 행에 “서울”, [금액] 필드의 조건 행에 >=50000을 같은 행에 입력한다(AND 조건). [금액] 필드의 정렬 행을 “내림차순”으로 설정한다. SQL로는 다음과 같다:
SELECT * FROM 주문 WHERE 지역="서울" AND 금액>=50000 ORDER BY 금액 DESC;
Q2. 크로스탭 쿼리를 사용하여 [판매] 테이블에서 지역별·분기별 판매금액 합계를 구하려 한다. 행 머리글, 열 머리글, 값 필드를 각각 무엇으로 설정해야 하는가?
행 머리글: [지역] 필드 (세로 방향 그룹 기준). 열 머리글: [분기] 필드 (가로 방향 그룹 기준). 값: [판매금액] 필드에 집계 함수 합계(Sum) 적용. 크로스탭 쿼리 마법사에서 위 순서대로 설정하거나, 디자인 보기에서 각 필드의 크로스탭 행을 “행 머리글”, “열 머리글”, “값”으로 지정하고 값 필드의 합계 행을 “합계(Sum)“로 설정한다.
Q3. 업데이트 쿼리 실행 후 데이터가 잘못 변경되었다. 되돌리는 방법은?
Access의 업데이트 쿼리는 실행 즉시 데이터베이스에 반영되며 Ctrl+Z(실행 취소)가 작동하지 않는다. 되돌리기 위해서는 ① 수동으로 역방향 업데이트 쿼리를 작성하거나 ② 사전에 백업한 .accdb 파일을 복원해야 한다. 시험 환경에서는 업데이트 쿼리 실행 전 반드시 선택 쿼리로 대상 레코드를 확인하는 습관이 중요하다.
Q4. [고객] 테이블과 [주문] 테이블을 조인할 때, 주문이 한 건도 없는 고객도 포함하여 조회하려면 어떤 조인을 사용해야 하는가?
LEFT JOIN(왼쪽 외부 조인)을 사용한다. [고객] 테이블이 왼쪽에 위치하고, 주문이 없는 고객도 결과에 포함되며 [주문] 측 필드는 NULL로 표시된다. Access 쿼리 디자인 보기에서는 두 테이블 조인선을 더블클릭한 후 조인 속성에서 “왼쪽 테이블의 모든 레코드 포함”을 선택한다.
Q5. 보고서에서 각 그룹의 소계와 전체 총계를 함께 표시하려면 어떻게 해야 하는가?
그룹 소계는 그룹 바닥글 영역에 텍스트 상자를 추가하고
=Sum([금액])수식을 입력한다. 전체 총계는 보고서 바닥글 영역에 같은 방법으로 텍스트 상자를 추가한다. 그룹 바닥글의 Sum은 해당 그룹 레코드만 합산하고, 보고서 바닥글의 Sum은 전체 레코드를 합산하므로 자연스럽게 소계와 총계가 구분된다. [그룹화 및 정렬] 창에서 그룹 바닥글을 “있음”으로 설정해야 해당 영역이 표시된다.
OIYO 편집부
Content Editor지식 인큐베이터이자 전문 콘텐츠 크리에이터. 경영, 경제, 법률 및 실생활에 유용한 실무/자격증 중심의 깊이 있는 정보를 연구하고 공유합니다.