본문 바로가기

DB

(16)
[DB] ORDER BY에서 별칭을 사용할 때 주의할 점 쿼리를 작성할 때 정렬(ORDER BY) 단계에서 주의해야 할 점이 있다. 다음 문제를 보자. https://school.programmers.co.kr/learn/courses/30/lessons/284531 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 이 문제는 데이터를 노선(ROUTE)별로 그룹화하여 합계와 평균을 구하는 집계 능력, 그리고 숫자 데이터에 반올림과 단위(km)를 붙이는 가공 능력을 동시에 요구한다. 이때 컬럼에 'km'라는 문자를 붙여버리면 컴퓨터는 이를 숫자가 아닌 문자열로 인식하여 정렬 결과가 꼬일 수 있다.따라서 다음과 같이 쿼리를 작성하면 틀렸다는 결과를 얻는다.SELECT ..
[DB] 트랜잭션 (Transaction) – ACID 속성, 트랜잭션 격리 수준 🧩 트랜잭션이 필요한 이유: 'All or Nothing'의 약속 데이터베이스 제약 조건이 데이터의 '상태'를 지킨다면, 트랜잭션은 데이터를 변경하는 '행위'의 일관성을 보장한다. 가장 흔한 예로, 쇼핑몰에서 주문이 발생하면 최소 두 가지 작업이 함께 일어나야 한다.orders 테이블에 주문 내역을 INSERTproducts 테이블에서 상품 재고를 UPDATE만약 1번 작업만 성공하고 2번 작업이 시스템 장애로 실패한다면 데이터베이스는 주문은 기록되었지만 재고는 줄어들지 않은,즉, 일관성이 깨진 상태가 된다. 이는 재고 관리 실패와 고객 신뢰도 하락으로 이어지는 심각한 문제다. 트랜잭션은 이처럼 논리적으로 쪼갤 수 없는 여러 작업들을 하나의 묶음(Unit of Work)으로 다루어,"전부 성공하거나, ..
[DB] 데이터 무결성 (Data Integrity), 제약 조건 (Constraints) 🧩 데이터 무결성(Data Integrity)이란 무엇이며 왜 중요한가?데이터 무결성이란 데이터의 정확성, 일관성, 유효성을 유지하려는 성질을 의미한다. 데이터베이스의 가장 근본적인 역할은 데이터를 빠르고 효과적으로 조회하는 것뿐만 아니라,데이터를 안전하고 정확하게 지키고 관리하는 것이다. "쓰레기가 들어가면, 쓰레기가 나온다 (Garbage In, Garbage Out)"는 컴퓨터 과학의 격언처럼,잘못된 데이터가 데이터베이스에 저장되는 순간, 그 데이터를 기반으로 한 모든 분석과 애플리케이션의 동작은 신뢰를 잃게 된다. 따라서 데이터베이스는 애플리케이션의 버그나 사용자의 실수로부터 데이터를 보호하는 최후의 보루 역할을 해야 하며,이를 위해 테이블의 특정 컬럼에 제약 조건(Constraints)이라는 ..
[DB] 인덱스 (Index) ❌ 인덱스의 필요성: Full Table Scan의 한계 데이터베이스 성능 저하의 가장 흔한 원인은 '풀 테이블 스캔(Full Table Scan)'이다.풀 테이블 스캔은 말 그대로 테이블의 전체 행(Row)을 처음부터 마지막까지 하나씩 차례대로 스캔하는 것이다.데이터베이스는 특정 컬럼에 특정 값이 어느 행에 있는지 알 수 없기 때문에, 해당 테이블 전체를 디스크에서 메모리로 읽어 들여 풀 테이블 스캔을 하는 것이다. 풀 테이블 스캔의 시간 복잡도는 O(N)이다. 즉, 데이터 건수에 비례해 검색 시간이 증가한다.데이터가 적을 때는 문제가 되지 않지만, 데이터가 수백만, 수천만 건으로 증가하면 애플리케이션의 응답 속도에 치명적인 영향을 미친다. 또한 실무적 관점에서 이는 단순한 연산 횟수 증가를 넘어, 디..
[DB] 뷰 (VIEW) 🧩 뷰 (VIEW): 컴퓨터 바탕화면의 바로가기 아이콘 뷰는 실제 데이터를 저장하지 않는 '가상의 테이블'이다.마치 컴퓨터 바탕화면의 바로가기 아이콘처럼, 뷰도 실제 테이블이 아니라, 데이터베이스에 저장된 하나의 SELECT 쿼리문이다. 사용자가 뷰를 조회하면, 데이터베이스는 뷰에 저장된 SELECT 쿼리를 실행하여 그 결과를 반환한다.따라서 뷰의 데이터는 항상 원본 테이블의 최신 상태를 유지하게 된다. CREATE VIEW ... AS SELECT ...: 뷰를 생성한다.뷰 이름 앞에는 v_ 나 view_ 같은 접두사를 붙여서 다른 테이블과 쉽게 구분한다.CREATE VIEW v_view_name ASSELECT ...뷰를 조회할 때는 일반 테이블을 조회하는 것처럼 SELECT 문을 사용하면 된다.뷰..
[DB] CASE 문 🧩 CASE 문: 데이터에 옷을 입히는 기술 JOIN이나 UNION이 데이터의 구조를 바꾸는 기술이었다면,CASE 문은 데이터의 '값 자체'를 특정 조건에 따라 동적으로 가공하고 새로운 의미를 부여하는 조건부 로직 도구다. 🧩 CASE 문의 두 가지 방식 CASE 문은 사용법에 따라 두 가지 방식으로 나뉜다. 1. 단순 CASE 문 (Simple CASE Expression)하나의 특정 열(Column) 값이 정해진 값과 일치하는지를 비교할 때 사용한다."이 값이 A면 X, B면 Y"와 같이 명확하게 분기할 때 유용하다.-- 주문 상태(status)를 영문에서 한글로 변환하기SELECT order_id, CASE status WHEN 'PENDING' THEN '주문 대기'..
[DB] UNION 🧩 JOIN vs UNION: 수평 결합과 수직 결합 먼저, JOIN과 UNION의 근본적인 차이를 이해하는 것이 중요하다.JOIN:여러 테이블을 옆으로(수평으로) 이어 붙여, 더 많은 열(Column)을 가진 하나의 결과 집합을 만든다.즉, 데이터의 정보를 풍성하게 만드는 기술이다.UNION:여러 SELECT 문의 결과 집합을 아래로(수직으로) 이어 붙여, 더 많은 행(Row)을 가진 하나의 결과 집합을 만든다.즉, 흩어진 집합들을 하나로 모으는 기술이다. ⚠️ 주의: UNION 규칙UNION 으로 연결되는 모든 SELECT 문은 컬럼의 개수가 동일해야 한다.각 SELECT 문의 같은 위치에 있는 컬럼들은 서로 호환 가능한 데이터 타입이어야 한다.최종 결과의 컬럼 이름은 첫 번째 SELECT 문의 컬..
[DB] 서브쿼리 – 스칼라 서브쿼리, 다중 행/열 서브쿼리, 상관 서브쿼리 🧩 서브쿼리(Subquery)란 무엇인가? 서브쿼리는 하나의 SQL 쿼리 문 안에 포함된 또 다른 SELECT 쿼리를 의미한다.복잡한 문제를 여러 단계로 나누어 생각해야 할 때, 이 단계들을 하나의 쿼리로 합쳐주는 강력한 기술이다.예를 들어, "평균 가격보다 비싼 상품 찾기"는 다음과 같이 하나의 쿼리로 해결할 수 있다.SELECT name, priceFROM productsWHERE price > (SELECT AVG(price) FROM products); -- 서브쿼리 결과: 평균 가격 동작 원리:바깥쪽의 메인 쿼리가 실행되기 전, 괄호 () 안에 있는 서브쿼리가 먼저 실행된다.데이터베이스는 서브쿼리의 실행 결과를 메인 쿼리에게 전달한다.메인 쿼리는 그 결과를 사용해 최종 작업을 수행한다. 🧩 ..
[DB] 외부 조인 (OUTER JOIN), 셀프 조인 (SELF JOIN), 크로스 조인 (CROSS JOIN) 🧩 외부 조인 (OUTER JOIN): 짝이 없는 데이터 찾기 내부 조인(INNER JOIN)은 양쪽 테이블에 모두 데이터가 존재하는, 즉 짝이 맞는 데이터(교집합)만 보여준다.하지만 실무에서는 "가입은 했지만 한 번도 주문하지 않은 고객"이나 "등록은 했지만 한 번도 팔리지 않은 상품"처럼,한쪽 테이블에는 데이터가 있지만, 다른 쪽에는 없는 소외된 데이터를 찾아야 할 때가 많다.이때 사용하는 것이 외부 조인(OUTER JOIN)이다. 외부 조인은 조인 조건에 맞지 않더라도, 기준이 되는 테이블의 모든 데이터를 결과에 포함시킨다.이때 짝이 맞는 데이터가 없는 쪽의 열은 NULL 값으로 채워진다. 🧩 LEFT JOIN vs RIGHT JOIN 외부 조인은 어느 테이블을 기준으로 삼느냐에 따라 둘로 나뉜..
[DB] 내부 조인 (INNER JOIN) 🤔 조인(JOIN)이 필요한 이유: 흩어진 데이터를 연결하는 기술 데이터베이스를 잘 설계하려면 데이터의 중복을 막고 일관성을 지키기 위해 정규화(Normalization) 과정을 거쳐서데이터를 여러 테이블로 나누어 저장해야 한다. 예를 들어, orders 테이블에는 고객의 이름이나 주소 대신 user_id만 저장하고, users 테이블에서 실제 고객 정보를 관리해야 한다. 하지만 이렇게 잘 분리된 데이터에서 "어떤 고객이 어떤 상품을 주문했는지"와 같은 의미 있는 정보를 만들려면,흩어진 데이터 조각들을 다시 합쳐야 한다. 이때 사용하는 기술이 바로 조인(JOIN)이다. 조인은 두 개 이상의 테이블을 특정 열(주로 기본 키와 외래 키)을 기준으로 연결하여, 마치 처음부터 하나의 테이블이었던 것처럼 보여주..
[DB] SQL – 집계 함수, GROUP BY, HAVING 데이터를 행 단위로 조회하는 것을 넘어, 전체 데이터를 요약하고 의미 있는 그룹으로 묶어 통계를 내는 것은 데이터 분석의 핵심이다.SQL은 이를 위해 집계 함수와 GROUP BY 절을 제공한다. 📌 집계 함수: 데이터를 한눈에 요약하기 집계 함수는 여러 행의 데이터를 바탕으로 하나의 요약된 결과 값을 계산해 주는 함수다. COUNT(): 행의 개수를 센다.COUNT(*): NULL을 포함한 테이블의 모든 행 개수를 반환한다. (예: 전체 주문 건수)COUNT(컬럼명): 해당 컬럼에서 NULL이 아닌 값의 개수만 반환한다. (예: 카테고리가 등록된 주문 건수)COUNT(DISTINCT 컬럼명): 중복을 제거한 고유한 값의 개수를 반환한다 (예: 실제 구매한 순수 고객 수)SUM(컬럼명): 숫자 컬럼의 합..
[DB] SQL – 문자열 함수, NULL 함수(IFNULL, COALESCE) 데이터베이스의 진정한 힘은 데이터를 단순히 저장하고 조회하는 것을 넘어, 저장된 데이터를 원하는 정보로 가공하고 계산하는 데 있다. SQL은 이를 위해 다양한 연산자와 내장 함수를 제공한다. 📌 산술 연산: SQL로 직접 계산하기 SELECT 문 안에서 숫자 타입의 열(Column)에 사칙연산(+, -, *, /)을 직접 적용하여 새로운 값을 계산할 수 있다.이를 통해 애플리케이션에서 별도로 계산할 필요 없이 데이터베이스 단에서 원하는 정보를 바로 얻을 수 있다. 예를 들어, 상품의 재고 자산 총액(가격 * 재고 수량)을 계산하고, AS를 사용해 total_stock_value라는 의미 있는 별칭을 붙여줄 수 있다.SELECT name, price, stock_quantity, ..
[DB] SQL – 조회, 필터링, 정렬 (WHERE, ORDER BY, LIMIT) 데이터베이스에 데이터를 저장하는 것만큼 중요한 것은, 저장된 데이터를 원하는 조건에 맞게 조회하고, 의미 있는 순서로 정렬하여 가치 있는 정보로 만드는 것입니다. 이 모든 작업의 중심에는 SELECT 문이 있다. 📌 SELECT와 FROM: 조회문의 기본 뼈대 SELECT 문은 두 가지 핵심 요소로 시작한다.SELECT: 조회할 열(Column)을 지정 (무엇을 가져올 것인가?)FROM: 데이터가 들어있는 테이블(Table)을 지정 (어디에서 가져올 것인가?)가장 기본적인 형태는 * 와일드카드를 사용하여 테이블의 모든 열을 조회하는 것이다.SELECT * FROM customers; 하지만 실무에서는 성능 저하와 가독성 문제를 피하기 위해, * 대신 필요한 열의 이름만 명시적으로 지정하는 것이 좋다.또..
[DB] SQL – DDL, DML 이제부터 기본적인 SQL, 데이터 타입, 제약 조건을 이용하여 간단한 쇼핑몰 데이터베이스를 설계해 보자. 📌 데이터베이스 생성 및 선택 데이터 작업을 시작하기 전에, 데이터를 담을 가장 큰 단위인 데이터베이스를 만들고, 앞으로 작업할 공간으로 지정해야 한다. CREATE DATABASE:데이터베이스라는 거대한 저장 공간을 만드는 명령어다.쇼핑몰의 모든 데이터를 보관할 my_shop이라는 전용 창고를 짓는 것과 같다.데이터베이스 이름은 관례적으로 프로젝트 이름이나 서비스의 특징을 나타내는 것으로 소문자와 언더스코어를 조합하여 만든다.CREATE DATABASE my_shop; USE:여러 데이터베이스 중에서 앞으로 작업할 데이터베이스를 선택하는 명령어다.이 명령어를 실행해야 이후의 모든 SQL 명령어가..
[DB] SQL, 제약 조건, 데이터 타입 🧩 SQL (Structured Query Language) SQL은 관계형 데이터베이스에서 데이터를 정의(DDL), 조작(DML), 제어(DCL)하는 국제 표준 언어다.따라서 대부분의 RDBMS에서 거의 동일하게 사용할 수 있다.SQL 표준을 넘어서 각 DBMS는 자신들만의 추가 기능이나 추가 문법을 제공하는데, 이것을 방언(사투리, Dialect)이라고 한다. SQL 명령어는 목적에 따라 크게 4가지로 분류된다. DDL (Data Definition Language, 데이터 정의어):데이터베이스나 테이블의 '구조'를 정의한다.주요 명령어: CREATE, ALTER, DROPDML (Data Manipulation Language, 데이터 조작어):실제 데이터를 추가, 조회, 수정, 삭제한다.주요 명..
[DB] 데이터베이스와 데이터베이스 관리 시스템(DBMS) 🧩 데이터(Data) vs 정보(Information): 무엇이 다른가? 데이터베이스를 이해하는 첫걸음은 데이터와 정보의 차이를 명확히 아는 것이다.이 둘은 종종 혼용되지만, 그 가치와 역할은 완전히 다르다. 데이터 (Data): 의미 없는 기록 조각아직 가공되지 않은 '날것'의 사실이나 값 자체를 의미한다.예를 들어, 쇼핑몰에서 발생한 "userA", "A티셔츠", "25000" 같은 개별 기록들은 문맥이 없어 그 자체만으로는 완전한 의미를 갖기 어렵다.구조화된 데이터 (Structured Data): 의미를 담은 재료데이터에 '고객ID', '상품명', '주문금액'과 같은 꼬리표(Label)를 붙여 표 형태로 정리한 것이다.이제 각 데이터 조각이 무엇을 의미하는지는 알 수 있지만, 여전히 단순한 '기..