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, 서브쿼리도 훨씬 자연스럽게 이해할 수 있다.

+ Recent posts