[SQLD] 2과목

windowook·2023년 12월 12일
post-thumbnail

> 1장 SQL 기본


1. 관계형 데이터베이스 개요

1. 데이터베이스(DB)
특정 기업이나 조직 또는 개인이 필요에 의해 데이터를 일정한 형태로 저장해 놓은 것을 의미한다.

2. 관계형 데이터베이스(RDB)
관계형 데이터베이스에서의 설계는 모든 데이터를 2차원 테이블 형태로 표현한 뒤 각 테이블 간의 관계를 정의하는 것으로 시작된다.

  • Oracle, SQL Server, MySQL, MariaDB, PostgreSQL

3. 테이블
관계형 데이터베이스의 기본 단위

  • 데이터베이스는 여러 개의 테이블로 구성된다.
세로 = 열컬럼 = 속성
가로 = 행로우 = 튜플 = 인스턴스

4. SQL(Structured Query Language)
관계형 데이터베이스에서 데이터를 다루기 위해 사용하는 언어

DMLSELECT, INSERT, UPDATE, DELETE (셀인업딜)
DDLCREATE, ALTER, DROP, RENAME (크알드리)
DCLGRANT, REVOKE
TCLCOMMIT, ROLLBACK

5. PK, FK
1) PK : 테이블에 존재하는 각 행을 한 가지 의미로 특정할 수 있는 한 개 이상의 컬럼

2) FK : 다른 테이블의 기본키로 사용되고 있는 관계를 연결하는 컬럼

2. DDL

Date Definition Language
데이터를 정의하는 SQL 명령어

  • Oracle에서는 AUTO COMMIT이 이뤄진다.
  • SQL Server에서는 COMMIT을 직접해야 한다.
  • Oracle에서 DDL 문장을 수행하면 내부적으로 트랜잭션을 종료시킨다.
CREATE구조를 생성하기 위한 명령어
ALTER구조를 변경하기 위한 명령어
DROP구조를 삭제할 때 쓰는 명령어
RENAME컬럼 혹은 테이블의 이름을 변경하고 싶을 때 쓰는 명령어
▽ ANSI 표준 기준
RENAME (기존 객체명) TO (새로운 객체명);
TRUNCATE테이블을 초기화하는 명령어

1. CREATE
1) 반드시 지켜야 하는 규칙

  • 테이블명은 고유해야 한다.
  • 한 테이블 내에서 컬럼명은 고유해야 한다.
  • 컬럼명 뒤에 데이터 유형과 데이터 크기가 명시되어야 한다.
  • 컬럼에 대한 정의는 괄호( ) 안에 기술한다.
  • 각 컬럼들은 ,로 구분된다.
  • 테이블명과 컬럼명은 숫자로 시작될 수 없다.
  • 마지막은 ;으로 끝난다.
  • A~Z, a~z, 0~9, _, $, # 문자만 허용된다.

2) 가용성을 위해 지키면 좋은 규칙

  • 테이블은 각각의 정체성을 나타내는 이름을 가져야 한다.
  • 컬럼명을 정의할 때는 다른 테이블과 통일성이 있어야 한다.같은 데이터를 저장하는 컬럼이라면 테이블이 달라도 컬럼명이 동일한 게 좋다.

3) 제약조건

  • 테이블에 저장될 데이터의 무결성, 데이터의 정확성과 일관성 유지, 데이터에 결손과 부정합이 없음을 보증하기 위한 장치

▽ 제약조건 종류

4) 참조 무결성 규정 관련 옵션

CASCADEParent 값 삭제 시 Child 값 같이 삭제
SET NULLParent 값 삭제 시 Child의 해당 컬럼 NULL 처리
SET DEFAULTParent 값 삭제 시 Child의 해당 컬럼 DEFAULT 값으로 변경
RESTRICTChild 테이블에 해당 데이터가 PK로 존재하지 않는 경우에만 Parent 값 삭제 및 수정 가능
NO ACTION참조 무결성 제약이 걸려있는 경우 삭제 및 수정 불가
AUTOMATICParent 테이블에 PK가 없는 경우 PK를 생성 후에 Child 테이블에 값을 입력한다.
DEPENDENTParent 테이블에 PK가 존재할 때만 Child 테이블 입력 허용

2. ALTER
컬럼 한개만 추가하고 변경할 때는 ( )를 생략해도 가능하다.

3. 데이터 유형 & 크기

유형데이터 타입
문자CHAR(s) : 데이터 크기를 고정한다.
'Jennie' = 'Jennie ' : 공백을 문자로 치지 않는다.
VARCHAR(s) : 데이터 크기가 가변으로 입력된다.
'Jennie' <> 'Jennie ' : 공백을 문자로 친다.
CLOB
숫자NUMBER
날짜DATE

3. DML

Data Manipulation Language
DDL에서 정의한 대로 데이터를 입력하고, 입력한 데이터를 수정, 삭제, 조회하는 명령어

  • Oracle에서는 구문을 실행하고 COMMIT을 직접 입력해야 한다.

1. 와일드카드
1) * : 모든 인스턴스
2) % : 모든 문자
3) - : 문자 하나

2. 합성 연산자 Concatenate
문자와 문자를 연결한다.

  • 인수는 반드시 2개만 사용할 수 있다.
    Oracle : ||
    SQL Server : +

CONCAT('가', '나') = '가' || '나' = '가' + '나'

3. DISTINCT
중복된 데이터가 있는 경우 1건으로 처리해서 출력한다.

4. TCL

Transaction Control Language
트랜잭션을 제어하는 명령어

1. 트랜잭션
쪼개질 수 없는 업무처리의 단위

  • '죽어도 한 세트로 묶일 수 밖에 없는 논리적인 업무 단위'
    ex) 티셔츠를 하나 결제한다. & 티셔츠 재고가 하나 차감된다.

  • 데이터베이스의 논리적 연산단위

1) 특징 (▷ 원일고지)

2) 트랜잭션의 위험성

Dirty Read타 트랜잭션으로 수정 가능한 상태.
아직 COMMIT 안 된 데이터를 읽는다.
Non-Repeatable Read같은 쿼리를 수행하지만 타 트랜잭션의 수정, 삭제로 다른 값이 Return된다.
Phantom Read같은 쿼리를 수행하지만 유령 레코드가 두번째 쿼리에서 발생한다.

2. SQL 실행 순서

파싱SQL 문법을 확인하고 구문 분석을 한다.
구문 분석한 SQL을 라이브러리 캐시에 저장한다.
실행옵티마이저가 생성한 실행 계획에 따라 SQL을 실행한다.
인출데이터를 읽어 전송한다.

5. WHERE 절

집계 함수는 WHERE 절에 올 수 없다.

1. 비교 연산자
=, <, <=, >, >=

2. 부정 비교 연산자
!=, ^=, <>, not 컬럼명 =, not 컬럼명 >, not 컬럼명 <, ...

3. SQL 연산자

1) NULL
모르는 값, 값의 부재를 의미한다.

  • 공백문자와 0과는 전혀 다른 값이다.
  • IS NULL을 제외한 모든 NULL과의 비교는 '알 수 없음(Unknown)'을 반환한다.
  • Oracle : 컬럼에 입력하는 ' '(공백)은 NULL로 입력된다.
    그래서 입력된 공백을 확인할 때는 WHERE (컬럼명) = ' ';이 아니라 IS NULL로 조회해야 한다.
  • SQL Server : 컬럼에 입력하는 ' '(공백)은 그대로 공백으로 입력된다. 그래서 WHERE (컬럼명) = ' ';으로 조회가 가능하다.

4. 부정 SQL 연산자

NOT BETWEEN ~ AND ~A와 B를 포함하지 않고 사이가 아닌 값들
NOT IN (LIST)LIST의 값들 중 일치하는 것이 아닌 값들
IS NOT NULLNULL이 아닌 값들

5. 논리 연산자

AND모든 조건이 TRUE여야 한다.
OR하나 이상의 조건이 TRUE이면 된다.
NOTTRUE, FALSE의 각각 반대
NOT은 OR로, OR은 NOT으로 만든다.

6. 연산자 우선순위
() ▶ NOT ▶ 비교 연산자 ▶ AND ▶ OR

6. 함수

[ ] 안에 들어있는 파라미터는 옵션.

  • 다중행 함수도 단일행 함수와 동일하게 단일 값만을 반환한다.
  • 1:M 조인이라 하더라도 M쪽에서 출력된 행이 하나씩 출력되므로 단일행 함수의 입력값으로 사용할 수 있다.

1. 문자 함수

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

  • SELECT ~ FROM ~ 의 형식을 갖추기 위한 일종의 DUMMY 테이블이다.
  • DUMMY라는 문자열 유형의 칼럼에 'X'라는 값이 들어있는 행을 1건 포함하고 있다.

2. 숫자 함수

3. 날짜 함수

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

1) Oracle에서 날짜의 연산은 숫자의 연산과 같다.

  • 1 = 1일
  • 1/24 = 1시간
  • 1/24/60 = 1분
  • 1/24/(60/10) = 1/24/6 = 10분

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 ~ 절이랑 같은 역할

  • 인수 개수가 짝수일 때 마지막 값이 DEFAULT 값이 된다.

7. GROUB BY, HAVING 절

1. GROUP BY
데이터를 그룹별로 묶는 절

  • GROUP BY 절을 통해 소그룹별 기준을 정한 후, SELECT 절에 집계 함수를 사용한다.
  • 집계 함수의 통계 정보는 NULL 값을 가진 행을 제외하고 수행한다.
  • GROUP BY ALIAS 절에서는 사용 불가

2. 집계 함수(그룹 함수)

COUNT(*)전체 로우를 카운트
COUNT(컬럼)컬럼이 NULL인 로우를 제외하고 카운트
COUNT(DISTINCT 컬럼)COUNT(컬럼)에 중복을 제거하고 카운트
- DISTINCT는 NULL도 한 행으로 본다.
SUM(컬럼)컬럼의 합계(NULL값 제외)
AVG(컬럼)컬럼의 평균(NULL값 제외)
MIN(컬럼)컬럼의 최소값(NULL값 제외)
MAX(컬럼)컬럼의 최대값(NULL값 제외)

▷COUNT, SUM, AVG : NULL을 제외하고 계산한다.

1) 주의점

  • 그룹 집계 함수로 중첩함수 ex) AVG(COUNT(*))를 사용하려면 앞의 컬럼들은 다 지워줘야한다.

왜냐하면 AVG를 사용하면 행을 1개만 반환하는데 나머지 컬럼들을 같이 조회하면 반환되는 행의 개수가 안 맞아서 에러가 발생한다.

3. HAVING
GROUP BY 절을 사용할 때 WHERE 절처럼 사용하는 조건절

  • HAVING 절에는 집계함수를 이용하여 조건 표시가 가능하다.
  • HAVING 절은 일반적으로 GROUP BY 뒤에 위치
  • 테이블 자체가 하나의 그룹이 된다면, GROUP BY가 없어도 단독으로 FROM(혹은 WHERE) 다음에 사용할 수 있다.

8. ORDER BY절

ASC : 오름차순
DESC : 내림차순

  • DEFAULT 값으로 오름차순(ASC)이 적용되며 DESC 옵션을 통해 내림차순으로 정렬이 가능하다.
  • ORDER BY 절에 컬럼명 대신 ALIAS 명이나 컬럼 순서를 나타내는 정수도 혼용 가능하다.
  • SQL 문장의 제일 마지막에 위치한다.
  • SELECT 절에서 정의하지 않은 컬럼도 사용 가능하다.
  • 순서를 변경할려면 NULLS FIRST, NULL LAST를 사용하면 된다.
  • GROUP BY 절을 사용하는 경우 ORDER BY 절에 집계 함수를 사용할 수도 있다.
  • SQL이 느려지게 만든다.

1. Oracle
NULL이 숫자들 중 가장 큰 값

  • SELECT 절에 기술되지 않는 컬럼으로도 정렬 기준으로 사용할 수 있다. Oracle은 행기반 데이터베이스라서 전체 컬럼을 메모리에 로드하기 때문이다.

2. SQL Server
NULL이 숫자들 중 가장 작은 값

9. SELECT 쿼리의 논리적 실행 순서

프웨그해셀오

SQL Server의 WITH TIES
SELECT TOP(2) WITH TIES ENAME, SAL FROM EMP ORDER BY SAL DESC;
▷ 급여가 높은 2명을 내림차순으로 출력하는데 같은 급여를 받는 사원은 같이 출력한다.

10. JOIN

두 개 이상의 테이블들을 연결 또는 결합하여 데이터를 출력하는 것

  • 일반적으로 행들은 PK와 FK 값의 연관에 의해 JOIN이 성립된다.
  • 어떤 경우에는 PK, FK 관계가 없어도 논리적인 값들의 연관만으로 JOIN이 성립가능하다.
  • SQL에서 조인은 2개 집합 간에서 1개가 발생한다. (JOIN 횟수 : 테이블 수 - 1)

1. 조인의 유형

> 2장 SQL 활용


1. STANDARD JOIN


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)

2. 집합 연산자

집합 연산자는 두 개 이상의 테이블에서 조인을 사용하지 않고, 연관된 데이터를 조회하는 방법 중 하나이다.

SELECT 절의 칼럼 수가 동일하고, 동일 위치에 존재하는 칼럼의 데이터 타입이 상호 호환이 가능해야 한다.

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

3. 계층 쿼리

테이블에 계층 구조를 이루는 컬럼이 존재할 경우 계층 쿼리를 이용해서 데이터를 출력할 수 있다.

예문)

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절 대신 사용한다.

4. 셀프 조인

FROM절에 같은 테이블이 두 번 이상 등장하기 때문에 혼란을 막기 위해 ALIAS를 반드시 표기해주어야 한다.

일반적인 경우 대-중-소를 가지고 있는데 그런 경우 셀프조인을 사용하고, 더 간단하게 하기 위해서 계층 쿼리를 이용한다.

5. 서브쿼리

하나의 SQL문 안에 포함되어 있는 또다른 SQL문

  • 서브쿼리를 괄호로 감싸서 사용한다.
  • 서브쿼리는 단일 행 또는 복수 행 비교 연산자와 함께 사용이 가능하다.
  • 단일 행 비교 연산자는 서브쿼리의 결과가 반드시 1건 이하여야 하고, 복수행 비교 연산자는 결과 건수와 상관없다.
  • 서브쿼리에서는 ORDER BY를 사용하지 못한다.
SELECT 절스칼라 서브쿼리
FROM 절인라인 뷰
WHERE 절, HAVING 절중첩 서브쿼리
ORDER BY 절

1. 스칼라 서브쿼리
주로 SELECT 절에 위치하지만 컬럼이 올 수 있는 대부분 위치에 사용할 수 있다.

  • 컬럼 대신 사용되므로 반드시 하나의 값만을 반환해야 하며 그렇지 않은 경우 에러를 발생시킨다.

2. 인라인 뷰
FROM 절 등 테이블명이 올 수 있는 위치에 사용 가능하다.

  • ORDER BY 사용이 가능하다.

3. 중첩 서브쿼리
1) WHERE절과 HAVING절에 사용가능하다.

비연관 서브쿼리메인 쿼리와 관계를 맺고 있지 않음
연관 서브쿼리메인 쿼리와 관계를 맺고 있음

2) 중첩 서브쿼리는 반환하는 데이터 형태에 따라서도 나눌 수 있다.

단일 행 서브쿼리서브쿼리가 1건 이하의 데이터를 반환
다중 행 서브쿼리서브쿼리가 여러 건의 데이터를 반환
다중 행 비교 연산자와 함께 사용
다중 컬럼 서브쿼리서브쿼리가 여러 컬럼의 데이터를 반환

a. 단일 행 서브쿼리 : 항상 1건 이하의 결과만 반환
b. 다중 행 서브쿼리 : 2건 이상의 행을 반환
c. 다중 컬럼 서브쿼리

4. 단일 행 비교 연산자
=,<,>,<>

5. 다중 행 비교 연산자
IN, ALL, ANY, SOME

  • 단일 행 서브쿼리의 비교 연산자로도 사용할 수 있다.

6. 뷰

특정 SELECT 문에 이름을 붙여서 재사용이 가능하도록 저장해놓은 오브젝트

  • 뷰는 가상테이블이다.
  • 실제 데이터를 저장하지는 않고 해당 데이터를 조회해오는 SELECT문만 가지고 있다.
독립성테이블 구조가 변경되어도 뷰를 사용하는 응용프로그램은 변경하지 않아도 된다.
편리성복잡한 질의를 뷰로 생성함으로써 관련 질의를 단순하게 작성할 수 있다.
보안성직원의 급여정보와 같이 숨기고 싶은 정보가 존재할 때 사용할 수 있다.

7. 그룹 함수

집계 함수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
특정 항목에 대한 소계를 계산하는 함수

  • 인자값으로 ROLLUP이나 CUBE를 사용할 수도 있다.
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 등과 함께 쓰이며 소계를 나타내는 행을 구분할 수 있게 해준다.

  • 원하는 위치에 원하는 텍스트를 출력할 수 있다.

8. 윈도우 함수

결과에 대한 함수 처리이기 때문에 결과 건수는 줄어들지 않는다.

  • PARTITION BY 구문이 없으면 전체 집합을 하나의 PARTITION으로 정의한 것과 동일하다.
  • 윈도우 함수 적용 범위는 PARTITION을 넘을 수 없다.

1. 순위 함수

RANK순위를 매기면서 같은 순위가 존재하면 존재하는 수만큼 다음 순위를 건너뛴다.
DENSE_RANK순위를 매기면서 같은 순위가 존재하더라도 다음 순위를 건너뛰지 않고 이어서 매긴다.
ROW_NUMBER순위를 매기면서 동일한 값이라도 각기 다른 순위를 부여한다.

2. 집계 함수

3. 행 순서 함수

4. 비율 함수

9. Top-N 쿼리

1. ROWNUM
Oracle의 ROWNUM은 슈도 컬럼(Pseudo Column)이다. 슈도는 '가짜'라는 의미

  • 실제로는 존재하지 않는 가짜 컬럼이라는 의미다.

ROWNUM은 행이 반환될 때마다 순번이 1씩 증가하기 때문에 WHERE ROWNUM = 5와 같은 건너뛰기 조건은 성립될 수 없다. ROWNUM은 항상 < 조건이나 <= 조건으로 사용해야 한다.

  • 무조건 1은 포함해서 누적되야한다.

2. 윈도우 함수의 순위 함수
ROW_NUMBER, RANK, DENSE_RANK를 이용한 Top-N 쿼리

3. Top(n)
SELECT TOP(n) 컬럼명 ▷ 해당 컬럼에서 상위 n까지의 데이터를 반환

4. with문
일종의 임시적인 뷰 테이블이다.

  • 여러 번 사용될 수록 유리하다.

10. DCL

Data Control Language
USER를 생성하고 USER에게 데이터를 컨트롤할 수 있는 권한을 부여하거나 회수하는 명령어

  • Oracle : 유저를 통해 데이터베이스에 접속을 하는 형태
  • SQL Server : 인스턴스에 접속하기 위해 로그인이라는 것을 생성하게 되며, 인스턴스 내에 존재하는 다수의 데이터베이스에 연결하여 작업하기 위해 유저를 생성한 후 로그인과 유저를 매핑해 주어야 한다.

1. USER 관련 명령어
하나의 데이터베이스는 여러 개의 USER를 가질 수 있다.

CREATE USER사용자를 생성하는 명령어
CREATE USER 권한이 있어야 수행 가능하다.
CREATE USER 사용자명 IDENTIFIED BY 패스워드;
ALTER USER사용자를 변경하는 명령어
사용자명 IDENTIFIED BY 패스워드;
DROP USER사용자를 삭제하는 명령어

2. 권한 관련 명령어
1) GRANT

  • 사용자에게 권한을 부여하는 명령어
    GRANT 권한 TO 사용자명;

2) REVOKE
REVOKE 권한 FROM 사용자명;

3. ROLE 관련 명령어
1) ROLE을 이용한 권한 부여

  • CREATE ROLE 롤명;
  • GRANT 권한 TO 롤명;
  • GRANT 롤명 TO 사용자명;

11. 절차형 SQL (PL/SQL)

SQL문의 연속적인 실행이나 조건에 따른 분기처리를 이용하여 특정 기능을 수행하는 저장 모듈을 생성할 수 있다.

1. 저장 모듈
PL/SQL 문장을 데이터베이스 서버에 저장하여 사용자와 애플리케이션 사이에서 공유할 수 있도록 만든 일종의 SQL 컴포넌트 프로그램

  • 독립적으로 실행되거나 다른 프로그램으로부터 실행될 수 있는 완전한 실행 프로그램
  • Oracle의 저장 모듈 : Procedure, User Defined Function(사용자 정의 함수), Trigger

1) 저장 모듈의 기능

  • Procedure는 SQL을 로직과 함께 데이터베이스 내에 저장해 놓은 명령문의 집합
  • 사용자 정의 함수는 단독적으로 실행되기 보다는 다른 SQL문을 통하여 호출되고 그 결과를 리턴하는 SQL의 보조적인 역할을 한다.

2. 특징
Block 구조로 되어있어 각 기능별로 모듈화 가능

  • 변수 상수 등을 선언하여 SQL 문장 간 값을 교환
  • IF, LOOP 등의 절차형 언어를 사용하여 절차적인 프로그램이 가능하도록 한다.
  • DBMS 정의 에러나 사용자 정의 에러를 정의하여 사용할 수 있다.
  • PL/SQL은 Oracle에 내장되어 있으므로 호환성이 좋다.
  • 응용 프로그램의 성능을 향상시킨다.
  • Block단위로 처리하여 통신량을 줄일 수 있다.
  • PL/SQL로 작성된 Procedure, User Defined Function, Trigger은 작성자의 기준으로 트랜젝션을 분할할 수 있고, Procedure 내에서 다른 프로시저를 호출할 경우에 호출 프로시저의 트랜젝션과는 별도로 PRAGMA AUTONOMOUS_TRANSACTION을 선언하여 자율 트랜젝션 처리를 할 수 있다.
  • PL/SQL에서는 동적 SQL 또는 DDL 문장을 실행할 때 EXECUTE IMMEDIATE를 사용해야 한다.

▽ Block 구조
|DECLARE|BEGIN~END 절에서 사용될 변수와 인수에 대한 정의 및 데이터 타입 선언부|
|:-:|:-:|
|BEGIN~END|개발자가 처리하고자 하는 SQL문과 여러 가지 비교문, 제어문을 이용 필요한 로직 처리|
|EXCEPTION|BEGIN~END 절에서 실행되는 SQL문이 실행될 때 에러가 발생하면 그 에러를 어떻게 처리할지 정의하는 예외 처리부|

3, T-SQL
근본적으로 SQL Server를 제어하는 언어

  • 표준 SQL에 약간의 기능을 추가, 보완하는 프로그래밍 기능을 갖고 있다.
    ▷ CREATE Procedure schema_NAME.Procedure_name

4. Trigger
특정한 테이블에 INSERT, UPDATE, DELETE와 같은 DML문이 수행되었을 때, 데이터베이스에서 자동으로 동작하도록 작성된 프로그램

  • 사용자 호출이 아니라 자동으로 데이터베이스에서 수행한다.
  • 데이터 무결성, 데이터 일관성을 위해 사용한다.
  • TCL을 사용할 수 없다.
  • 데이터베이스에 로그인 하는 작업에도 정의할 수 있다.

1) Procedure와 Trigger의 차이점

ProcedureTrigger
CREATE Procedure 문법 사용CREATE Trigger 문법 사용
EXECUTE 명령어로 실행생성 후 자동으로 실행
TCL 언어 사용 가능TCL 언어 사용 불가능
profile
안녕하세요

0개의 댓글