SELECT 문은 데이터 조회의 출발점입니다
SQL은 데이터베이스에 요청을 보내는 언어입니다. 그중 SELECT 문은 테이블에 저장된 데이터를 읽을 때 사용합니다.
MySQL을 배우는 과정에서 SELECT는 가장 먼저 익혀야 할 문장입니다. 데이터를 추가하거나 수정하기 전에도, 현재 어떤 데이터가 들어 있는지 확인하려면 결국 SELECT를 사용해야 합니다.
가장 기본 형태는 다음과 같습니다.
SELECT 열이름
FROM 테이블이름;예를 들어 students 테이블에서 모든 학생의 이름을 조회하려면 다음처럼 작성합니다.
SELECT name
FROM students;여러 열을 함께 보고 싶다면 쉼표로 구분합니다.
SELECT id, name, score
FROM students;모든 열을 조회할 때는 *를 사용할 수 있습니다.
SELECT *
FROM students;*는 편리하지만, 실무에서는 필요한 열만 선택하는 습관이 좋습니다. 열이 많거나 데이터가 큰 테이블에서 모든 열을 가져오면 불필요한 데이터까지 읽게 됩니다.

SQL 문장은 어떻게 읽히는가
처음 SQL을 배울 때 헷갈리는 부분이 있습니다. 우리는 SQL을 다음 순서로 씁니다.
SELECT name, score
FROM students
WHERE score >= 80;하지만 데이터를 처리하는 흐름은 대체로 다음 순서로 이해하면 쉽습니다.
FROM students
어느 테이블에서 데이터를 가져올지 정합니다.WHERE score >= 80
조건에 맞는 행만 남깁니다.SELECT name, score
남은 행에서 필요한 열만 보여 줍니다.
즉, SQL은 작성 순서와 처리 흐름이 완전히 같지 않습니다. SELECT가 먼저 보이지만, 실제로는 먼저 테이블을 정하고, 조건으로 행을 걸러낸 뒤, 마지막에 보여 줄 열을 고른다고 생각하면 됩니다.
이 흐름은 앞으로 조인, 그룹화, 서브쿼리를 배울 때도 계속 중요합니다.
사용할 데이터베이스와 예제 데이터 준비하기
이전 장에서 만든 mysql_book 데이터베이스를 사용한다고 가정하겠습니다.
USE mysql_book;현재 어떤 테이블이 있는지 확인하려면 다음 명령을 실행합니다.
SHOW TABLES;students 테이블의 구조를 확인하려면 다음처럼 입력합니다.
DESC students;이전 장에서 만든 students 테이블은 처음 접속을 확인하기 위한 아주 단순한 구조였습니다. 이번 장에서는 조건 검색을 연습하기 위해 학년, 점수, 도시, 생년월일 컬럼을 함께 사용하겠습니다.
이미 students 테이블을 만들었다면 다음 문장으로 필요한 컬럼을 추가할 수 있습니다. 같은 컬럼이 이미 있다면 오류가 날 수 있으니, DESC students;로 먼저 확인해 보세요.
ALTER TABLE students
ADD COLUMN grade INT,
ADD COLUMN score INT,
ADD COLUMN city VARCHAR(50),
ADD COLUMN birth_date DATE;새로 시작하고 싶다면 아래처럼 테이블을 다시 만들어도 됩니다. 단, 기존 students 데이터가 모두 지워지므로 학습용 데이터인지 확인한 뒤 실행하세요.
DROP TABLE IF EXISTS students;
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
email VARCHAR(100),
grade INT,
score INT,
city VARCHAR(50),
birth_date DATE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);예제를 따라 하기 쉽도록 샘플 데이터를 넣겠습니다.
INSERT INTO students (name, email, grade, score, city, birth_date)
VALUES
('Kim', '[email protected]', 1, 95, 'Seoul', '2005-03-15'),
('Lee', '[email protected]', 2, 82, 'Busan', '2004-11-02'),
('Park', NULL, 2, 70, 'Seoul', '2005-07-21'),
('Choi', '[email protected]', 3, 88, 'Incheon', '2003-12-09'),
('Han', '[email protected]', 1, NULL, 'Seoul', '2006-01-30');실제 테이블의 열 이름이 다르다면, 예제의 열 이름을 자신의 테이블에 맞게 바꾸어 실행하면 됩니다.
숫자 데이터 조회하기
숫자 데이터는 따옴표 없이 사용합니다.
SELECT id, name, score
FROM students;점수가 90점 이상인 학생만 조회하려면 WHERE 절을 사용합니다.
SELECT id, name, score
FROM students
WHERE score >= 90;WHERE는 조건에 맞는 행만 남기는 역할을 합니다.
다음은 학년이 2학년인 학생을 조회하는 예입니다.
SELECT id, name, grade
FROM students
WHERE grade = 2;SQL에서 =는 "같다"라는 뜻입니다. 프로그래밍 언어에서 자주 쓰는 ==가 아니라 = 하나를 사용합니다.
문자열 데이터 조회하기
문자열은 작은따옴표로 감쌉니다.
SELECT id, name, city
FROM students
WHERE city = 'Seoul';문자열을 비교할 때 따옴표를 빼면 MySQL은 그것을 열 이름이나 다른 식별자로 해석하려고 합니다. 이름, 도시, 이메일처럼 문자로 된 값은 작은따옴표로 감싸는 습관을 들이는 것이 좋습니다.
이름이 Kim인 학생을 찾는 예는 다음과 같습니다.
SELECT id, name, score
FROM students
WHERE name = 'Kim';문자열의 대소문자 구분 여부는 문자셋과 콜레이션 설정에 따라 달라질 수 있습니다. 처음 학습할 때는 저장된 값과 같은 형태로 입력하는 것이 안전합니다.
날짜 데이터 조회하기
MySQL에서 날짜는 보통 'YYYY-MM-DD' 형식으로 작성합니다.
SELECT id, name, birth_date
FROM students
WHERE birth_date = '2005-03-15';특정 날짜 이후에 태어난 학생도 조회할 수 있습니다.
SELECT id, name, birth_date
FROM students
WHERE birth_date >= '2005-01-01';날짜도 비교가 가능합니다. 더 과거의 날짜는 작은 값으로, 더 나중의 날짜는 큰 값으로 비교된다고 이해하면 됩니다.
열 이름에 별칭 붙이기
조회 결과의 열 이름을 보기 좋게 바꾸고 싶을 때는 별칭을 사용합니다. 별칭은 AS로 붙입니다.
SELECT name AS student_name,
score AS exam_score
FROM students;결과 화면에서는 name 대신 student_name, score 대신 exam_score라는 이름이 보입니다.
AS는 생략할 수도 있습니다.
SELECT name student_name,
score exam_score
FROM students;하지만 처음 배울 때는 AS를 쓰는 편이 더 명확합니다.
별칭에 공백을 넣고 싶다면 백틱을 사용할 수 있습니다.
SELECT name AS `student name`,
score AS `exam score`
FROM students;다만 실무에서는 공백이 들어간 별칭보다 student_name처럼 밑줄을 사용하는 방식이 더 다루기 쉽습니다.
계산 결과 조회하기
SELECT 문은 테이블의 열만 그대로 보여 주는 것이 아닙니다. 간단한 계산 결과도 조회할 수 있습니다.
SELECT name,
score,
score + 5 AS adjusted_score
FROM students;이 문장은 기존 점수에 5점을 더한 값을 adjusted_score라는 이름으로 보여 줍니다. 테이블에 저장된 값이 바뀌는 것은 아닙니다. SELECT는 조회용 문장이므로 계산 결과를 화면에 보여 줄 뿐입니다.
간단한 문자열이나 숫자 계산도 직접 조회할 수 있습니다.
SELECT 'MySQL' AS database_name;SELECT 10 + 20 AS result;이런 방식은 SQL 문법을 빠르게 확인하거나 함수 결과를 테스트할 때 유용합니다.
WHERE 절로 필요한 행만 고르기
WHERE 절은 조건에 맞는 행만 조회합니다.
SELECT 열이름
FROM 테이블이름
WHERE 조건;예를 들어 점수가 80점 이상인 학생을 조회하려면 다음처럼 씁니다.
SELECT id, name, score
FROM students
WHERE score >= 80;WHERE 절이 없으면 테이블의 모든 행이 조회됩니다.
SELECT id, name, score
FROM students;데이터가 적을 때는 문제가 없어 보이지만, 실무 테이블에는 수십만, 수백만 행이 들어 있을 수 있습니다. 필요한 데이터만 조회하는 습관이 중요합니다.
비교 연산자 사용하기
비교 연산자는 값을 비교할 때 사용합니다.
| 연산자 | 의미 | 예 |
|---|---|---|
= | 같다 | grade = 1 |
<> | 같지 않다 | city <> 'Seoul' |
!= | 같지 않다 | city != 'Seoul' |
> | 크다 | score > 80 |
>= | 크거나 같다 | score >= 80 |
< | 작다 | score < 60 |
<= | 작거나 같다 | score <= 60 |
MySQL에서는 같지 않음을 나타낼 때 <>와 !=를 모두 사용할 수 있습니다.
SELECT id, name, score
FROM students
WHERE score < 70;SELECT id, name, city
FROM students
WHERE city <> 'Seoul';논리 연산자 AND, OR, NOT
조건을 하나만 쓰는 경우도 있지만, 실제 조회에서는 여러 조건을 함께 사용하는 일이 많습니다. 이때 논리 연산자를 사용합니다.
AND: 모든 조건을 만족해야 함
AND는 양쪽 조건을 모두 만족하는 행만 남깁니다.
SELECT id, name, grade, score
FROM students
WHERE grade = 2
AND score >= 80;이 문장은 2학년이면서 점수가 80점 이상인 학생을 조회합니다.
OR: 조건 중 하나만 만족해도 됨
OR는 여러 조건 중 하나라도 만족하면 결과에 포함합니다.
SELECT id, name, city
FROM students
WHERE city = 'Seoul'
OR city = 'Busan';거주 도시가 Seoul이거나 Busan인 학생을 조회합니다.
NOT: 조건을 반대로 바꿈
NOT은 조건을 부정합니다.
SELECT id, name, grade
FROM students
WHERE NOT grade = 1;다만 위 문장은 다음처럼 쓰는 편이 더 읽기 쉽습니다.
SELECT id, name, grade
FROM students
WHERE grade <> 1;SQL은 실행되는 것도 중요하지만, 사람이 읽기 쉬운 것도 중요합니다.
AND와 OR를 함께 쓸 때는 괄호를 사용하기
AND와 OR를 함께 쓰면 조건의 의미가 헷갈릴 수 있습니다.
SELECT id, name, grade, city, score
FROM students
WHERE grade = 1
OR grade = 2
AND score >= 90;이 문장은 얼핏 보면 "1학년 또는 2학년 중에서 점수가 90점 이상"처럼 보일 수 있습니다. 하지만 AND가 OR보다 먼저 처리됩니다.
따라서 위 조건은 다음과 비슷하게 해석됩니다.
WHERE grade = 1
OR (grade = 2 AND score >= 90)원하는 조건이 "1학년 또는 2학년이면서, 점수가 90점 이상"이라면 괄호를 명확히 써야 합니다.
SELECT id, name, grade, city, score
FROM students
WHERE (grade = 1 OR grade = 2)
AND score >= 90;조건이 조금이라도 복잡해지면 괄호를 사용하는 습관이 좋습니다. 괄호는 SQL을 읽는 사람에게 의도를 분명하게 전달합니다.
IN으로 여러 값 중 하나 찾기
같은 열에 대해 여러 값을 비교할 때 OR를 반복하면 문장이 길어집니다.
SELECT id, name, city
FROM students
WHERE city = 'Seoul'
OR city = 'Busan'
OR city = 'Incheon';이럴 때는 IN을 사용할 수 있습니다.
SELECT id, name, city
FROM students
WHERE city IN ('Seoul', 'Busan', 'Incheon');IN은 괄호 안의 값 중 하나와 일치하면 결과에 포함합니다.
학년이 1, 2, 3학년 중 하나인 학생을 조회할 때도 사용할 수 있습니다.
SELECT id, name, grade
FROM students
WHERE grade IN (1, 2, 3);반대로 목록에 포함되지 않은 값을 찾으려면 NOT IN을 사용합니다.
SELECT id, name, city
FROM students
WHERE city NOT IN ('Seoul', 'Busan');BETWEEN으로 범위 조회하기
어떤 값이 일정 범위 안에 있는지 확인할 때는 BETWEEN을 사용할 수 있습니다.
SELECT id, name, score
FROM students
WHERE score BETWEEN 80 AND 90;중요한 점은 BETWEEN이 양쪽 끝값을 포함한다는 것입니다. 위 문장은 다음과 같은 의미입니다.
WHERE score >= 80
AND score <= 90날짜 범위에도 사용할 수 있습니다.
SELECT id, name, birth_date
FROM students
WHERE birth_date BETWEEN '2005-01-01' AND '2005-12-31';범위 밖의 값을 찾고 싶다면 NOT BETWEEN을 사용합니다.
SELECT id, name, score
FROM students
WHERE score NOT BETWEEN 60 AND 100;LIKE로 일부 문자열 검색하기
문자열의 일부만 알고 있을 때는 LIKE를 사용합니다. LIKE는 패턴 검색을 위한 조건입니다. 패턴에는 주로 %와 _를 사용합니다.
| 기호 | 의미 |
|---|---|
% | 글자 수와 상관없이 아무 문자열 |
_ | 정확히 한 글자 |
이름이 Kim으로 시작하는 학생을 찾으려면 다음처럼 씁니다.
SELECT id, name
FROM students
WHERE name LIKE 'Kim%';이메일에 gmail이 들어간 학생을 찾을 수도 있습니다.
SELECT id, name, email
FROM students
WHERE email LIKE '%gmail%';두 번째 글자가 a인 이름을 찾으려면 _를 사용할 수 있습니다.
SELECT id, name
FROM students
WHERE name LIKE '_a%';NULL은 빈 문자열이나 0이 아닙니다
SQL에서 NULL은 값이 없음을 의미합니다. 아직 입력되지 않았거나, 알 수 없거나, 해당되지 않는 값을 나타낼 때 사용합니다.
NULL은 다음 값들과 다릅니다.
숫자
0빈 문자열
''공백
' '날짜처럼 보이는 잘못된 값
예를 들어 어떤 학생의 이메일을 아직 모른다면 email 값이 NULL일 수 있습니다.
이때 다음 조건은 올바르지 않습니다.
SELECT id, name, email
FROM students
WHERE email = NULL;NULL은 일반 값처럼 =로 비교하지 않습니다. 값이 없다는 특별한 상태이기 때문에, 같다 또는 같지 않다로 판단하지 않습니다.
NULL을 찾을 때는 IS NULL을 사용합니다.
SELECT id, name, email
FROM students
WHERE email IS NULL;NULL이 아닌 값을 찾으려면 IS NOT NULL을 사용합니다.
SELECT id, name, email
FROM students
WHERE email IS NOT NULL;NULL이 포함된 조건을 조심하기
NULL은 비교 연산자와 함께 사용할 때 주의해야 합니다.
예를 들어 다음 조건을 보겠습니다.
SELECT id, name, score
FROM students
WHERE score <> 0;이 조건은 점수가 0이 아닌 학생을 찾습니다. 하지만 score가 NULL인 행은 결과에 포함되지 않습니다. NULL <> 0이 참으로 판단되는 것이 아니라, 알 수 없음으로 처리되기 때문입니다.
점수가 0이 아니거나 아직 입력되지 않은 학생까지 포함하고 싶다면 조건을 따로 써야 합니다.
SELECT id, name, score
FROM students
WHERE score <> 0
OR score IS NULL;반대로 점수가 실제로 입력된 학생 중에서 0이 아닌 학생만 찾고 싶다면 다음처럼 씁니다.
SELECT id, name, score
FROM students
WHERE score IS NOT NULL
AND score <> 0;NULL은 "값이 없다"는 특별한 상태입니다. 일반 숫자나 문자열처럼 다루지 않는 것이 핵심입니다.
SELECT 문 작성 순서 정리
이번 장에서 배운 기본 SELECT 문은 다음 형태로 정리할 수 있습니다.
SELECT 열이름 또는 계산식
FROM 테이블이름
WHERE 조건;예제를 하나로 묶어 보겠습니다.
SELECT id,
name AS student_name,
grade,
score
FROM students
WHERE grade IN (1, 2)
AND score BETWEEN 80 AND 100
AND city = 'Seoul';이 문장은 다음 의미입니다.
students테이블에서학년이 1 또는 2이고
점수가 80점 이상 100점 이하이며
도시가
Seoul인 행을 찾은 뒤id,name,grade,score열을 보여 줍니다.
SQL을 읽을 때는 항상 이 질문을 순서대로 해 보세요.
어느 테이블에서 가져오는가?
어떤 행을 남기는가?
어떤 열을 보여 주는가?
이 세 가지를 구분하면 SELECT 문을 훨씬 쉽게 이해할 수 있습니다.
직접 연습해 보기
아래 문장을 직접 실행해 보면서 결과가 어떻게 달라지는지 확인해 보세요.
1. 모든 학생 조회하기
SELECT *
FROM students;2. 이름과 점수만 조회하기
SELECT name, score
FROM students;3. 80점 이상인 학생 조회하기
SELECT name, score
FROM students
WHERE score >= 80;4. 1학년 또는 2학년 학생 조회하기
SELECT name, grade
FROM students
WHERE grade IN (1, 2);5. 점수가 70점 이상 90점 이하인 학생 조회하기
SELECT name, score
FROM students
WHERE score BETWEEN 70 AND 90;6. 이메일이 없는 학생 조회하기
SELECT name, email
FROM students
WHERE email IS NULL;7. 이름에 a가 포함된 학생 조회하기
SELECT name
FROM students
WHERE name LIKE '%a%';실습할 때는 조건을 조금씩 바꿔 보세요. >=를 >로 바꾸거나, AND를 OR로 바꾸면 결과가 어떻게 달라지는지 확인하는 것이 중요합니다.
핵심 정리
SELECT 문은 데이터를 조회하는 가장 기본적인 SQL 문장입니다.
SELECT는 보여 줄 열을 정합니다.FROM은 데이터를 가져올 테이블을 정합니다.WHERE는 조건에 맞는 행만 남깁니다.숫자는 따옴표 없이, 문자열과 날짜는 보통 작은따옴표로 감쌉니다.
별칭은
AS로 붙입니다.여러 조건은
AND,OR,NOT으로 연결합니다.여러 값 중 하나를 찾을 때는
IN을 사용합니다.범위를 찾을 때는
BETWEEN을 사용합니다.일부 문자열을 찾을 때는
LIKE를 사용합니다.NULL은= NULL이 아니라IS NULL로 확인합니다.
이번 장의 목표는 SQL을 많이 외우는 것이 아닙니다. SELECT, FROM, WHERE가 각각 어떤 역할을 하는지 이해하는 것입니다.
다음 장에서는 조회 결과를 정렬하고, 개수를 세고, 그룹으로 묶는 방법을 배웁니다. 데이터를 읽는 능력이 한 단계 더 넓어집니다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.