데이터베이스에 데이터가 저장되어 있다면, 그 데이터를 바탕으로 다양한 인사이트를 얻을 수 있다. 그중에서도 데이터를 조회하는 데이터 조작어(DML) 인
SELECT문에 대해 알아보자.
SELECT : 무엇을 가져올것인가? (조회할 열, 컬럼을 지정)FROM : 어디에서 가져올것인가? (데이터가 들어있는 테이블을 지정)예를 들어 customers 테이블의 정보를 조회하고 싶다고 하면
SELECT * FROM customers; -- '*'는 해당 테이블의 모든 데이터를 조회한다는 의미
실행결과
| customer_id | name | password | address | join_date | |
|---|---|---|---|---|---|
| 1 | 이순신 | yisunsin@example.com | password123 | 서울특별시 중구 세종대로 | 2023-05-01 00:00:00 |
| 2 | 세종대왕 | sejong@example.com | password456 | 서울특별시 종로구 사직로 | 2024-05-01 00:00:00 |
| 3 | 장영실 | youngsil@example.com | password789 | 부산광역시 동래구 북천동 | 2025-05-01 00:00:00 |
위 표처럼 모든 데이터를 조회하면 해당 테이블의 모든 데이터가 전부 조회된다.
하지만 때로는 비밀번호같은 민감한 정보는 필요없을 수 있다.
지금은 테스트용이라 데이터가 별로 없지만 만약 customers테이블에 수백만명의 회원 데이터가 저장되어있다고 생각하면,
성능저하 : 불필요한 데이터까지 모두 가져와서 DB시스템에 큰 부담을 줄 수 있다. 속도도 저하된다.가독성 저하 : 내가 보고싶은 데이터는 '이름'과 '메일'뿐인데, 수십개의 열이 함께 포함되니 한눈에 파악하기 어렵다.네트워크 트래픽 낭비 : DB 서버에서 우리 컴퓨터로 데이터를 전송할 때, 필요 없는 데이터까지 함께 보내므로 네트워크 자원을 낭비할 수 있다.SELECT * 대신 SELECT 절에 우리가 보고싶은 열의 이름들을 , 로 구분하여 적어주면 된다.
SELECT name, email FROM customers;
실행결과
| name | |
|---|---|
| 이순신 | yisunsin@example.com |
| 세종대왕 | sejong@example.com |
| 장영실 | youngsil@example.com |
실행 결과를 보면 customer_id, password같은 민감하거나 불필요한정보는 빼고 name과 email데이터만 조회됐다.
이렇게 SELECT FROM 절을 사용해서 성능저하나 가독성 저하 등을 방지하고 원하는 데이터만 골라 조회할 수 있다.
SELECT 열이름
FROM 테이블이름
WHERE 조건
WHERE 절은 FROM 절 바로 뒤에 위치하고 우리가 원하는 행(row)만 걸러내는 필터 역할을 한다.| 연산자 | 의미 | 예시 |
|---|---|---|
| = | 같다 | WHERE name = '이순신' |
| != 또는 <> | 같지 않다 | WHERE name != '세종대왕' |
| > | 크다 | WHERE price > 10000 |
| < | 작다 | WHERE stock_quantity < 50 |
| >= | 크거나 같다 | WHERE price >= 10000 |
| <= | 작거나 같다 | WHERE stock_quantity <= 50 |
SELECT * FROM customers WHERE email 'yisunsin@example.com';
실행결과
| customer_id | name | password | address | join_date | |
|---|---|---|---|---|---|
| 1 | 이순신 | yisunsin@example.com | password123 | 서울특별시 중구 세종대로 | 2023-05-01 00:00:00 |
수십, 수백만건의 데이터가 있더라고 WHERE절을 사용해 정확한 조건을 걸어준다면 우리에게 필요한 단 하나의 데이터를 골라서 조회할 수 있다.
더 복잡한 조건이 필요하다면 논리연산자를 사용하면 된다.
AND : 양쪽의 조건이 모두 참일 때 최종적으로 참이 된다.OR : 양쪽의 조건 중 하나라도 참이면 최종적으로 참이 된다.NOT : 주어진 조건을 부정한다.IN, LIKE, BETWEEN, IS NULL등과 함께 사용된다.)-- 가격이 5000원 이상이면서, 재고가 50개 이상인 상품 조회하기(AND)
SELECT * FROM products WHERE price >= 5000 AND stock_quantity >= 50;
실행결과
| product_id | name | description | price | stock_quantity |
|---|---|---|---|---|
| 1 | 갤럭시 | 최신 AI 기능이 탑재된 고성능 스마트폰 | 10000 | 55 |
| 2 | 아이폰 | 직관적인 사용자 경험을 제공하는 스마트폰 | 5000 | 55 |
| 3 | 보급형 스마트폰 | NULL | 5000 | 100 |
-- 가격이 20000원이거나, 재고가 100개 이상인 제품 조회하기(OR)
SELECT * FROM products WHERE price = 20000 OR stock_quantity >= 100;
실행결과
| product_id | name | description | price | stock_quantity |
|---|---|---|---|---|
| 2 | LG그램 | 초경량 디자인과 강력한 성능을 자랑하는 노트북 | 20000 | 35 |
| 3 | 에어팟 | 편리한 사용성의 무선 이어폰 | 3000 | 110 |
| 5 | 보급형 스마트폰 | NULL | 5000 | 100 |
-- 가격이 20000원이 아닌 제품을 조회하기(NOT)
SELECT * FROM products WHERE price != 20000;
실행결과
| product_id | name | description | price | stock_quantity |
|---|---|---|---|---|
| 1 | 갤럭시 | 최신 AI기능이 탑재된 고성능 스마트폰 | 10000 | 55 |
| 3 | 아이폰 | 직관적인 사용자 경험을 제공하는 스마트폰 | 5000 | 55 |
| 4 | 에어팟 | 편리한 사용성의 무선 이어폰 | 3000 | 110 |
| 5 | 보급형 스마트폰 | NULL | 5000 | 100 |
SELECT * FROM products WHERE price BETWEEN 5000 AND 15000;
포함 한다.이 범위에 속하지 않는다.-- 테이블에서 가격이 5000원 이상, 15000원 이하가 아닌 상품 조회
SELECT * FROM products WHERE price NOT BETWEEN 5000 AND 15000;
실행결과
| product_id | name | description | price | stock_quantity |
|---|---|---|---|---|
| 2 | LG그램 | 초경량 디자인과 강력한 성능을 자랑하는 노트북 | 20000 | 35 |
| 4 | 에어팟 | 편리한 사용성의 무선 이어폰 | 3000 | 110 |
IN : 목록에 포함된 값 찾기SELECT * FROM products WHERE name = '갤럭시' OR name = '아이폰' OR name = '에어팟';
IN을 사용해야한다.IN(목록) 구문은 괄호 안에 있는 목록 중 하나라도 일치하는 것이 있으면 선택한다. SELECT * FROM products WHERE name IN ('갤럭시', '아이폰', '에어팟');
마찬가지로 IN 앞에 NOT을 붙이면 반대의 의미로 사용 가능하다.
SELECT * FROM products WHERE NOT IN ('갤럭시', '아이폰', '에어팟');
LIKE : 문자열의 일부로 검색하기(패턴매칭)= 연산자는 문자열 전체가 정확히 일치해야만 사용할 수 있다. 이처럼 문자열의 일부만으로 데이터를 검색하고 싶을 때 LIKE 연산자와 와일드카드를 함께 사용한다.와일드카드 문자
% : 0개 이상의 모든 문자를 의미한다.sejong% : sejong으로 시작하는 모든 문자열 (sejong@example.com, sejong123 등)%example.com : example.com으로 끝나는 모든 문자열(aaa@example.com, hello@example.com 등)%서울% : 서울 이라는 단어를 포함하는 모든 문자열(수도서울, 서울에 살자, 수도 서울에 살자 등)_ : 정확히 한 개의 문자를 의미이_신 : '이'로 시작하고 '신' 으로 끝나는 세글자 이름(이순신, 이방신 등, 예를 들어 이나라신은 정확히 한 개의 문자가 아니므로 탈락)SELECT * FROM customers WHERE address NOT LIKE '서울특별시%';
| customers_id | name | password | address | join_date | |
|---|---|---|---|---|---|
| 3 | 장영실 | youngsil@example.com | password789 | 부산광역시 동래구 북천동 | 2025-05-01 00:00:00 |