SELECT·FROM WHERE 비교 연산자 별칭 AS 실행 순서 📝 문제풀이
◀ 이전 📋 목차 CH 03 ▶
🔍 CHAPTER 02 · 입문

SELECT 기본 — 원하는 데이터를 골라내기

CH 01에서 "데이터는 표로 저장되고 SQL로 물어본다"는 큰 그림을 잡았죠. 이제 실제로 어느 열을, 어느 테이블에서, 어떤 조건으로 가져올지 직접 써 보는 장이에요. 한 줄씩 천천히 손에 익혀볼게요.

🎯 이 장을 끝내면
🗄️
이 장의 예제 테이블. CH 01에서 봤던 users 테이블을 계속 이어서 씁니다. id(번호), name(이름), age(나이) 세 열이 있어요. 아래 세 명이 들어 있다고 생각하고 예제를 따라와 주세요.
users 테이블 (전체)
idnameage
1'철수'20
2'영희'25
3'민수'30
📥
SELECT · FROM
어느 열을, 어느 테이블에서
가장 기본 짝꿍. SELECT는 "무엇을", FROM은 "어디서".

SELECT는 "어느 열을 가져올지", FROM은 "어느 테이블에서 가져올지"를 적어요. 이 둘은 거의 항상 함께 다녀요. 먼저 모든 열을 가져오는 SELECT *부터 봐요.

SELECT *          -- 모든 열(id, name, age)을
FROM users;       -- users 테이블에서 가져와라

별표(*)는 "전부"라는 뜻이에요. 그래서 위 쿼리는 users모든 열, 모든 행을 그대로 돌려줘요.

결과: SELECT * FROM users;
idnameage
1'철수'20
2'영희'25
3'민수'30

필요한 열만 콕 집어 가져오려면 별표 대신 열 이름을 쉼표로 나열해요. 예를 들어 이름과 나이만 보고 싶다면:

SELECT name, age   -- name과 age 열만
FROM users;        -- users 테이블에서
결과: SELECT name, age FROM users;
nameage
'철수'20
'영희'25
'민수'30

id 열이 결과에서 사라졌죠? 내가 적은 열만 나와요. 열의 순서도 내가 적은 대로 나옵니다(SELECT age, name이라 쓰면 나이가 앞에 와요).

🆚 SELECT * vs 특정 열 SELECT * — "모든 열 다 줘". 빠르게 확인할 때 편해요.
SELECT name, age — "이 열만 줘". 필요한 것만 가져와 결과가 깔끔하고 낭비가 적어요. 💡 실무에서는 필요한 열만 명시하는 쪽을 권해요. 자바로 치면 SELECT *는 "객체 통째로", 특정 열 조회는 "필요한 필드만 꺼내 쓰기"에 가까워요.
💡
SQL 문장은 보통 세미콜론(;)으로 끝내요. 키워드(SELECT·FROM)는 대소문자를 안 가리지만, 관례로 대문자를 써서 눈에 잘 띄게 합니다.
🔎
WHERE
WHERE로 행을 걸러내기
SELECT가 "열"을 고른다면, WHERE는 "행"을 고릅니다.

SELECT세로(열)를 골랐죠. 이제 가로(행)를 고를 차례예요. WHERE는 "조건에 맞는 행만 남겨라"라는 뜻이에요. 조건이 참(true)인 행만 결과에 들어와요.

SELECT *
FROM users
WHERE age >= 20;   -- 나이가 20 이상인 행만

세 명 모두 나이가 20 이상이라, 이 경우엔 전부 통과해요. 조건을 더 좁혀 볼까요? 나이가 25 이상인 사람만:

SELECT name, age
FROM users
WHERE age >= 25;   -- 25 이상만 통과
결과: WHERE age >= 25
nameage
'철수'20  ✗
'영희'25  ✓
'민수'30  ✓

철수(20)는 조건에 맞지 않아 걸러졌어요. 이번엔 이름으로 찾아볼게요. 여기서 중요한 규칙 하나 —

SELECT *
FROM users
WHERE name = '철수';   -- 문자열은 작은따옴표로 감싼다!
🧵 문자열은 작은따옴표, 숫자는 그냥 문자열 값'철수'처럼 작은따옴표('…')로 감싸요. 감싸지 않으면 DB는 그걸 "열 이름"으로 오해해요.
숫자 값20처럼 따옴표 없이 그대로 씁니다. 💡 자바의 문자열은 큰따옴표("철수")지만, 표준 SQL의 문자열은 작은따옴표예요. 이 차이를 처음에 자주 헷갈려요. "SQL 문자열 = 작은따옴표"로 기억!
🧭
WHERE없으면 모든 행이 대상이 돼요(SELECT * FROM users;는 전부 조회). WHERE를 붙이는 순간 "이 조건을 통과한 행만"으로 좁혀지는 거예요.
⚖️
비교 연산자
조건을 만드는 비교 연산자들
WHERE 안에서 값을 비교할 때 쓰는 기호들이에요.

WHERE의 조건은 대부분 "이 값과 저 값을 비교"하는 형태예요. SQL의 비교 연산자를 표로 정리했어요.

연산자예시
=같다age = 20
<> (또는 !=)같지 않다age <> 20
>크다 (초과)age > 20
<작다 (미만)age < 20
>=크거나 같다 (이상)age >= 20
<=작거나 같다 (이하)age <= 20
☕ 자바 개발자가 꼭 짚을 점 자바에서는 값이 같은지 볼 때 ==(등호 두 개)를 쓰죠. 하지만 SQL은 등호 하나 = 로 비교해요. SQL에는 ==없어요.
또 "같지 않다"는 자바의 !=도 되지만, 표준 SQL은 <>를 정석으로 씁니다(둘 다 널리 통해요). 💡 정리: 같다 = = (자바의 == 아님), 같지 않다 = <> 또는 !=.
-- 20살이 "아닌" 사람
SELECT name, age
FROM users
WHERE age <> 20;   -- '철수'(20) 제외, '영희'·'민수' 통과
💡
>(초과)와 >=(이상)의 한 글자 차이가 결과를 가릅니다. "20 초과"는 20을 포함하지 않고, "20 이상"은 20을 포함해요. 경계값에서 자주 실수하니 조건을 적을 때 "이 값 자신도 들어가나?"를 항상 되물어 보세요.
🏷️
별칭 AS
AS로 결과 열 이름 바꾸기
결과를 볼 때만 이름을 예쁘게 갈아입혀요.

결과 표의 열 제목(헤더)을 보기 좋게 바꾸고 싶을 때 AS 별칭을 써요. 실제 테이블의 열 이름이 바뀌는 건 아니고, "이번 결과에서만" 표시 이름을 바꾸는 거예요.

🔤
별칭(alias) — 어떤 대상에게 붙이는 "임시 별명"이에요. 여기서는 AS로 결과 열에 새 표시 이름을 달아주는 걸 뜻해요. 나중에 배울 조인(CH 06)에서는 긴 테이블 이름을 짧게 부를 때도 이 별칭을 써요.
SELECT name AS 이름, age AS 나이
FROM users;
결과: 헤더가 별칭으로 바뀜
이름나이
'철수'20
'영희'25
'민수'30

열 제목이 name·age에서 이름·나이로 바뀌었죠. AS생략할 수도 있어요 — SELECT name 이름처럼요(하지만 AS를 적으면 뜻이 더 또렷해서 초보 때는 적는 걸 권해요).

🏷️
별칭에 띄어쓰기나 특수문자가 들어가면 AS "회원 이름"처럼 큰따옴표(제품에 따라 백틱)로 감싸요. 지금은 "결과 헤더를 갈아입히는 스티커" 정도로 가볍게 기억하면 충분해요.
🔢
실행 순서
쓰는 순서 ≠ 처리되는 순서
이 감각 하나면 앞으로가 훨씬 편해져요.

우리는 문장을 SELECT → FROM → WHERE 순서로 씁니다. 그런데 데이터베이스가 실제로 처리하는 순서는 조금 달라요.

🗄️
① FROM
먼저 테이블을 연다
🔎
② WHERE
조건으로 행을 거른다
🎯
③ SELECT
남은 행에서 열을 고른다

즉 DB는 먼저 어느 테이블인지 열고(FROM), 그다음 조건에 맞는 행만 남기고(WHERE), 마지막에 보여줄 열을 고른다(SELECT)는 거예요. 작성은 SELECT가 맨 앞이지만, 논리적으로는 FROM → WHERE → SELECT인 셈이죠.

🤔 왜 이걸 알아두면 좋을까? "먼저 행을 거르고(WHERE), 그다음 열을 고른다(SELECT)"는 흐름을 알면, 결과가 왜 이렇게 나오는지가 머릿속에 그려져요. 나중에 정렬·집계 같은 게 붙어도 "어느 단계에서 일어나는 일인지"로 정리하면 헷갈리지 않아요. 💡 자바로 비유하면: 컬렉션을 filter(WHERE)로 먼저 걸러낸 뒤 map(SELECT)으로 필요한 값만 뽑아내는 스트림 흐름과 비슷해요.
🧠 이 장 핵심 요약
📝
문제풀이 · 점검
배운 걸 가볍게 점검해봐요
시험이 아니라 "내가 이해했나" 확인용이에요. 틀려도 바로 해설이 나와요.
🧪
문제를 풀면 즉시 정답과 해설이 나오고, 위쪽 바에 점수가 쌓여요. 네 가지 유형(객관식 · O/X · 빈칸 · 쿼리결과)을 섞어 두었어요.
CH 03 ↕️ 정렬과 제한 — ORDER BY로 줄 세우고 LIMIT으로 개수 자르기