데이터베이스 12

[DB] 데이터베이스 인덱스(Index)란?

데이터베이스 성능이 점점 느려질 때, 대부분의 초보 개발자는 쿼리만 고치려 합니다. 하지만 진짜 해답은 인덱스(Index)에 있습니다.인덱스는 쿼리 성능을 획기적으로 개선할 수 있는 도구이지만, 잘못 사용하면 오히려 시스템에 부담을 줄 수 있죠.이번 포스팅에서는 인덱스의 개념, 동작 방식, 실무 적용 방법까지 한눈에 이해할 수 있도록 정리해보았습니다. 📌 1. 인덱스(Index)란?인덱스는 책의 목차처럼, 데이터베이스에서 특정 데이터를 더 빠르게 조회할 수 있도록 만들어진 검색 도우미입니다.일반적으로는 B-Tree(균형 트리) 구조로 만들어져 있으며, 특정 컬럼 값을 기준으로 정렬된 구조를 유지합니다.예를 들어, 수만 건의 회원 중 이름이 '홍길동'인 사람을 찾을 때, 인덱스가 없다면 모든 데이터를 ..

데이터베이스 2025.05.09

[DB] 자주 쓰는 SQL 쿼리 패턴 10가지 정리

SQL은 데이터베이스를 다루는 데 있어 필수적인 언어입니다. 하지만 문법을 안다고 해서 바로 실무에 적용하기는 쉽지 않죠. 정작 프로젝트를 진행하다 보면 “어떤 쿼리를 어떻게 작성해야 하지?” 하는 고민에 자주 부딪히게 됩니다.이번 포스팅에서는 실무에서 자주 사용되는 SQL 쿼리 패턴 10가지를 간결하게 정리해보았습니다. 기본적인 조회부터 집계, 조인, 수정/삭제까지, 자주 쓰는 구조들을 한눈에 확인해보세요. ✅ 1. 기본 SELECT 조회SELECT name, email FROM users WHERE status = 'active';가장 기본이 되는 조회 구문조건 필터링, 정렬, 페이징과 자주 함께 사용됨 🔍 2. LIKE를 이용한 검색SELECT * FROM products WHERE name L..

데이터베이스 2025.05.08

[DB] 정규화(Normalization)란?

데이터베이스를 공부하다 보면 “테이블을 정규화하세요”라는 말을 자주 듣게 됩니다.그런데 왜 굳이 테이블을 잘게 나누는 걸까요? 그냥 하나에 다 넣으면 안 될까요?오늘은 그 궁금증을 풀어보며, 데이터베이스의 정규화(Normalization)가 무엇인지,왜 필요한지, 그리고 정규형의 종류와 각각 어떤 조건을 가지는지 살펴볼게요.  💡 정규화란?정규화(Normalization)는 데이터의 중복을 최소화하고, 일관성과 무결성을 유지하기 위해 테이블 구조를 체계적으로 분해하는 과정입니다.데이터베이스를 처음 설계할 때, 하나의 테이블에 많은 정보를 넣으면 편해 보일 수 있지만,이렇게 구성된 테이블은 중복 데이터가 많아지고, 데이터 수정/삭제 시 여러 문제(이상, anomaly)가 발생할 수 있습니다. ❌ 정규화가..

데이터베이스 2025.04.12

[DB] 데이터베이스 키(Key)의 개념과 종류

SQL을 공부하면서 PRIMARY KEY, FOREIGN KEY, UNIQUE 같은 말, 많이 들어보셨죠?이 키(Key)라는 개념은 데이터베이스에서 정확하고 일관된 데이터를 저장하고 관리하기 위한 핵심 도구입니다.오늘은 데이터베이스에서 사용되는 다양한 키의 종류와 그 역할에 대해 정리해볼게요.  📌 키(Key)란 무엇인가?키(Key)는 테이블 내에서 각 행(row)을 고유하게 식별하거나,테이블 간 관계를 정의하기 위한 기준이 되는 열(column)입니다.쉽게 말해, 중복 없이 값을 구분해주는 기준이라고 생각하면 돼요. 🔎 주요 키의 종류 1. 🟡 기본 키 (Primary Key)한 행(row)을 고유하게 식별하기 위한 컬럼NULL 값을 가질 수 없고, 중복도 허용되지 않음하나의 테이블에는 기본 키는..

데이터베이스 2025.04.11

[SQL] SQL 조인의 종류

SQL(Structured Query Language)에서 조인(JOIN)은 여러 테이블에서 데이터를 결합하고 관련 정보를 가져오는 데 사용됩니다. 데이터베이스 설계 시 데이터를 여러 테이블로 나누어 관리하는 것이 일반적이므로, 조인은 데이터 간의 관계를 바탕으로 필요한 정보를 효율적으로 조회하는 데 핵심적인 역할을 합니다. 1. 조인의 종류INNER JOIN두 테이블에서 공통된 값을 가진 행만 반환교집합에 해당하는 데이터를 조회할 때 사용 LEFT JOIN (LEFT OUTER JOIN)왼쪽 테이블의 모든 행과 오른쪽 테이블에서 일치하는 행을 반환일치하지 않는 경우 NULL을 반환왼쪽 테이블의 데이터를 우선적으로 보고자 할 때 사용 RIGHT JOIN (RIGHT OUTER JOIN)오른쪽 테이블의 모..

데이터베이스 2025.01.08

[Today's Query] 부서별 연봉 3위까지 사원의 이름과 연봉 조회 (2025/01/08)

WITH tbl_ranking AS ( SELECT RANK() OVER(partition by d.dept_no ORDER BY s.salary DESC) AS ranking, CONCAT(e.first_name, ' ', e.last_name) AS name, s.salary, d2.dept_name FROM ( SELECT emp_no, MAX(salary) AS salary FROM salaries GROUP BY emp_no ) AS s JOIN employees AS e ON e.emp_no = s.emp_no JOIN dept_emp AS d ON e.emp_no = d.emp_no JOIN departments AS d2 ON d2.dept_no = d.dept_..

[Today's Query] 부서 이동 경험이 있는 사원들의 현재 부서를 조회 (2025/01/07)

부서 이동 경험이 있는 사원들의 정보와 현재 부서를 조회하세요.SELECT e.emp_no, CONCAT(e.first_name, ' ', e.last_name) AS name, e.hire_date, d.dept_name, de.to_dateFROM dept_emp AS de JOIN departments AS d ON d.dept_no = de.dept_noJOIN employees AS e ON de.emp_no = e.emp_noWHERE to_date = '9999-01-01' AND e.emp_no IN ( SELECT e.emp_no FROM dept_emp AS d JOIN employees AS e ON ..

[Today's Query] 부서 평균 연봉보다 연봉이 높은 사원을 조회 (2025/01/06)

문제최신 연봉이 부서 최신 연봉의 평균보다 높은 사원을 조회하세요.WITH LatestSalaries AS ( SELECT emp_no, salary, ROW_NUMBER() OVER (PARTITION BY emp_no ORDER BY from_date DESC) AS rn FROM salaries),avgSalary AS ( SELECT b.dept_no, AVG(a.salary) AS avg_salary FROM (SELECT emp_no, salary FROM LatestSalaries WHERE rn = 1) AS a JOIN dept_emp AS b ON a.emp..

[Today's Query] 재직 중인 개발부서 사원의 최신 연봉 정보를 출력 (2025/01/04)

문제재직 중인 개발(Development)부서의 사원 목록과 가장 최신 연봉 정보를 출력SELECT a.emp_no, CONCAT(a.first_name, ' ', a.last_name) AS emp_name, b.salaryFROM employees AS aJOIN dept_emp AS c ON a.emp_no = c.emp_noJOIN departments AS d ON c.dept_no = d.dept_noJOIN salaries AS b ON a.emp_no = b.emp_noWHERE d.dept_name = 'Development' AND c.to_date > now() AND b.from_date = (..