1. 데이터베이스(DB)
특정 기업이나 조직 또는 개인이 필요에 의해 데이터를 일정한 형태로 저장해 놓은 것을 의미한다.
2. 관계형 데이터베이스(RDB)
관계형 데이터베이스에서의 설계는 모든 데이터를 2차원 테이블 형태로 표현한 뒤 각 테이블 간의 관계를 정의하는 것으로 시작된다.
3. 테이블
관계형 데이터베이스의 기본 단위
| 세로 = 열 | 컬럼 = 속성 |
|---|---|
| 가로 = 행 | 로우 = 튜플 = 인스턴스 |
4. SQL(Structured Query Language)
관계형 데이터베이스에서 데이터를 다루기 위해 사용하는 언어
| DML | SELECT, INSERT, UPDATE, DELETE (셀인업딜) |
|---|---|
| DDL | CREATE, ALTER, DROP, RENAME (크알드리) |
| DCL | GRANT, REVOKE |
| TCL | COMMIT, ROLLBACK |
5. PK, FK
1) PK : 테이블에 존재하는 각 행을 한 가지 의미로 특정할 수 있는 한 개 이상의 컬럼
2) FK : 다른 테이블의 기본키로 사용되고 있는 관계를 연결하는 컬럼
Date Definition Language
데이터를 정의하는 SQL 명령어
| CREATE | 구조를 생성하기 위한 명령어 |
|---|---|
| ALTER | 구조를 변경하기 위한 명령어 |
| DROP | 구조를 삭제할 때 쓰는 명령어 |
| RENAME | 컬럼 혹은 테이블의 이름을 변경하고 싶을 때 쓰는 명령어 |
| ▽ ANSI 표준 기준 | |
| RENAME (기존 객체명) TO (새로운 객체명); | |
| TRUNCATE | 테이블을 초기화하는 명령어 |
1. CREATE
1) 반드시 지켜야 하는 규칙
2) 가용성을 위해 지키면 좋은 규칙
3) 제약조건
▽ 제약조건 종류

4) 참조 무결성 규정 관련 옵션
| CASCADE | Parent 값 삭제 시 Child 값 같이 삭제 |
|---|---|
| SET NULL | Parent 값 삭제 시 Child의 해당 컬럼 NULL 처리 |
| SET DEFAULT | Parent 값 삭제 시 Child의 해당 컬럼 DEFAULT 값으로 변경 |
| RESTRICT | Child 테이블에 해당 데이터가 PK로 존재하지 않는 경우에만 Parent 값 삭제 및 수정 가능 |
| NO ACTION | 참조 무결성 제약이 걸려있는 경우 삭제 및 수정 불가 |
| AUTOMATIC | Parent 테이블에 PK가 없는 경우 PK를 생성 후에 Child 테이블에 값을 입력한다. |
| DEPENDENT | Parent 테이블에 PK가 존재할 때만 Child 테이블 입력 허용 |
2. ALTER
컬럼 한개만 추가하고 변경할 때는 ( )를 생략해도 가능하다.

3. 데이터 유형 & 크기
| 유형 | 데이터 타입 |
|---|---|
| 문자 | CHAR(s) : 데이터 크기를 고정한다. |
| 'Jennie' = 'Jennie ' : 공백을 문자로 치지 않는다. | |
| VARCHAR(s) : 데이터 크기가 가변으로 입력된다. | |
| 'Jennie' <> 'Jennie ' : 공백을 문자로 친다. | |
| CLOB | |
| 숫자 | NUMBER |
| 날짜 | DATE |
Data Manipulation Language
DDL에서 정의한 대로 데이터를 입력하고, 입력한 데이터를 수정, 삭제, 조회하는 명령어

1. 와일드카드
1) * : 모든 인스턴스
2) % : 모든 문자
3) - : 문자 하나
2. 합성 연산자 Concatenate
문자와 문자를 연결한다.
CONCAT('가', '나') = '가' || '나' = '가' + '나'
3. DISTINCT
중복된 데이터가 있는 경우 1건으로 처리해서 출력한다.
Transaction Control Language
트랜잭션을 제어하는 명령어

1. 트랜잭션
쪼개질 수 없는 업무처리의 단위
'죽어도 한 세트로 묶일 수 밖에 없는 논리적인 업무 단위'
ex) 티셔츠를 하나 결제한다. & 티셔츠 재고가 하나 차감된다.
데이터베이스의 논리적 연산단위
1) 특징 (▷ 원일고지)

2) 트랜잭션의 위험성
| Dirty Read | 타 트랜잭션으로 수정 가능한 상태. |
|---|---|
| 아직 COMMIT 안 된 데이터를 읽는다. | |
| Non-Repeatable Read | 같은 쿼리를 수행하지만 타 트랜잭션의 수정, 삭제로 다른 값이 Return된다. |
| Phantom Read | 같은 쿼리를 수행하지만 유령 레코드가 두번째 쿼리에서 발생한다. |
2. SQL 실행 순서
| 파싱 | SQL 문법을 확인하고 구문 분석을 한다. |
|---|---|
| 구문 분석한 SQL을 라이브러리 캐시에 저장한다. | |
| 실행 | 옵티마이저가 생성한 실행 계획에 따라 SQL을 실행한다. |
| 인출 | 데이터를 읽어 전송한다. |
집계 함수는 WHERE 절에 올 수 없다.
1. 비교 연산자
=, <, <=, >, >=
2. 부정 비교 연산자
!=, ^=, <>, not 컬럼명 =, not 컬럼명 >, not 컬럼명 <, ...
3. SQL 연산자

1) NULL
모르는 값, 값의 부재를 의미한다.
4. 부정 SQL 연산자
| NOT BETWEEN ~ AND ~ | A와 B를 포함하지 않고 사이가 아닌 값들 |
|---|---|
| NOT IN (LIST) | LIST의 값들 중 일치하는 것이 아닌 값들 |
| IS NOT NULL | NULL이 아닌 값들 |
5. 논리 연산자
| AND | 모든 조건이 TRUE여야 한다. |
|---|---|
| OR | 하나 이상의 조건이 TRUE이면 된다. |
| NOT | TRUE, FALSE의 각각 반대 |
| NOT은 OR로, OR은 NOT으로 만든다. |
6. 연산자 우선순위
() ▶ NOT ▶ 비교 연산자 ▶ AND ▶ OR
[ ] 안에 들어있는 파라미터는 옵션.

1. 문자 함수

1) DUAL 테이블
사용자 SYS가 소유하며 모든 사용자가 액세스 가능한 테이블
2. 숫자 함수

3. 날짜 함수
| SYSDATE | 현재의 연, 월, 일, 시, 분, 초를 반환해주는 함수 |
|---|---|
| EXTRACT(특정 단위 FROM 날짜 데이터) | 날짜 데이터에서 특정 단위만을 출력하여 반환해주는 함수 |
| ADD_MONTHS(날짜 데이터, 특정 개월 수) | 날짜 데이터에서 특정 개월 수를 더한 날짜를 반환해주는 함수 |
| 날짜의 이전달이나 다음 달에 기준 날짜의 일자가 존재하지 않으면 해당 월의 마지막 일자를 반환한다. | |
| ex) 2월은 02-28 |
1) Oracle에서 날짜의 연산은 숫자의 연산과 같다.
4. 변환 함수
1) 명시적 형변환과 암시적 형변환
2) 명시적 형변환에 쓰이는 함수 (Oracle)

3) 명시적 형변환에 쓰이는 함수 (SQL Server)
| CAST(표현식 AS data_type [(length)]) | 표현식을 목표 데이터 유형으로 변환한다. |
|---|---|
| CONVERT(data_type [(length)], expression [,style]) | 표현식을 목표 데이터 유형으로 변환한다. |
5. NULL 관련 함수

6. CASE
표현 방식이 함수보다는 구문에 가까운 조건 함수
CASE WHEN ~ THEN ~
ELSE ~
END AS ~
1) ELSE 뒤의 값이 DEFAULT 값이 되고 별도의 ELSE 값이 없을 경우 NULL값이 DEFAULT 값이 된다.
2) SIMPLE_CASE_EXPRESSION
똑같은 기능 표현인데 원래의 구문보다 간단하게 적을 수 있다.
ex) CASE WHEN 컬럼명 = '특정 컬럼명' THEN '원하는 컬럼명'
▷ CASE 컬럼명 WHEN '특정 컬럼명' THEN '원하는 컬럼명'
7. DECODE
CASE WHEN ~ THEN ~ END ~ 절이랑 같은 역할
1. GROUP BY
데이터를 그룹별로 묶는 절
2. 집계 함수(그룹 함수)
| COUNT(*) | 전체 로우를 카운트 |
|---|---|
| COUNT(컬럼) | 컬럼이 NULL인 로우를 제외하고 카운트 |
| COUNT(DISTINCT 컬럼) | COUNT(컬럼)에 중복을 제거하고 카운트 |
| - DISTINCT는 NULL도 한 행으로 본다. | |
| SUM(컬럼) | 컬럼의 합계(NULL값 제외) |
| AVG(컬럼) | 컬럼의 평균(NULL값 제외) |
| MIN(컬럼) | 컬럼의 최소값(NULL값 제외) |
| MAX(컬럼) | 컬럼의 최대값(NULL값 제외) |
▷COUNT, SUM, AVG : NULL을 제외하고 계산한다.
1) 주의점
왜냐하면 AVG를 사용하면 행을 1개만 반환하는데 나머지 컬럼들을 같이 조회하면 반환되는 행의 개수가 안 맞아서 에러가 발생한다.
3. HAVING
GROUP BY 절을 사용할 때 WHERE 절처럼 사용하는 조건절
ASC : 오름차순
DESC : 내림차순
1. Oracle
NULL이 숫자들 중 가장 큰 값
2. SQL Server
NULL이 숫자들 중 가장 작은 값
프웨그해셀오

SQL Server의 WITH TIES
SELECT TOP(2) WITH TIES ENAME, SAL FROM EMP ORDER BY SAL DESC;
▷ 급여가 높은 2명을 내림차순으로 출력하는데 같은 급여를 받는 사원은 같이 출력한다.
두 개 이상의 테이블들을 연결 또는 결합하여 데이터를 출력하는 것
1. 조인의 유형



1. USING, ON
1) USING 조건절
▷ 같은 이름을 가진 컬럼들 중에서 원하는 컬럼에 대해서만 선택적으로 EQUI JOIN을 할 수 있다.
▷ ALIAS는 사용할 수 없다.
2) ON 조건절
▷ 컬럼명이 다르더라도 JOIN 조건을 사용할 수 있다.
▷ ALIAS나 테이블명을 반드시 사용해서 컬럼명을 선택해야 한다.
2. 순수 관계 연산자
1) SELECT 연산 : WHERE 절로 구현
2) PROJECT 연산 : SELECT 절로 구현
3) JOIN 연산 : JOIN 기능으로 구현
4) DIVIDE 연산 : 현재는 사용되지 않음
▷SELECT, WHERE, JOIN, DIVIDE(현재는 X)
집합 연산자는 두 개 이상의 테이블에서 조인을 사용하지 않고, 연관된 데이터를 조회하는 방법 중 하나이다.
SELECT 절의 칼럼 수가 동일하고, 동일 위치에 존재하는 칼럼의 데이터 타입이 상호 호환이 가능해야 한다.

| UNION ALL | QUERY1의 결과와 QUERY2의 결과를 그대로 합하는 것으로 중복된 행도 그대로 출력된다. |
|---|---|
| - 정렬 작업이 없어서 빠르다. | |
| UNION | UNION은 QUERY1의 결과와 QUERY2의 결과를 합한 후 중복을 제거하여 출력한다. |
| - 두 개의 SQL을 UNION으로 연결할 경우 헤드의 명칭은 첫번째 SQL의 컬럼명 혹은 ALIAS를 따른다. | |
| - 정렬 작업이 있다. | |
| INTERSECT | QUERY1의 결과와 QUERY2의 결과에서 공통된 부분만 중복을 제거하여 출력한다. |
| - 정렬 작업이 있다. | |
| - INTERSECT 연산을 할 경우 SELECT 항목의 데이터 타입, 그리고 순서도 똑같아야 한다. | |
| MINUS / EXCEPT | QUERY1의 결과에서 QUERY2의 결과를 제거하고 출력한다. |
| - 정렬 작업이 있다. |
테이블에 계층 구조를 이루는 컬럼이 존재할 경우 계층 쿼리를 이용해서 데이터를 출력할 수 있다.

예문)
SELECT LEVEL,
SYS_CONNECT_BY_PATH('['||CATEGORY_TYPE||']'|| CATEGORY_NAME, '-') AS PATH
FROM CATEGORY
START WITH PARENT_CATEGORY IS NULL
CONNECT BY PRIOR CATEGORY_NAME = PARENT_CATEGORY;
▷ START WITH PARENT_CATEGORY IS NULL
: PARENT_CATEGORY 컬럼이 NULL인 인스턴스가 출력된다.
▷ CONNECT BY PRIOR CATEGORY_NAME = PARENT_CATEGORY
: 카테고리명과 부모의 카테고리가 같은 인스턴스를 반환한다. 가장 하위(리프) 노드까지 반복한다.
| CONNECT_BY_ROOT 컬럼 | 루트 노드의 주어진 컬럼 값을 반환한다. |
|---|---|
| CONNECT_BY_ISLEAF | 가장 하위 노드인 경우 1을 반환, 그 외에는 0을 반환한다. |
| ORDER SIBLINGS BY | 계층 쿼리에서는 같은 레벨끼리 정렬되도록 ORDER BY절 대신 사용한다. |
FROM절에 같은 테이블이 두 번 이상 등장하기 때문에 혼란을 막기 위해 ALIAS를 반드시 표기해주어야 한다.
일반적인 경우 대-중-소를 가지고 있는데 그런 경우 셀프조인을 사용하고, 더 간단하게 하기 위해서 계층 쿼리를 이용한다.
하나의 SQL문 안에 포함되어 있는 또다른 SQL문
| SELECT 절 | 스칼라 서브쿼리 |
|---|---|
| FROM 절 | 인라인 뷰 |
| WHERE 절, HAVING 절 | 중첩 서브쿼리 |
| ORDER BY 절 |
1. 스칼라 서브쿼리
주로 SELECT 절에 위치하지만 컬럼이 올 수 있는 대부분 위치에 사용할 수 있다.
2. 인라인 뷰
FROM 절 등 테이블명이 올 수 있는 위치에 사용 가능하다.
3. 중첩 서브쿼리
1) WHERE절과 HAVING절에 사용가능하다.
| 비연관 서브쿼리 | 메인 쿼리와 관계를 맺고 있지 않음 |
|---|---|
| 연관 서브쿼리 | 메인 쿼리와 관계를 맺고 있음 |
2) 중첩 서브쿼리는 반환하는 데이터 형태에 따라서도 나눌 수 있다.
| 단일 행 서브쿼리 | 서브쿼리가 1건 이하의 데이터를 반환 |
|---|---|
| 다중 행 서브쿼리 | 서브쿼리가 여러 건의 데이터를 반환 |
| 다중 행 비교 연산자와 함께 사용 | |
| 다중 컬럼 서브쿼리 | 서브쿼리가 여러 컬럼의 데이터를 반환 |
a. 단일 행 서브쿼리 : 항상 1건 이하의 결과만 반환
b. 다중 행 서브쿼리 : 2건 이상의 행을 반환
c. 다중 컬럼 서브쿼리
4. 단일 행 비교 연산자
=,<,>,<>
5. 다중 행 비교 연산자
IN, ALL, ANY, SOME
특정 SELECT 문에 이름을 붙여서 재사용이 가능하도록 저장해놓은 오브젝트
| 독립성 | 테이블 구조가 변경되어도 뷰를 사용하는 응용프로그램은 변경하지 않아도 된다. |
|---|---|
| 편리성 | 복잡한 질의를 뷰로 생성함으로써 관련 질의를 단순하게 작성할 수 있다. |
| 보안성 | 직원의 급여정보와 같이 숨기고 싶은 정보가 존재할 때 사용할 수 있다. |
| 집계 함수 | COUNT, SUM, AVG, MAX, MIN 등 |
|---|---|
| 소계(총계) 함수 | ROLLUP, CUBE, GROUPING SETS 등 |
1. ROLL UP
소그룹 간의 소계 및 총계를 계산하는 함수
| ROLLUP(A) | A로 그룹핑 |
|---|---|
| 총합계 | |
| ROLLUP (A, B) | A, B로 그룹핑 |
| A로 그룹핑 | |
| 총합계 | |
| ROLLUP (A, B, C) | A, B, C로 그룹핑 |
| A, B로 그룹핑 | |
| A로 그룹핑 | |
| 총합계 |
2. CUBE
소그룹 간의 소계 및 총계를 다차원적으로 계산할 수 있는 함수
| CUBE (A) | A로 그룹핑 |
|---|---|
| 총합계 | |
| CUBE (A, B) | A, B로 그룹핑 |
| A로 그룹핑 | |
| B로 그룹핑 | |
| 총합계 | |
| CUBE (A, B, C) | A, B, C로 그룹핑 |
| A, B로 그룹핑 | |
| A, C로 그룹핑 | |
| B, C로 그룹핑 | |
| A로 그룹핑 | |
| B로 그룹핑 | |
| C로 그룹핑 | |
| 총합계 |
3. GROUPING SETS
특정 항목에 대한 소계를 계산하는 함수
| GROUPING SETS(A, B) | A로 그룹핑 |
|---|---|
| B로 그룹핑 | |
| GROUPING SETS(A, B, ( )) | A로 그룹핑 |
| B로 그룹핑 | |
| 총합계 | |
| GROUPING SETS(A, ROLLUP(B)) | A로 그룹핑 |
| B로 그룹핑 | |
| 총합계 | |
| GROUPING SETS(A, ROLLUP(B, C)) | A로 그룹핑 |
| B, C로 그룹핑 | |
| B로 그룹핑 | |
| 총합계 | |
| GROUPING SETS(A, B, ROLLUP(C)) | A로 그룹핑 |
| B로 그룹핑 | |
| C로 그룹핑 | |
| 총합계 |
4. GROUPING
ROLLUP, CUBE, GROUPING SETS 등과 함께 쓰이며 소계를 나타내는 행을 구분할 수 있게 해준다.
결과에 대한 함수 처리이기 때문에 결과 건수는 줄어들지 않는다.
1. 순위 함수
| RANK | 순위를 매기면서 같은 순위가 존재하면 존재하는 수만큼 다음 순위를 건너뛴다. |
|---|---|
| DENSE_RANK | 순위를 매기면서 같은 순위가 존재하더라도 다음 순위를 건너뛰지 않고 이어서 매긴다. |
| ROW_NUMBER | 순위를 매기면서 동일한 값이라도 각기 다른 순위를 부여한다. |
2. 집계 함수

3. 행 순서 함수

4. 비율 함수

1. ROWNUM
Oracle의 ROWNUM은 슈도 컬럼(Pseudo Column)이다. 슈도는 '가짜'라는 의미
ROWNUM은 행이 반환될 때마다 순번이 1씩 증가하기 때문에 WHERE ROWNUM = 5와 같은 건너뛰기 조건은 성립될 수 없다. ROWNUM은 항상 < 조건이나 <= 조건으로 사용해야 한다.
2. 윈도우 함수의 순위 함수
ROW_NUMBER, RANK, DENSE_RANK를 이용한 Top-N 쿼리
3. Top(n)
SELECT TOP(n) 컬럼명 ▷ 해당 컬럼에서 상위 n까지의 데이터를 반환
4. with문
일종의 임시적인 뷰 테이블이다.
Data Control Language
USER를 생성하고 USER에게 데이터를 컨트롤할 수 있는 권한을 부여하거나 회수하는 명령어
1. USER 관련 명령어
하나의 데이터베이스는 여러 개의 USER를 가질 수 있다.
| CREATE USER | 사용자를 생성하는 명령어 |
|---|---|
| CREATE USER 권한이 있어야 수행 가능하다. | |
| CREATE USER 사용자명 IDENTIFIED BY 패스워드; | |
| ALTER USER | 사용자를 변경하는 명령어 |
| 사용자명 IDENTIFIED BY 패스워드; | |
| DROP USER | 사용자를 삭제하는 명령어 |
2. 권한 관련 명령어
1) GRANT
2) REVOKE
REVOKE 권한 FROM 사용자명;
3. ROLE 관련 명령어
1) ROLE을 이용한 권한 부여

SQL문의 연속적인 실행이나 조건에 따른 분기처리를 이용하여 특정 기능을 수행하는 저장 모듈을 생성할 수 있다.
1. 저장 모듈
PL/SQL 문장을 데이터베이스 서버에 저장하여 사용자와 애플리케이션 사이에서 공유할 수 있도록 만든 일종의 SQL 컴포넌트 프로그램
1) 저장 모듈의 기능
2. 특징
Block 구조로 되어있어 각 기능별로 모듈화 가능
▽ Block 구조
|DECLARE|BEGIN~END 절에서 사용될 변수와 인수에 대한 정의 및 데이터 타입 선언부|
|:-:|:-:|
|BEGIN~END|개발자가 처리하고자 하는 SQL문과 여러 가지 비교문, 제어문을 이용 필요한 로직 처리|
|EXCEPTION|BEGIN~END 절에서 실행되는 SQL문이 실행될 때 에러가 발생하면 그 에러를 어떻게 처리할지 정의하는 예외 처리부|
3, T-SQL
근본적으로 SQL Server를 제어하는 언어
4. Trigger
특정한 테이블에 INSERT, UPDATE, DELETE와 같은 DML문이 수행되었을 때, 데이터베이스에서 자동으로 동작하도록 작성된 프로그램
1) Procedure와 Trigger의 차이점
| Procedure | Trigger |
|---|---|
| CREATE Procedure 문법 사용 | CREATE Trigger 문법 사용 |
| EXECUTE 명령어로 실행 | 생성 후 자동으로 실행 |
| TCL 언어 사용 가능 | TCL 언어 사용 불가능 |