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. 핵심 정리
- SELECT는 테이블에서 원하는 데이터를 조회하는 가장 기본적인 SQL 문이다.
- ORDER BY는 조회 결과를 정렬하며, 여러 기준을 함께 줄 수 있다.
- WHERE는 조건에 맞는 행만 필터링할 때 사용한다.
- 문자열 검색에는 LIKE, 여러 값 비교에는 IN, 범위 비교에는 BETWEEN이 유용하다.
- NULL 비교는 =가 아니라 IS NULL, IS NOT NULL을 사용해야 한다.
- DISTINCT는 중복을 제거하고 고유한 값만 확인할 때 사용한다.
- LIMIT은 결과 개수를 제한하거나 페이지 단위 조회에 활용된다.
- JOIN은 여러 테이블의 데이터를 연결해서 함께 조회하는 핵심 기능이다.
- INNER JOIN은 서로 매칭되는 데이터만, LEFT JOIN은 왼쪽 테이블 전체를 유지한다.
- SELF JOIN은 같은 테이블 안의 계층 관계를 표현할 때 유용하다.
'TIL > [TIL]' 카테고리의 다른 글
| [TIL]JDBC 기초: 연결, Statement, PreparedStatement, SQL Injection, CRUD 흐름 (0) | 2026.05.18 |
|---|---|
| [TIL]SQL 심화: GROUP BY, 서브쿼리, 집합 연산, DML, 트랜잭션, DDL, 제약조건, 데이터 타입, 인덱스 (1) | 2026.05.15 |
| [TIL]enum, lambda, stream 실무 관점 정리 (0) | 2026.05.13 |
| [TIL]Exception, Checked/Unchecked, 예외 계층 구조, 다형성, IO 스트림 (0) | 2026.05.12 |
| [TIL]Java Collection Framework, List / Set / Map 핵심 정리 (0) | 2026.05.11 |