이 글이 필요한 사람
컴활 1급 데이터베이스 실기에서 `DLookup`, `DCount`, `DSum`이 한 문제에 섞이면 함수 이름은 알지만 무엇을 골라야 할지 멈추거나, 조건식의 따옴표와 연결 연산자에서 자주 틀리는 사람에게 맞는 글입니다.
기존 데이터베이스 객체 가이드는 테이블·쿼리·폼·보고서의 역할을, DB 빠른 공부 가이드는 학습 순서를, 프로시저 참조 가이드는 Me와 Forms! 경로를 맡습니다. 이 글은 도메인 함수 세 개의 선택과 공통 인수·조건식만 좁게 다룹니다.
두음 암기부터 잡으세요: 룩값·카개·썸합·식도조
'룩값'은 DLookup이 값 하나를 찾고, '카개'는 DCount가 개수를 세며, '썸합'은 DSum이 합계를 낸다는 뜻입니다. '식도조'는 세 함수가 공유하는 Expr·Domain·Criteria를 식·도메인·조건으로 번역한 말입니다.
재미 문장 '룩이는 값을 보고, 카운트는 개수를 세고, 썸은 합친 뒤 식당 도메인 조건표를 본다'를 말한 뒤 지시문에서 결과 단어를 표시하세요. 조회·표시이면 DLookup, 몇 건·개수이면 DCount, 총액·합계이면 DSum입니다.
함수 이름부터 외우려고 하면 조건식에서 다시 막힙니다. 먼저 결과 종류를 고르고, 두 번째로 도메인이 테이블인지 쿼리인지 찾고, 마지막에 조건을 문자열로 완성하는 순서를 고정하세요.
세 함수의 공통 뼈대는 Expr·Domain·Criteria입니다
Microsoft Learn이 안내하는 구문은 `DLookup(Expr, Domain, Criteria)`, `DCount(Expr, Domain, Criteria)`, `DSum(Expr, Domain, Criteria)`입니다. 세 함수 모두 첫째 인수는 계산하거나 반환할 식, 둘째는 레코드 집합, 셋째는 범위를 제한하는 조건입니다.
Expr에는 보통 `[단가]`, `[주문번호]`, `[수량]*[단가]`처럼 필드나 계산식을 문자열로 넣습니다. Domain에는 `상품`, `주문내역`처럼 테이블 이름이나 매개 변수가 필요 없는 쿼리 이름을 문자열로 넣습니다.
Criteria는 선택 인수이며 SQL의 WHERE 절과 비슷하지만 `WHERE`라는 단어는 쓰지 않습니다. 예를 들어 `[지역] = '서울'`이 조건 부분이며, 조건에 사용하는 필드는 Domain 안에 존재해야 합니다.
DLookup은 조건에 맞는 필드 값 하나를 조회합니다
DLookup은 다른 테이블이나 쿼리에서 특정 조건에 맞는 필드 값 하나를 가져올 때 사용합니다. Microsoft Learn은 폼이나 보고서의 레코드 원본에 없는 필드 값을 표시하는 대표 용도로 설명합니다.
예를 들어 상품코드가 7인 상품의 단가를 찾는다면 `=DLookup("[단가]", "상품", "[상품코드] = 7")`처럼 읽습니다. Expr은 반환할 단가, Domain은 상품 테이블, Criteria는 상품코드 7입니다.
조건을 생략하거나 여러 레코드가 조건에 맞으면 원하는 행을 보장할 수 없습니다. Microsoft 문서도 기본 키처럼 결과를 고유하게 만드는 조건을 권장하므로, 값 하나를 찾을 때는 고유한 조건인지 확인하세요.
DCount는 레코드 개수를 세고 Null 함정을 확인합니다
DCount는 지정한 도메인에서 조건에 맞는 레코드 수를 반환합니다. 주문 상태가 완료인 건수를 세면 `=DCount("*", "주문", "[상태] = '완료'")`처럼 작성할 수 있습니다.
Expr에 특정 필드를 넣으면 그 필드가 Null인 레코드는 세지 않습니다. 전체 레코드 수가 목적이라면 `*`를 사용하거나 Null이 없는 기본 키 필드를 사용하는 편이 안전합니다.
쿼리 안에서 전체 레코드 수를 집계하는 문제라면 일반 Count가 더 적합할 수 있습니다. DCount는 폼의 계산 컨트롤, 매크로, 모듈처럼 현재 레코드 원본 밖의 도메인을 조건으로 세야 할 때 역할이 선명합니다.
DSum은 조건에 맞는 숫자 필드의 합계를 구합니다
DSum은 지정한 도메인의 숫자 필드 또는 숫자 계산식 합계를 반환합니다. 고객번호 7의 주문금액 합계라면 `=DSum("[주문금액]", "주문", "[고객번호] = 7")`처럼 읽습니다.
Expr에는 합산할 숫자 필드를 넣거나 `[수량]*[단가]`처럼 도메인 안의 필드로 계산식을 만들 수 있습니다. 개수를 구하는 DCount와 달리 결과가 몇 행인지가 아니라 그 행들의 숫자 값을 더합니다.
조건에 맞는 레코드가 없거나 도메인에 레코드가 없으면 DSum은 Null을 반환할 수 있습니다. 계산 컨트롤에서 0을 표시해야 한다면 `Nz(DSum(...), 0)`처럼 Null 처리 필요 여부를 함께 봅니다.
숫자·문자·날짜 조건은 구분 기호가 다릅니다
숫자 조건은 `"[상품코드] = 7"`처럼 숫자 자체를 조건 문자열 안에 둡니다. 숫자를 폼 컨트롤에서 가져오면 `"[상품코드] = " & [txt상품코드]`처럼 문자열 바깥에서 값을 연결합니다.
문자 조건은 조건 값에 작은따옴표가 필요합니다. 고정값은 `"[지역] = '서울'"`, 컨트롤 값은 `"[지역] = '" & [txt지역] & "'"`처럼 최종 조건 문자열 안에 문자 구분 기호가 남도록 만듭니다.
날짜 조건은 Access 식에서 `#` 구분 기호를 사용합니다. 컨트롤 값을 붙일 때는 `"[주문일] >= #" & [txt기준일] & "#"`처럼 최종 조건식에 날짜 구분 기호가 포함되는지 확인하세요.
폼 컨트롤을 붙일 때는 완성된 조건 문자열을 상상합니다
조건식에서 가장 흔한 실수는 따옴표 개수를 눈으로만 세는 것입니다. Microsoft Learn은 폼 컨트롤 식을 문자열과 분리해 먼저 평가한 뒤 `&`로 이어 붙이는 방식을 안내합니다.
예를 들어 숫자 컨트롤의 현재 값이 7이면 `"[상품코드] = " & Forms!상품조회!txt상품코드`가 최종적으로 `[상품코드] = 7`이 되어야 합니다. 문자 값이 서울이면 최종 문자열은 `[지역] = '서울'`이 되어야 합니다.
시험에서 식이 길어지면 Expr, Domain, Criteria 세 덩어리로 먼저 자르고, Criteria만 종이에 최종 결과 형태로 한 번 써 보세요. 조건 문자열이 정상적인 WHERE 절처럼 읽히면 따옴표와 연결 위치도 확인하기 쉬워집니다.
Null과 0은 같은 결과가 아닙니다
DLookup은 조건에 맞는 레코드가 없으면 Null을 반환합니다. DSum도 합산할 레코드가 없으면 Null을 반환할 수 있습니다. 반면 DCount는 셀 레코드가 없으면 개수 결과가 0이 됩니다.
화면에 빈값 대신 0을 표시해야 하는 계산이라면 Nz를 사용할 수 있습니다. 다만 모든 Null을 무조건 0으로 바꾸기보다 지시문이 값 없음과 숫자 0을 같은 의미로 처리해도 되는지 먼저 확인해야 합니다.
DLookup 결과가 Null이라면 먼저 조건 필드가 Domain에 있는지, 조건 문자열이 올바른지, 실제로 일치하는 레코드가 있는지 봅니다. DCount가 예상보다 작으면 Expr로 지정한 필드의 Null 여부도 확인하세요.
자주 틀리는 함정은 함수보다 인수 역할 뒤바꾸기입니다
첫째, 값 하나를 찾아야 하는데 DCount를 쓰거나 개수를 세는데 DLookup을 쓰는 함정입니다. 지시문의 결과가 값·개수·합계 중 무엇인지 먼저 표시하면 막을 수 있습니다.
둘째, Domain에 필드 이름을 넣고 Expr에 테이블 이름을 넣는 함정입니다. 첫째 인수는 무엇을 반환·계산하는지, 둘째 인수는 어느 레코드 집합인지로 번역하세요. 셋째, Criteria에 WHERE를 직접 넣거나 문자·날짜 구분 기호를 빠뜨리는 함정입니다.
넷째, DLookup에서 여러 행이 맞는데도 원하는 값이 나온다고 가정하는 함정입니다. 값 하나를 안정적으로 찾으려면 기본 키나 고유한 조건을 사용하고, DCount 전체 행은 `*`, DSum은 숫자 식이라는 마지막 차이를 확인하세요.
시험 직전에는 6줄만 남기세요
첫째, DLookup은 값 하나입니다. 둘째, DCount는 레코드 개수입니다. 셋째, DSum은 숫자 합계입니다. 넷째, 공통 인수는 Expr·Domain·Criteria입니다.
다섯째, Criteria는 WHERE 없는 조건 문자열이며 숫자는 그대로, 문자는 작은따옴표, 날짜는 `#`로 구분합니다. 여섯째, DCount 전체 행은 `*`, DLookup·DSum의 결과 없음은 Null 가능성을 확인합니다.
마지막으로 '룩값·카개·썸합·식도조'를 보지 않고 풀어 말하세요. 함수 이름보다 결과 종류와 세 인수 역할이 바로 나오면 실전 식도 훨씬 빨리 읽힙니다.