Chapter 8: SQL 소개
SQL을 데이터베이스를 위한 수식으로 생각하기
엑셀(Excel)에 익숙하다면, 이미 수식의 강력함을 잘 알고 있을 것입니다. 엑셀 수식은 데이터를 변환하고 계산하며 인사이트를 도출하는 데 사용됩니다. SQL은 데이터베이스에서 비슷한 역할을 하지만, 훨씬 더 강력하고 유연합니다.
엑셀 수식이 특정한 문법(등호로 시작하고, 특정 함수명을 사용하는 등)을 따르듯이, SQL도 고유한 문법을 가지고 있습니다. 예를 들어 엑셀에서 =SUM(B2:B10)
을 사용해 값을 더하듯이, SQL에서는 SELECT SUM(salary) FROM employees
를 사용해 같은 작업을 수행할 수 있습니다.
핵심적인 차이점은 SQL은 개별 셀이 아닌 전체 테이블 단위로 작동한다는 점입니다. 이 덕분에 대용량 데이터셋을 처리할 때 매우 효율적입니다.
SQL이란?
SQL(발음은 "시퀄" 또는 알파벳 S-Q-L)은 Structured Query Language의 약자입니다. 관계형 데이터베이스(Relational Database)와 상호작용하기 위한 표준 언어로, 1970년대부터 사용되어 왔습니다.
SQL은 다음과 같은 특징을 가집니다:
- 선언형(Declarative): 어떻게가 아닌 무엇을 원하는지 기술합니다
- 표준화됨(Standardized): 기본 명령어는 다양한 데이터베이스 시스템 간에 비슷하게 작동합니다
- 강력함(Powerful): 간결한 명령어로 복잡한 데이터 작업을 수행할 수 있습니다
- 특화됨(Specialized): 관계형 데이터베이스를 위한 전용 언어입니다
SQL에는 여러 가지 "방언"(예: MySQL, PostgreSQL, Microsoft SQL Server, Oracle 등)이 있지만, 기본적인 명령어와 구조는 공통적입니다. 한 시스템에서 기본기를 익히면 다른 시스템으로의 전환도 수월합니다.
SQL 명령어의 기본 구조
대부분의 SQL 명령어는 사용자가 원하는 작업을 논리적으로 표현합니다. 가장 일반적인 명령어는 데이터를 조회하는 SELECT
입니다. 기본적인 SELECT
문은 다음과 같습니다:
SELECT column1, column2
FROM table_name
WHERE condition
ORDER BY column1;
각 구성 요소를 살펴보면 다음과 같습니다:
- SELECT: 조회하고자 하는 컬럼을 지정합니다
- FROM: 해당 컬럼이 속한 테이블을 지정합니다
- WHERE: 조건에 따라 행을 필터링합니다 (선택 사항)
- ORDER BY: 결과를 정렬합니다 (선택 사항)
이 구조는 마치 자연어로 데이터를 요청하는 방식과 유사합니다: "이 테이블에서 이런 조건에 맞는 행의 이 컬럼들을 이 순서로 보여줘."
주요 SQL 명령어와 엑셀의 대응 기능
SELECT = 컬럼 선택
SQL의 SELECT
문은 보고 싶은 컬럼을 지정합니다:
SELECT first_name, last_name, salary
FROM employees;
엑셀에서 불필요한 컬럼을 숨기고 원하는 데이터만 보는 것과 비슷합니다.
WHERE = 필터 적용
SQL의 WHERE
절은 조건에 따라 행을 필터링합니다:
SELECT *
FROM employees
WHERE department = 'Sales';
엑셀의 필터 기능을 사용해 Department 컬럼이 "Sales"인 행만 표시하는 것과 동일합니다.
GROUP BY = 피벗 테이블
SQL의 GROUP BY
절은 데이터를 집계합니다. 이는 엑셀의 피벗 테이블 기능과 유사합니다:
SELECT department, AVG(salary) as average_salary
FROM employees
GROUP BY department;
각 부서별 평균 급여를 계산하며, 엑셀에서 범주별 평균값을 피벗 테이블로 계산하는 방식과 비슷합니다.
JOIN = 다른 시트에서 VLOOKUP이나 INDEX/MATCH 사용
SQL의 JOIN
은 여러 테이블의 데이터를 조합합니다:
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.id;
엑셀에서 VLOOKUP이나 INDEX/MATCH로 다른 시트에서 데이터를 가져오는 것과 유사합니다.
ORDER BY = 데이터 정렬
ORDER BY
절은 결과를 정렬합니다:
SELECT *
FROM employees
ORDER BY salary DESC;
엑셀에서 열을 높은 값에서 낮은 값으로 정렬하는 것과 같습니다.
SQL 데이터 타입
엑셀에서 텍스트, 숫자, 날짜 등 다양한 데이터 타입이 존재하듯, SQL에서도 각 컬럼에 대해 명시적인 데이터 타입을 지정합니다. 주요 SQL 데이터 타입은 다음과 같습니다:
- INTEGER: 정수 (예: 1, 42, -99)
- DECIMAL 또는 NUMERIC: 소수점을 포함한 숫자 (예: 10.5, 3.14159)
- VARCHAR: 가변 길이 텍스트 (예: 이름, 주소 등)
- DATE: 날짜 (예: 2025-04-07)
- BOOLEAN: 참/거짓 값
테이블을 생성할 때 각 컬럼의 데이터 타입을 지정하면 데이터의 일관성을 유지하고 적절한 연산이 가능해집니다.
기본 SQL 연산
SQL 초보자가 꼭 알아야 할 기본 연산들을 알아봅시다.
데이터 조회
가장 기본적인 SQL 연산은 SELECT
문을 이용한 데이터 조회입니다:
-- 모든 컬럼과 행 조회
SELECT * FROM customers;
-- 특정 컬럼만 조회
SELECT first_name, last_name, email FROM customers;
-- 중복 제거된 값 조회
SELECT DISTINCT city FROM customers;
데이터 필터링
데이터를 필터링하려면 WHERE
절을 사용합니다:
-- 조건 일치
SELECT * FROM products WHERE category = 'Electronics';
-- 숫자 비교
SELECT * FROM products WHERE price > 100;
-- 복수 조건
SELECT * FROM products
WHERE category = 'Electronics' AND price < 500;
-- 패턴 매칭
SELECT * FROM customers WHERE email LIKE '%gmail.com';
LIKE
연산자는 와일드카드를 이용한 패턴 매칭을 지원합니다:
%
: 임의 개수의 문자_
: 임의의 한 문자
데이터 정렬
결과를 정렬하려면 ORDER BY
를 사용합니다:
-- 기본 오름차순 정렬
SELECT * FROM products ORDER BY price;
-- 내림차순 정렬
SELECT * FROM products ORDER BY price DESC;
-- 복수 기준 정렬
SELECT * FROM customers ORDER BY state, city;
결과 수 제한
많은 SQL 방언에서 결과 행 수를 제한할 수 있습니다:
-- 상위 10개 행만 조회
SELECT * FROM products LIMIT 10;
계산 및 변환
SQL은 계산과 데이터 변환을 위한 함수들을 제공합니다:
-- 집계 함수
SELECT
COUNT(*) as total_customers,
AVG(age) as average_age,
MIN(age) as youngest,
MAX(age) as oldest
FROM customers;
-- 문자열 함수
SELECT
first_name,
last_name,
CONCAT(first_name, ' ', last_name) as full_name,
UPPER(email) as email_uppercase
FROM customers;
-- 날짜 함수
SELECT
order_date,
YEAR(order_date) as order_year,
MONTH(order_date) as order_month
FROM orders;
데이터 그룹화
카테고리별로 데이터를 집계하려면 GROUP BY
를 사용합니다:
-- 주(state)별 고객 수
SELECT state, COUNT(*) as customer_count
FROM customers
GROUP BY state
ORDER BY customer_count DESC;
-- 제품 카테고리별 매출 합계
SELECT
category,
SUM(price * quantity) as total_sales
FROM order_items
JOIN products ON order_items.product_id = products.id
GROUP BY category;
GROUP BY
를 사용할 때 HAVING
절로 그룹을 필터링할 수 있습니다:
-- 총 매출이 $10,000를 초과하는 제품 카테고리
SELECT
category,
SUM(price * quantity) as total_sales
FROM order_items
JOIN products ON order_items.product_id = products.id
GROUP BY category
HAVING SUM(price * quantity) > 10000;
SQL vs. 엑셀: 실용적 비교
SQL이 엑셀과 어떻게 다른지 이해하기 위해 공통적인 데이터 작업을 비교해봅시다:
예제: 부서별 평균 급여 찾기
엑셀:
- 데이터 범위 선택
- 삽입 > 피벗 테이블
- "Department"를 행으로 드래그
- "Salary"를 값으로 드래그
- 값 필드 설정을 "평균"으로 변경
SQL:
SELECT department, AVG(salary) as average_salary
FROM employees
GROUP BY department;
예제: 상위 5명 고액 연봉자 찾기
엑셀:
- 데이터 범위 선택
- 데이터 > 정렬
- Salary 기준 내림차순 정렬
- 상위 5행 확인
SQL:
SELECT first_name, last_name, salary
FROM employees
ORDER BY salary DESC
LIMIT 5;
예제: 부서별 직원 수 세기
엑셀:
- 데이터 범위 선택
- 삽입 > 피벗 테이블
- "Department"를 행으로 드래그
- "Name"을 값으로 드래그 (기본 Count로 설정됨)
SQL:
SELECT department, COUNT(*) as employee_count
FROM employees
GROUP BY department;
예제: 2024년에 채용된 직원 찾기
엑셀:
- 데이터 범위 선택
- 필터 버튼 클릭
- "Hire Date" 컬럼을 2024년으로 필터
SQL:
SELECT *
FROM employees
WHERE YEAR(hire_date) = 2024;
자주 발생하는 SQL 실수
SQL을 처음 접할 때 주의해야 할 일반적인 실수들입니다:
-
세미콜론(;) 누락: 대부분의 SQL 문장은 세미콜론으로 끝나야 합니다
-
잘못된 따옴표 사용: 대부분의 SQL에서는 텍스트는 작은 따옴표('), 컬럼/테이블 이름은 큰 따옴표(")를 사용합니다 (필요한 경우)
-
컬럼/테이블 이름 오타: SQL 키워드는 보통 대소문자를 구분하지 않지만, 테이블과 컬럼 이름의 대소문자 구분 여부는 DBMS에 따라 다릅니다
-
WHERE 절 생략: WHERE 없이 전체 테이블을 조회하면 큰 테이블에서는 비효율적일 수 있습니다
-
= NULL 사용: NULL 값을 비교할 때는
IS NULL
을 사용해야 합니다:-- 잘못된 예 SELECT * FROM customers WHERE phone = NULL; -- 올바른 예 SELECT * FROM customers WHERE phone IS NULL;
-
JOIN의 동작 방식 오해: INNER, LEFT, RIGHT JOIN은 테이블 간 매칭되지 않는 행에 대해 다른 결과를 반환합니다
결론
SQL은 데이터베이스를 다루기 위한 강력한 언어이며, 그 개념 대부분은 엑셀에서 이미 익숙한 작업들과 평행을 이룹니다. SQL을 "데이터베이스를 위한 수식"이라고 생각하면, 엑셀에서의 경험을 기반으로 SQL을 더 쉽게 이해하고 활용할 수 있습니다.
다음 장에서는 실제 SQL 쿼리를 작성하며, 엑셀의 일반 작업들을 SQL로 어떻게 변환하는지를 단계별 예제를 통해 실습해보겠습니다.