SQL 이란 데이터베이스에 「이런 결과를 보여 달라」고 설명하는 언어입니다. 어떤 순서로 표를 뒤질지는 적지 않고 원하는 결과만 적는데요, 그래서 명령어가 어떤 종류로 나뉘는지와 쿼리가 실제로 어떤 순서로 읽히는지를 알면 처음 보는 쿼리도 훨씬 덜 낯설어집니다. 저도 SQL 을 처음 배우면서 「SELECT 가 맨 앞에 있으니 제일 먼저 실행되겠지」라고 생각했는데요, 이번 글에서는 SQL 이 어떤 언어인지, DDL·DML 같은 명령어 묶음이 무엇인지, 그리고 SELECT 문이 어떤 순서로 실행되는지 예시 표로 하나씩 짚어 보겠습니다. 쿼리는 지난 글처럼 BigQuery(GoogleSQL) 문법으로 적었습니다. 지난 글: SQL 데이터 타입과 NULL: 숫자·문자·날짜, 그리고 빈 값
SQL 기초 시리즈 5/12 · 전체 커리큘럼
오늘 배울 개념
SQL(Structured Query Language)은 관계형 데이터베이스와 대화하는 언어입니다. Microsoft Learn 의 SQL 입문 과정은 프로그래밍 언어를 절차형과 선언형으로 나누는데요, 절차형은 컴퓨터가 따라 할 단계를 하나하나 적는 언어이고, 선언형은 원하는 결과만 적고 그 결과를 만드는 단계는 실행 엔진에 맡기는 언어라고 설명합니다. 그리고 SQL 로 데이터를 조회하는 일은 대개 선언형으로 움직인다고 적고 있죠. 식당에 비유하면 쉽습니다. 손님은 주문서에 「김치찌개 둘, 공깃밥 하나」라고만 쓰고, 냄비를 몇 번째로 올릴지는 주방이 정하죠. SQL 쿼리가 주문서이고, 데이터베이스의 쿼리 처리기가 주방인데요, 같은 문서에 따르면 쿼리 처리기는 데이터에 대한 통계와 표에 걸린 인덱스를 보고 결과를 가져올 쿼리 계획(query plan)을 스스로 세웁니다. 엑셀로 치면 필터와 매크로의 차이에 가깝습니다. 필터는 「채널이 SNS 인 줄만」이라는 조건만 고르면 되고, 매크로(VBA)는 첫 줄부터 마지막 줄까지 돌며 하나씩 확인하는 과정을 직접 적어야 하죠. SQL 은 필터 쪽인 셈입니다.
개념 그림: SQL 은 「무엇을」만 적고 「어떻게」는 데이터베이스가 정합니다
SQL 명령어는 어떤 종류가 있을까요?
SQL 문장은 하는 일에 따라 몇 묶음으로 나뉩니다. BigQuery GoogleSQL 소개 문서에 나오는 분류를 기준으로, 엑셀 작업과 짝을 지어 보면 이렇습니다.
| 묶음 | 하는 일 | BigQuery 명령 예 | 엑셀로 치면 |
|---|---|---|---|
| DQL(Data Query Language, 조회) | 표를 읽어 결과 행을 돌려준다 | SELECT | 필터·피벗으로 보기 |
| DDL(Data Definition Language, 정의) | 데이터셋·표·뷰 같은 객체를 만들고 바꾼다 | CREATE TABLE, ALTER TABLE, DROP TABLE | 시트를 새로 만들고 열 머리글 정하기 |
| DML(Data Manipulation Language, 조작) | 행을 넣고 고치고 지운다 | INSERT, UPDATE, DELETE, MERGE | 셀에 값을 입력·수정·삭제 |
| DCL(Data Control Language, 제어) | 접근 권한 같은 자원을 관리한다 | GRANT, REVOKE | 파일 공유 권한 설정 |
| TCL(Transaction Control Language, 트랜잭션) | 여러 변경을 한 묶음으로 확정하거나 취소한다 | BEGIN TRANSACTION, COMMIT TRANSACTION, ROLLBACK TRANSACTION | 저장하기, 저장하지 않고 닫기 |
지난 4회에서 쓴 CREATE TABLE shop.members (...) 가 DDL 이었고, 0회에서 본 「전부 반영되거나 전부 취소되는」 트랜잭션을 다루는 것이 TCL 입니다. BigQuery 트랜잭션 문서에 따르면 COMMIT TRANSACTION 은 트랜잭션 안의 변경을 한 번에 반영하고, ROLLBACK TRANSACTION 은 그 변경을 모두 버립니다.
권한은 DCL 문서대로 GRANT 로 사용자에게 역할을 주고 REVOKE 로 뺏는데요, 마케터가 매일 쓰게 될 문장은 대부분 SELECT 입니다. 이 시리즈의 6회부터 12회도 거의 SELECT 하나를 깊이 파는 내용이죠.
이 분류는 자료마다 조금 다른데요, BigQuery 문서는 SELECT 를 DQL 로 따로 두지만 Microsoft Learn 과정은 SELECT 를 DML 에 넣고, DML 을 「수정」만으로 좁혀 SELECT 를 DQL 로 떼는 분류도 있다고 소개합니다. 이름보다 「읽기인지, 구조를 바꾸는지, 행을 바꾸는지」를 구분하는 것이 더 중요하죠.
표준 SQL 과 방언: 제품마다 문법이 왜 조금씩 다를까요?
SQL 에는 미국 국가표준협회(ANSI)가 정한 표준이 있고, 각 회사가 여기에 자기만의 변형과 확장을 더한다고 Microsoft Learn 과정은 설명합니다. 그래서 SELECT·INSERT·UPDATE·DELETE 같은 기본 문장은 어느 제품에서나 비슷하게 쓰지만, 세부 문법은 제품마다 조금씩 다른데요, 이렇게 제품별로 갈라진 SQL 을 방언(dialect)이라고 부릅니다. BigQuery 소개 문서는 GoogleSQL 을 ANSI 를 따르는 SQL 이라고 적고, 예전 방식인 legacy SQL 방언도 제한적으로 남아 있지만 새 프로젝트에는 GoogleSQL 을 권한다고 안내합니다.
차이가 잘 보이는 예가 「결과를 몇 행만 보기」입니다.
| 제품 | 방언 이름 | 행 수 제한 문법 |
|---|---|---|
| BigQuery | GoogleSQL | LIMIT 10 |
| PostgreSQL·MySQL | 각 제품 SQL | LIMIT 10 |
| SQL Server | T-SQL(Transact-SQL) | SELECT TOP (10) ... (OFFSET ... FETCH 도 지원) |
| SQL 표준(SQL:2008) | 표준 | FETCH FIRST 10 ROWS ONLY |
PostgreSQL SELECT 문서의 호환성 항목에 따르면 LIMIT·OFFSET 은 PostgreSQL 고유 문법이고 MySQL 도 쓰며, 같은 기능을 하는 표준 문법은 SQL:2008 에서 들어온 FETCH FIRST 입니다. SQL Server 는 TOP 문서대로 TOP 을 쓰고, 여러 쪽으로 나눠 볼 때는 OFFSET·FETCH 를 권하죠.
그래서 처음 배울 때는 「표준에 가까운 뼈대」를 익히고, 쓰는 제품의 문서에서 다른 점만 확인하는 방식이 덜 헷갈립니다. 이 시리즈가 BigQuery 문법으로 쓰면서 다른 제품과 크게 다른 곳만 한 줄씩 덧붙이는 것도 그래서인데요, 그렇다면 그 뼈대인 SELECT 문은 어떤 순서로 읽어야 할까요?
예시로 이해하기: SQL 쿼리 실행 순서
문구점 주문 표 shop.orders 를 놓고 보겠습니다(가상 데이터).
orders
| order_id | member_id | channel | amount | status |
|---|---|---|---|---|
| 1 | 1 | 검색광고 | 12000 | 완료 |
| 2 | 2 | SNS | 8000 | 완료 |
| 3 | 1 | 검색광고 | 15000 | 취소 |
| 4 | 3 | SNS | 22000 | 완료 |
| 5 | 4 | 이메일 | 5000 | 완료 |
| 6 | 2 | 검색광고 | 9000 | 완료 |
「취소를 뺀 주문만으로 채널별 매출을 구하고, 1만 원 이상인 채널만 매출 큰 순서로 보고 싶다」는 질문을 SQL 로 쓰면 이렇습니다. 문법은 6회부터 하나씩 배우니 지금은 모양만 보셔도 충분합니다.
SELECT channel, SUM(amount) AS total
FROM shop.orders
WHERE status = '완료'
GROUP BY channel
HAVING SUM(amount) >= 10000
ORDER BY total DESC;쓰는 순서는 SELECT 가 맨 앞이지만, BigQuery 쿼리 문법 문서는 쿼리가 대체로 FROM → WHERE → GROUP BY 와 집계 → HAVING → WINDOW → QUALIFY → DISTINCT → ORDER BY → LIMIT 순서로 계산된다고 적고, 「계산 순서가 쓰는 순서와 늘 같지는 않다」고 덧붙입니다. WINDOW·QUALIFY 는 이 시리즈에서 다루지 않으니 빼고, 아래 T-SQL 문서의 처리 순서대로 SELECT 목록이 계산되는 자리(HAVING 다음)를 넣어 보면 위 쿼리는 이렇게 흘러갑니다.
- FROM:
shop.orders의 6행을 가져옵니다. - WHERE:
status = '완료'가 아닌 3번 주문이 빠져 5행이 남습니다. - GROUP BY: 채널별로 묶어 검색광고(1·6번) 21000, SNS(2·4번) 30000, 이메일(5번) 5000 의 세 묶음이 됩니다.
- HAVING: 합계가 10000 미만인 이메일 묶음이 빠집니다.
- SELECT: 결과에 보일 열
channel과total을 만듭니다. - ORDER BY:
total이 큰 순서로 줄을 세웁니다.
| channel | total |
|---|---|
| SNS | 30000 |
| 검색광고 | 21000 |
결과는 6행에서 시작해 5행, 3묶음, 2묶음으로 줄어든 뒤 정렬된 모습인데요, 위 숫자는 표가 작아 손으로 더해 맞춘 값입니다. T-SQL SELECT 문서도 FROM·WHERE·GROUP BY·HAVING 다음에 SELECT, 그 뒤에 ORDER BY 가 오는 같은 흐름을 「논리적 처리 순서」로 소개합니다.
개념 그림: 쓰는 순서와 실행 순서가 다른 곳은 SELECT 의 자리입니다
개념 그림: 단계마다 행이 걸러지고 묶이면서 최종 결과 2줄이 남습니다
연습 문제
1. (쉬움) 아래 문장은 각각 DQL·DDL·DML·DCL·TCL 중 어디에 속할까요? CREATE TABLE, INSERT, SELECT, GRANT, COMMIT TRANSACTION, DROP TABLE
정답 보기
CREATE TABLE 은 DDL, INSERT 는 DML, SELECT 는 DQL, GRANT 는 DCL, COMMIT TRANSACTION 은 TCL, DROP TABLE 은 DDL 입니다. 표를 만들고 없애는 것은 「정의」, 행을 넣는 것은 「조작」이라고 기억하면 덜 헷갈립니다. 다만 본문에서 본 것처럼 SELECT 를 DML 에 넣는 자료도 있습니다.
2. (보통) 다음 절을 실행되는 순서대로 늘어놓아 보세요. ORDER BY, FROM, HAVING, SELECT, WHERE, GROUP BY
정답 보기
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY 입니다. 표를 가져오고(FROM), 행을 거르고(WHERE), 묶고(GROUP BY), 묶음을 거른(HAVING) 뒤에야 보여 줄 열을 만들고(SELECT), 마지막에 줄을 세웁니다(ORDER BY).
3. (보통) 예시 쿼리에서 WHERE status = '완료' 줄을 지우면 결과가 어떻게 바뀔까요?
정답 보기
취소된 3번 주문(15000)이 함께 더해집니다. 검색광고가 12000 + 15000 + 9000 = 36000, SNS 는 그대로 30000, 이메일은 5000 이라 HAVING 에서 빠집니다. 정렬하면 검색광고 36000, SNS 30000 순서가 되어 1위가 바뀝니다. WHERE 한 줄이 집계 전에 어떤 행을 넣고 뺄지 정한다는 점을 보여 주는 예입니다.
헷갈리기 쉬운 것
- SELECT 에서 지은 별칭은 WHERE 에서 못 씁니다: 실행 순서상 WHERE 가 SELECT 보다 먼저라서,
WHERE total >= 10000처럼 SELECT 에서 지은 이름(total)을 쓰면 안 됩니다. BigQuery 쿼리 문법 문서도 WHERE 는 FROM 에서 온 열만 참조하고 SELECT 목록의 별칭은 참조할 수 없다고 적고 있죠. 반대로 BigQuery 는GROUP BY·HAVING·ORDER BY에서는 별칭을 쓸 수 있게 해 주는데요, Microsoft Learn 과정에 따르면 SQL Server 에서는 SELECT 의 별칭을GROUP BY·HAVING에서 쓸 수 없습니다. 예시 쿼리의 HAVING 에 별칭 대신SUM(amount)를 그대로 적은 것도 어느 제품에서나 통하게 하려는 것입니다. - 논리적 순서는 실제 처리 순서와 다를 수 있습니다: BigQuery 문서는 「대체로(typically)」 그 순서로 계산된다고 표현하고, T-SQL SELECT 문서는 실제 물리적 실행은 쿼리 처리기가 정하며 순서가 목록과 다를 수 있다고 적습니다. 실행 순서는 「어느 절에서 어떤 이름을 쓸 수 있는지」를 판단하는 읽는 순서로 이해하시면 됩니다.
- ORDER BY 가 없으면 결과 순서는 정해져 있지 않습니다: BigQuery 쿼리 문법 문서에 따르면 ORDER BY 가 없을 때 결과 순서는 정의되지 않습니다. 같은 쿼리라도 줄 순서가 늘 같다고 기대하지 말고, 순서가 필요하면 ORDER BY 를 꼭 적어 두세요.
마치며
SQL 이란 원하는 결과를 설명하는 선언형 언어이고, 명령어는 조회(DQL)·정의(DDL)·조작(DML)·권한(DCL)·트랜잭션(TCL)으로 나뉘며, SELECT 문은 쓰는 순서와 달리 FROM 에서 시작해 ORDER BY 로 끝나는 순서로 읽힙니다. 처음 보는 쿼리를 만나면 SELECT 부터 읽지 말고 FROM 부터 따라가 보시길 권하는데요, 「어느 표에서 어떤 행을 걸러 어떻게 묶었나」가 먼저 보이면 쿼리가 훨씬 짧게 느껴질 거예요. 저도 시리즈를 따라가며 공부하고 있으니 전체 커리큘럼을 참고해 주세요. 다음 글에서는 SELECT·FROM 으로 원하는 열만 꺼내는 법을 다룹니다.
자주 묻는 질문
- SQL 이란 무엇이고 어디에 쓰나요?
- SQL(Structured Query Language)은 관계형 데이터베이스에 데이터를 조회하고, 표를 만들고, 행을 넣고 고치고, 권한을 관리하는 언어입니다. 원하는 결과만 적으면 데이터베이스의 쿼리 처리기가 가져오는 방법을 정하는 선언형 방식이라, 마케터는 주로 SELECT 문으로 매출·광고 성과 같은 데이터를 집계할 때 씁니다.
- DDL 과 DML 의 차이는 무엇인가요?
- DDL 은 표·뷰 같은 객체 자체를 만들고 바꾸고 없애는 문장(CREATE·ALTER·DROP)이고, DML 은 이미 있는 표 안의 행을 넣고 고치고 지우는 문장(INSERT·UPDATE·DELETE·MERGE)입니다. 엑셀로 치면 DDL 은 시트와 열 머리글을 만드는 일, DML 은 셀 값을 입력·수정하는 일에 가깝습니다.
- SQL 실행 순서는 어떻게 되나요?
- SELECT 문은 FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY 순서로 읽힙니다(BigQuery 문서 기준으로 그 뒤에 LIMIT). 그래서 SELECT 에서 지은 별칭은 WHERE 에서 쓸 수 없습니다. 이 순서는 논리적인 순서이고, 실제 처리 방식은 데이터베이스가 정합니다.
관련 글 더 보기
- SQL 데이터 타입과 NULL: 숫자·문자·날짜, 그리고 빈 값 - SQL 기초 시리즈 4회, CREATE TABLE 과 타입
- 데이터베이스란? 엑셀 시트와 무엇이 다를까 - SQL 기초 시리즈 0회, DBMS 와 트랜잭션
- 엑셀 피벗테이블이란? 뜻부터 만들기·새로고침까지 실무 활용법 - GROUP BY 집계와 닮은 엑셀 기능
