●데이터 모델링 정의
추상화 : 현실세계를 간략하게 표현한다.
단순화 : 누구나 쉽게 이해하도록 표현한다.
명확화 : 명확하게, 한 가지 의미로 해석되도록 표현한다.
●좋은 모델링의 3대 요건
중복배제
비즈니스 룰
완전성
●데이터 관점
- 비즈니스 프로세스에서 사용되는 데이터를 의미
업무가 어떤 데이터와 관련이 있으며 무슨 관계인지에 대해 모델링
구조 분석, 정적 분석
●프로세스 관점
비즈니스 프로세스에서 수행하는 작업을 의미
업무가 실제하고 있는 일은 무엇이며 어떻게 해야 하는지에 대해 모델링
시나리오 분석, 도메인 분석, 동적 분석
●데이터와 프로세스 상관 관점
프로세스와 데이터 간의 관계를 의미
업무를 처리하는 방법에 따라 어떤 영향을 받는지에 대해 모델링
crud 분석
★개념적 데이터 모델링
추상화, 업무 중심적, 포괄적, 개념적
★논리적 데이터 모델링
정규화, 재사용성, 신뢰성
★물리적 데이터 모델링
성능, 보안, 가용성
ERD의 구성 요소는 엔터티(Entity, Thing), 관계(Relationship), 속성(Attribue) 3가지이다.
●데이터 모델링의 ERD 작성 절차
엔터티를 도출하고 그린다
엔터티를 배치한다.
엔터티 간에 관계를 설정한다.
관계를 서술한다.
관계 참여도를 표현한다.
관계의 필수 여부를 표현한다.
●데이터 모델링 과정에서의 고려사항
데이터 모델의 독릭섭
정규화를 통해 중복된 데이터를 제거해야 한다.
2. 고객 요구사항의 표현
정합성을 유지하며 정보요구사항을 이해하고 정확, 간결하게 표현
3. 데이터 품질 확보
중복/비유연성/비일관성을 주의한다.
●데이터 독립성의 특징
데이터 복잡도 증가
데이터 중복 제거
사용자 요구사항 변경에 따른 대응력 향상
관리 및 유지보수 비용 절감
●스키마
외부 스키마
사용자 개개인, DB 이용자의 관점(VIEW 단계)
2. 개념 스키마
설계자 관점, 기관, 조직 전체 관점
3. 내부 스키마
개발자 관점, 저장 장치 관점
●3층 스키마와 독립성과 매핑
논리적 사상 = 외부적/개녀먹 사상 = 논리적 데이터 톡립성
물리적 사상 = 개념적/내부적 사상 = 물리적 데이터 독립성
●엔터티 특징
엔터티는 반드시 해당 업무에서 필요하고 관리하고자 하는 정보이다.
유일한 식별자에 의해 식별 가능하다.
두 개 이상의 인스턴스의 집합이다.
엔터티는 업무 프로세스에 의해 이용된다.
엔터티는 반드시 속성을 가진다.
엔터티는 다른 엔터티와 꼭 관계가 있다.
●엔터티 분류
유무형에 따른 분류
유형 엔터티(물품, 사원)
개념 엔터티(조직, 보험상품 등)
사건 엔터티(주문, 청구, 미납 등)
2. 발생 시점에 따른 분류
기본 엔터티(키 엔터티)(사원, 부서, 고객, 상품 자재 등)
중심 엔터티(계약, 사고, 청구, 주문, 매출 등)
행위 엔터티(주문 목록, 사원변경 이력 등)
(보통 행위 엔터티의 데이터 양이 가장 많다.)
●속성
속성은 해당 업무에서 필요하고 관리하고자 하는 정보
주식별자에 함수적으로 종속된다.
●속성 분류
-기본 속성 : 비즈니스 프로세스에서 도출되는 본래의속성
(이자율, 원금, 예치기간)
-설계 속성 : 데이터 모델링 과정에서 속성을 새로 만들거나 변형하여 도출된 속성
(상품코드, 지점 코드, 예금분류 등)
-파생 속성 : 다른 속성에 의해 만들어지는 속성이다.
(합계, 평균, 이자)
단일 속성
하나의 의미로 구성된 것
회원 id, 이름, 나이, 성별 등
2. 복합 속성
여러개의 의미가 있는 것
주소 등
3. 다중값 속성
속성에 여러 개의 값을 가질 수 있는 것
다중값 속성은 엔터티로 분해되므로 1차 정규화를 하거나 별도의 엔터티를 만들어 관계로 연결해야 한다.
★한 개의 엔터티는 두 개 이상의 인스턴스가, 두 개 이상의 속성을 갖는다.
★엔터티 내 하나의 인스턴스 속 한 개의 속성은 한 속성값만 가질 수 있다.
●관계
존재 관계
엔터티 간의 상태를 의미한다.
uml 클래스 다이어그램의 관계 중 연관관계이며 실선으로 표현한다.(ERD에서는 표기 구분X)
2. 행위 관계
엔터티 간에 어떤 행위가 있는 것
UML 클래스 다이어그램의 관계 중 의존관계이며 점선으로 표현한다.(ERD에서는 표기 구분X)
●관계의 표기법
관계명 : 관계의 이름
관계 차수 : 1:1, 1:M, M:N
관계선택사양 : 필수관계, 선택관계
종류
완전 1:1 관계 : 한 엔터티에 관계되는 엔터티가 하나만 있는 경우로, 반드시 존재한다.
선택적 1:1 관계 : 한 엔터티에 관계되는 엔터티가 하나거나 없을 수 있다.
2. 1:M 관계
관계에 참여하는 각각의 엔터티가 관계를 맺는 다른 엔터티에 대해 하나 이상의 관계를 맺는 것. 하지만 반대 방향은 딱 하나의 관계만 가진다.
3. M:N 관계
- 두 개 엔터티가 서로 여러 개의 관계를 가지는 것이다.
관계형DB에서 M:N 관계의 조인은 카테시안 곱이 발생한다. 그래서 두 개의 주식별자를 상속받은 관계 엔터티를 이용해 3개의 엔터티로 구분해 표현한다.(M:N 관계를 1:N, N:1로 해소)
4. 구분
필수참여관계 = 필수적 관계 : 반드시 하나는 있어야 하는 관계이며 | 로 표현한다.
선택참여관계 = 선택적 관계 : 없을 수도 있는 관계며 O 로 표현한다.
●식별자
유일성 : 주식별자에 의해 엔터티 내에 모든 인스턴스들을 유일하게 구분함
최소성 : 주식별자를 구성하는 속성의 수는 유일성을 만족하는 최소의 수가 되어야 함
불변성 : 주식별자가 한 번 특정 엔터티에 지정되면 그 식별자의 값은 변하지 않아야 함
존재성 : 주식별자가 지정되면 반드시 데이터 값이 존재(NULL 안됨)
기본키PK : 후보킹 중 엔터티를 대표할 수 있는 키
후보키 : 유일성과 최소성을 만족하는 키
수퍼키 : 유일성은 만족하지만 최소성은 만족하지 않는 키
대체키 : 여러 개의 후보키 중 기본키를 선정하고 남은 키
식별자 분류 (대표성 여부에 따른 식별자 종류)
주식별자PK : 유일성, 최소성, 대표성을 만족한다. 다른 엔터티와 참조관계로 연결될 수 있다.
보조 식별자 : 유일성, 최소성은 만족하지만 대표성을 만족하지 못해 참조관계를 연결하지 못한다.
2. 스스로 생성 여부에 따른 식별자 종류
내부 식별자 : 엔터티 내부에서 스스로 만들어지는 식별자
외부 식별자 : 다른 엔터티와의 관계로 인해 만들어지는 식별자
3. 속성의 수에 따른 식별자 종류
단일 식별자 : 하나의 속성으로 구성되는 식별자
복합 식별자 : 두 개 이상의 속성으로 구성되는 식별자
4. 대체 여부에 따른 식별자 종류
본질 식별자 : 업무에 의해 만들어지는 식별자
인조 식별자 : 유일한 값을 만들기 위해 인위적으로 만들어지는 식별자
(주민등록번호, 사원번호, 부서코드 등)
●주식별자 도출기준
1. 해당 업무에서 자주 이용되는 속성을 PK로 지정한다.
2. 명칭, 내역 등과 같이 이름으로 기술된다면 가능하면 PK로 지정하지 않는다.
특히, ‘이름’은 최악(동명이인)
3. 복합으로 주식별자를 구성할 경우 너무 많은 속성이 포함되지 않도록 새로운 인조식별자를 생성한다.
●식별자 관계로만 설정할 때의 문제점
- 조인에 참여하는 주식별자속성의 수가 많은 경우 정확하게 고인관계를 설정하지 않고, 누락하여 개발하는 경우가 생길 수도 있다.
- 식별자 관계만으로 연결된 데이터 모델은 주식별자 속성이 지속적으로 증가할 수 밖에 없는 구조로서 개발자 복잡성과 오류가능성을 유발시킬 수 있는 요인이 될 수 있다는 것이다.
●비식별자 관계로만 설정할 때의 문제점
일반적으로 각각의 엔터티에는 중요한 기준속성이 있는데 이러한 기준속성은 부모엔터티의 PK 속성으로 상속되어 자식 엔터티에 존재하는 경우가 많다.
●정규화
정규화 : 최소한의 데이터 중복, 최대한의 데이터 유연성, 데이터 일관성
데이터 중복을 제거하고 데이터 모델의 독립성을 확보한다.
정규화를 통해 업무 상 변화가 생겨도 데이터 모델의 변경을 최소화 할 수 있다.
제 1 정규화 : 속성의 원자성을 확보하며 PK를 설정
제 2 정규화 : PK가 2개 이상의 속성으로 이루어진 경우, 부분 함수 종속성을 제거
제 3 정규화 : PK를 제외한 칼럼 간 종속성 제거 = 이행 함수 종속성 제거
(엔터티의 일반속성 간에는 서로 종속되지 않는다)
BCNF : PK를 제외하고 후보키가 있는 경우, 후보키가 기본키를 종속시키면 분해한다.
●정규화의 성능
정규화는 데이터 중복성을 제거한다.
그래서 데이터 모델의 유연성을 높이고 성능 향상에 도움이 된다.
하지만 데이터 조회 SELECT 시 조인을 유발한다.
그래서 CPU, 메모리 사용량이 크다.
이런 부분은 반정규화를 적용해서 해결한다.
●반정규화
반정규화는 DB 성능 향상을 위해, 데이터 중복을 허용하고 조인을 줄이는 방법이다.
조희SELECT 속도는 향상되지만 데이터 모델의 유연성은 낮아진다.
●반정규화를 수행하는 경우
정규화에 충실하면 종속성, 활용성은 향상되지만 수행 속도가 느려지는 경우
다량의 범위를 자주 처리해야 하는 경우
특정 범위의 데이터만 자주 처리하는 경우
요약/집계 정보가 자주 요구되는 경우
반정규화 정보에 대한 재현의 적시성으로 판단
( 여러 테이블에 대해 다량의 조인이 필요한 경우, 적시성 확보를 위해 반정규화한다. )
●반정규화 절차
반정구화 대상조사 (범위처리빈도수 조사, 대량의 범위 처리 조사, 등등)
다른 방법유도 검토 (뷰 테이블, 클러스터링 적용, 인덱스의 조정 등등)
클러스터링 : 클러스터링 인덱스는 인덱스 정보를 저장할 때 물리적으로 정렬해 저장하는 방법으로, 인접 블록을 연속적으로 읽기 때문에 성능이 향상된다.
파티셔닝 : 논리적으로는 한 테이블이지만 여러 데이터 파일에 분산되어 저장하는 것.
데이터 조회 시 엑세스 범위가 줄고, 데이터가 분할되어 있어 I/O 성능이 향상된다.
-Range Partition : 데이터 값의 범위를 기준으로 하는 range 파티셔닝
List Partition : 특정 값을 지정하는 List 파티셔닝 (대용량)
Hash Partition : 해시함수를 적용하는 Hash 파티셔닝
Compoiste Partition : 범위와 해시를 복합적으로 사용하는 compoiste 파티셔닝
반정규화 적용 (테이블 반정규화, 속성의 반정규화, 관계의 반정규화)
●반정규화 기법
테이블 반정구화 : 테이블 병합/분할/추가
1:1 관계 테이블 병합 : 1:1 관계를 통합하여 성능 향상
1:M 관계 테이블 병합 : 1:M 관계를 통합하여 성능 향상
수퍼/서브 타입 테이블 병합 : 수퍼/서브(부모-자식) 관계를 통합하여 성능향상
(수퍼/서브타입 변환 방법 : 데이터 양 & 트랜잭션의 유형에 따라)
수직분할 : 칼럼 단위 테이블을 I/O 분산처리를 위해 테이블을 1:1로 분리하여 성능 향상
트랜잭션이 처리되는 유형을 파악하는 것이 선행되어야 한다.
수평분할 : 로우 단위로 집중 발생되는 트랜잭션을 분석해 I/O 및 데이터 접근성의 효율성을 높여 성능을 향상하기 위해 특정 값에 따라 로우 단위로 테이블을 쪼갠다.
●테이블 추가 방법
중복 테이블 추가 : 다른 업무거나 서버가 다른 경우 돌일 테이블 구조를 중복하여 원격 조인을 제거하여 성능을 향상
통계 테이블 추가 : SUM, AVG 등을 미리 수행하여 계산해 둠으로써 조회 시 성능을 향상
이력 테이블 추가 : 이력 테이블 중 마스터 테이블에 존재하는 레코드를 중복하여 성능 향상
부분 테이블 추가 : 한 테이블의 전체 칼럼 중 자주 이용하는 집중화된 칼럼들의 I/O를 줄이기 위해 해당 칼럼을 모아놓은 별도의 테이블을 생성
●칼럼 반정규화
중복 칼럼 추가 : 조인을 감소시키기 위해 칼럼 중복하기
파생 칼럼 추가 : 계산에 의해 발생되는 성능 저하를 예방하기 위해 미리 값을 계산한 칼럼 추가
이력 테이블 칼럼 추가 : 불특정 조회로 인한 성능 저하 예방을 위해 이력 테이블에 기능성 칼럼(최근 값 여부, 시작과 종료일자 등) 추가
PK에 의한 칼럼 추가 : 단일 PK 내에서 특정 값을 조회하는 경우 생기는 성능 저하를 예방하기 위해 이미 존재하는 PK 데이터를 일반 속성으로 포함하는 칼럼을 추가
응용 시스템 오작동을 위한 칼럼 추가 : 업무적으로는 의미가 없지만 사용자의 잘못된 데이터 처리로 원래 값 복구를 원하는 경우, 이전 데이터를 임시적으로 중복하여 보관하는 칼럼 추가
●관계 반정규화
중복 관계 추가 : 데이터 처리를 위한 여러 조인이 발생시키는 성능 저하 예방을 위해 추가적인 관계를 맺는 것
●로우 체이닝
로우에 데이터가 INSERT 후 DELETE 되어 항 행이 삭제되고 해당 블록에 빈 공간이 생겼을 때 새로운 데가 입력된다고 가정하자.
새로운 데이터가 입력될 때 처음에 빈 공간이 있는 블록에 입력되고 그 공간이 부족할 대 새로운 블록에 나머지 데이터를 입력하는 것을 로우체이닝이라고 한다.
로우 길이가 너무 길어서 데이터 블록 하나에 데이터가 모두 저장되지 않고, 두 개 이상의 블록에 걸쳐 한 로우가 저장되어 있는 형태이다.
●로우 마이그레이션
행에 입력될 수 있는 데이터 영역에 데이터가 모두 입력되어 저장 공간이 부족한 경우에서 기존 데이터의 변경 작업이 일어난다고 가정하자.
변경 작업에 의해 공간이 더 필요한데 저장 공간이 없을 경우 새로운 블록으로 이동시켜 변경 작업을 수행하는 것이 로우마이그레이션이다.
데이터 블록에서 수정이 발생하면 수정된 데이터를 해당 데이터 블록에 저장하지 못하고 다른 블록의 빈 공간을 찾아 저장하는 방식이다.
간단하게 요약하자면
로우 체이닝은 : 데이터를 입력할 수 있는 공간이 부족할 때 새로운 블록에 나머지 데이터를 추가 입력
로우 마이크레이션 : 데이터를 입력할 수 있는 공간이 부족할 때 그 공간 자체를 더 넓은 새로운 공간으로 이동시켜 데이터 변경 작업을 수행하는 것
●분상 DB의 투명성
분할 투명성 : 고객은 하나의 논리적 릴레이션이 여러 단편으로 분할되어 각 단편의 사본이 여러 시스템에 저장되어 있음을 인식할 필요가 없다.
위치 투명성 : 고객이 사용하려는 데이터 저장장소를 명시할 필요가 없으며 고객은 데이터가 어디 있든 동일한 방법으로 데이터 접근이 가능해야 한다.
지역 사상 투명성 :
중복 투명성 : DB 객체가 여러 시스템에 중복되어 존재해도 고객과는 무관하게 데이터 일관성이 유지된다.
장애 투명성 : DB가 분산된 각 지역의 시스템이나 통신망에 이상이 생겨도 데이터 무결성은 보장된다.
병행 투명성 : 여러 고객의 응용 프로그램이 동시에 분산 DB에 대한 트랜잭션을 수행해도 결과에 이상이 없다.
●분산 DB의 장단점
장점
신뢰성/가용성/효용성/융통성 UP
병렬 처리 수행 -> 빠른 응답, 통신 비용은 LOW
시스템 용량 확장 EASY
각 지역 사용자들의 요구 수용 빠름
단점
설계/관리 복잡, 비용 HIGH
데이터 무결성에 대한 위협
보안 관리/통제 어렵고 오류의 잠재성이 큼
응답 속도 불규칙
●계층형 db : 트리형 형태로 데이터 저장
●네트워크형 db : 오너와 맴버 형태로 데이터 저장
-집합 연산-
합집합(union) : 두 릴레이션을 하나로 결합
차집합(diference) : 본래 릴레이션에는 존재하고 다른 릴레이션에는 존재하지 않는 것을 조회
교집합(intersection) : 두 릴레이션 간 공통된 것을 조회
곱집합(cartesian product) : 각 릴레이션에 존재하는 모든 데이터를 조합하여 연산
-관계 연산-
선택 연산(selection) : 릴레이션에서 조건에 맞는 행만을 조회
투영 연산(projection) : 릴레이션에서 조건에 맞는 속성만을 조회
결합 연산(join) : 여러 릴레이션의 공통된 속성을 사용해 새로운 릴레이션을 만듦
나누기 연산(division) : 기준 릴레이션에서 나누는 릴레이션이 가진 속성과 동일한 값을 가지는 행을 추출하고 나누는 릴레이션의 속성을 삭제한 후 중복된 행을 제거
●데이터는 관계형 데이터베이스의 기본 단위인 테이블의 형태로 저장된다.
●기본키PK는 한 테이블에서 유일성(Unique)과 최소성(NOT NULL)을 만족하면서 해당 테이블을 대표한다.
-primary key는 절대로 null이면 안된다.
●SQL 실행 순서
-파싱(Parsing)->실행(execution)->인출(fetch)
행 = 튜플(관계형 DB) = 레코드(관계형 DB)
열 = 속성(관계형 DB)
도메인 = DB에서 필드에 채워질 수 있는 값의 집합니다.
●파싱
-소프트 파싱
sql 파싱 정보를 저장하는 라이브러리 캐시에서 파싱된 정보를 찾을 수 있는 겨우
2. 파싱 단계를 거치지 않고 바로 실행 단계로 넘어감
3. 효율성이 높음
-하드 파싱
라이브러리 캐시에서 sql문 파싱 정보를 찾을 수 없는 경우
2. 파싱 후 실행 단계로 넘어감
3. 처음 하드 파싱 후 변수의 값만 다른 select문은 소프트 파싱된다.
DDL : CREATE, DROP, RENAME, ALTER
DML : UPDATE, INSERT, DELETE, SELECT
DCL : GRANT, REVOKE, TRUNCATE
TCL : COMMIT, ROLLBACK, SAVEPOINT
●SQL과 오라클의 COMMIT 여부 추후 정리 예정
●작업 순서
DCL(권한 부여) -> DDL(데이터 구조 정의) -> DML(데이터 조회 등)
●트랜잭션의 특성
-원자성(atomicity) : 트랜잭션의 처리가 완전히 끝나지 않았을 때 전혀 이루어지지 않은 것과 같아야 한다.
-일관성(consistency) : 트랜잭션 실행 결과로 db 상태에 모순이 없고, 실행 후에도 일관성이 유지되어야 한다.
-고립성(isolation) : 트랜잭션 실행 중 생성하는 연산의 중간 결과는 다른 트랜잭션이 접근 할 수 없다. (부분적인 실행 결과를 다른 트랜잭션이 볼 수 없다.)
-영속성(durability) : 트랜잭션이 그 실행을 성공적으로 완료하면 그 결과는 영구적으로 보장되어야 한다.
●SELECT 문장을 통한 테이블 생성, CTAS
CTAS 구문
-CREATE TABLE 테이블 명 AS SELECT 칼럼명 FROM 복사할 테이블명;
장점 : 칼럼별로 데이터 유형을 다시 재정의 하지 않아도 된다.
단점 : 기존 테이블의 제약조건 중에 NOT NULL만 새로운 복제 테이블에 적용되고 PK, FK, 고유키, CHECK 등의 다른 제약 조건은 없어진다.
●테이블 구조 확인
-desc 테이블명;
●constraint 제약조건 사용
-데이터 무결성을 위한 방법으로, 테이블의 특정 칼럼에 설정하는 제약이다.
-테이블을 생성할 때 제약조건을 반드시 기술 할 필요는 없지만 이후 alter table을 이용해서 추가, 수정하는 경우 데이터가 이미 입력된 상태라면 처리 과정이 쉽지 않아서 초기 테이블 생성 시점부터 적합한 제약 조건에 대한 검토가 필요하다.
-칼럼명 앞에 constraint를 입력하여 제약조건을 설정한다.
예) constraint d_fk foreign key (deptno)
references dept (deptno)
on delete CASCADE
-primary key(기본 키)
1. 기본키 정의
2. 한 테이블에 하나만 존재
3. 절대 null이면 안됨
-Unique key(고유 키)
고유 키 정의
null값을 가진 행이 여러개 있어도 고유키 제약 위반 안됨
-NOT NULL
NULL 값의 입력을 금지.
디폴트 상태에서 모든 칼럼을 NULL을 허가하고 있지만, 이 제약을 지정함으로써 해당 칼럼은 입력 필수가 된다.
-CHECK
입력할 수 있는 값의 범위 등을 제한한다.
CHECK 제약으로 TRUE or FALSE로 평가할 수 있는 논리식을 지정한다.
-Foreign key(외래 키)
테이블간의 관계를 정의하기 위함
외래키 지정시 참조 무결성 제약 옵션을 선택 할 수 있다.
●테이블 생성 시에 cascade 사용하기
-cascade 옵션은 참조 관계(pk, fk 관계)가 있을 경우 참조되는 데이터도 자동으로 삭제할 수 있는 것이다.
예) 컬럼 앞에 ‘on delete cascade’를 입력하여 사용할 수 있다.
●테이블 명 변경
alter table 테이블명 rename to 새로운 테이블명;
●칼럼 추가
alter table 테이블명 add (컬럼명 데이터 유형);
●칼럼 변경
alter table 테이블명 modify (컬럼명 데이터 유형);
-sql server인 경우
alter table 테이블명 alter column (컬러명 데이터 유형);
참고 : alter table ~ alter column은 여러 칼럼 동시 수정 x
예) alter table emp alter column (분류명 varchar(30) not null, 등록일자 date not null); <- 이거 안됨.. 따로 따로 구문 나누어서 작성해야 함.
●칼럼 삭제
alter table 테이블명 drop column 삭제할 컬럼명;
●컬럼명 변경
alter table 테이븖명 rename column 컬럼명 to 새 컬럼명;
●제약 조건 추가
alter table 테이블명 add constraint 제약조건명 primary key (컬럼명);
●제약 조건 삭제
alter table 테이블명 drop constraint 제약조건명;
●테이블 삭제
drop table 테이블명;
●cascade constraint
-constraint 옵션은 해당 테이블과 관계가 있던 참조되는 제약조건에 대해서도 삭제한다는 것을 의미한다.
drop table 테이블명 cascade constraint;
●truncate table은 테이블 자체가 삭제되는 것이 아니고, 해당 테이블에 들어있던 모든 행들이 제거되고 저장 공간을 재사용 가능하도록 해제한다.
-빠른 삭제를 위해 로그도 기록하지 않는다.
●뷰(view)
-뷰란 테이블로부터 유도된 가상의 테이블이다.
뷰 생성
create view 뷰명 as select 칼럼명 from 참조할테이블명;
뷰 조회
select 칼럼명 from 뷰명;
뷰 삭제
drop view 뷰명;
뷰 특징
참조한 테이블이 변경되면 뷰도 변경된다.
뷰에 대한 입력/수정/삭제에는 제약이 있다.
뷰는 특정 칼럼만 조회하므로 보안성을 향상시킨다.
한 번 생성된 뷰는 변경이 불가능하다. (변경을 원하면 삭제 후 재생성해야 한다.)
●뷰의 장 단점
-장점-
보안
데이터 관리와 select문이 간단해짐
한 테이블에 여러 뷰를 생성 가능
-단점-
독자적 인덱스를 만들 수 없음
삽입/수정/삭제 연산에 제약이 있음
데이터 구조 변경 불가능
●Nologging 옵션 (insert 문)
db에 데이터를 입력하면 로그파일에 그 정보를 기록한다.
check point라는 이벤트가 발생하면 로그파일 데이터를 데이터 파일에 저장한다.
nologging 옵션은 로그파일의 기록을 최소화시켜 입력 시 성능을 향상시키는 방법으로 buffer cache라는 메모리 영역을 생략하고 기록한다.
insert문에만 효과가 있다.
-delete와 update에서는 지원되지 않는다.
●테이블 1의 특정 칼럼을 테이블 2에 입력하기
insert into 테이블2 select 칼럼명 from 테이블1;
●테이블 1의모든 데이터를 테이블 2에 입력하기
insert into 테이블2 select * from 테이블1;
사용방법
alter table 테이블명 nologging;
●update문
-update문은 원하는 조건으로 검색해서 해당 데이터를 수정하는 것
-update문에 조건문을 입력하지 않으면 모든 데이터가 수정되므로 유의
-사용법-
update 테이블명 set 수정할칼러면 = ‘새로운값‘ where 조건;
●delete문
-delete문은 원하는 조건을 검색해서 해당되는 행을 삭제한다.
-사용법-
-테이블 내 행 삭제
delete from 테이블명 where 조건;
-테이블 삭제
delete table 삭제할 테이블명;
delete from 삭제할 테이블명; <-이게 맞는거 같은디??..
●select 문
-select문 예제
select * from emp where 사번 = ‘10’;
|| <- 문자 결합 기호
예) select a || ‘맛’ from emp;
a칼럼 뒤에 맛 이라는 문자를 결합하여 ‘a맛’ 이라는 형태로 출력한다.
●distinct
distinct 옵션은 칼럼명 앞에 지정하여 중복된 데이터를 한 번만 조회하게 한다.
-모든 조인을 다 실행한 다음에 중복을 제거하기 때문에 효율적이지 않다.
예) select distinct 칼럼명 from emp where = ‘조건’;
●alias
조회된 결과에 일종의 별명을 부여해서 칼럼명/테이블 명을 변경할 수 있다.
예) select 칼럼명 as [별칭] from 테이블명 where 조건;
●order by
order by는 데이터를 오름차순(asc) 또는 내림차순(desc)로 출력 직전에 정렬한다.
-기본 값은 오름차순(asc) 내림차순으로 정렬하고 싶을 때는 가장 마지막에 desc를 붙이면 된다.
-order by는 정렬하므로 db 메모리를 많이 사용하여 성능 저하가 발생한다.
예) select * from emp order by 컬럼명 desc;
●index를 사용한 정렬 회피
-정렬은 db에 부하를 주기 때문에 인덱스(기본키)를 사용해 회피할 수 있다.
-기본키를 지정하면 자동으로 기본키에 대한 오름차순 인덱스가 생성된다.
-내림차순으로 출력하고 싶다면 힌트의 개념을 사용한다.
select 칼럼명 /*+INDEX_DESC(테이블명)*/FROM 테이블명;
위처럼 힌트를 사용한 select 문을 실행하면 pk에 대해 내림차순으로 출력된다.
●문자 유형
- char
고정된 길이
서로 다른 문자가 나올 때까지 비교한다.
길이가 서로 다른 char형 타입이면 작은 쪽에 space를 추가하여 길이를 같게 한 후에 비교한다.
달라진 첫 번째 문자의 값에 따라 크기를 결정한다.
blank의 수만 다르다면 서로 같은 값으로 결정한다.
varchar
서로 다른 문자가 나올 때까지 비교한다.
길이가 다르다면 짧은 것이 끝날 때까지만 비교한 후에 길이가 긴 것이 크다고 판단한다.
길이가 같고 다른 것이 없다면 같다고 판단한다.
varchar은 not null까지 길이를 말한다.
●LIKE문
-LIKE문은 와일드 카드를 사용해서 데이터를 조회할 수 있다.
-LIKE문 뒤에 와일드카드를 사용하지 않으면 =와 같다.
% : 어떤 문자를 포함한 모든 것을 조회한다.
ex. %es%는 문자 중간에 es가 포함된 모든 문자를 조회한다.
_ : 한 개인 단일 문자를 의미한다.
ex. ‘name_’은 ‘name’으로 시작하고 그 뒤에 한 글자만 더 붙는 것을 조회한다.
* : all 모든 것을 의미한다.
●Between
Between문은 지정된 범위에 있는 값을 조회한다.
select * from emp where 컬럼명 between a and b;
예를 들어
select * from emp where sal between 1000 and 2000;
하면
emp 테이블에서 sal(급여)이 1000에서 2000 사이인 직원을 조회한다.
이 때 1000과 2000도 포함한다.
즉 1000<= sal <= 2000 이다.
반대로 1000과 2000 사이가 아닌 것을 조회하고 싶다면 between 앞에 not를 붙인다.
●IN
IN문은 ‘OR’의 의미를 가지고 있어서 한 조건만 만족해도 조회가 가능하다.
select * from emp where job in (‘check’, ‘manager’);
라면 job이 check나 manager 행을 조회한다.
in조건에 여러 개의 칼럼을 사용할 수도 있다.
select * from emp where (job, ename) in ((‘clerk’, ‘sales’), (‘aaa’, ‘bbb’));
라면 job이 clerk이거나 sales이면 ename에서 aaa나 bbb 행을 조회한다.
●NULL 값 조회하기
select * from emp where job is null;
select * from emp where job is not null;
-null 함수
nvl() : nvl(mgr, 0) : mgr 칼럼이 null이면 0으로 바꾼다.
nvl2() : nvl2(mgr, 1, 0) : mgr 칼럼이 null이 아니면 1을 null이면 0을 반환한다.
nullif() : nullif(n1, n2) : n1와 n2가 같으면 null을 같지 않으면 n1을 반환한다.
coalesce() : coalesce(mgr, 1...) : mgr이 null이 아니면 mgr을 리턴 mgr이 null이면 컬럼 2를 리턴 한다.
●group by문
-group by는 테이블에서 행을 소규모 그룹화하여 합계, 평균, 최대, 최소 등을 계산할 수 있다.
-having 절에 조건문을 사용한다.
(having은 group by 없어도 사용 가능하다.)
-order by절도 사용할 수 있다.
select dpt_id, sum(sal) from emp group by dpt_id;
-> 부서 아이디(dpt_id) 별 직원들의 월급(sal) 합계이다.
만약 부서 아이디가 10, 11, 12, 13인 직원들의 월급 합계를 조회한다면 아래와 같다.
select dpt_id, sum(sal) from emp where dpt_id between 10 and 13 group by dpt_id;
●having문 사용
-group by 문에 조건절을 사용할려면 having문을 사용해야 한다.
-만약 where 절에 조건문을 사용하게 된다면, group by 대상에서 제외된다.
select dpt_id, sum(sal) from emp group by dpt_id having sum(sal) > 30000;
->위의 예시에서는 부서아이디(dpt_id) 별 직원들의 월급(sal) 합계를 출력하지만, having문의 조건으로 인해 월급 합계가 30000을 넘는 행들만 조회한다.
●집계함수
count() : 행수를 조회한다.
-count(*) : null 행 포함해서 계산
-count(칼럼) : null값을 제외한 행 수 계산
sum() : 합계 계산
avg() : 평균을 계산
max()와 min() : 최대값/최소값을 계산
stddev() : 표준편차를 계산
varian() : 분산을 계산
중요 : 집계함수는 기본적으로 null을 포함하지 않음 count(*)는 포함
중요 : count(*) 함수는 조건절이 거짓일 때 0을 반환한다.
●문장 수행 단계
from-where-group by-having-select-order by
●명시적esxplicit 형변환과 암시적 implicit 형변환
-인덱스 칼럼에 형변환을 수행한다면 인덱스를 사용하지 못한다.
●형변환 함수
TO_NUMBER(문자열) : 문자열을 숫자로 변환
T0_CHAR(숫자/날짜, [FORMAT]) : 숫자/문자를 지정된 FORMAT의 문자로 변환
TO_DATE(문자열, FORMAT) : 문자열을 지정된 FORMAT의 날짜형으로 변환
●내장형 함수
-모든 DB는 SQL에서 사용할 수 있는 내장형 함수를 가진다.
-dual 테이블은 oracle db에 의해 자동으로 생성되는 테이블이다.
-oracle db 사용자가 임시로 사용할 수 있는 테이블로, 내장형 함수를 실행할 때도 사용할 수 있다.
-oracle db의 모든 사용자가 사용할 수 있다.
-oracle은 기본적으로 dual 테이블이라는 dummy 테이블이 존재한다.
●문자형 함수
SUBSTR(문자열, m, n) : 문자열 m번째 위치부터 n개를 자름
CONCAT(문자열1, 문자열2) : 문자열1과 문자열2를 결합(||)
LOWER(문자열) : 영문자를 소문자로 변환
UPPER(문자열) : 영문자를 대문자로 변환
LENGTH(문자열) or LEN(문자열) : 공백을 포함한 문자열의 길이를 알려줌
LTRIM(문자열, 지정문자) : 왼쪽에 지정된 문자를 삭제 (지정문자를 생략하면 공백을 삭제)
RTRIM(문자열, 지정문자) : 오른쪽에 지정된 문자를 삭제 (지정문자를 생략하면 공백을 삭제)
TRIM(문자열, 지정된 문자) : 양쪽에 지정된 문자를 삭제 (지정문자를 생략하면 공백을 삭제함)
●날짜형 함수
SYSDATE : 오늘의 날짜를 날짜 타입으로 알려줌
EXTRACT(‘YEAR’ | ‘MONTH’ | ‘DAY’ from d) : 날짜에서 년, 월, 일을 조회
●숫자형 함수
ABS(숫자) : 절대값 반환
SIGN(숫자) : 양수(1), 음수(-1), 0(0)
MOD(숫자1, 숫자2) : 숫자1을 숫자2로 나눈 나머지를 계산 (%)
CEIL(숫자) : 숫자보다 크거나 같은 최소의 정수를 반환
FLOOR(숫자) : 숫자보다 작거나 같은 최대의 정수를 반환
ROUND(숫자, m) : 숫자를 소수점 m자리까지 반올림하고, 출력한다 기본값 : 0
TRUNC(숫자, m) : 숫자를 소수점 m자리에서 버림
●DECODE문으로 IF문을 구현할 수 있다. 즉 특정 조건이 참이면 A, 거짓이면 B로 응답한다.
SELECT DECODE(DPT_ID, 23, ‘TRUE’, ‘FALSE’) FROM EMP;
위의 SQL 쿼리에서 DPT_ID가 23이면 TRUE를 응답하고 그렇지 않으면 FALSE를 응답한다.
●CASE문
CASE문은 IF – THEN ELSE-END 구문을 사용해 조건문으로 사용한다.
SELECT CASE
WHEN DPT_ID = 23 THEN ‘GROUP A’
WHEN DPT_ID = 24 THEN ‘GROUP B’
ELSE
‘GROUP C’
FROM EMP;
<- DPT_ID가 23이면 GROUP A를 24명 GROUP B를 그렇지 않으면 GROUP C를 출력한다.
●ROWNUM
-ROWNUM은 SELECT문의 결과에 대해 논리적인 일렬번호를 부여한다.
●ROWID
-모든 테이블은 ROWID를 가진다
-ROWID는 ORACLE DB 내에서 데이터를 구분할 수 있는 유일한 값이다.
SELECT ROWID FROM 테이블명;
●WITH 구문
-WITH 구문은 서브쿼리를 사용해 임시 테이블이라 뷰처럼 사용할 수 있다.
(뷰라고 생각하면 됨)
WITH 임시테이블 AS (SELECT 칼럼명 FROM 테이블명)
SELECT * FROM 임시테이블명
●GRANT
-GRANT문은 DB 사용자에게 권한을 부여한다.
구조
GRANT 권한 ON 테이블명 TO 사용자;
WITH GRANT OPTION : 특정 사용자에게 권한을 부여할 수 있는 권한
WITH ADMIN OPTION : 테이블에 대한 모든 권한 부여
●REVOKE
-REVOKE문은 DB 사용자에게 부여된 권한을 회수한다.
구문
REVOKE 권한 ON 테이블명 FROM 사용자;
추가 정리할 것 : role
●TCL(COMMIT, AUTO COMMIT, ROLLBACK, SAVEPOINT)개념은 쉬어서 생략
●등가조인
-조인은 여러 개의 릴레이션을 사용해 새로운 릴레이션을 만드는 과정이다.
-두 테이블 간 일치하는 것을 조인한다.
-HASH 조인은 등가조인에서만 사용 가능하다.
SELECT * FROM EMP, DPT WHERE EMP.NO = DPT.NO;
=로 두 개의 테이블을 연결한다.
SELECT * FROM OEMP, DPT WHERE EMP.NO = DPT.NO AND EMP.NAME LIKE ‘강%’ ORDER BY NAME;
<=조인문에 추가 조건이나 정렬문도 사용할 수 있다.
●INNER JOIN
INNER JOIN은 ‘ON구’를 사용해 테이블을 연결한다.
SELECT * FROM EMP INNER JOIN DPT ON EMP.NO = DPT.NO;
이렇게 INNER JOIN구에 두 테이블 명을 서술하고 ON구를 사용해 조인 조건을 넣는다.
●INTERSECT 연산
-INTERSECT 연산은 두 테이블에서 교집합을 조회한다.
(즉 두 테이블에서 공통된 값을 조회한다.)
●비등가 조인
-비등가 조인은 두 개의 테이블 간 조인하는 경우 =을 사용하지 않고 > < >= <=등을 사용한다.
●OUTER JOIN
-OUTER JOIN은 두 테이블 간 교집합을 조회하고 한 쪽 테이블에만 있는 데이터도 포함시켜서 조회한다.
오라클에서는 (+) 기호를 사용해서 할 수 있다.
SELECT * FROM DPT, EMP WHERE EMP.NO (+)= DPT.NO;
●LEFT OUTER JOIN
-LEFT OUTER JOIN은 두 개의 테이블에서 같은 것과, 왼쪽 테이블에만 있는 것을 포함해서 조회한다.
SELECT * FROM DPT LEFT OUTER JOIN EMP ON EMP.NO = DPT.NO;
●RIGHT OUTER JOIN
-RIGHT OUTER JOIN은 두 테이블에서 같은 것과, 오른쪽 테이블에만 있는 것을 포함해서 조회한다.
SELECT * FROM DPT RIGHT OUTER JOIN EMP ON EMP.NO = DPT.NO;
●CROSS JOIN
-CROSS JOIN은 조인 조건 구 없이 2개의 테이블을 하나로 조인한다.
-조인구가 없어서 카테시안 곱이 발생한다.
-FROM절에 CROSS JOIN구를 사용하면 된다.
-만약 행이 14개 있는 테이블과 행이 4개 있는 테이블을 조인하면 총 56개의 행이 조회된다.
SELECT * FROM EMP CROSS JOIN DPT;
●UNION(합집합)
-UNION 연산은 두 테이블을 하나로 만든다.
-주의사항은 두 테이블의 칼럼수, 칼럼의 데이터 형식 모두가 일치해야 한다.
(그렇지 않으면 오류)
-두 테이블을 하나로 합치면서 중복된 데이터를 제거한다.
(정렬(SORT) 과정을 발생시킨다.)
-UNION ALL도 두 테이블을 하나로 합친다. 하지만 중복을 제거하거나 정렬을 유발하지는 않는다.
●MINUS(차집합)
-차집합 조회
-먼저 쓴 SELECT문에는 있고 뒤에 쓰는 SELECT문에는 없는 집합을 조회한다.
●계층형 조회 connect by
트리 형태의 구조로 쿼리를 실행한다.
start with구는 시작 조건을, connect by prior는 조인 조건을 의미한다.
(프자부순 prior 자식 = 부모 = 순방향 전개 즉 부모노드에서 자식노드로 가는 것이 순방향)
이렇게 루트 노드부터 하위 노드의 질의를 실행한다.
최대 계층의 수를 구하는 함수 : MAX(LEVEL): LEVEL은 계층값으로 루트가 1이다.
-계층형 조회 결과를 명확히 보기 위해 LPAD()를 사용할 수 있다.
EX
LPAD(‘’, 4) : 왼쪽 공뱅 4칸을 화면에 찍어 트리 형태처럼 출력한다.
LEVEL : 검색 항목의 깊이. 계층 구조에서 가장 상위 레벨은 1이다.
CONNECT_BY_ROOT : 계층 구조의 최상위 값을 표시
CONNECT_BY_ISLEAF : 계층 구조의 최하위 값을 표시
SYS_CONNECT_BY_PATH : 계층 구조의 전체 전개 경로 표시
NOCYCLE : 순환구조가 발생지점까지만 전개되는 것
CONNECT_BY_LSCYCLE : 순환 구조 발생 지점을 표시
●서브쿼리
-FROM구에 SELECT문을 사용하는 인라인 뷰
-SELECT문에 서브쿼리를 사용하는 스칼라 서브쿼리
-WHERE구에 SELECT문을 사용하는 서브쿼리
●단일행 서브쿼리 (스칼라 서브쿼리)
-반환하는 행 1개
-비교 연산자(=, <, <=, >=> <>) 사용
●다중 행 서브쿼리
-반환하는 행이 여러 개
-다중 행 비교 연산자인 IN, ANY, ALL, EXISTS 사용
IN(서브쿼리) : 메인쿼리의 비교 조건이 서브쿼리의 결과 중 하나만 동일하면 참(OR)
ALL(서브쿼리) : 메인쿼리와 서브쿼리의 결과가 모두 동일하면 참
< ALL : 최소값 반환
> ALL : 최대값 반환
ANY(서브쿼리) : 메인 쿼리의 비교 조건이 서브쿼리의 결과 중 하나 이상 동일하면 참
- < ANY : 하나라도 크면 참
> ANY : 하나라도 작으면 참
EXISTS(서브쿼리) : 메인쿼리와 서브쿼리의 결과가 하나라도 존재하면 참
●그룹 합수(group function)
-rollup : rollup은 group by의 칼럼(순서 상관 있음)에 대해 부분합 subtotal을 만들어 준다.
(예를 들어 소계/합계 등이 계산되면 grouping 함수는 0을 반환하고 그렇지 않으면 1을 반환해서 합계 값을 식별할 수 있다.
-grouping 함수에서 사용될 컬럼은 반드시 group by 절에서 명시되어야 한다.
-grouping sets : group by에 나오는 칼럼의 순서와 관계없이 개별적으로 처리하여, 다양한 소계를 만들 수 있다.
-cube : 제시한 컬럼에 대해 결합 가능한 모든 집계(합의 경우의 수)를 계산한다.
●윈도우 함수(window function)
-함수 구조 생략...(뭔 소린지 이해 안됨..z)
-순위 함수
RANK : 동일한 순위는 동일한 값
DENSE_RANK : 동일한 순위를 하나의 건수
ROW_NUMBER : 동일한 순위에 대해 고유의 순위
-행 순서 관련 함수
FRIST_VALUE : 파티션에서 가장 처음에 나오는 값을 구한다 = MIN()
LAST_VALUE : 파티션에서 가장 나중에 나오는 값을 구한다 = MAX()
LAG : 이전 행을 가지고 온다.
LEAD : 윈도우에서 특정 위치의 행을 가지고 온다.(기본값 : 1)
-비율 관련 함수
CUME_DIST : 파티션 전체 건수에서 현재 행보다 작거나 같은 건수에 대한 누적 백분율을 조회 (누적 분포상에 위치를 0~1 사이의 값을 가짐)
PERCENT_RANK : 행의 순서별 백분율을 조회
NTILE : 파티션별 전체 건수를 인자 값으로 N등분한 결과를 조회
(예 NTLIE(4) OVER(ORDER BY SAL DESC) AS N_TILE : 급여가 높은 순으로 4개로 등분한다.)
RATIO_TO_REPORT : 파티션 내 전체 SUM(칼럼)에 대한 행 별 갈럼 값의 백분율을 소수점까지 조회
●파티션의 기능
1. 파티션은 대용량의 테이블을 여러 개의 데이터 파일에 분리해서 저장한다.
-데이터가 물리적으로 분리된 데이터 파일에 저장되면 입력/수정/삭제/조회의 성능이 향상된다.
-데이터 조회 시 데이터의 범위를 줄여서 성능을 향상시킨다.
2. 파티션은 각각의 파티션 별로 독립적으로 관리될 수 있다.
즉, 파티션 별 백업/복구가 가능하면 파티션 전용 생성도 가능하다.
Range Partition : 테이블의 칼럼 중 값의 범위를 기준으로 데이터를 나누어 저장한다. 대상 테이블이 날짜/숫자값으로 분리가 가능
List Partition : 특정 값을 기준으로 테이블을 분할한다. 대용량의 데이터를 특정 값에 따라 분리
Hash Partition : dbms가 내부적으로 해시함수를 사용해 테이블을 분할한다. 성능 향상, 설계자는 테이블에 데이터가 정확하게 어떻게 들어가는지 알 수 없다.
Compsite Partition : 여러 개의 파티션 기법을 조합해서 사용하는 것이다.
-파티션은 4가지 유형이 있다.
Global Index : 여러 개의 파티션에서 한 개의 사용
Local Index : 해당 파티션 별 각자의 사용
Prefixed Index : 파티션 키와 키가 동일
Non Prefixed Index : 파티션 키와 키가 다름
●PL/SQL 특징
PL/SQL은 BLOCK 구조로 되어있어 각 기능별로 모듈화가 가능하다.
변수, 상수 등을 선언하여 SQL 문장 간 값을 교환한다.
IF, LOOP 등의 절차형 언어를 사용하여 절차적인 프로그램이 가능하도록 한다.
DBMS 정의 에러나 사용자 정의 에러를 정의하여 사용할 수 있다.
PL/SQL은 Oracle에 내장되어 있으므로 Oracle과 PL/SQL을 지원하는 어떤 서버로도 프로그램을 옮길 수 있다.
PL/SQL은 응용 프로그램의 성능을 향상시킨다.
PL/SQL은 여러 SQL 문장을 BLOCK으로 묶고 한번에 BLOCK 전부를 서버로 보내기 때문에 통신량을 줄일 수 있다.
문제 보기
-변수와 상수 등을 사용하여 일반 SQL 문장을 실행할 때 WHERE절의 조건 등으로 대입할 수 있다.
-procedure, user defined function, trigger 객체를 PL/SQL로 작성 할 수 있다.
-procedure 내부에 작성된 절차적 코드는 PL/SQL엔진이 처리하고 일반적인 SQL 문장은 SQL 실행기가 처리한다.
-PL/SQL문의 기본 구조로 DECLARE와 BEGIN ~ END 문은 필수지만, EXCEPTION 문은 선택사항이다.
●트리거에 대한 설명
-Trigger는 데이터베이스에 의해서 자동으로 호출되고 수행된다.
-Trigger는 특정 테이블에 대해서 insert, update, delete 문이 수행되었을 때 호출되도록 정의할 수 있다.
-Trigger는 데이터베이스에 로그인하는 작업에도 정의할 수 있다.
-commit, rollback과 같은 TCL 실행 안됨.
●프로시저와 트리거 차이점
프로시저
-CREATE PROCEDURE 문법사용
-EXECUTE 명령어로 실행
-COMMIT, ROLLBACK 실행 가능
트리거
-CREATE TRIGGER 문법 사용
-생성 후 자동으로 실행
-COMMIT, ROLLBACK 실행 안됨
●최적화 부분 이번 해 지양해서 낸다고 함..
이것만 알아두자
-인덱스 생성
create index 인덱스명 on 테이블명(컬럼);
Nested Loop join : 랜덤 엑세스로 조회
sort merge join : sort merge 조인은 두 개의 테이블을 sort_area라는 메모리 공간에 모두 로딩하고 정렬한다.
-sort merge 조인은 정렬이 발생하므로 데이터 양이 많으면 성능이 떨어진다.
Hash join : 두 테이블 중에서 작은 테이블을 hash 메모리에 로딩하고 두 테이블의 조인 키를 사용해서 해시 테이블을 생성한다.
-hash join은 equla join만 사용 가능하다.
-cpu 연산을 많이 한다.
-그래서 hash조인 시에는 선행 테이블이 충분히 메모리에 로딩되는 크기여야 한다.
---------------------
추가로 공부하면서 안 것 1
extract 사용법
만약 COL1에 2020-2-1 이렇게 있으면
SELECT EXTRACT(YEAR FROM SYS-DATE)
이렇게 사용하면 결과는 ‘2020‘만 나온다.
lpad 사용법
-LPAD : 대상문자, 지정 길이, 채울 문자
SELECT lpad(‘1’, ‘8’, ‘0’) FROM DUAL
= 00000001
EXTRACT와 함께 사용하면
LPAD(EXTRACT(MONTH FROM SYSDATE), 2, ‘0’) FROM DUAL;
이렇게 되면 EXTRACT로 출력된 결과가 2인데 여기서 LPAD를 이용했으니 2개의 자릿수로 지정하고 앞에 0을 붙이므로 ‘02’로 출력된다.
--------------------------
추가로 공부하면서 안 것 2
select DEPTNO, JOB, sum(sal) from test group by rollup(deptno, job);
두 문장이 같음
select DEPTNO, JOB, sum(sal) from test group by grouping sets((deptno, job), (deptno), ())
select DEPTNO, JOB, sum(sal) from test group by cube(deptno, job);
두 문장이 같음
select DEPTNO, JOB, sum(sal) from test group by grouping sets(deptno, job, (deptno, job), ());
추가로 공부하면서 안 것 3
nulls last : null값을 마지막에 정렬시키는 것
추가로 공부하면서 안 것 4
role은 데이터베이스에서 오브젝트(데이블, 프로시정 뷰 등) 의 권한을 묶어서 권한을 관리할 수 있다.
추가로 공부하면서 안 것 5
select * from sqld2 where (col1, col2) in (('x', 'y'), ('가', '나'));
추가로 공부하면서 안 것 6
- 서브쿼리는 메인쿼리 칼럼 사용 가능
메인쿼리는 서브쿼리 칼럼 사용 불가
추가로 공부하면서 안 것 7
오라클은 DDL 자동커밋
SQL 서버는 DDL 자동커밋 X
오라클에서는 is null로 검색
SQL 서버에서는 = “”로 검색
추가로 공부하면서 안 것 8
NEXT_DAY 함수는 지정된 요일의 첫 번째 날짜를 출력한다.
추가로 공부하면서 안 것 9
NTILE는 1부터 시작한다.
예 NTILE(4) 1~4
추가로 공부하면서 안 것 10
윈도우 파티셔에서 unbounded preceding와 current row
는 시작부터 끝까지를 의미한다.
추가로 공부하면서 안 것 11
where null = null은 안됨
null을 조회할려면 where is null 이런식으로 조회해야함
고로 null = null은 공집합이 나옴
추가로 공부하면서 안 것 12
현재 행을 기준으로 파티션 내에서 앞의 한 건, 현재 행, 뒤의 한 건을 범위를 지정하는 over의 옵션은?
= rows between 1 preceding and 1 following
추가로 공부하면서 안 것 13
서브쿼리의 종류 중에 서브쿼리를 실행하고 한 행, 한 칼럼을 반환하는 서브쿼리를 무엇이라고 하는가?
= 스칼라 서브쿼리
추가로 공부하면서 안 것 14
서브 쿼리 종류 중에서 서브쿼리가 메인쿼리의 제공자의 역할을 하고 메인쿼리의 값이 서브쿼리에 주입되지 않는 유형은?
= access subquery
추가로 공부하면서 안 것 15
p.사원번호 is null
추가로 공부하면서 안 것 16
식별자 관계에서는 자식 엔터티의 기본기가 부모 엔터티에 대해 종속적으로 구성되고 비식별자 관계에서 자식 엔터티의 기본기가 부모 엔터티에 대해 독립적으로 구성된다.
추가로 공부하면서 안 것 17
서브쿼리는 정렬을 수행하기 위해서 내부에 order by를 사용하지 못한다.
'포트폴리오 > 자격증 자료' 카테고리의 다른 글
리눅스 마스터 1급 실기 요약 (2) | 2022.01.20 |
---|
댓글