SELECT - 조회

KoK·2025년 10월 6일

DATABASE

목록 보기
6/6
post-thumbnail

1. SELECT

데이터베이스에 데이터가 저장되어 있다면, 그 데이터를 바탕으로 다양한 인사이트를 얻을 수 있다. 그중에서도 데이터를 조회하는 데이터 조작어(DML) 인 SELECT 문에 대해 알아보자.

  • SELECT : 무엇을 가져올것인가? (조회할 열, 컬럼을 지정)
  • FROM : 어디에서 가져올것인가? (데이터가 들어있는 테이블을 지정)

예를 들어 customers 테이블의 정보를 조회하고 싶다고 하면

SELECT * FROM customers; -- '*'는 해당 테이블의 모든 데이터를 조회한다는 의미

실행결과

customer_idnameemailpasswordaddressjoin_date
1이순신yisunsin@example.compassword123서울특별시 중구 세종대로2023-05-01 00:00:00
2세종대왕sejong@example.compassword456서울특별시 종로구 사직로2024-05-01 00:00:00
3장영실youngsil@example.compassword789부산광역시 동래구 북천동2025-05-01 00:00:00

위 표처럼 모든 데이터를 조회하면 해당 테이블의 모든 데이터가 전부 조회된다.
하지만 때로는 비밀번호같은 민감한 정보는 필요없을 수 있다.
지금은 테스트용이라 데이터가 별로 없지만 만약 customers테이블에 수백만명의 회원 데이터가 저장되어있다고 생각하면,

  1. 성능저하 : 불필요한 데이터까지 모두 가져와서 DB시스템에 큰 부담을 줄 수 있다. 속도도 저하된다.
  2. 가독성 저하 : 내가 보고싶은 데이터는 '이름'과 '메일'뿐인데, 수십개의 열이 함께 포함되니 한눈에 파악하기 어렵다.
  3. 네트워크 트래픽 낭비 : DB 서버에서 우리 컴퓨터로 데이터를 전송할 때, 필요 없는 데이터까지 함께 보내므로 네트워크 자원을 낭비할 수 있다.

1-1. 특정 열만 선택

SELECT * 대신 SELECT 절에 우리가 보고싶은 열의 이름들을 , 로 구분하여 적어주면 된다.

SELECT name, email FROM customers;

실행결과

nameemail
이순신yisunsin@example.com
세종대왕sejong@example.com
장영실youngsil@example.com

실행 결과를 보면 customer_id, password같은 민감하거나 불필요한정보는 빼고 nameemail데이터만 조회됐다.
이렇게 SELECT FROM 절을 사용해서 성능저하나 가독성 저하 등을 방지하고 원하는 데이터만 골라 조회할 수 있다.


2. WHERE - 기본검색

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_idnameemailpasswordaddressjoin_date
1이순신yisunsin@example.compassword123서울특별시 중구 세종대로2023-05-01 00:00:00

수십, 수백만건의 데이터가 있더라고 WHERE절을 사용해 정확한 조건을 걸어준다면 우리에게 필요한 단 하나의 데이터를 골라서 조회할 수 있다.

더 복잡한 조건이 필요하다면 논리연산자를 사용하면 된다.

  • AND : 양쪽의 조건이 모두 참일 때 최종적으로 참이 된다.
  • OR : 양쪽의 조건 중 하나라도 참이면 최종적으로 참이 된다.
  • NOT : 주어진 조건을 부정한다.
    (이 후 알아볼 IN, LIKE, BETWEEN, IS NULL등과 함께 사용된다.)

2-1. AND

-- 가격이 5000원 이상이면서, 재고가 50개 이상인 상품 조회하기(AND)
SELECT * FROM products WHERE price >= 5000 AND stock_quantity >= 50;

실행결과

product_idnamedescriptionpricestock_quantity
1갤럭시최신 AI 기능이 탑재된 고성능 스마트폰1000055
2아이폰직관적인 사용자 경험을 제공하는 스마트폰500055
3보급형 스마트폰NULL5000100

2-2. OR

-- 가격이 20000원이거나, 재고가 100개 이상인 제품 조회하기(OR)
SELECT * FROM products WHERE price = 20000 OR stock_quantity >= 100;

실행결과

product_idnamedescriptionpricestock_quantity
2LG그램초경량 디자인과 강력한 성능을 자랑하는 노트북2000035
3에어팟편리한 사용성의 무선 이어폰3000110
5보급형 스마트폰NULL5000100

2-3. NOT

-- 가격이 20000원이 아닌 제품을 조회하기(NOT)
SELECT * FROM products WHERE price != 20000;

실행결과

product_idnamedescriptionpricestock_quantity
1갤럭시최신 AI기능이 탑재된 고성능 스마트폰1000055
3아이폰직관적인 사용자 경험을 제공하는 스마트폰500055
4에어팟편리한 사용성의 무선 이어폰3000110
5보급형 스마트폰NULL5000100

3. WHERE - 편리한 조건검색

3-1. BETWEEN : 특정 범위에 있는 값 찾기

SELECT * FROM products WHERE price BETWEEN 5000 AND 15000;
  • 실행 결과는 같지만 이전에 >= 연산자를 사용했을 때보다 훨씬 간결하게 작성할수 있다.
  • BETWEEN은 양 끝 값을 포함 한다.

3-1-1. NOT BETWEEN : 특정 범위를 제외한 값 찾기

  • BETWEEN 앞에 NOT을 붙이면 정확히 그 반대의 의미가 된다.
    이 범위에 속하지 않는다.
-- 테이블에서 가격이 5000원 이상, 15000원 이하가 아닌 상품 조회
SELECT * FROM products WHERE price NOT BETWEEN 5000 AND 15000;

실행결과

product_idnamedescriptionpricestock_quantity
2LG그램초경량 디자인과 강력한 성능을 자랑하는 노트북2000035
4에어팟편리한 사용성의 무선 이어폰3000110

3-2. IN : 목록에 포함된 값 찾기

SELECT * FROM products WHERE name = '갤럭시' OR name = '아이폰' OR name = '에어팟';	
  • 위 쿼리처럼 작성하게 되면 조회해야하는 상품이 수십, 수백개 일때는
    IN을 사용해야한다.
  • IN(목록) 구문은 괄호 안에 있는 목록 중 하나라도 일치하는 것이 있으면 선택한다.
SELECT * FROM products WHERE name IN ('갤럭시', '아이폰', '에어팟');
  • 실행 결과는 이전과 같다. 가동성은 훨씬 좋아졌다.

3-2-1. NOT IN : 목록에 포함되지 않은 값 찾기

마찬가지로 IN 앞에 NOT을 붙이면 반대의 의미로 사용 가능하다.

SELECT * FROM products WHERE NOT IN ('갤럭시', '아이폰', '에어팟');
  • 실행결과는 이전과 같다. 마찬가지로 가독성은 훨씬 향상되었다.

3-3. LIKE : 문자열의 일부로 검색하기(패턴매칭)

  • = 연산자는 문자열 전체가 정확히 일치해야만 사용할 수 있다. 이처럼 문자열의 일부만으로 데이터를 검색하고 싶을 때 LIKE 연산자와 와일드카드를 함께 사용한다.

와일드카드 문자

  • % : 0개 이상의 모든 문자를 의미한다.
    • sejong% : sejong으로 시작하는 모든 문자열 (sejong@example.com, sejong123 등)
    • %example.com : example.com으로 끝나는 모든 문자열(aaa@example.com, hello@example.com 등)
      -%서울% : 서울 이라는 단어를 포함하는 모든 문자열(수도서울, 서울에 살자, 수도 서울에 살자 등)
  • _ : 정확히 한 개의 문자를 의미
    • 이_신 : '이'로 시작하고 '신' 으로 끝나는 세글자 이름(이순신, 이방신 등, 예를 들어 이나라신은 정확히 한 개의 문자가 아니므로 탈락)

3-3-1 NOT LIKE

SELECT * FROM customers WHERE address NOT LIKE '서울특별시%';
customers_idnameemailpasswordaddressjoin_date
3장영실youngsil@example.compassword789부산광역시 동래구 북천동2025-05-01 00:00:00
  • 주소가 서울특별시인 고객을 제외한 나머지 고객을 확인할 수 있다.
profile
개발 이것저것

0개의 댓글