구글 스프레드시트의 QUERY 함수는 원본 데이터에서
필요한 열을 선택하고, 조건에 맞는 행만 추출하고, 결과를 정렬하거나
요약할 수 있는 함수입니다.
QUERY 수식을 처음 작성할 때 가장 많이 막히는 부분은
where 조건입니다. 문자 조건에는 따옴표가 필요하지만
숫자에는 따옴표를 사용하지 않으며, 날짜는
date '연도-월-일' 형식으로 작성해야 합니다.
조건 문법이 맞는데 일부 값이 사라진다면 한 열에 숫자와 문자가 섞여 있는지도 확인해야 합니다. QUERY는 한 열의 다수 데이터 유형을 기준으로 열 유형을 정하고, 소수 유형의 값을 null로 처리할 수 있습니다.
=QUERY(A1:E,"select * where B = '영업'",1)A1:E 범위에서 B열 값이 “영업”인 행을 모두 반환하고, 원본의 첫 번째 행을 헤더로 처리합니다.
QUERY는 SQL과 비슷한 문법을 사용하지만 SQL과 완전히 같은 언어는
아닙니다. 스프레드시트 수식의 첫 번째 인수에서 데이터 범위를 이미
지정하므로 쿼리 문자열에는 from 절을 사용하지 않습니다.
이 글은 Google의 QUERY 함수, Google Visualization API Query Language, TEXT·TO_TEXT·FILTER 공식 문서를 기준으로 작성했습니다. 예제의 범위, 열 위치와 조건값은 실제 스프레드시트 구조에 맞게 변경해야 합니다.
![]() |
| QUERY 함수는 원본 범위에서 WHERE 조건에 맞는 행을 반환합니다. 문자·숫자·날짜는 조건 작성 방식이 다르며 데이터 유형과 헤더 행 수도 함께 확인해야 합니다. 위 이미지는 QUERY 함수의 필터링 구조를 설명하기 위한 대표 개념 이미지입니다. |
예제에서 사용할 데이터 구조
아래 예제는 A1:E 범위에 다음 표가 있다고 가정합니다.
| 열 | 머리글 | 데이터 유형 |
|---|---|---|
| A열 | 주문일 | 날짜 |
| B열 | 부서 | 문자열 |
| C열 | 담당자 | 문자열 |
| D열 | 상품명 | 문자열 |
| E열 | 금액 | 숫자 |
원본 데이터의 실제 열 위치가 다르면 수식의 A·B·C·D·E도 함께 변경해야 합니다.
QUERY 함수의 기본 구조
=QUERY(데이터범위, "쿼리문", 헤더행수)
세 인수의 의미는 다음과 같습니다.
- 데이터범위: 조회할 원본 셀 범위
- 쿼리문: 선택·조건·정렬 방법을 작성한 문자열
- 헤더행수: 원본 범위의 처음 몇 행이 머리글인지 지정하는 값
세 번째 인수는 선택사항이지만 생략하면 Google Sheets가 데이터 내용을 보고 헤더 수를 추정합니다. 결과를 예측하기 쉽게 하려면 실제 구조에 맞춰 0 또는 1을 명시하는 편이 적절합니다.
문자 조건에는 작은따옴표를 사용합니다
B열의 부서가 “영업”인 행만 반환하려면 문자 조건을 작은따옴표로 감쌉니다.
=QUERY(
A1:E,
"select * where B = '영업'",
1
)
수식 전체에서 쿼리문은 큰따옴표로 감싸고, 쿼리문 안의 문자열 값은 작은따옴표로 감싸는 구조입니다.
다음 수식에는 영업이라는 값의 작은따옴표가 없습니다.
=QUERY(
A1:E,
"select * where B = 영업",
1
)
QUERY는 영업을 문자값으로 올바르게 해석하지 못할 수
있습니다.
숫자 조건에는 따옴표를 사용하지 않습니다
E열 금액이 100,000 이상인 행만 반환하는 수식입니다.
=QUERY(
A1:E,
"select A,C,D,E where E >= 100000",
1
)
숫자 100000에는 작은따옴표를 사용하지 않습니다.
금액을 높은 순으로 정렬하려면 order by를 추가합니다.
=QUERY(
A1:E,
"select A,C,D,E where E >= 100000 order by E desc",
1
)
desc는 내림차순이고 asc는 오름차순입니다.
같음을 비교할 때는 = 하나를 사용합니다
QUERY의 같음 비교 연산자는 =입니다.
올바른 조건:
where B = '영업'
잘못된 조건:
where B == '영업'
같지 않음을 비교할 때는 != 또는 <>를
사용할 수 있습니다.
=QUERY(
A1:E,
"select * where B <> '취소'",
1
)
조건값을 셀에서 가져오는 방법
H2에 조회할 부서명이 입력돼 있다면 쿼리 문자열과 H2 값을 연결할 수 있습니다.
=QUERY(
A1:E,
"select A,C,D,E where B = '"&H2&"'",
1
)
수식이 만드는 쿼리 문자열의 형태는 다음과 같습니다.
select A,C,D,E where B = '영업'
숫자 조건을 셀에서 가져올 때는 작은따옴표를 추가하지 않습니다. I2에 최소 금액이 입력돼 있다고 가정합니다.
=QUERY(
A1:E,
"select A,C,D,E where E >= "&I2,
1
)
H2는 문자열이므로 작은따옴표 사이에 넣고, I2는 숫자이므로 쿼리문에 숫자 그대로 연결합니다.
문자 조건과 숫자 조건을 함께 연결합니다
H2의 부서와 I2의 최소 금액을 모두 만족하는 행을 반환하는 수식입니다.
=QUERY(
A1:E,
"select A,C,D,E where B = '"&H2&"' and E >= "&I2,
1
)
조건 셀이 비어 있으면 완성된 쿼리 문자열도 불완전해질 수 있습니다. QUERY를 실행하기 전에 조건 셀이 입력됐는지 확인할 수 있습니다.
=IF(
OR(H2="",I2=""),
"부서와 최소 금액을 입력하세요",
QUERY(
A1:E,
"select A,C,D,E where B = '"&H2&"' and E >= "&I2,
1
)
)
AND는 모든 조건을 만족하는 행을 반환합니다
B열이 “영업”이고 E열 금액이 100,000 이상인 행만 반환합니다.
=QUERY(
A1:E,
"select A,C,D,E where B = '영업' and E >= 100000",
1
)
두 조건 중 하나만 맞는 행이 아니라 두 조건을 모두 만족하는 행만 결과에 포함됩니다.
OR는 조건 중 하나를 만족하는 행을 반환합니다
부서가 “영업” 또는 “마케팅”인 행을 반환합니다.
=QUERY(
A1:E,
"select * where B = '영업' or B = '마케팅'",
1
)
AND와 OR를 함께 사용할 때는 조건의 의미를 명확하게 하기 위해 괄호를 사용하는 편이 적절합니다.
=QUERY(
A1:E,
"select * where (B = '영업' or B = '마케팅') and E >= 100000",
1
)
위 수식은 영업 또는 마케팅 부서이면서 금액이 100,000 이상인 행을 반환합니다.
빈 셀은 is null과 is not null로 확인합니다
담당자 C열이 비어 있지 않은 행만 반환하려면
is not null을 사용합니다.
=QUERY(
A1:E,
"select * where C is not null",
1
)
담당자가 비어 있는 행만 반환하려면 is null을
사용합니다.
=QUERY(
A1:E,
"select * where C is null",
1
)
다음과 같이 작성하지 않습니다.
where C = null
셀에 공백 문자가 들어 있으면 실제로는 문자열입니다.
한 열에 숫자와 문자가 섞이면 소수 데이터 유형이 null로 처리될 수 있습니다.
빈칸 조건 결과가 예상과 다르면 원본 값과 열의 데이터 유형을 함께 확인해야 합니다.
contains로 일부 문자열을 포함한 행을 찾습니다
D열 상품명에 “노트북”이라는 문자열이 포함된 행을 반환합니다.
=QUERY(
A1:E,
"select * where D contains '노트북'",
1
)
contains는 문자열 일부가 포함돼 있는지 확인합니다.
정확히 같은 값만 찾으려면 =을 사용합니다.
H2에 검색어가 입력된 경우:
=QUERY(
A1:E,
"select * where D contains '"&H2&"'",
1
)
문자열 검색은 대소문자를 구분합니다
QUERY의 문자열 비교와 문자열 검색은 대소문자를 구분합니다.
영문 데이터에서 “Laptop”과 “laptop”을 같은 값으로 찾으려면
lower() 또는 upper()를 사용할 수 있습니다.
=QUERY(
A1:E,
"select * where lower(D) contains 'laptop'",
1
)
H2의 검색어도 소문자로 바꿔 연결할 수 있습니다.
=QUERY(
A1:E,
"select * where lower(D) contains '"&LOWER(H2)&"'",
1
)
starts with와 ends with로 시작·끝 문자열을 찾습니다
담당자 이름이 “김”으로 시작하는 행을 찾습니다.
=QUERY(
A1:E,
"select * where C starts with '김'",
1
)
상품명이 “세트”로 끝나는 행을 찾습니다.
=QUERY(
A1:E,
"select * where D ends with '세트'",
1
)
정확한 일치에는 =, 일부 포함에는
contains, 시작이나 끝 조건에는
starts with와 ends with를 사용합니다.
날짜 조건은 date 연도-월-일 형식을 사용합니다
QUERY 쿼리문의 날짜 리터럴은 date 키워드 뒤에
yyyy-MM-dd 형식의 날짜를 작성합니다.
2026년 6월 1일 이후 주문을 반환하는 수식입니다.
=QUERY(
A1:E,
"select A,B,C,D,E where A >= date '2026-06-01'",
1
)
다음처럼 일반 문자열만 작성하면 날짜 유형과 맞지 않을 수 있습니다.
where A >= '2026-06-01'
날짜 셀의 화면 표시 형식이 2026. 6. 1. 또는 2026/06/01이어도 쿼리 문자열 안에서는 표준 날짜 리터럴 형식을 사용합니다.
날짜 조건을 셀에서 가져옵니다
H2에 시작 날짜가 실제 날짜 값으로 입력돼 있다면
TEXT로 쿼리 날짜 형식에 맞춰 연결합니다.
=QUERY(
A1:E,
"select A,B,C,D,E where A >= date '"&TEXT(H2,"yyyy-mm-dd")&"'",
1
)
H2와 I2 사이의 날짜를 조회하려면 다음처럼 작성할 수 있습니다. 이 예제는 A열이 날짜 유형이라는 전제입니다.
=QUERY(
A1:E,
"select A,B,C,D,E where A >= date '"&TEXT(H2,"yyyy-mm-dd")&"' and A <= date '"&TEXT(I2,"yyyy-mm-dd")&"'",
1
)
H2와 I2에 날짜처럼 보이는 일반 텍스트가 아니라 Google Sheets가 인식하는 날짜 값이 들어 있는지 확인합니다.
날짜와 시각이 함께 있다면 열 유형을 확인합니다
A열에 날짜뿐 아니라 시각까지 들어 있다면 열이 날짜가 아니라 날짜/시간 유형으로 처리될 수 있습니다.
종료 날짜를 날짜 리터럴의 자정 값과 비교하면 종료일의 오후 데이터가 예상과 다르게 제외될 수 있습니다.
날짜 단위의 보고서가 목적이라면 원본에 날짜만 포함한 보조 열을 만들거나, 날짜/시간 리터럴과 다음 날 시작 시각을 사용하는 구조를 검토합니다.
where A >= datetime '2026-06-01 00:00:00'
and A < datetime '2026-07-01 00:00:00'
위 조건은 2026년 6월 1일 0시부터 2026년 7월 1일 0시 전까지의 날짜/시간 값을 대상으로 합니다.
헤더 행 수는 원본 범위에 맞춰 지정합니다
원본 범위가 A1:E이고 1행에 머리글이 있다면 세 번째 인수를 1로 지정합니다.
=QUERY(
A1:E,
"select * where B = '영업'",
1
)
원본 범위가 A2:E처럼 데이터 행부터 시작하고 헤더가 포함되지 않았다면 0을 사용합니다.
=QUERY(
A2:E,
"select * where B = '영업'",
0
)
헤더 수가 잘못되면 다음 문제가 나타날 수 있습니다.
- 첫 번째 데이터 행이 결과 머리글처럼 표시됨
- 실제 머리글이 데이터 행으로 포함됨
- 숫자·문자 유형 추정 결과가 달라짐
- 집계 결과의 제목이 예상과 다르게 표시됨
세 번째 인수를 무조건 1로 복사하지 말고 QUERY의 첫 번째 인수에 헤더 행이 실제로 포함돼 있는지 확인합니다.
일반 범위에서는 A·B·C 열 표기를 사용합니다
QUERY의 첫 번째 인수가 일반 셀 범위라면 원본 열 위치에 따라 A·B·C처럼 열 문자를 사용할 수 있습니다.
=QUERY(
A1:E,
"select A,C,E where B = '영업'",
1
)
머리글의 실제 글자인 “주문일”, “담당자”, “금액”을 쿼리 열 이름으로 바로 작성하는 구조가 아닙니다.
다음처럼 작성하지 않습니다.
select 주문일, 담당자, 금액
배열로 범위를 결합하면 Col1·Col2를 사용합니다
중괄호 배열을 사용해 떨어진 범위를 하나의 데이터로 결합하면 쿼리
문자열에서는 결합 결과의 위치에 따라 Col1,
Col2 형식을 사용합니다.
다음 수식은 A:C와 E열을 결합합니다.
=QUERY(
{A1:C1000,E1:E1000},
"select Col1,Col3,Col4 where Col4 >= 100000",
1
)
결합 결과의 열 위치는 다음과 같습니다.
Col1: 원본 A열Col2: 원본 B열Col3: 원본 C열Col4: 원본 E열
원본 E열이 결합 결과에서는 네 번째 열이므로 Col4로
참조합니다.
QUERY에서 일부 값이 사라지면 혼합 데이터 유형을 확인합니다
QUERY의 한 열에는 부울, 숫자 또는 문자열 중 하나의 일관된 데이터 유형을 사용하는 것이 중요합니다.
예를 들어 사번 열에 다음 값이 섞여 있다고 가정합니다.
1001
1002
임시직
1004
외부-01
숫자값이 다수라면 QUERY는 해당 열을 숫자 열로 판단하고 소수인 문자열 값을 null로 처리할 수 있습니다.
사번이 계산값이 아니라 식별자라면 원본 열의 값 유형을 텍스트로 통일하는 것이 적절할 수 있습니다.
원본을 바로 변경하기 어려울 때는 QUERY에 전달하기 전에
TO_TEXT로 해당 열을 텍스트로 변환할 수 있습니다.
=QUERY(
{
A1:B1000,
ARRAYFORMULA(TO_TEXT(C1:C1000)),
D1:E1000
},
"select Col1,Col2,Col3,Col5 where Col3 is not null",
1
)
배열을 새로 구성했으므로 열 표기는 A·B·C가 아니라
Col1부터 Col5까지 사용합니다.
금액·수량처럼 실제 계산이 필요한 열을 텍스트로 바꾸면 숫자 비교와 합계 계산 방식이 달라집니다.
식별번호인지 계산값인지 먼저 판단한 뒤 데이터 유형을 통일해야 합니다.
쿼리 절은 정해진 순서로 작성합니다
QUERY 언어의 절은 원하는 순서로 자유롭게 배치하는 구조가 아닙니다. 자주 사용하는 절은 다음 순서로 작성합니다.
select → where → group by → pivot → order by → limit → offset → label → format → options
영업 부서의 금액 상위 10건을 반환하고 E열 결과 제목을 “주문금액”으로 바꾸는 예제입니다.
=QUERY(
A1:E,
"select A,C,D,E where B = '영업' order by E desc limit 10 label E '주문금액'",
1
)
order by를 where보다 먼저 작성하면
쿼리 문자열을 분석하지 못할 수 있습니다.
Unable to parse query string 오류를 확인합니다
QUERY의 두 번째 인수 문법이 잘못되면 다음과 같은 내용이 포함된 오류가 표시될 수 있습니다.
이 오류가 표시되면 다음 항목을 확인합니다.
- 쿼리 문자열 전체가 큰따옴표 안에 있는지
- 문자 조건이 작은따옴표 안에 있는지
- 같음 비교에
==가 아니라=을 사용했는지 from절을 넣지 않았는지- where·order by·limit 등의 순서가 맞는지
- 괄호가 열리고 닫히는 개수가 맞는지
- 날짜 앞에
date또는datetime이 있는지 - 일반 범위와 Col 표기법을 혼동하지 않았는지
조건값을 셀에서 연결했다면 QUERY 함수 전체를 보기 전에 완성된 쿼리 문자열만 별도 셀에 출력해 확인하는 방법도 사용할 수 있습니다.
="select A,C,E where B = '"&H2&"' and E >= "&I2
별도 셀에 표시된 문자열에서 따옴표, 조건값과 연산자가 예상한 위치에 있는지 확인한 뒤 해당 셀을 QUERY의 두 번째 인수로 사용할 수 있습니다.
=QUERY(A1:E,J2,1)
조건에 맞는 결과가 없는 경우와 수식 오류를 구분합니다
쿼리 문법이 올바르더라도 조건을 만족하는 행이 없으면 기대한 데이터가 나타나지 않을 수 있습니다.
다음 순서로 조건을 단순화합니다.
=QUERY(A1:E,"select *",1)로 원본이 반환되는지 확인합니다.- where 조건을 하나만 추가합니다.
- 문자 조건의 대소문자와 앞뒤 공백을 확인합니다.
- 숫자가 실제 숫자 유형인지 확인합니다.
- 날짜가 실제 날짜 값인지 확인합니다.
- AND 조건을 하나씩 추가해 결과가 사라지는 지점을 확인합니다.
원본 문자열의 앞뒤에 불필요한 공백이 있다면 화면에서는 같은 값처럼 보여도 정확한 일치 조건에서 제외될 수 있습니다.
결과가 펼쳐질 영역도 비워 둡니다
QUERY 결과는 수식이 입력된 셀에서 시작해 여러 행과 열로 자동 확장됩니다.
결과가 들어갈 위치에 기존 값이나 다른 수식이 있으면 배열 결과를 펼치지 못했다는 오류가 표시될 수 있습니다.
QUERY 수식 아래쪽과 오른쪽에 결과가 들어갈 충분한 빈 영역을 확보합니다. 결과 중간 셀을 개별적으로 수정하는 대신 원본 데이터나 QUERY 수식을 수정합니다.
QUERY와 FILTER 중 어떤 함수를 사용할지 구분합니다
단순히 조건에 맞는 행만 반환하려면 FILTER가 더 직접적인
경우도 있습니다.
금액이 100,000 이상인 행을 FILTER로 반환하는 수식입니다.
=FILTER(
A2:E,
E2:E >= 100000
)
QUERY는 열 선택, 조건, 정렬, 집계, 제한과 결과 제목 변경을 하나의 쿼리문으로 처리할 수 있습니다.
FILTER는 스프레드시트의 일반 조건식을 직접 사용하므로 QUERY 문자열의 따옴표와 날짜 리터럴을 작성할 필요가 없습니다.
| 작업 목적 | 우선 검토할 함수 |
|---|---|
| 조건에 맞는 원본 행만 단순 반환 | FILTER |
| 반환할 열 선택과 정렬을 함께 처리 | QUERY |
| 그룹별 합계·평균·개수 계산 | QUERY |
| 열 안에 숫자와 문자가 혼합돼 있음 | 원본 유형 통일 후 QUERY 또는 FILTER 검토 |
QUERY가 더 복잡한 함수라는 이유만으로 모든 필터 작업에 QUERY를 사용할 필요는 없습니다. 결과에서 필요한 기능과 원본 데이터 유형을 기준으로 선택합니다.
QUERY WHERE 조건 최종 점검 순서
A1부터 시작하는지 A2부터 시작하는지 확인하고 세 번째 인수를 1 또는 0으로 지정합니다.
문자열은 작은따옴표로 감싸고 숫자는 따옴표 없이 작성합니다.
같음은 = 하나를 사용하고, 빈 값은 is null 또는 is not null로 비교합니다.
완성된 쿼리 문자열을 별도 셀에 출력해 따옴표와 조건값을 확인합니다.
여러 조건이 의도한 순서로 계산되도록 OR 조건을 괄호로 묶습니다.
date 'yyyy-MM-dd' 형식을 사용하고 조건 셀은 TEXT로 변환해 연결합니다.
영문 조건에서 대소문자를 무시해야 한다면 lower 또는 upper를 사용합니다.
일반 범위는 A·B·C, 배열 결합 결과는 Col1·Col2 형식을 사용합니다.
같은 열에 숫자와 문자열이 섞여 일부 값이 null로 처리되지 않았는지 확인합니다.
QUERY 결과가 펼쳐질 아래쪽과 오른쪽 셀을 비워 둡니다.
내용 확인에 사용한 Google 공식 자료
공식 문서 확인일: 2026년 7월 29일

댓글 쓰기