TIL/[TIL]

[TIL]SQL 조회 기초: SELECT, ORDER BY, WHERE, DISTINCT, LIMIT, JOIN

namerong 2026. 5. 14. 14:40

1. 학습 주제

데이터베이스에서 데이터를 조회하는 가장 기본적인 문법 흐름을 정리했다.
특히 단순 조회에서 시작해서, 정렬, 조건 필터링, 중복 제거, 결과 개수 제한, 그리고 여러 테이블을 연결하는 JOIN까지 이어지는 흐름을 학습했다.

  • SELECT로 원하는 컬럼 조회하기
  • ORDER BY로 결과 정렬하기
  • WHERE로 조건에 맞는 데이터만 필터링하기
  • DISTINCT로 중복 제거하기
  • LIMIT로 필요한 개수만 조회하기
  • JOIN으로 여러 테이블 데이터를 함께 조회하기

2. SELECT

SELECT는 테이블에서 원하는 데이터를 조회할 때 사용하는 가장 기본적인 SQL 문이다.

SELECT menu_name FROM tbl_menu;
  • 특정 컬럼 하나만 조회할 수 있다.
  • 여러 컬럼도 함께 조회할 수 있다.
  • *를 사용하면 모든 컬럼을 조회할 수 있다.
SELECT
    menu_code,
    menu_name,
    menu_price
FROM
    tbl_menu;
SELECT * FROM tbl_menu;

SELECT는 테이블 조회뿐 아니라 간단한 연산이나 함수 실행에도 사용할 수 있다.

SELECT 6 + 3;
SELECT NOW();
SELECT CONCAT('홍', '길동');

또한 AS를 사용하면 컬럼 결과에 별칭을 붙일 수 있다.

SELECT CONCAT('홍', '길동') AS name;
SELECT CONCAT('홍', '길동') AS 'Full name';
  • 조회 결과를 더 읽기 쉽게 만들 수 있다.
  • 연산 결과나 함수 결과에 이름을 붙일 때 유용하다.

3. ORDER BY

ORDER BY는 조회한 결과를 원하는 기준으로 정렬할 때 사용한다.

SELECT
    menu_code,
    menu_name,
    menu_price
FROM
    tbl_menu
ORDER BY
    menu_price ASC;
  • ASC는 오름차순이다.
  • ASC는 생략 가능하다.
  • DESC는 내림차순이며 생략할 수 없다.
ORDER BY
    menu_price DESC,
    menu_name ASC;
  • 정렬 기준은 여러 개 줄 수 있다.
  • 첫 번째 기준이 같으면 두 번째 기준으로 정렬한다.

연산 결과나 별칭으로도 정렬할 수 있다.

SELECT
    menu_code,
    menu_price,
    menu_code * menu_price AS calculated_value
FROM
    tbl_menu
ORDER BY
    calculated_value DESC;

특정 값의 우선순위를 직접 정하고 싶을 때는 FIELD()를 사용할 수 있다.

ORDER BY
    FIELD(orderable_status, 'N', 'Y');
  • 'N'을 먼저, 'Y'를 나중에 배치할 수 있다.
  • 일반적인 오름차순/내림차순이 아니라 사용자 지정 순서를 만들 때 유용하다.

NULL 정렬도 함께 확인했다.

ORDER BY
    ref_category_code IS NULL DESC;
  • NULL 여부를 조건처럼 사용해 정렬할 수 있다.
  • NULL 데이터를 위로 올리거나 아래로 내리는 제어가 가능하다.

4. WHERE

WHERE는 원하는 조건에 맞는 행만 골라내는 필터 역할을 한다.

SELECT
    menu_name,
    menu_price
FROM
    tbl_menu
WHERE
    menu_price < 13000;
  • 비교 연산자를 사용해 조건을 줄 수 있다.
  • =, <>, >, <, >=, <= 등을 사용한다.

논리 연산자를 사용하면 여러 조건을 조합할 수 있다.

WHERE
    orderable_status = 'Y' AND category_code = 10;
WHERE
    orderable_status = 'Y' OR category_code = 10;
  • AND는 모두 만족해야 한다.
  • OR는 하나만 만족해도 된다.

범위 조건은 BETWEEN으로 더 읽기 쉽게 표현할 수 있다.

WHERE
    menu_price BETWEEN 10000 AND 25000;

부정은 NOT BETWEEN을 사용한다.

문자열 검색은 LIKE를 사용한다.

WHERE
    menu_name LIKE '%마늘%';
  • %마늘% : 마늘이 포함된 경우
  • 마늘% : 마늘로 시작하는 경우
  • %마늘 : 마늘로 끝나는 경우

여러 값 중 하나인지 확인할 때는 IN이 유용하다.

WHERE
    category_code IN (4, 5, 6);

NULL 비교는 일반 =로 할 수 없다는 점도 중요했다.

WHERE
    ref_category_code IS NULL;
  • NULL은 값이 없다는 특별한 상태이다.
  • = NULL이 아니라 IS NULL, IS NOT NULL을 사용해야 한다.

5. DISTINCT

DISTINCT는 중복된 값을 제거하고 고유한 값만 보고 싶을 때 사용한다.

SELECT DISTINCT
    category_code
FROM
    tbl_menu;
  • 특정 컬럼에 어떤 값들이 종류별로 있는지 확인할 때 유용하다.
  • 데이터의 “목록”이나 “분류값”을 빠르게 파악할 수 있다.

NULL이 포함된 컬럼에도 사용할 수 있다.

SELECT DISTINCT
    ref_category_code
FROM
    tbl_category;

여러 컬럼을 함께 지정하면, 선택한 컬럼 조합이 모두 같을 때만 중복으로 판단한다.

SELECT DISTINCT
    category_code,
    orderable_status
FROM
    tbl_menu;
  • 단일 컬럼 중복 제거와 다르게, 여러 컬럼을 하나의 묶음으로 본다.

6. LIMIT

LIMIT은 조회 결과 중 일부만 잘라서 가져올 때 사용한다.

SELECT
    menu_name,
    menu_price
FROM
    tbl_menu
ORDER BY
    menu_price DESC
LIMIT 5;
  • 상위 5개 결과만 가져온다.
  • 많은 데이터 중 일부만 보고 싶을 때 유용하다.

시작 위치와 개수를 함께 지정할 수도 있다.

LIMIT 1, 4;
  • 1개를 건너뛴 뒤 4개를 가져온다.
  • 게시판 페이지네이션의 핵심 원리로 자주 사용된다.

즉 LIMIT은:

  • 상위 N개 조회
  • 페이지별 데이터 잘라서 조회
  • 테스트용 샘플 데이터 확인

같은 상황에서 많이 사용된다.


7. JOIN

JOIN은 서로 다른 테이블에 저장된 데이터를 연결해서 함께 조회하는 기능이다.
관계형 데이터베이스에서 매우 중요한 개념이다.

예를 들어 메뉴 테이블에는 category_code만 있고, 카테고리 이름은 다른 테이블에 있을 수 있다.
이럴 때 두 테이블을 연결해서 한 번에 조회한다.


8. 컬럼 별칭과 테이블 별칭

JOIN을 사용하기 전에 별칭 개념도 같이 확인했다.

8.1 컬럼 별칭

SELECT
    menu_name AS '메뉴 이름',
    menu_price price
FROM
    tbl_menu;
  • 결과 컬럼 이름을 보기 좋게 바꿀 수 있다.

8.2 테이블 별칭

SELECT
    a.menu_name,
    a.menu_price
FROM
    tbl_menu AS a;
  • 테이블 이름이 길거나 여러 테이블을 함께 쓸 때 편하다.
  • JOIN에서는 거의 필수처럼 사용된다.

9. INNER JOIN

가장 기본적인 JOIN은 INNER JOIN이다.

SELECT
    a.menu_name,
    b.category_name
FROM
    tbl_menu a
JOIN
    tbl_category b ON a.category_code = b.category_code;
  • 두 테이블에서 연결 조건이 맞는 데이터만 가져온다.
  • 교집합 개념으로 이해할 수 있다.
  • 메뉴와 카테고리 이름을 함께 보고 싶을 때 적합하다.

즉 INNER JOIN은:

  • 서로 짝이 맞는 데이터만 조회
  • 가장 기본적이고 자주 쓰이는 JOIN 방식

이라고 볼 수 있다.


10. OUTER JOIN

OUTER JOIN은 한쪽 테이블의 데이터를 모두 유지하면서, 짝이 맞는 데이터가 없으면 NULL로 채워서 보여준다.

10.1 LEFT JOIN

SELECT
    a.category_name,
    b.menu_name
FROM
    tbl_category a
LEFT JOIN tbl_menu b ON a.category_code = b.category_code;
  • 왼쪽 테이블의 데이터는 모두 유지한다.
  • 오른쪽에 짝이 없으면 NULL로 표시된다.

즉:

  • “기준 테이블은 다 보여주고 싶다”
  • “연결되는 데이터가 없더라도 빠뜨리고 싶지 않다”

는 상황에 적합하다.

10.2 RIGHT JOIN

  • 오른쪽 테이블을 기준으로 모두 보여준다.
  • 원리는 LEFT JOIN과 같고 기준만 반대이다.

11. SELF JOIN

SELF JOIN은 같은 테이블을 자기 자신과 조인하는 방식이다.

SELECT
    a.category_name AS '하위 카테고리',
    b.category_name AS '상위 카테고리'
FROM
    tbl_category a
JOIN tbl_category b ON a.ref_category_code = b.category_code;
  • 같은 테이블을 두 번 사용하지만 역할이 다르다.
  • 하나는 하위 카테고리 역할, 하나는 상위 카테고리 역할을 한다.

이런 구조는 계층형 데이터에서 자주 사용된다.

예:

  • 카테고리 상하위 구조
  • 조직도
  • 댓글과 부모 댓글 관계

12. 학습 흐름 정리

12.1 단일 테이블 조회

  • SELECT로 원하는 컬럼 조회
  • ORDER BY로 정렬
  • WHERE로 조건 필터링
  • DISTINCT로 중복 제거
  • LIMIT으로 필요한 만큼만 조회

12.2 여러 테이블 조회

  • 컬럼 별칭, 테이블 별칭 사용
  • INNER JOIN으로 매칭되는 데이터만 조회
  • LEFT JOIN으로 기준 테이블 전체 유지
  • SELF JOIN으로 같은 테이블을 관계형으로 조회

13. 핵심 정리

  1. SELECT는 테이블에서 원하는 데이터를 조회하는 가장 기본적인 SQL 문이다.
  2. ORDER BY는 조회 결과를 정렬하며, 여러 기준을 함께 줄 수 있다.
  3. WHERE는 조건에 맞는 행만 필터링할 때 사용한다.
  4. 문자열 검색에는 LIKE, 여러 값 비교에는 IN, 범위 비교에는 BETWEEN이 유용하다.
  5. NULL 비교는 =가 아니라 IS NULL, IS NOT NULL을 사용해야 한다.
  6. DISTINCT는 중복을 제거하고 고유한 값만 확인할 때 사용한다.
  7. LIMIT은 결과 개수를 제한하거나 페이지 단위 조회에 활용된다.
  8. JOIN은 여러 테이블의 데이터를 연결해서 함께 조회하는 핵심 기능이다.
  9. INNER JOIN은 서로 매칭되는 데이터만, LEFT JOIN은 왼쪽 테이블 전체를 유지한다.
  10. SELF JOIN은 같은 테이블 안의 계층 관계를 표현할 때 유용하다.