1. SQL은 어떤 언어인가
SQL은 데이터를 계산, 로직의 구현보단 데이터베이스(DB)에 저장된 데이터를 조회하고 요약하는 언어에 더 가깝다.
특히, 데이터 분석 관점에서 SQL은 다음과 같은 역할을 한다.
• 필요한 데이터를 고른다
• 조건에 맞는 행만 남긴다
• 정렬하거나 개수를 제한한다
이 모든 작업은 결국 “데이터를 읽고 줄이는 과정”으로 볼 수 있다.
2. SQL 작성 순서와 실행 순서
SQL을 처음 배울 때 가장 헷갈리는 개념 중 하나가 작성 순서와 실제 실행 순서가 다르다는 점이다.
작성할 때는 보통 아래와 같은 순서로 쿼리를 작성한다.
SELECT
FROM
WHERE
ORDER BY
LIMIT
하지만 데이터베이스 내부에서는 다음 순서로 처리된다.
|
FROM
↓
ON
↓
JOIN
↓
WHERE
↓
GROUP BY
↓
HAVING
↓
SELECT
↓
DISTINCT
↓
ORDER BY
|
이 차이를 이해하지 못하면. GROUP BY, HAVING, 서브쿼리에서 오류가 발생했을 때 이유를 파악하기 어렵다.
3. SELECT / FROM — 데이터 조회의 시작
SQL에서 데이터를 조회하는 모든 쿼리는 SELECT와 FROM으로 시작한다.
이 둘은 단순히 “가져온다 / 어디서” 수준이 아니라, 쿼리의 역할을 명확히 나누는 핵심 구성 요소다.
가장 기본적인 조회 문법은 다음과 같다.
SELECT column_name
FROM table_name;
여러 컬럼을 조회할 경우에는 쉼표로 구분한다.
SELECT
col1,
col2,
col3
FROM user;
이처럼 SELECT 절에서는 조회하고 싶은 컬럼을 하나씩 명시해주면 된다.
3.1) 별칭(AS) — 결과를 읽기 쉽게 만들기
데이터를 조회하다 보면 컬럼 이름이 너무 길거나, 현재 분석 목적에 비해 의미가 직관적이지 않은 경우가 있다.
이럴 때 별칭(alias)를 사용해 컬럼의 이름을 바꿀수 있다.
SELECT
user_id AS id,
created_at AS signup_date
FROM users;
위 쿼리에서 실제 컬럼 이름은 user_id, created_at이지만, 조회 결과에서는 각각 id, signup_date라는 이름으로 표시된다.
3.2) FROM — 데이터 원천 결정
FROM 절은 조회 대상이 되는 데이터의 출처를 결정한다.
• FROM은 데이터를 ‘선택’하지 않는다.
• FROM은 쿼리의 작업 대상 집합을 만든다.
“이 테이블(또는 이 결과 집합)을 기준으로 이후 작업을 하겠다" 라 선언하는 것과 같다.
3.3) SELECT — 결과 컬럼 생성
SELECT 절은 FROM에서 만들어진 데이터 집합을 어떻게 표현할지 결정한다.
• 어떤 컬럼을 볼지
• 계산식을 쓸지
• 집계할지
• 별칭(alias)을 붙일지
SELECT는 결과의 형태와 출력 *스키마를 만든다
* 스키마: 데이터베이스의 구조(개체, 속성, 관계)와 제약 조건에 대한 정의
4. WHERE — 행 필터링
WHERE 절은 행 단위로 데이터를 필터링하는 역할을 한다.
SELECT *
FROM users
WHERE age >= 20;
|
비교연산자
|
의미
|
예시
|
|
=
|
같다
|
age=21 gender=’female’
|
|
<>
|
같지 않다 (다르다)
|
age<>21 gender<>’female’
|
|
>
|
크다
|
age>21
|
|
>=
|
크거나 같다
|
age>=21
|
|
<
|
작다
|
age<21
|
|
<=
|
작거나 같다
|
age<=21
|
|
논리연산자
|
의미
|
예시
|
|
AND
|
그리고
|
age>20 and gender=’female’ → 나이가 20세 이상이고, 여성
|
|
OR
|
또는
|
age>20 or gender=’female’ → 나이가 20세 이상이거나, 여성
|
비교 연산자와 논리 연산자를 조합해 더 촘촘하게 필터링을 할수도 있다.
SELECT *
FROM users
WHERE age >= 20
AND gender = 'F';
5. IN / LIKE
조건이 많아질수록 가독성을 유지하는 것이 중요하다.
IN은 여러 개의 값 중 하나라도 일치하면 참(True) 이 되는 조건문이다.
같은 컬럼에 대해 OR 조건을 여러 번 쓰는 것을 간단하게 표현할 때 사용한다.
SELECT *
FROM orders
WHERE status IN ('PAID', 'SHIPPED');
LIKE는 문자열 패턴을 기준으로 데이터를 검색할 때 사용한다.
정확히 일치하는 값이 아니라 “이런 형태의 문자열”을 찾고 싶을 때 활용된다.
SELECT *
FROM users
WHERE email LIKE 'abc%' -- abc로 시작
WHERE email LIKE '%abc%' -- abc 포함
WHERE email LIKE '%abc' -- abc로 끝남
WHERE email LIKE '%___%' -- 3글자
% : 글자 0개 이상(아무 길이)
_ : 글자 1개(정확히 한 글자)
6. NULL — SQL에서 가장 자주 실수하는 부분
NULL은 값이 없다는 의미이지, 0이나 빈 문자열과는 전혀 다른 개념이다.
NULL은 일반적인 비교 연산자로 비교할 수 없다.
다음 쿼리는 잘못된 예시다.
SELECT *
FROM users
WHERE deleted_at = NULL
NULL 비교는 반드시 IS NULL 또는 IS NOT NULL을 사용해야 한다.
SELECT *
FROM users
WHERE deleted_at IS NULL
or activated_at IS NOT NULL
NULL 처리는 이후 JOIN이나 집계 단계에서 특히 중요해진다.
7. ORDER BY / LIMIT — 결과 해석을 바꾸는 요소
ORDER BY는 최종 결과를 정렬하는 역할을 한다.
여러 컬럼을 기준으로 우선순위를 두고 정렬할 수도 있다.
SELECT *
FROM orders
ORDER BY activated_at ASC, created_at DESC;
ASC : 오름차순 (기본값)
DESC : 내림차순
LIMIT은 결과 개수를 제한한다.
SELECT *
FROM orders
ORDER BY created_at DESC
LIMIT 10;
같은 데이터라도 완전히 다른 의미를 가질 수 있으므로
ORDER BY는 항상 의도를 가지고 사용해야 한다.
오늘 학습한 내용 정리
- SQL은 데이터를 읽고 줄이는 언어다
- SELECT절은 어떤것을 보여줄지 결정한다.
- FROM절은 어디에서 데이터를 가져올것인지 결정한다.
- WHERE는 행 필터링 역할을 한다
- FROM → WHERE → SELECT 순서로 데이터가 처리된다
- NULL은 일반 값과 다르게 처리해야 한다
- 비교연산자와 논리연산자 LIKE와 같은 조건을 사용할줄 알아야 한다.
- ORDER BY와 LIMIT은 결과 해석에 직접적인 영향을 준다
가장 중요한 포인트!
|
FROM
↓
ON
↓
JOIN
↓
WHERE
↓
GROUP BY
↓
HAVING
↓
SELECT
↓
DISTINCT
↓
ORDER BY
|
이 기본 흐름이 익숙해지면 이후의 집계, JOIN, 서브쿼리도 훨씬 자연스럽게 이해할 수 있다.
'F.SQL > SQL 기초 복습' 카테고리의 다른 글
| [SQL] 복잡한 쿼리를 다루는 방법 — 서브쿼리와 CTE (0) | 2026.01.04 |
|---|---|
| [SQL] JOIN 실전 — 테이블 연결하기 (0) | 2026.01.04 |
| [SQL] 테이블 구조 이해 & JOIN 준비 운동 (0) | 2026.01.04 |
| [SQL] 데이터를 숫자로 요약하기 — 집계와 그룹화 (0) | 2026.01.03 |
| [SQL] 조건을 조금 더 똑똑하게 — CASE로 데이터 분류하기 (0) | 2026.01.03 |
