[11편] SQL 기초: 데이터베이스 조회 시 WHERE와 JOIN 절 올바르게 쓰는 법




프론트엔드와 API 통신 구조까지 탄탄하게 익혔다면, 이제 웹 서비스의 뒤편에서 데이터를 묵묵히 보관하고 관리하는 데이터베이스(DB)의 세계를 마주할 차례다. 백엔드 개발은 물론이고 풀스택 개발자나 데이터 분석을 지망하는 이들이 가장 먼저 통과해야 할 관문은 단연 SQL(Structured Query Language)이다.

화면 속 멋진 버튼 뒤편에서 사용자가 요청한 데이터를 정확하게 콕 집어 가져오거나, 흩어져 있는 방대한 정보를 하나로 엮어내는 작업은 모두 SQL의 기초 문법 위에서 이루어진다. 하지만 초보자들은 쿼리문을 작성할 때 필터링을 잘못하거나 여러 테이블을 엉뚱하게 엮어버려 서버를 멈추게 하거나 엉뚱한 데이터를 출력하는 실수를 반복하곤 한다.

[소제목] WHERE 절로 원하는 데이터만 정확하게 필터링하기

데이터베이스에 저장된 수만 건의 회원 정보나 상품 목록 중에서 내가 원하는 조건에 딱 맞는 데이터만 골라내는 작업은 SQL의 기본 중의 기본이다. 이때 사용하는 것이 바로 WHERE 절이다.

  • WHERE 절은 SELECT 문 뒤에 붙어 특정 조건을 만족하는 행(Row)만 추려내는 필터 역할을 한다.

  • 예를 들어 쇼핑몰 DB에서 가격이 1만 원 이상이면서 재고가 남아있는 상품만 조회하고 싶다면 조건식을 어떻게 엮어야 할지 기준이 명확해야 한다.

  • 조건문 안에서는 대소비교 연산자(>, <)뿐만 아니라 문자열 패턴을 찾는 LIKE, 여러 값을 한 번에 지정하는 IN 등의 보조 도구를 적절히 조합할 수 있다.

직접 쿼리를 짜다 보면 조건문 연결에 쓰이는 AND와 OR의 순서를 헷갈려 엉뚱한 데이터가 조회되는 바람에 당황하는 경우가 적지 않다. 특히 OR 연산이 섞일 때는 괄호 ()를 이용해 우선순위를 명확히 잡아주지 않으면 데이터 필터링이 완전히 틀어지므로 주의가 필요하다.

[소제목] JOIN 절의 개념과 테이블을 쪼개는 이유

실무에서 데이터베이스를 설계할 때는 모든 정보를 하나의 거대한 표(Table)에 때려 넣지 않는다. 회원 정보, 주문 내역, 상품 정보 등 주제별로 테이블을 잘게 쪼개어(정규화) 관리하는 것이 원칙이다.

  • 테이블이 쪼개져 있기 때문에, 사용자의 이름과 그 사용자가 주문한 상품의 이름을 한눈에 보려면 흩어진 테이블들을 다시 하나로 연결해주어야 한다.

  • 이 연결 작업을 수행하는 핵심 문법이 바로 JOIN이다.

  • 가장 흔하게 쓰이는 INNER JOIN은 두 테이블 사이에 공통으로 존재하는 교집합 데이터만 반환하며, 어느 한쪽에만 데이터가 있거나 누락된 경우를 대비해 LEFT JOIN이나 RIGHT JOIN을 활용해 기준을 잡아주어야 한다.

초보 시절에 가장 많이 하는 실수는 JOIN 조건을 잘못 걸어서(예: 연결 고리가 되는 고유 번호 매칭을 누락하여) 데이터가 기하급수적으로 증폭되는 이른바 '카테시안 곱(Cartesian Product)' 현상을 마주하는 것이다. 순식간에 수백만 개의 행이 화면에 쏟아지며 데이터베이스가 멈추는 아찔한 경험을 하게 된다.

[소제목] 실무 쿼리 작성 시 주의해야 할 성능 최적화 팁

SQL을 처음 공부할 때는 "원하는 결과만 잘 나오면 그만이지" 하고 작성하기 바쁘지만, 데이터 양이 수십만 건 이상으로 늘어나면 작성한 쿼리 하나 때문에 서버 전체가 느려지는 현상을 겪게 된다.

  • WHERE 절에서 필터링을 할 때 대상 컬럼에 함수를 씌우거나 가공을 해버리면(예: WHERE YEAR(created_at) = 2026), 데이터베이스에 미리 만들어둔 인덱스(Index)가 무력화되어 전체 테이블을 다 뒤지는 풀 스캔(Full Scan)이 발생한다.

  • 따라서 컬럼 원본 상태 그대로 비교 조건을 걸어주는 습관을 들여야 한다.

  • 또한, 필요한 컬럼만 SELECT 명시하고 불필요하게 SELECT *를 난발하는 버릇은 네트워크 자원을 낭비하는 주범이므로 지양해야 한다.

[소제목] 초보자가 자주 하는 실수와 주의사항

SQL을 다룰 때 가장 흔한 실수는 대소문자 구분을 소홀히 하거나 세미콜론(;) 마침표를 빼먹어서 구문 에러를 마주하는 것이다. SQL 명령어 자체는 대소문자를 엄격하게 가리지 않지만, 테이블 이름이나 컬럼명은 데이터베이스 설정에 따라 대소문자를 구분하는 경우가 많으므로 주의해야 한다.

또한, 데이터를 삭제(DELETE)하거나 수정(UPDATE)하는 쿼리를 날릴 때 WHERE 절을 빠뜨리는 대참사도 가끔 일어난다. 조건문 없이 UPDATE users SET status = 'inactive'; 같은 명령을 쳐버리면 테이블 전체의 데이터가 순식간에 망가져 버리므로, 수정이나 삭제 쿼리를 실행하기 전에는 반드시 SELECT 문으로 어떤 대상이 추려지는지 눈으로 먼저 확인하는 습관을 철저히 들여야 한다. 처음에는 낯선 조인 문법과 생소한 키워드 때문에 머리가 복잡하겠지만, 데이터의 흐름을 표로 그려가며 연습하면 금방 감을 잡을 수 있다.

핵심 요약:

  • WHERE 절을 이용하면 방대한 데이터 속에서 원하는 조건에 맞는 행만 정확하게 필터링할 수 있으며, 복잡한 조건은 괄호로 우선순위를 잡아야 한다.

  • 쪼개진 테이블의 데이터를 연결할 때는 JOIN 절을 사용하며, 교집합과 외부 조인의 차이를 정확히 이해해야 데이터 누락을 막을 수 있다.

  • 수정이나 삭제 쿼리를 날릴 때는 WHERE 절 누락으로 인한 데이터 손실을 방지하기 위해 반드시 SELECT로 먼저 대상을 검증해야 한다.

다음 편 예고: 다음 편에서는 리눅스(Linux) 기초 명령어: 파일 권한(chmod) 설정과 디렉토리 이동법을 다룬다.

이 글을 읽으면서 SQL 쿼리를 작성하다가 JOIN 문법에서 막혔거나 조건문 때문에 헤맸던 기억이 있다면 댓글로 편하게 공유해 주세요!

댓글 쓰기

0 댓글

신고하기

프로필

이미지alt태그 입력