diff --git a/_algorithms/SQLD/sqld-1.md b/_algorithms/SQLD/sqld-1.md index fb31fa1..410062e 100644 --- a/_algorithms/SQLD/sqld-1.md +++ b/_algorithms/SQLD/sqld-1.md @@ -9,14 +9,14 @@ ogImage: ## 1.1 데이터 모델의 이해 -### 모델링이란 +### 1.1.1 모델링이란 - 현실세계의 데이터를 약속된 표기법으로 표현 - 업무의 흐름을 가시화, 명세화하여 정보시스템을 구축하기 위한 분석, 설계 과정의 일환 - 업무 프로세스와 데이터를 분석하여 추상화 - 데이터베이스 구축의 사전작업 및 업무 형상화 -### 모델링 특징 - **추단명** +### 1.1.2 모델링 특징 - **추단명** - 추상화 - 대상의 주요 특징을 추출하여 일정한 형식으로 표현 @@ -30,7 +30,7 @@ ogImage: - 비유연성 최소화 : 데이터의 정의와 테이터의 사용 프로세스를 분리하여 데이터, 프로세스의 변화가 프로그램과 DB에 미치는 영향 최소화 해야함 - 비일관성 최소화 : 데이터 간의 상호 연관관계를 명확하게 정의하여 데이터를 일관성있게 유지해야함 -### 모델링 3가지 관점 - **데프상** +### 1.1.3 모델링 3가지 관점 - **데프상** - 데이터 관점 (What) - 데이터에 집중, 데이터들의 관계를 맺고 사용되는지를 모델링 @@ -42,7 +42,7 @@ ogImage: - 데이터와 흐름간의 관계를 맺고 영향을 주고받는지를 모델링 - CRUD분석 -### 모델링 3가지 단계 - **개논물** +### 1.1.4 모델링 3가지 단계 - **개논물** - 개념적 데이터 모델링 - 가장 높은 추상화 레벨, 포괄적 개념 @@ -57,7 +57,7 @@ ogImage: - DBMS의 성능, 보안, 가용성 고려하여 설계, 가장 낮은 추상화레벨 - 성능향상을 위한 반정규화 수행 및 테이블, 인덱스, 함수 등을 생성 -### 3단계 스키마 구조 - **외개내** +### 1.1.5 3단계 스키마 구조 - **외개내** > ANSI-SPARC정의, 데이터 독립성 보장을 위한 설계방법 @@ -71,7 +71,7 @@ ogImage: - 개발자 관점, 디스크나 메모리상의 물리적,실질적 저장구조 나타냄 - 물리적 뷰 제공 -### ERD +### 1.1.6 ERD - 데이터 모델링에대한 문서화 방법을 제공 - 중요한 엔터티는 왼쪽 상단에 배치 @@ -83,13 +83,13 @@ ogImage: ## 1.2 엔터티 -### 엔터티 개념 +### 1.2.1 엔터티 개념 - DB의 구성요소중 독립적으로 식별 가능한 객체(Object) - 도서관 DB 모델링시 엔터티 -> 회원, 대출, 도서 - 보다 상세히 자신을 표현하기위해 속성(Attribute)라는 하위요소를 가진다. 회원 엔터티의 속성 -> 회원명, 주소, 전화번호 -### 엔터티 특징 +### 1.2.2 엔터티 특징 - 업무에서 필요하고 관리하고자 하는 정보 - 유일한 식별자를 가져야 함 @@ -97,7 +97,7 @@ ogImage: - 하위요소로 반드시 속성을 가져야함 - 엔터티는 다른 엔터티와 한 개 이상의 관계를 가져야 함, 단 통계성 & 코드성 엔터티의 경우 관계 생략가능 -### 엔터티 분류 +### 1.2.3 엔터티 분류 - 발생 시점 / 상속 관계에 따른 분류 - 기본 엔터티 : 고유한 주식별자를 가지는 독립적 엔터티, ex) 사원, 부서, 고객, 상품, 자재 @@ -108,11 +108,11 @@ ogImage: - 개념 엔터티 : 개념적 정의되는 엔터티, ex) 부서, 상품분류, 강의 - 사건 엔터티 : 업무를 수행하면서 발생하는 행위나 이벤트를 나타내는 엔터티, ex) 주문, 대여, 수강 -### 교차 엔터티 +### 1.2.4 교차 엔터티 - M:N 관계를 해소하기 위해 만들어진 엔터티 -### 엔터티 명명법 +### 1.2.5 엔터티 명명법 - 엔터티 생성 의미대로 이름을 부여 - 약어 사용하지 않는다, 너무길어질때만 약어를 표준화하여 사용 @@ -121,25 +121,25 @@ ogImage: ## 1.3 속성 -### 속성 개념 +### 1.3.1 속성 개념 - 엔터티에 대한 자세하고 구체적인 정보, 엔티의 하위요소 - 업무 프로세스에 꼭 필요한 것들로 최소화 - 의미상으로 더 이상 분리되지 않는 최소의 데이터 단위 -### 속성 값 +### 1.3.2 속성 값 - 속성이 가질 수 있는 특정 값 - 속성값이 으미적으로 다중 값을 포함할때, 1차 정규화 진행 - -### 엔터티, 인스턴스, 속성값 특징 +### 1.3.3 엔터티, 인스턴스, 속성값 특징 - 한 개의 엔터티는 두 개 이상의 인스턴스를 가짐, 엔터티는 인스턴스의 집합 - 한 개의 엔터티는 두 개 이상의 속성을 가짐, 엔터티는 속성의 집합 - 한 개의 속성은 한 개의 속성값만 가짐 -### 속성의 분류 +### 1.3.4 속성의 분류 - 속성의 특성에 따른 분류 - 기본 속성 : 엔터티가 본래 가지고 있어야 하는 속성 @@ -150,13 +150,13 @@ ogImage: - FK(외래키) 속성 : 관계를 통해 다른 엔터티의 속성을 가져와 포함시킨 속성 - 일반 속성 : PK,FK제외 나머지 -### 도메인 +### 1.3.5 도메인 - 속성이 가질 수 있는 값의 범위(데이터 타입, 크기)를 정의한 것 ## 1.4 관계 -### 관계의 개념 +### 1.4.1 관계의 개념 > 엔터티 간 맺고 있는 연관성 @@ -167,11 +167,11 @@ ogImage: ## 1.5 식별자 -### 식별자의 개념 +### 1.5.1 식별자의 개념 - 인스턴스를 유일하게 구별할 수 있는 속성 -### 주식별자 +### 1.5.2 주식별자 > 엔터티 인스턴스를 유일하게 구별해주는 식별자, PK를 말함 @@ -180,7 +180,7 @@ ogImage: - 붋변성 : 속성값이 최초 생성시 부여된 값에서 변하면안됨 - 존재성 : 반드시 값을 가져야함, NOT NULL -### 식별자의 분류 +### 1.5.3 식별자의 분류 - 대표성 여부에 따른 분류 - 주식별자(PK) : 인스턴스를 유일하게 구별하는 식별자, 유일성, 최소성, 불변성, 존재성 만족 @@ -196,7 +196,7 @@ ogImage: - 본질 식별자 : 업무에 존재하는 본래 식별자, 원조식별자라고도 함 - 인조식별자 : 업무에 존재하지않으나 원조식별자가 복잡하여 인위적으로만든 식별자, 대리식별자라고도 함 -### 식별자 관계, 비식별자 관계 +### 1.5.4 식별자 관계, 비식별자 관계 - 식별자 관계 - ERD작성시 실선표현 diff --git a/_algorithms/SQLD/sqld-2.md b/_algorithms/SQLD/sqld-2.md index 0e69c2e..ca8ec76 100644 --- a/_algorithms/SQLD/sqld-2.md +++ b/_algorithms/SQLD/sqld-2.md @@ -13,13 +13,13 @@ ogImage: - 이상현상(Anomaly) : 테이블과 관계들의 CRUD가 일어나는 과정에서 일관성이 깨지는 현상 -### 이상현상 종류 +### 2.1.1 이상현상 종류 - 삽입이상 : 테이블에 데이터 삽입 시 의도하지 않은 정보까지 삽입해야 하는 현상 - 갱신 이상 : 중복저장되어있는 데이터 중 하나만 갱신하고 다른 하나를 갱신하지 않을때 나타나는 데이터 불일치 현상 - 삭제 이상 : 테이블의 특정 데이터를 삭제할때 의도하지 않은 정보까지 삭제되는 현상 -### 정규화 절차 - **도부이결다조** +### 2.1.2 정규화 절차 - **도부이결다조** - 제1 정규화 : 릴레이션의 속성값이 모두 원자값만으로 구성되어야 함 - 중복값 제거 @@ -28,11 +28,11 @@ ogImage: - 제3 정규화 : 기본키 제외 컬럼간의 종속성 제거, 이행 함수종속성을 제거 - BCNF : 기본키를 제외 후보키가 있는경우 후보키가 기본키를 종속시키면 분해 -### 제1정규형 +### 2.1.3 제1정규형 - 모든 속성이 하나의 속성값, 유사한 속성이 반복되지 않는 상태 -### 제2정규형 +### 2.1.4 제2정규형 > 부분 함수종속성을 제거한상태 @@ -40,7 +40,7 @@ ogImage: - **주식별자가 2개** 이상으로 구성된 복합식별자의경우, 일반 속성이 주식별자의 일부에만 종속성을 가지는 상황 - 주식별자가 단일식별자일 때는 제2정규화가 필요없으며, 이미 제2정규형인 상태 -### 제3정규형 +### 2.1.5 제3정규형 > 이행 함수 종속성을 제거한상태 @@ -51,20 +51,20 @@ ogImage: ## 2.2 관계와 조인의 이해 -### 조인의 트레이드 오프 +### 2.2.1 조인의 트레이드 오프 - 정규화를 통해 분해된 테이블들은 조회 과정에서 여러 번의 조인이 발생가능 - 조인은 DB의 성능 측면에서 다소 부하가 높은 연산, 정규화를 통해 분해된 DB는 조회성능이 떨어질 수 있음 - 성능 저하를 막기위한 조인의 빈도를 줄이는것도 필요 - 데이터의 정합성과 조회성능 간 트레이드 오프 관계 존재 -### 2.2.1 반정규화가 필요한 상황 +### 2.2.2 반정규화가 필요한 상황 - 조회성능이 중요한 상황 - 반정규화 시 DB정합성이 낮아져 문제가 발생할 수 있으므로 대안을 검토후 반정규화 진행 - 대안의 종류 (뷰 생성, 인덱스 조정, 클러스터링 적용, 어플리케이션에서의 처리 등) -### 2.2.2 테이블 반정규화 +### 2.2.3 테이블 반정규화 - 테이블 병합 @@ -86,7 +86,7 @@ ogImage: - 이력 테이블 추가 : 변경 이력 등 이력 데이터를 관리할 수 있는테이블을 별도로 추가 - 부분 테이블 추가 : 디스크 I/O를 줄이기 위해 하나의 테이블 내에특별히 자주 사용하는 속성들만 모아서 새로운 테이블로 추가 -### 2.2.3 칼럼 반정규화 +### 2.2.4 칼럼 반정규화 - 중복 컬럼 추가 : 조인을 감소시키기 위해 자주 사용하는 컬럼을 중복 추가하는 기법 - 파생 컬럼 추가 : 트랜잭선 처리 시 계산에의한 부하발생을 줄이기 위해 계싼값을 별도의 컬럼으로 미리 추가 @@ -94,7 +94,7 @@ ogImage: - PK에 의한 컬럼 추가 : 복합 의미를 갖는 PK를 단일 속성으로 구성했을때, PK를 파싱해서 추가적인 내용을 조회해야하는 경우에 성능하락이 존재할 수 있으므로 이를 일반속성으로 추가하는 기법 - 응용 시스템 오동작을 위한 컬럼 추가 : 이전(백업) 데이터를 임시적으로 중복하여 보관하는 기법 -### 2.2.4 관계 반정규화 +### 2.2.5 관계 반정규화 - 여러 관계를 거쳐 다수의 조인을 통해 처리가 가능하지만 이때 발생할 수 있는 성능 저하를 막기위해 추가적으로 중복된 관계를 맺는 방법 - 조인이 많으면 CPU연산 부하가 커짐 -> 조회 성능 저하 diff --git a/_algorithms/SQLD/sqld-3.md b/_algorithms/SQLD/sqld-3.md new file mode 100644 index 0000000..172fdef --- /dev/null +++ b/_algorithms/SQLD/sqld-3.md @@ -0,0 +1,270 @@ +--- +title: "[SQLD] 3장. SQL 기본" +excerpt: "관계형 데이터베이스 개요, SELECT문, 함수, WHERE절, GROUP BY, ORDER BY, 조인, 표준 조인" +coverImage: "/assets/blog/posts/mysql/cover.png" +date: "2026-07-22T19:00:00" +ogImage: + url: "/assets/blog/posts/mysql/cover.png" +--- + +## 3.1 관계형 데이터베이스 개요 + +### 3.1.1 데이터베이스 + +- 데이터 : 컴퓨터로 일을 처리할때 처리 대상이 되는 것, 수집한 사실 또는 값 +- 정보 : 데이터를 가공하여 유용하게 활용할 수 있게 만든 것 +- 처리, 프로세싱: 가치없는 데이터를 목적에 따라 가공하여 유용한 정보로 변환하는 과정 +- 데이터베이스 : 데이터를 일정한 체계에 따라 통합하여 디스크,메모리에 저장한것으로 응용프로그램에 종속적이지 않도록 일종의 미들웨어 형태로 만든 것. 데이터 처리과정의 중복서, 일관성등의 오류를 없애기 위해 등장 +- 데이터베이스관리시스템(DBMS) : 데이터베이스를 구축하고 관리할 수 있는 기능을 제공하는 시스템 + +### 3.1.2 관계형 데이터베이스 + +- 1970년 E.F.Codd박사가 발표한 정규화 이론에 따라 데이터의 일관성 문제를 근본적으로 해결한 DBMS -> RDB 등장 +- 2차원 구조의 행과 열로 구성된 테이블 형태로 데이터 모델을 다루며 수학적 이론을 바탕으로 연산자체를 수학적으로 최적화 할 수 있음 +- SQL이라는 공통의 질의언어를 정의하여 데이터로부터 정보를 쉽게 조회, 가공, 추출하는것이 가능 + +### 3.1.3 TABLE + +- 행과 열로 표현된 2차원 매트릭스 형태를 뜻함 +- 논리적 모델링에서는 Entity, 물리적모델링에서는 테이블이라고 부름, 관계형 DB에서는 Relation이라고 부르기도함 +- 컬럼 헤더 / 스키마 +- 행 / 레코드 / 튜플 +- 열 / 필드 / 속성 + +### 3.1.4 SQL + +- Structured Query Language, 구조화된 질의언어 +- DB구조를 정의, 데이터를 조작, 제어하는 절차적 + 비절차적 언어 +- DDL : Data Definition Language, 데이터 정의 언어 + - 데이터의 구조, 스키마를 정의하는 명령어 + - ERD로 그려진 모델은 DDL과 상호 변환이 가능 + - ex ) CREATE, ALTER, DROP, RENAME, TRUNCATE +- DML : Data Manipulation Language, 데이터 조작 언어 + - 데이터를 조회,입력, 수정, 삭제 하는 명령어 + - 커밋 전에 롤백이 가능 + - ex ) SELECT, UPDATE, INSERT, DELETE, MERGE +- DCL : Data Control Language, 데이터 제어언어 + - 사용자 접근 권한과 같은 보안과 제어를 다루는 명령어 + - ex ) GRANT, REVOKE +- TCL: Transaction Control Language + - 트랜잭션 제어 언어 + - ex ) COMMIT, ROLLBACK, SAVEPOINT + +## 3.2 SELECT문 + +### 3.2.1 SELECT + +- 데이터 조회 명령어, WHERE절을 통해 특정조건의 열 조회 +- 테이블에 대한 별명(Alias)부여 가능 +- SELECT문 절 실행순서 -> **F-W-G-H-S-O** + +### 3.2.2 산술연산자 + +- 더하기, 곱하기 등 산술연산 수행 +- 동일한 행에서 칼럼 대 칼럼의 연산 수행 +- Null과의 산술연산 결과는 Null, 0으로나누면 에러발생 + +### 3.3.3 합성연산자 + +- ||는 합성연산자로 문자열을 연결할 때 사용용 + +## 3.3 함수 + +### 단일행 함수 vs 다중행 함수 + +- 단일행 함수 : 하나의 행에 대해서 연산을 수행한 후 결과를 반환, 1:M의 조인에서도 M쪽의 각각의 행에 대해서 단일행 함수를 사용가능 +- 다중행 함수 : 여러 행에 대해서 연산을 수행한 후 결과를 반환, 집계함수(COUNT,SUM,AVG 등), 그룹함수(ROLLUP, CUBE), 윈도우함수(RANK, ROW_NUMBER등)등이 해당 + +### 3.3.1 문자함수 + +| 함수 | 설명 | +| -------------------- | ------------------------------------ | +| LOWER / UPPER | 소문자 / 대문자로 변환 | +| CHR(CHAR) | ASCII 코드 → 문자 변환 | +| TRIM / LTRIM / RTRIM | 양쪽 / 왼쪽 / 오른쪽 공백(문자) 제거 | +| SUBSTR | 문자열 일부 추출 | +| LENGTH | 문자열 길이 반환 | +| REPLACE | 특정 문자열 치환 | + +### 3.3.2 숫자함수 + +| 함수 | 설명 | +| ----- | ------------------- | +| ABS | 절댓값 | +| MOD | 나머지 | +| ROUND | 반올림 | +| TRUNC | 버림 | +| SIGN | 부호 반환(-1, 0, 1) | +| CEIL | 올림 | +| FLOOR | 내림 | + +### 3.3.3 날짜함수 + +| 함수 | 설명 | +| ------- | ------------------------- | +| SYSDATE | 현재 날짜/시간 반환 | +| EXTRACT | 날짜에서 연/월/일 등 추출 | + +### 3.3.4 변환함수 + +| 구분 | 설명 | +| ------------- | -------------------------------------------- | +| 명시적 형변환 | TO_NUMBER, TO_CHAR, TO_DATE 함수로 직접 변환 | +| 암시적 형변환 | DB연산시 내부적으로 임의로 수행되는 변환 | + +### 3.3.5 NULL 관련 함수 + +- NVL, NULLIF, COALESCE + +### 3.3.6 CASE + +- 2가지 형식으로 작성가능 + +1. 단순 CASE 표현식 : 특정 컬럼의 값과 일치하는지 비교 + +```sql +SELECT ename, + CASE deptno + WHEN 10 THEN '인사팀' + WHEN 20 THEN '개발팀' + ELSE '기타' + END AS dept_name + FROM emp; +``` + +2. 검색 CASE 표현식 : WHEN절에 조건식을 직접 작성 + +```sql +SELECT ename, + CASE WHEN sal >= 3000 THEN '고연봉' + WHEN sal >= 1500 THEN '중간' + ELSE '저연봉' + END AS sal_grade + FROM emp; +``` + +## 3.4 WHERE절 + +> 특정조건 만족하는 행만을 대상으로 연산 수행 + +### 3.4.1 비교연산자 + +| 구분 | 연산자 | 설명 | +| ------ | ------- | ------------------------------------- | +| 단일행 | = | 같음 | +| 단일행 | <, <= | 작음, 작거나 같음 | +| 단일행 | IS NULL | NULL 여부 비교 | +| 다중행 | IN | 목록 중 하나라도 일치하면 참 | +| 다중행 | EXISTS | 서브쿼리 결과가 존재하면 참 | +| 다중행 | ALL | 목록의 모든 값과 비교하여 만족하면 참 | +| 다중행 | ANY | 목록의 값 중 하나라도 만족하면 참 | + +### 3.4.2 부정 비교연산자 + +| 구분 | 연산자 | 설명 | +| ------ | ----------- | ------------------------- | +| 단일행 | !=, ^=, <> | 같지 않음 | +| 단일행 | IS NOT NULL | NULL이 아니면 참 | +| 다중행 | NOT IN | 목록에 포함되지 않으면 참 | +| 다중행 | NOT EXISTS | 서브쿼리 결과가 없으면 참 | + +### 3.4.3 SQL 연산자 + +| 연산자 | 설명 | +| --------------- | ---------------------------------------------- | +| BETWEEN A AND B | A와 B 사이의 값이면 참 (A, B 포함) | +| LIKE | 문자열 패턴 비교 (% : 여러 문자, \_ : 한 문자) | + +### 3.4.4 부정 SQL 연산자 + +| 연산자 | 설명 | +| ------------------- | --------------------------- | +| NOT BETWEEN A AND B | A와 B 사이의 값이 아니면 참 | +| NOT LIKE | 패턴과 일치하지 않으면 참 | + +### 3.4.5 논리연산자 + +| 연산자 | 설명 | +| ------ | ----------------------------- | +| AND | 두 조건 모두 참이면 참 | +| OR | 두 조건 중 하나라도 참이면 참 | +| NOT | 조건의 결과를 반대로 | + +## 3.5 GROUP BY, HAVING절 + +### 3.5.1 GROUP BY + +- 매우 부하가 높은 연산 +- WHERE,HAVING 두개다 사용해서 필터링을 할 수 있지만 WHERE절에서 해주는게 조회성능이 더 좋음 + +### 3.5.2 집계함수 + +- GROUP BY절을 통해 그룹핑한 후 통계값 계산하는 함수 +- COUNT, SUM, AVG, MIN, MAX +- DISTINCT : 컬럼값의 중복제거 즉 해당 그룹에서 첫번째 행에 대해서만 연산 수행 + +### 3.5.3 HAVING + +- WHERE절과 달리 집계함수를 사용할 수 있음 +- SELECT JOB, AVG() + +## 3.6 ORDER BY절 + +### 3.6.1 ORDER BY + +- 테이블에 삽입된 데이터는 특별한 순서없이 디스크에저장 : 튜플의 무순서성 +- DBMS에 따라 NULL값 최소,최대로 처리하는 방식다름 + +## 3.7 조인 + +### 3.7.1 조인의 개념 + +- 두개의 테이블을 하나로 병합하는 것 +- O(N^2) 시간복잡도를 가지므로 조회성능을 위해서는 조인이 덜 일어나도록, 반정규화가 필요 + +### 3.7.2 EQUI JOIN + +- Equal(=), 등식을 조건으로 사용할때 발생하는 조인 + +### 3.7.3 Non EQUI JOIN + +- 부등식을 사용해서 범위를 나타낸 조건일때 발생하는 조인 + +### 3.7.4 3개 이상 TABLE JOIN + +- N개의 테이블을 조인할때 N-1번의 조인이 발생함 + +### 3.7.5 OUTER JOIN + +- EQUI, NON EQUIJOIN은 INNER JOIN에 해당, 교집합에 해당한다면 +- OUTER JOIN은 조인 조건에 맞지않는 행까지 포괄적으로 병합하는 방법, 합집합에 해당 + - LEFT, RIGHT, FULL등 +- 오라클 기준 WHERE A.DEPT NO = B.DEPTNO(+)의 경우 + (+) 기호가 붙지 않은쪽이 기주넽이블이 됨, 즉 A LEFT OUTER JOIN B + +## 3.8 표준 조인 + +- DBMS마다 문법이 약간 달라지는 이슈해결을 위해 표준을 만듬 + - ANSI(미국 국가표준 협회) SQL + - ISO(국제 표준화 기구) + +### 3.8.1 INNER JOIN + +- 교집합 +- 기준이되는 키에 따른 값이 존재하는 것만 병합 + +### 3.8.2 OUTER JOIN + +- 합집합 +- 기준이 되는 키에 따른 칼럼값이 존재하지 않더라도 모든 튜플을 병합 +- 어떤 테이블들의 행을 포함시킬지에 따라 LEFT, RIGHT구분 + +### 3.8.3 NATURAL JOIN + +- 두테이블에서 같은 이름의 컬럼들에 대해서 동일한 컬럼값을 가지는 행만 병합되는 조인 +- 조인조건을 내포하고있으므로 ON절을 사용할 수 없음, SELEECT 절의 컬럼명에도 테이블 별칭 표시할수 없음 + +### 3.8.4 CROSS JOIN + +- 왼쪽,오른쪽 모든행의 대응을 조합하여 결과를 출력 +- 조건이 별도로 지정되지 않음 diff --git a/_algorithms/SQLD/sqld-4.md b/_algorithms/SQLD/sqld-4.md new file mode 100644 index 0000000..8128d64 --- /dev/null +++ b/_algorithms/SQLD/sqld-4.md @@ -0,0 +1,250 @@ +--- +title: "[SQLD] 4장. SQL 활용" +excerpt: "서브쿼리, 집합연산자, 그룹함수, 윈도우함수, Top N 쿼리, 계층형 질의, PIVOT/UNPIVOT, 정규표현식" +coverImage: "/assets/blog/posts/mysql/cover.png" +date: "2026-07-25T12:00:00" +ogImage: + url: "/assets/blog/posts/mysql/cover.png" +--- + +## 4.1 서브쿼리 + +- 서브쿼리는 반드시 괄호로 감싸서 표현 + +- 들어가는 위치에 따른 구분, **스인중** + +| 종류 | 설명 | +| --------------- | ----------------------------------------------------- | +| 스칼라 서브쿼리 | SELECT문의 컬럼 입력 위치에 존재 | +| 인라인 뷰 | FROM절의 테이블 입력 위치에 존재 | +| 중첩 서브쿼리 | WHERE절, HAVING절의 컬럼 또는 테이블 입력 위치에 존재 | + +- 메인쿼리의 컬럼 사용 여부에 따른 구분, **연비** + +| 종류 | 설명 | +| --------------- | ----------------------------------------------- | +| 연관 서브쿼리 | 서브쿼리가 메인쿼리의 컬럼을 사용하는 경우 | +| 비연관 서브쿼리 | 서브쿼리가 메인쿼리의 컬럼을 사용하지 않는 경우 | + +### 4.1.1 스칼라 서브쿼리 + +- SELECT, ORDER BY등에 들어가는 서브쿼리 +- 컬럼이 입력되는 위치에 삽입되므로 서브쿼리의 결과는 하나의 컬럼만을 가져야함 + +### 4.1.2 인라인 뷰 + +- FROM 절의 테이블이 입력되는 위치에 들어가는 서브쿼리 +- VIEW와 같이 쿼리실행시 생성되는 동적 테이블이라고 볼수 있음 +- 테이블의 일부분만 불러와 사용함으로써 비교횟수를 줄이는 이점 존재 + +#### 테이블과 뷰의 차이 + +| 구분 | 테이블(Table) | 뷰(View) | +| ----------- | -------------------------------------- | ------------------------------------------------------- | +| 개념 | 실제 데이터를 저장하는 물리적 객체 | 하나 이상의 테이블로부터 유도된 가상 테이블 | +| 데이터 저장 | 실제 데이터를 저장함 | 데이터를 저장하지 않고 쿼리(정의)만 저장함 | +| 생성 방식 | 정적 생성 | 동적 생성 | +| 인덱스 생성 | 인덱스 생성 가능 | 원칙적으로 인덱스 생성 불가 (기반 테이블의 인덱스 사용) | +| CRUD | 삽입/조회/수정/삭제 모두 자유롭게 가능 | 조회는 자유로우나 삽입/수정/삭제는 제약이 존재 | + +#### 뷰의 특징 + +| 특징 | 설명 | +| ------ | ----------------------------------------------------------------------------------------- | +| 편리성 | 복잡한 쿼리를 뷰로 정의해두면 간단하게 재사용할 수 있어 SQL 작성이 편리함 | +| 보안성 | 특정 컬럼이나 행만 노출하도록 정의할 수 있어 민감한 데이터를 숨겨 보안을 강화할 수 있음 | +| 독립성 | 기반 테이블의 구조가 변경되어도 뷰의 정의만 유지하면 되므로 논리적 데이터 독립성을 제공함 | + +### 4.1.3 중첩 서브쿼리 + +- WHERE절,HAVING절에 들어가는것을 지칭 +- 단일행, 다중행, 다중컬럼같이 다양한 반환값을 가짐 +- 중첩 서브쿼리의 경우 메인쿼리와 연관성이 있으면 연관서브쿼리, 없으면 비연관 서브쿼리라 함 + +## 4.2 집합연산자 + +- JOIN과달리 특정한 기준키 없이 합집합, 교집합 연산을 수행하므로 두테이블의 컬럼구성(스키마)가 동일해야함 +- 스키마 구성은 동일하나 컬럼의 이름이 다를 경우 첫번째 테이블의 이름을 따름 + +### 4.2.1 UNION ALL / UNION + +- 합집합 연산 수행 +- UNION ALL : 중복 포함 +- UNION : 중복 제거, 1건만 + +### 4.2.2 INTERSECT + +- 교집합 연산 수행 + +### 4.2.3 MINUS / EXCEPT + +- 차집합 연산 수행 + +## 4.3 그룹함수 + +- GROUP BY 절에 따른 결과에 대해서 그룹 별로 연산을 수행하는 함수 + +### 4.3.1 ROLLUP + +- GROUP BY 절에 들어가는 컬럼을 대상으로 하위 그룹핑을 수행하는 함수 +- 소계와 총계를 구할 때 사용 +- ROLLUP(부서명,입사연도) 시 부서명,입사연도 갯수, 부서 갯수, 전체 총 갯수가 나옴 + +### 4.3.2 CUBE + +- ROLLUP은 1차원적인 하위그룹핑만 수행하지만 CUBE는 조합가능한 모든 경우로 그룹핑 수행 +- 인자 1개일경우 ROLLUP과 동일 +- 인자 두개이상일 경우 (부서명,입사연도) -> (부서명) -> (입사연도) -> (전체) + +### 4.3.3 GROUPING SETS + +- 그룹핑할 대상을 지정하는 함수 +- 인자로 ROLLUP,CUBE를 넣을 수 있음 +- 개별 소계 + +### 4.3.4 GROUPING + +- ROLLUP, CUBE, GROUPING SETS와 함께 사용하여 소계에 해당하는행, 그렇지않은행 구분을 가능하게 해줌 +- 소계의 해당하는행은 1, 그렇지않은 행 0 반환, CASE문에 사용 + +## 4.4 윈도우함수 + +- 행과행간의 관계를 나타내는 연산을 쉽게 하기 위한 함수 +- GROUP BY의 경우 각행으 ㄹ대상으로 연산 수행 후 새로운 구성을 만들지만, 윈도우 함수는 각 행의 기존 구성을 유지한 상태로 해당 행에 대해서 새로운 값을 추가 또는 기존의 값을 변경함 +- 대표적으로 RANK 함수, 모든 윈도우 함수는 OVER 키워드와 함께 사용 + +### 4.4.1 순위함수 + +| 함수이름 | 설명 | 예 | +| ---------- | -------------------------------------------------------------- | ---------- | +| RANK | 동일 순위를 같은 값으로 부여하고, 그 다음 순위는 건너뜀 | 1, 2, 2, 4 | +| DENSE_RANK | 동일 순위를 같은 값으로 부여하고, 그 다음 순위는 건너뛰지 않음 | 1, 2, 2, 3 | +| ROW_NUMBER | 동일 값이라도 중복 없이 고유한 순번을 부여함 | 1, 2, 3, 4 | + +### 4.4.2 집계함수 + +- OVER절을 사용해서 파티션 별로 집계하거나 누적 집계를 할 수 있음 + +| 함수이름 | 설명 | +| -------- | --------------------------------- | +| COUNT | 파티션 내 행의 개수를 반환함 | +| SUM | 파티션 내 값들의 합계를 반환함 | +| AVG | 파티션 내 값들의 평균을 반환함 | +| MIN | 파티션 내 값들 중 최솟값을 반환함 | +| MAX | 파티션 내 값들 중 최댓값을 반환함 | + +- PARTITION BY로 나눈 파티션(그룹) 단위로 집계하며, 원래의 행 구성은 그대로 유지됨 + +```sql +SELECT 사원명, 부서명, 급여, + SUM(급여) OVER (PARTITION BY 부서명) AS 부서합계 +FROM 사원; +``` + +| 사원명 | 부서명 | 급여 | 부서합계 | +| ------ | ------ | ---- | -------- | +| 김 | 영업 | 100 | 300 | +| 이 | 영업 | 200 | 300 | +| 박 | 개발 | 150 | 150 | + +- 부서명을 기준으로 파티션이 나뉘어, 영업 파티션(김·이)의 합계 300, 개발 파티션(박)의 합계 150이 각 행마다 표시됨 + +### 4.4.3 행 순서함수 + +| 함수이름 | 설명 | +| ----------- | ---------------------------------------------- | +| FIRST_VALUE | 파티션 내 정렬 기준상 첫 번째 행의 값을 반환함 | +| LAST_VALUE | 파티션 내 정렬 기준상 마지막 행의 값을 반환함 | +| LAG | 파티션 내 현재 행 기준 이전 행의 값을 반환함 | +| LEAD | 파티션 내 현재 행 기준 이후 행의 값을 반환함 | + +### 4.4.4 비율함수 + +- 백분율등 비율 연산 + +| 함수이름 | 설명 | +| --------------- | ------------------------------------------------------------------------------- | +| CUME_DIST | 파티션 내에서 현재 행의 누적 백분율(0 초과 1 이하)을 반환함 | +| PERCENT_RANK | 파티션 내에서 현재 행의 상대적 순위를 백분율(0 이상 1 이하)로 반환함, 0부터시작 | +| NTILE | 파티션 내 행들을 지정한 개수의 그룹으로 나누고 각 행의 그룹 번호를 반환함 | +| RATIO_TO_REPORT | 파티션 내 전체 합계 대비 현재 행 값의 비율을 반환함 | + +## 4.5 Top N 쿼리 + +### 4.5.1 ROWNUM 함수 + +- 현재 데이터를 그대로 둔상태에서 순차적인 행 번호를 붙여주는 함수 + +## 4.6 계층형 질의와 셀프 조인 + +- 계층형 데이터 : 하나의 테이블 안에서 행과 행 사이에 부모-자식 관계가 존재하는 데이터 (예: 사원-관리자, 조직도, 게시판 답글) +- 각 행은 자신의 부모를 가리키는 컬럼(예: 관리자 사번)을 가지며, 이를 따라 올라가거나 내려가며 계층 구조를 표현함 +- 이러한 계층 구조를 조회하는 방법으로 계층형 질의와 셀프 조인이 있음 + +| 구분 | 설명 | +| ----------- | ------------------------------------------------------------------- | +| 계층형 질의 | START WITH, CONNECT BY 등 전용 키워드로 계층 구조를 재귀적으로 탐색 | +| 셀프 조인 | 하나의 테이블을 자기 자신과 조인하여 부모-자식 관계를 연결 | + +### 4.6.1 계층형 질의 + +- 아래의 키워드를 사용해서 계층형 질의를 작성하면 셀프조인을 사용하지 않고 효율적인 쿼리작성 가능 + +| 함수/키워드 | 설명 | +| ------------------- | --------------------------------------------------------- | +| START WITH | 계층 구조 탐색의 시작점(최상위 루트) 행을 지정함 | +| CONNECT BY | 부모-자식 연결 조건을 지정하여 계층을 따라 탐색함 | +| PRIOR | CONNECT BY절에서 부모 행을 가리키는 키워드 | +| LEVEL | 현재 행의 계층 깊이를 반환함 (루트는 1) | +| CONNECT_BY_ROOT | 현재 행이 속한 계층의 최상위 루트 값을 반환함 | +| CONNECT_BY_ISLEAF | 현재 행이 최하위(잎) 노드이면 1, 아니면 0을 반환함 | +| SYS_CONNECT_BY_PATH | 루트부터 현재 행까지의 경로를 지정한 구분자로 이어 반환함 | +| NOCYCLE | 계층 구조에 순환이 있어도 오류 없이 탐색을 계속하게 함 | +| ORDER SIBLINGS BY | 같은 부모를 가진 형제 행들 사이의 정렬 순서를 지정함 | + +### 4.6.2 셀프 조인 + +- 하나의 테이블을 조인 +- 계층의 깊이가 너무길어지면 셀프조인보다는 계층형 질의를 사용해서 해결하는것이 좋음 + +## 4.7 PIVOT절과 UNPIVOT절 + +- 헹과열을 전환하여 테이블을 재구성 하는 것 +- 행열을 바꾸는 관점에따라 피벗,언피벗 구분 + +### 4.7.1 PIVOT절 + +- 행을 열로 바꿈 +- 각 행 속성값들이 컬럼 헤더가되고, 속성값이 재배치 + +### 4.7.2 UNPIVOT절 + +- 열을 행으로 바꿈 +- 컬럼 헤더들이 한컬럼의 속성값들이 됨 + +## 4.8 정규표현식 + +- 문자열의 패턴을 표현하는 형식 언어로, 복잡한 문자열 검색·치환·추출을 간결하게 처리할 수 있음 +- LIKE만으로는 표현하기 어려운 정교한 패턴 매칭에 사용 + +| 함수 | 설명 | +| -------------- | ----------------------------------------------------------- | +| REGEXP_LIKE | 문자열이 패턴과 일치하는지 여부를 반환 (주로 WHERE절에 사용) | +| REGEXP_REPLACE | 패턴과 일치하는 부분을 다른 문자열로 치환 | +| REGEXP_SUBSTR | 패턴과 일치하는 부분 문자열을 추출 | +| REGEXP_INSTR | 패턴과 일치하는 부분의 시작 위치를 반환 | +| REGEXP_COUNT | 패턴과 일치하는 횟수를 반환 | + +- 주요 메타문자 + +| 메타문자 | 설명 | +| -------- | --------------------------------- | +| ^ | 문자열의 시작 | +| $ | 문자열의 끝 | +| . | 임의의 한 문자 | +| \* | 앞 문자가 0회 이상 반복 | +| + | 앞 문자가 1회 이상 반복 | +| ? | 앞 문자가 0회 또는 1회 | +| [ ] | 대괄호 안의 문자 중 하나 | +| \| | OR (둘 중 하나) | +| { } | 반복 횟수 지정 (예: {2,4}) | diff --git a/_algorithms/SQLD/sqld-5.md b/_algorithms/SQLD/sqld-5.md new file mode 100644 index 0000000..60b14c8 --- /dev/null +++ b/_algorithms/SQLD/sqld-5.md @@ -0,0 +1,202 @@ +--- +title: "[SQLD] 5장. 관리구문" +excerpt: "DML, TCL, DDL, DCL" +coverImage: "/assets/blog/posts/mysql/cover.png" +date: "2026-08-03T12:00:00" +ogImage: + url: "/assets/blog/posts/mysql/cover.png" +--- + +## 5.1 DML + +- Data Manipulation Language, 데이터 조작 언어 +- 테이블의 데이터를 조회/입력/수정/삭제하는 명령어 +- COMMIT 전에는 ROLLBACK으로 되돌릴 수 있음 + +| 명령어 | 설명 | +| ------ | -------------------------- | +| SELECT | 데이터 조회 | +| INSERT | 데이터 입력 | +| UPDATE | 데이터 수정 | +| DELETE | 데이터 삭제 | +| MERGE | 조건에 따라 입력 또는 수정 | + +### 5.1.1 INSERT + +- 테이블에 새로운 행을 추가하는 명령어 +- 컬럼 목록을 생략하면 테이블 정의 순서대로 모든 컬럼에 값을 입력해야 함 + +```sql +INSERT INTO emp (empno, ename, sal) +VALUES (1001, '김영덕', 3000); +``` + +### 5.1.2 UPDATE + +- 기존 행의 컬럼 값을 수정하는 명령어 +- WHERE절을 생략하면 테이블의 모든 행이 수정되므로 주의 + +```sql +UPDATE emp + SET sal = 3500 + WHERE empno = 1001; +``` + +### 5.1.3 DELETE + +- 테이블의 행을 삭제하는 명령어 +- WHERE절을 생략하면 모든 행이 삭제됨 (테이블 구조는 남음) +- TRUNCATE와 달리 롤백이 가능하고, 조건별 삭제가 가능 + +```sql +DELETE FROM emp + WHERE empno = 1001; +``` + +### 5.1.4 MERGE + +- 하나의 문장으로 조건에 따라 INSERT와 UPDATE(또는 DELETE)를 함께 수행 +- 대상 테이블에 일치하는 행이 있으면 UPDATE, 없으면 INSERT (UPSERT) + +```sql +MERGE INTO emp e +USING new_emp n + ON (e.empno = n.empno) +WHEN MATCHED THEN + UPDATE SET e.sal = n.sal +WHEN NOT MATCHED THEN + INSERT (empno, ename, sal) + VALUES (n.empno, n.ename, n.sal); +``` + +## 5.2 TCL + +- Transaction Control Language, 트랜잭션 제어 언어 +- 트랜잭션 : 데이터베이스의 논리적 연산 단위로, 더 이상 나눌 수 없는 하나의 작업 묶음 +- COMMIT, ROLLBACK, SAVEPOINT + +### 5.2.1 트랜잭션의 특징 + +- 트랜잭션의 4가지 특성, **ACID** + +| 특성 | 설명 | +| ------------------- | ----------------------------------------------------------------- | +| 원자성(Atomicity) | 트랜잭션의 연산은 모두 반영되거나 전혀 반영되지 않아야 함 | +| 일관성(Consistency) | 트랜잭션 수행 전후로 데이터베이스가 일관된 상태를 유지해야 함 | +| 고립성(Isolation) | 실행 중인 트랜잭션의 중간 결과가 다른 트랜잭션에 보이지 않아야 함 | +| 지속성(Durability) | 커밋된 트랜잭션의 결과는 영구적으로 반영되어야 함 | + +### 5.2.2 COMMIT + +- 트랜잭션에서 수행한 변경 내용을 데이터베이스에 영구적으로 반영 +- 커밋 이후에는 ROLLBACK으로 되돌릴 수 없음 + +### 5.2.3 ROLLBACK + +- 트랜잭션에서 수행한 변경 내용을 취소하고 마지막 COMMIT 시점 상태로 되돌림 +- SAVEPOINT를 지정하면 특정 지점까지만 되돌릴 수 있음 + +### 5.2.4 SAVEPOINT + +- 트랜잭션 내에 되돌아갈 수 있는 중간 지점을 지정하는 명령어 +- ROLLBACK TO 저장점명으로 해당 지점 이후의 작업만 취소 가능 + +```sql +SAVEPOINT sp1; +DELETE FROM emp WHERE empno = 1001; +ROLLBACK TO sp1; -- DELETE만 취소, sp1 이전 작업은 유지 +``` + +## 5.3 DDL + +- Data Definition Language, 데이터 정의 언어 +- 테이블 등 객체의 구조(스키마)를 정의/변경/삭제하는 명령어 +- 실행 즉시 자동 커밋(Auto Commit)되어 롤백이 불가능 + +| 명령어 | 설명 | +| -------- | -------------------------------- | +| CREATE | 객체 생성 | +| ALTER | 객체 구조 변경 | +| DROP | 객체 삭제 | +| TRUNCATE | 테이블의 모든 행 삭제(구조 유지) | +| RENAME | 객체 이름 변경 | + +### 5.3.1 CREATE + +- 테이블 등 데이터베이스 객체를 생성하는 명령어 +- 컬럼명, 데이터 타입, 제약조건 등을 정의 + +```sql +CREATE TABLE emp ( + empno NUMBER PRIMARY KEY, + ename VARCHAR2(20) NOT NULL, + sal NUMBER DEFAULT 0 +); +``` + +### 5.3.2 ALTER + +- 이미 생성된 객체의 구조를 변경하는 명령어 + +| 구분 | 설명 | +| ------------- | ------------------------------ | +| ADD | 컬럼 또는 제약조건 추가 | +| MODIFY | 컬럼의 데이터 타입/기본값 변경 | +| DROP COLUMN | 컬럼 삭제 | +| RENAME COLUMN | 컬럼 이름 변경 | + +```sql +ALTER TABLE emp ADD (hiredate DATE); +ALTER TABLE emp MODIFY (ename VARCHAR2(30)); +``` + +## 5.4 DCL + +- Data Control Language, 데이터 제어 언어 +- 사용자 생성 및 접근 권한 등 보안과 제어를 다루는 명령어 + +### 5.4.1 USER 관련 명령어 + +- 데이터베이스에 접속하는 사용자 계정을 생성/변경/삭제 + +| 명령어 | 설명 | +| ----------- | --------------------------- | +| CREATE USER | 사용자 계정 생성 | +| ALTER USER | 계정 정보 변경(비밀번호 등) | +| DROP USER | 사용자 계정 삭제 | + +```sql +CREATE USER ydkim IDENTIFIED BY password; +``` + +### 5.4.2 권한 관련 명령어 + +- 사용자에게 특정 작업을 수행할 권한을 부여하거나 회수 + +| 명령어 | 설명 | +| ------ | --------- | +| GRANT | 권한 부여 | +| REVOKE | 권한 회수 | + +```sql +GRANT SELECT, INSERT ON emp TO ydkim; +REVOKE INSERT ON emp FROM ydkim; +``` + +### 5.4.3 ROLE 관련 명령어 + +- ROLE : 여러 권한을 하나로 묶은 집합으로, 권한 관리를 편리하게 해줌 +- 사용자마다 권한을 일일이 부여하는 대신 ROLE 단위로 부여/회수 가능 + +| 명령어 | 설명 | +| ----------- | ----------------------------------- | +| CREATE ROLE | 롤 생성 | +| GRANT | 롤에 권한 부여 / 사용자에게 롤 부여 | +| REVOKE | 롤 또는 권한 회수 | +| DROP ROLE | 롤 삭제 | + +```sql +CREATE ROLE dev_role; +GRANT SELECT, INSERT ON emp TO dev_role; +GRANT dev_role TO ydkim; +```