공부 방법: 노랭이책과 네이버카페(데이터 전문가 포럼의 SQLD 예상문제 풀이) 자료로 퇴근 후 하루 1~2시간 정도 활용해 문제 풀이 및 오답 정리를 통해 개념 및 문제유형을 익히고, 틈날 때마다 sqld 관련 유튜브를 보며 몰랐던 개념을 숙지하고 관련 문제를 다시 풀어보는 시간을 가졌다.
시험 후기: 객관식 40, 단답형 10문제 중 객관식은 5~6문제 정도, 단답형은 특정 함수명이 정확히 기억나지 않아 정답이 확실하지 않았다.
현업을 주로 소프트웨어 설계를 배우고 쓰는 중이라 ORACLE이나 SQL을 직접 쓰지 않기 때문에 개념만으로는 유추해 내기는 어렵고 경험적으로 직접 코딩을 해봐야 알 수 있는 문제들이 더러 있었다. 추후에 현업에서 SW 설계단을 넘어가서 SQL을 다룰 수 있는 환경이 만들어진다면 좀 더 쉽게 풀 수 있었을 것 같다.
여러 IT 자격증(정보처리기사, 리눅스마스터1급, 빅데이터분석기사) 등을 시험 한번에 취득하면서 그나마 SQLD는 나름 현업을 고려해서 잘 짜여진 문제들로 구성되있는 것이 아닌가 하는 시험이 었다.
답: attribute(속성)
주문이라는 엔터티가 있을 때 단가라는 속 값의 범위는 100에서 10,000 사이의 실수 값이며 제품명이라는 속성은 길이가 20자리 이내의 문자열로 정의할 수 있다
답 : 도메인(Domain)
속성의 명칭은 애매모호하지 않게, 복합 명사를 사용하여 구체적으로 명명(Ex. 학생 엔티티의 이름, 교수 엔티티의 이름과 같이 각 엔티티별로 동일한 속성명을 사용하는 것을 지양)함으로써 전체 데이터모델에서 유일성을 확보하는 것이 반정규화, 통합 등의 작업을 할 때 혼란을 방지
명칭, 내역 등과 같이 이름으로 기술되는 것들은 주식별자로 지정하기에 부적절함
항목 | 식별자관계 | 비식별자관계 |
---|---|---|
목적 | 강한 연결관계 표현 | 약한 연결관계 표현 |
자식 주식별자 영향 | 자식 주식별자의 구성에 포함 | 자식 일반 속성에 포함 |
표기법 | 실선 | 점선 |
연결 고려사항 | - 반드시 부모엔티티 종속 | - 약한 종속관계 |
1) 데이터모델링을 할 때 정규화를 정확하게 수행한다.
2) 데이터베이스 용량산정을 수행한다.
3) 데이터베이스에 발생되는 트랜잭션의 유형을 파악한다.
4) 용량과 트랜잭션의 유형에 따라 반정규화를 수행한다.
5) 이력모델의 조정, PK/FK조정, 슈퍼타입/서브타입 조정 등을 수행한다.
6) 성능관점에서 데이터모델을 검증한다.
아래와 같은 보관금원장 엔터티에서 관서에 대한 정보가 반정규화 되어 있기 때문에 관서정보를 조회할 때 성능저하가 발생하고 있다. 이 엔터티에 대해 몇차 정규화가 필요한 지와 분리된 스키마 구조를 가장 바르게 짝지은 것은?
보관금원장 테이블{관서번호, 납부자번호 | 관리점번호, 관서명, 상태, 관서등록일자, 직급명, 통신번호}
함수 종속성(FD):
{관서번호, 납부자번호} {직급명, 통신번호}
{관서번호} {관리점번호, 관서명, 상태, 관서등록일자}
ANS: 함수종속성의 규칙에 따라 {관서번호} {관리점번호, 관서명, 상태, 관서등록일자}가 PK인 엔터티가 2차 정규화로 분리되어야 함.
매각기일과 일자별매각물건을 1:M 관계로 2차 정규화하는 과정으로 지금의 나로써는 알아먹기 힘들다(22.2.18)
컬럼에 의한 반복적인 속성값을 갖는 형태는 속성의 원자성을 위배한 제1차 정규화의 대상
컬럼 단위에서 중복된 경우도 1차 정규화의 대상이 된다. 이에 대한 분리는 1:M의 관계로 두 개의 엔터티로 분리된다.
중복속성에 대한 분리가 1차 정규화의 대상이 되며, 로우단위의 중복도 1차 정규화의 대상이 되지만 컬럼 단위로 중복이 되는 경우도 1차 정규화의 대상이다.
공급자 테이블 vs 전화번호 테이블, 메일주소 테이블, 위치 테이블(1:M) 관계
- 공급자의 데이터는 1000만건 이상의 대량 데이터를 가진 테이블임
- 전화번호, 메일주소, 위치는 자주 변경이 될 수 있으며 데이터를 조회를 할 때 항상 최근에 변경된 값을 조회
하나의 테이블에 많은 양의 데이터가 저장되면 인덱스를 추가하고 테이블을 몇 개로 쪼개도 성능이 저하되는 경우가 있다. 이때 논리적으로는 하나의 테이블이지만 물리적으로는 여러 개의 테이블로 분리하여 데이터 액세스 성능도 향상시키고, 데이터 관리방법도 개선할 수 있도록 테이블에 적용하는 기법
현금출급기실적 테이블
설계된 순서는 아래와 같음
- PK 인덱스 = 거래일자 > 사무소코드 > 출급기번호 > 명세표번호
- 건수, 금액 컬럼
SQL문
SELECT 건수, 금액 FROM 현금출급기실적 WHERE 거래일자 BETWEEN '20140701' AND '20140702' AND 사무소코드 = '000369'
ANS) 인덱스는 값의 범위에 따라 일정하게 정렬이 되어 있으므로 상수값으로 EQUAL 조건으로 조회되는 칼럼이 가장 앞으로 나오고 범위조회 하는 유형의 칼럼이 그 다음에 오도록 하는 것이 인덱스 엑세스 범위를 좁힐 수 있는 가장 좋은 방법!
PK의 순서를 사무소코드 > 거래일자 > 출급기번호 > 명세표번호로 바꾸는 것이 성능에 유리함
학사기준 테이블
- PK: 학사기준번호
- 컬럼: 년도 + 학기 + 특이사항
수강신청 테이블- PK: 강의번호 + 학번
- 컬럼: 학사기준번호(FK) + 성명 + 연락처1 + 연락처2 + 등록년도 + 감면코드
단, 학사기준과 수강신청은 조인하여 정보를 조회할 업무가 많음
ANS) 엔터티 간에 논리적 관계가 있을 경우, 이 데이터들이 업무적으로 밀접하게 연결되어 상호간에 조인이 자주 발생한다는 것을 의미하는 것이기 때문에, 데이터베이스 상에서 DBMS가 제공하는 FK Constraint를 생성했는지 여부와 상관없이 조인 성능을 향상시키기 위한 인덱스를 생성시켜주는 것이 좋음 수강신청 테이블의 학사기준번호에 인덱스가 필요함.
DDL: 객체 생성(CREATE), 변경(ALTER, RENAME), 제거(TRUNCATE: 테이블 안 내부 데이터만 삭제하고 테이블은 남김, DROP)의 5가지 - DDL은 ROLLBACK을 할 수 없음
DML: 입력(INSERT), 수정(UPDATE), 삭제(DELETE), 조회(SELECT), MERGE(존재하면 UPDATE, 존재하지 않으면 INSERT)
TCL: 작업 완료(COMMIT, SAVEPOINT) 및 취소(ROLLBACK)
DCL: 권한 부여 및 회수(GRANT, REVOKE)
(1) 비절차적 데이터 조작어(DML)는 사용자가 무슨 데이터를 원하며, 어떻게 그것을 접근해야 되는지를 명시하는 언어이다.
=> PL/SQL처럼 절차적 데이터 조작어를 통한 프로그래밍이 가능한 경우만 어떻게 데이터를 접근해야 하는지 가능함.
(2) DML은 데이터베이스 사용자가 응용 프로그램이나 질의어를 통하여 저장된 데이터베이스를 실질적으로 접근하는 데 사용되며 SELECT, INSERT, DELETE, UPDATE 등이 있다.
(3) DDL은 스키마, 도메인, 테이블, 뷰, 인덱스를 정의하거나 변경 또는 제거할 때 사용되며 CREATE, DROP, ALTER, RENAME 등이 있다.
(4) 호스트 프로그램 속에 삽입되어 사용되는 DML명령어들을 데이터 부속어(Data sub language)라고 한다.
NOT NULL constraint 를 먼저보고 보기를 체크하자
(PROD_ID VARCHAR2(10) NOT NULL
,PROD_NM VARCHAR2(100) NOT NULL,
,REG_DT DATE NOT NULL,
,REGR_NO NUMBER(10)
,CONSTRAINT PRODUCT_PK PRIMARY KEY(PROD_ID));
Contraint를 사용한 기본키 지정 방법
CONSTRAINT constraint_name PRIMARY KEY(col_1, col_2, ...)
ALTER TABLE 기관분류 ALTER COLUMN 분류명 VARCHAR(30) NOT NULL;
ALTER TABLE 기관분류 ALTER COLUMN 등록일자 DATE NOT NULL;
S 테이블의 두개의 row 값은 삭제됨
ON DELETE CASCADE
속성
R 테이블의 두개의 row 값 중 B 컬럼의 값은 NULL로 바뀜
ON DELETE SET NULL
속성으로 인해
결과적으로 테이블 R의 데이터는
(1, NULL) 과 (2, NULL)
UNIQUE 는 NULL 입력이 가능함
제약조건 | 설명 |
---|---|
NOT NULL | 컬럼이 NULL 값을 포함하지 못하도록 지정 |
UNIQUE | 컬럼 값이 해당 테이블 전체에서 유일한 값으로 NULL 가능 |
PRIMARY KEY | NOT NULL & UNIQUE |
FOREIGN KEY | 입력되어야 할 값이 다른 테이블의 컬럼 값을 참조 |
CHECK | 해당 조건을 만족하는 값으로만 입력을 제한 |
65-Base
- A - Z, a-z
- 0 - 9, $, #, _
제약 조건의 생략 여부를 확인, 특히 NOT NULL
CREATE TABLE EMP
(EMP_NO VARCHAR2(10) PRIMARY KEY
,EMP_NM VARCHAR2(300) NOT NULL
,DEPT_CODE VARCHAR2(4) NOT NULL
,JOIN_DATE DATE NOT NULL
,REGIST_DATE DATE NULL);
CREATE INDEX IDX_EMP_01 ON EMP (JOIN_DATE);
또는 (기본키를 테이블 만들고 나서 지정하는 경우)
CREATE TABLE EMP
(EMP_NO VARCHAR2(10) NOT NULL
,EMP_NM VARCHAR2(300) NOT NULL
,DEPT_CODE VARCHAR2(4) DEFAULT '0000' NOT NULL
,JOIN_DATE DATE NOT NULL
,REGIST_DATE DATE);
ALTER TABLE EMP ADD CONSTRAINT EMP_PK PRIMARY KEY (EMP_NO);
CREATE INDEX IDX_EMP_01 ON EMP (JOIN_DATE);
4번이 틀린 이유: 테이블 생성문과 인덱스 생성문은 정상적으로 수행되지만, 테이블 생성문장에서 이미 PRIMARY KEY를 지정하였으므로 ALTER TABLE 문장에서 오류가 발생함.
ANS) 학번은 PK 이므로 COUNT
집계 함수의 결과는 둘 다 같음
1) 테이블 생성시 설정할 수 있다.
2) 외래 키 값은 NULL 값을 가질 수 없다. (특정 테이블의 PK
라면)
3) 한 테이블에 하나만 존재해야 한다. (-> PRIMARY KEY
에 대한 설명)
4) 외래키 값은 참조 무결성 제약을 만들 수 있다.
1) 체크(checK) 제약조건은 DB의 데이터의 무결성을 유지하기 위하여 테이블의 특정 칼럼에 설정
3) 고유키로 지정된 모든 컬럼들은 NULL 값을 가질 수 없다.(NULL 입력 가능)
4) 외래키는 테이블 간의 관계를 정의하기 위해 기본 키를 다른 테이블의 외래키가 참조하도록 설정(참조 무결성)
참고: 테이블의 데이터가 아주 많을 때 오라클에서는 이와 같은 삭제(
ALTER TABLE DROP COLUMN
작업은 많은 시간을 필요로 함!
RENAME STADIUM TO STADIUM_JSC
부모 테이블의 행이 삭제될 때 자식 테이블의 행에 어떤 일이 발생하는지 정의할 수 있음.
자식 테이블의 행이 입력될 때 부모 테이블의 행과 관련해서 어떻게 할 것인지를 정의.
1) INTO TBL (ID, AMT)
로 명시해야 삽입 가능
2) DEGREE
자릿수 초과
3) AMT
컬럼의 NOT NULL
제약조건으로 인해 불가능
FOREIGN KEY로 인해 고객테이블은 삭제 작업이 제약
주문테이블은 입력 작업이 제약
2) SYNTAX 에러 발생
3) TRUNCATE
는 테이블 초기화로 ROLLBACK이 불가능
4) DROP
과 같은 DDL
명령은 ROLLBACK이 불가능
정리하자면, TRUNCATE TABLE, DROP TABLE
은 로그를 남기지 않으므로(Auto COMMIT
되어 ROLLBACK
불가) 개발 기준과 상충됨.
정답은 1번
TRUNCATE
명령어는UNDO
를 위한 데이터를 생성하지 않기 때문에(e.g.ROLBACK
이 불가능) 동일 데이터량 삭제 시DELETE
보다 빠르다!
TRUNCATE
도 별도로 사용자COMMIT
이 필요없이 Auto commit 됨!
ACID!
2) 일관성(Consistency)
성공적으로 수행이 완료된 트랜잭션의 결과는 영구적으로 반영되어야 한다. 는 일관성이 아닌 지속성에 대한 설명
3) 고립성(Isolation)
둘 이상의 트랜잭션이 동시에 실행되는 경우에 서로의 작업에 영향을 끼칠 수 없다. (격리성)
4) 지속성(Durability)
트랜잭션의 수행 전과 트랜잭션의 수행 완료 후의 데이터베이스의 상태는 언제나 같아야 한다. 는 지속성이 아닌 일관성에 관한 설명
설명 오류!
UPDATE A SET VAL = 200 WHERE ID = '001'; CREATE TABLE B ( ID CHAR(3) PRIMARY KEY); ROLLBACK;
에서 ORACLE에서는 200, SQL Server에서는 100이 되었다.
1) ORACLE에서는 DDL 문장(CREATE, ALTER, DROP, TRUNCATE, RENAME
) 수행 후 자동으로 COMMIT을 수행
2) SQL Server에서는 ROLLBACK
문장에 의해 UPDATE
가 취소되어 VAL 값이 100
3) ORACLE에서는 DDL 문장의 수행은 내부적으로 트랜잭션을 종료 시키므로 B 테이블은 생성됨
4) SQL Server에서는 CREATE TABLE
문장도 TRANSACTION
의 범주에 포함된다. 그러므로 ROLLBACK
문장에 의해서 최종적으로 B 테이블은 생성되지 않음!
트랜잭션은 데이터베이스의 논리적 연산단위로서 밀접히 관련되어 분리될 수 없는 한 개 이상의 데이터베이스 조작을 가리킴.
BEGIN TRANSACTION
으로 구문을 트랜잭션을 시작하고
COMMIT 또는 ROLLBACK으로 트랜잭션을 종료한다.
ROLLBACK 구문을 만나면
최초의 BEGIN TRANSACTION 시점까지 모두 ROLLBACK이 수행된다.
저장점을 정의하면 롤백할 때 트랜잭션에 포함된 전체 작업을 롤백하는 것이 아니라 현 시점에서
SAVEPOINT
까지 트랜잭션의 일부만 롤백
BEGIN TRANSACTION;
SAVE TRANSACTION SP1;
UPDATE 상품 SET 상품명 = 'LCD-TV' WHERE 상품ID = '001';
SAVE TRANSACTION SP2;
UPDATE 상품 SET 상품명 = '평면-TV' WHERE 상품ID = '001';
ROLLBACK TRANSACTION SP2;
COMMIT
하면 LCD-TV 까지는 저장됨!
NOT > AND > OR
다음과 같을 때 AND를 먼저 수행 한 후 OR 연산을 수행하므로 답은 3이 된다.
1) 서비스번호 컬럼의 모든 레코드가 '001'과 같은 숫자형식으로 입력되어 있어야 오류가 발생하지 않음.
2-4) ''
으로 데이터 입력시, 서비스명 컬럼의 데이터에 대해서 ORACLE에서는 NULL
로 입력되며, IS NULL
로 조건으로 조회하여야 함
반면에 SQL Server에서는 데이터를 조회하려면 서비스명 = ''
로 조회하여야 한다.
가) 함수의 입력 행수에 따라 단일행 함수와 다중행 함수로 구분
나) 단일행 함수는 SELECT, WHERE, ORDER BY, UPDATE
의 SET절에 사용이 가능하다.
다) 1:M 관계의 두 테이블을 조인할 경우 M쪽에 다중행이 출력되므로 단일행 함수는 사용할 수 없다(X) 1:M 조인이라 하더라도 M 쪽에서 출력된 행이 하나씩 단일행 함수의 입력값으로 사용되므로 사용할 수 있다.
라) 다중행 함수도 단일행 함수와 동일하게 단일 값만을 반환한다.
다중행 함수(Multi-Row Function)는 집계 함수(Aggregate Function), 그룹 함수(Group Function), 윈도우 함수(Window Function)으로 구분된다.
Ex.COUNT(), AVG(), SUM(), MIN(), MAX(), STDDEV()
등
단일행 함수 : 문자형, 숫자형, 날짜형, 변환형 함수로 구성되며
문자형 함수 :UPPER(), LOWER(), CONCAT(), SUBSTR(), LENGTH()
등
숫자형 함수 :ROUND(), TRUNC(), MOD(), POWER(a,b), SQRT()
등
날짜형 함수 :SYSDATE(), LAST_DAY(SYSDATE), ADD_MONTHS()
등,
변환형 함수 :TO_CHAR(), TO_NUMBER(), TO_DATE()
등
- 줄바꿈 하나의 문자열이므로 C1 컬럼의 문자열의 길이는 3+5=8,
- 여기서 줄바꿈을 의미하는 CHR(10)을 공백 문자열로 바꿨기 때문에
- C1 컬럼은 각각 AA, BBB로 변환되고
- 각각의 문자열의 길이를 빼고 +1을 하면
- SUM((3-2+1) + (5-3+1)) = 5
LENGTH : 문자열의 길이를 반환하는 함수
CHR : 주어진 ASCII 코드에 대한 문자를 반환하는 함수 (CHR(10) -> 줄바꿈)
REPLACE : 문자열을 치환하는 함수 (REPLACE(C1, CHR(10)) -> 줄바꿈 제거)
날짜 정보에다가 +1, 즉 하루를 더하고
그것을 24로 나누면 1시간
또 그것을 6으로 나누면 10분을 더한셈이므로
정답은 3번
CASE 컬럼 WHEN 조건1 THEN 값1 WHEN 조건2 THEN 값2 ELSE 값3 END
#컬럼이 조건1일 때는 값1을 조건2일 때는 값2를 반환하고 조건에 맞지 않는 경우에는 값3을 반환함
IN ('b','c')
인 경우 b나 c 둘다
일반형 함수 | 함수 설명 |
---|---|
NVL(표현식1, 표현식2) ~ 오라클 / ISNULL(표현식1, 표현식2) ~ SQL | 표현식1의 결과값이 NULL이면 표현식2의 값을 출력한다. (단, 표현식1과 표현식2의 결과 데이터 타입이 같아야 한다. |
NULLIF(표현식1, 표현식2) | 표현식1의 결과값과 표현식2의 결과값이 같으면, NULL을, 같지 않으면 표현식1을 리턴한다. |
COALESCE(표현식1, 표현식2, ....) | 임의의 개수 표현식에서 NULL이 아닌 최초의 표현식을 나타낸다. 모든 표현식이 NULL이면 NUULL을 리턴한다. |
NVL2(col, 표현식1, 표현식2) | col이 NULL이 아니면 표현식1, NULL이면 표현식2를 리턴 |
집계함수 COUNT는
NULL
인 행 제외하므로 COUNT(GRADE)의 결과는 645
빈칸에 들어갈 쿼리 = 인라인뷰(Inline view)
1번에서 인라인 뷰 안에서 뷰 바깥의 테이블 D와 조인하는 것은 불가능
GROUP BY 절
HAVING 절
GROUP BY 절에서 나타난 회원ID는 반드시 SELECT 절에서 나타나야함.
HAVING절과 같이 나타난 그룹함수의 사용은 문제가 없음.
3번 역시 GROUP BY 절에 나타난 메뉴ID, 사용유형코드가 SELECT에 나타남. HAVING 절을 통한 조건문 필터는 문제가 없음.
GROUP BY로 묶었는데 애먼
년
칼럼으로 ORDER BY할 수 없음
ID 칼럼을 1과 2로 변환하여 오름차순, AMT의 경우 내림차순으로 정렬
FWGHSO
FROM WHERE GROUP BY HAVING SELECT ORDER BY
(22.02.21(D-19) 까지)
5개의 테이블로부터 필요한 칼럼을 조회하려고 할 때, 최소 몇 개의 JOIN 조건이 필요한가?
=> 4개
DBMS 옵티마이저는 From 절에 나열된 테이블이 아무리 많아도 항상 2개의 테이블씩 짝을 지어 Join을 수행한다.
4개: SMITH -> S%, %T% 에 해당 + SCOTT -> S%, %T%에 해당함.
(22.02.22)
그림과 같이 순수관계연산자는 SELECTION, PROJECTION, JOIN, DIVISION
이 있다.
비선호컨텐츠를 제외하는 쿼리를 작성하였으나 고객ID 말고도 컨텐츠ID가 같아야함.
2번의 경우 비선호컨텐츠가 기준으로 선정되었기 때문에 답이 될 수 없음.
2개의 INNER JOIN이면 됨
Join 시 Using 과 On 비교
department 테이블
dept_id | description |
---|---|
1 | Accounting |
2 | Finance |
3 | Research and Development |
4 | Marketing |
5 | Sales |
employees 테이블
employee_id | dept_id | first_name | last_name |
---|---|---|---|
1 | 1 | John | Smith |
2 | 4 | Peter | Maybank |
3 | 5 | Samantha | Savoy |
4 | 2 | Evan | Baxter |
5 | 3 | Kamila | Erdos |
select *
from employees as e
inner join departments as d
on e.dept_id = d.dept_id;
On
을 이용한 조인 질의 결과는 두 테이블의 모든 컬럼이 결과로 산출
employee_id | dept_id | first_name | last_name | dept_id | description |
---|---|---|---|---|---|
1 | 1 | John | Smith | 1 | Accounting |
2 | 4 | Peter | Maybank | 4 | Marketing |
3 | 5 | Samantha | Savoy | 5 | Sales |
4 | 2 | Evan | Baxter | 2 | Finance |
5 | 3 | Kamila | Erdos | 3 | Research and Development |
5 rows & 6 columns
select *
from employees as e
inner join departments as d using (dept_id);
Using
을 이용한 조인 질의 결과는 중복된 컬럼인 dept_id는 한번만 산출
dept_id | employee_id | first_name | last_name | description |
---|---|---|---|---|
1 | 1 | John | Smith | Accounting |
4 | 2 | Peter | Maybank | Marketing |
5 | 3 | Samantha | Savoy | Sales |
2 | 4 | Evan | Baxter | Finance |
3 | 5 | Kamila | Erdos | Research and Development |
5 rows & 5 columns
USING
의 경우 동등 조인을 수행하고 오직 컬럼명이 같을 경우에 사용할 수 있기 때문에, 같은 컬럼을 중복하여 포함시킬 필요가 없는 것.
The dept_id column, the column we're joining the two tables on, only appears once in the output. Why? Because USING performs an equality join and can only be used when the column names are identical, it's unnecessary to include the column twice. A nice side-effect of this is convenience - when you're using USING, if you want to refer to the column in your SELECT clause or elsewhere, you don't need to prefix the column name with the table name!
ON
과WHERE
의 차이
SQL문 순서는FROM
ON
JOIN
WHERE
, 즉 ON이 WHERE보다 순서상으로 더 빠름
Inner Join
의 경우 존재하는 값에 대해서만 출력하기 때문에 조건의 위치나 테이블의 순서와 상관없이 같은 실행계획으로 같은 값이 출력
Outer Join
의 경우
LEFT OUTER JOIN
조인 수행시 먼저 표기된 좌측 테이블에 해당하는 데이터를 먼저 읽은 후, 나중에 표기된 우측 테이블에서 JOIN 대상 데이터를 읽어 온다. 즉, A와 B를 비교해서 B의 JOIN 칼럼에서 같은 값이 있을 때 그 해당 데이터를 가져오고, B의 칼럼에서 같은 값이 없는 경우 B 테이블에서 가져오는 칼럼들은 NULL로 채운다.
pairwise 형태로 비교해야됨!
INTERSECT는 결과의 교집합으로 중복된 행을 하나의 행으로 표시!
Query1의 별칭으로 출력되야하고, ENAME, JOB의 오름차순으로 정렬되야
집합연산자는 SQL에서 위에 정의된 연산자가 먼저 수행된다. 그러므로 UNION이 나중에 수행되므로 결과적으로 중복 데이터가 모두 제거되어 수행
START WITH 절은 계층 구조 전개의 시작 위치를 지정하는 구문이다. 즉, 루트 데이터를 지정한다(액세스)
PRIOR : CONNECT BY 절에 사용되며, 현재 읽은 칼럼을 지정한다.
PRIOR 자식 = 부모 형태를 사용하면 계층구조에서 부모데이터에서 자식데이터(부모 -> 자식) 방향으로 전개하는 순방향 전개를 한다. 그리고 PRIOR 부모 = 자식 형태를 사용하면 반대로 자식 데이터에서 부모 데이터(자식 -> 부모) 방향으로 전개하는 역방향 전개를 한다.
ORDER SIBLINGS BY: 형제 노드(동일 LEVEL) 사이에서 정렬을 수행한다.
(22.02.26)
루트노드의 LEVEL 값은 1
CONNECT BY PRIOR 사원번호 = 매니저사원번호
부모의 사원번호가 자식의 매니저 사원번호와 같은 애들을 방향으로 계층화
한 테이블에서 두 칼럼이 연관 관계가 있을 때 사용한다.
FROM 절에 동일 테이블이 두 번 이상 나타난다. 동일 테이블 사이의 조인을 수행하면 테이블과 칼럼 이름이 모두 동일하기 때문에 식별을 위해서는 반드시 테이블 별칭 Alias를 사용해야 한다.
(22.02.27)
크게 두가지 방법 : 하나는 셀프 조인, 하나는 스칼라 서브 쿼리 활용
A || B 는 연결연산자로 A: 1, B: a 이면 A||B는 1a
다중 컬럼 서브쿼리란 서브 쿼리의 결과가 여러 컬럼의 데이터를 출력해주는 서브쿼리
메인 쿼리에서 참조한 회원 A 컬럼을 서브쿼리에서 활용하므로 연관 서브쿼리
FROM 절에서 사용되는 서브쿼리를 인라인뷰(Inline view)라고 한다. 서브쿼리의 결과가 마치 실행 시에 동적으로 생성된 테이블인 것처럼 사용할 수 있다. 인라인뷰는 SQL문이 실행될 때만 임시적으로 생성되는 동적인 뷰이기 떄문에 데이터베이스에 해당 정보가 저장되지 않는다. 서브쿼리의 결과가 마치 실행 시에 동적으로 생성된 테이블인 것처럼 사용할 수 있다.
하나의 평가 항목에 평가등급이 기대수준 이하일 경우 재평가를 수행하여 평가회차가 증가하고 평가등급이 갱신되는 데이터를 찾는 쿼리가 필요함!
담당자를 바꾸기 위해 부서코드를 SELECT하는건 말이 안됨
- NVL :
NVL(e1, e2)
e1이 NULL 이면 e2 반환, e1이 NON NULL 이면 e1 반환- ROLLUP :
GROUP BY ROLLUP(A,B)
- (A, B) : A와 B를 기준으로 GROUP BY 해서 카운트한 결과가 나타남
- (A, NULL): A만을 GROUP BY 기준으로 해서 카운트한 결과가 나타남, B는 NULL
- (NULL, NULL): 아무런 기준없이 전체를 GROUP BY 해서 카운트한 결과가 나타남
- GROUPING : GROUP BY 기준이 되는 컬럼의 값이 NULL 일때 1을 리턴, NULL 이 아닐 때 0을 리턴
(22.03.01)
GROUPING : GROUP BY 기준이 되는 컬럼의 값이 NULL 일때 1을 리턴, NULL 이 아닐 때 0을 리턴, 즉 소계나, 총합등 집계된 데이터의 경우 1을 리턴하고 만약 집계된 데이터가 아니라면 0을 리턴
(22.03.02, ~111번)
Partition 과 Group By 구문은 의미적으로 유사하다.
Partition By: SQL에서 추출한 데이터를 일련의 기준에 의해서 함수의 적용 대상을 구분짓고자 할 때 사용할 수 있는 것
Partition 구문이 없으면 전체 집합을 하나의 Partition으로 정의한 것과 동일하다.
윈도우 함수 처리로 인해 결과 건수가 줄어든다.
윈도우 함수 적용 시 결과 건수는 줄어들지 않음, GROUP 함수 적용시 결과 건수가 줄어듦
윈도우 함수 적용 범위는 Partition을 넘을 수 없다.
RANK 함수는 ORDER BY를 포함한 QUERY 문에서 특정 항목(칼럼)에 대한 순위를 구하는 함수이며 동일한 값에 대해서는 동일한 순위를 매긴다.
GROUP BY | PARTITION BY | |
---|---|---|
사용 | 그룹 외부에서 묶어 순위 및 그룹별 집계를 구할 떄 사용 | 그룹 내 순위 및 그룹별 집계를 구할 때 사용 |
결과값 | 특정 원하는 컬럼에 대해서 추출해 결과값을 보여줌 | 전체 데이터에서 원하는 값을 보여줌 |
RANK를 잘 사용하고 있으나, 요구사항에서 게임상품ID별로 각각 순위를 매겨야 하므로 오답
각각의 추천경로별로 1건씩 추출
GROUP BY 절에 의한 GROUP 함수의 값을 구한 뒤 윈도우 함수가 실행되므로 문제가 없음.
그룹함수로 인한 모든 값은 다 처리된 후 윈도우 함수가 실행됨.
WINDOWNING 절
(22.03.03 ~ 116)
LAG는 바로 앞에껄 찾게하고, LEAD는 바로 뒤에껄 찾게 함.
GRANT SELECT, UPDATE ON A_User.TB_A TO B_User;
GRANT, REVOKE 사용 예제
WITH GRANT OPTION으로 인해 Kim이 Park에게 권한을 줄 수 있음
- PL/SQL은 Block 구조로 되어있어 각 기능별로 모듈화가 가능하다.
TRUNCATE
를 사용,DELETE
는ROLLBACK
이 가능하도록 삭제하는 것임
DDL 명령어를 PL/SQL내에서 실행시키려면 execute immediate
문을 활용해야됨.
CREATE PROCEDURE
명령을 사용해서 생성CREATE FUNCTION
명령을 사용해서 생성TRIGGER
을 사용하여 데이터 무결성, 일관성을 유지할 수 있음)RANK() OVER
ROWNUMBER() OVER
LEAD() OVER
LAG() OVER
COST BASED OPTIMIZEZR(CBO)
테이블 및 인덱스 등의 통계 정보를 활용하여 SQL문을 실행하는 데 소요 될 처리시간 및 CPU, I/O 자원량 등을 계산하여 가장 효율적일 것으로 예상되는 실행계획을 선택하는 옵티마이저
실행계획을 통해서 알 수 있는 정보
- 액세스 기법
- 질의 처리 예상 비용
- 조인 순서
실제처리 건수
2번을 기준으로 3번과 4번이 깊이가 같은 작업이고 4번보다는 3번이 먼저이므로 3 4 2
2번과 5번 중 2번이 먼저 수행
B-Tree 인덱스
CLUSTERED 인덱스
BITMAP 인덱스
인덱스의 컬럼을 DEPTNO + REGIST_DATE 순으로 변경하면 효율적으로 탐색이 가능함.
인덱스의 첫번째 컬럼에 준 조건이 동등조건이 되면 탐색함에 있어서 효율적으로 활용됨.
두 칼럼에 대한 '='를 모두 사용해서 범위를 좁히는 데 사용!
비용기반 옵티마이저는 테이블, 인덱스, 컬럼 등 객체의 통계정보를 사용하여 실행계획을 수립하므로 통계정보가 변경되면 SQL의 실행계획이 달라질 수 있다.
ORACLE의 실행계획에 나타나는 기본적인 Join 기법으로는 NL Join, Hash Join, Sort Merge Join 등이 있다.
- NL Join은 데이터 집계하는 업무 보다는 OLTP의 목록 처리 업무에 많이 사용된다.
- DW 등의 데이터 집계 업무에서 많이 사용되는 Join 기법은 Hash Join 또는 Sort Merge Join이다.
Nested Loop Join
- 2개 이상의 테이블에서 하나의 집합을 기준으로 순차적으로 상대방 Row를 결합하여 원하는 결과를 조합하는 방식
- 먼저 선행 테이블의 처리 범위를 하나씩 액세스하면서 추출된 값으로 연결할 테이블을 조인한다.
특징- 좁은 범위에서 유리한 성능을 보여줌
- 순차적으로 처리하며, Random access 위주
- 후행 테이블(Driven)에는 조인을 위한 인덱스 생성 필요
- 실행 속도 = 선행 테이블 사이즈 * 후행 테이블 접근횟수
SMJ은 조인 칼럼을 기준으로 데이터를 정렬하여 조인을 수행한다.
NL조인은 주로 랜덤 액세스 방식으로 데이터를 읽는 반면,
SMJ은 주로 스캔 방식으로 데이터를 읽는다.
SMJ는 랜덤 액세스로 NL 조인에서 부담이 되던 넓은 범위의 데이터를 처리할 때 이용되는 조인 기법.
그러나 SMJ은 정렬할 데이터가 많아 메모리에서 모든 정렬 작업을 수행하기 어려운 경우에는 임시 영역(디스크)을 사용하기 때문에 성능이 떨어진다.
Hash Join은 조인 칼럼의 인덱스를 사용하지 않기 때문에 조인 칼럼의 인덱스가 존재하지 않을 경우에도 사용할 수 있는 조인 기법이다. Hash 함수를 이용하여 조인을 수행하기 때문에 '='로 수행하는 동등 조인에서만 사용이 가능
한쪽 테이블이 주 메모리의 가용 메모리에 담길 정도로 충분히 작고 해시 키 속성에 중복 값이 적을 때 효과적이다.
(22.03.06 p146번까지 1회독 완료)
(22.03.11 쓱 2회독)
ORDER BY 1, 2란 첫번째 컬럼, 두번째 컬럼을 의미하고, DESC가 생략되어 있으므로 오름차순으로 정렬
- 4번의 경우 N1만 뽑았으므로 2번째 컬럼이 없기 때문에 오류가 발생함.
(a + b + c + d) 의 경우는 해당 로우에 대해서 계산이 되고 난 컬럼에 대해서 Sum 이 수행됨
(a) + (b) .. 의 경우 각각의 sum 을 수행하고 나서 다시 사칙연산이 수행됨
SUM() 함수에서 단일 컬럼이 연산이 될 때에는 NULL값은 연산의 대상에서 제외!
T1.COL1 = T2.COL1(+) 의 의미는 LEFT OUTER JOIN으로 COL1기준으로 OUTER JOIN
LEFT OUTER JOIN
을 통해야 MANAGER_ID가 NULL인 최상위 관리자가 나올 수 있음.
NTILE(숫자) 를 하면 숫자만큼 등분하여 순위를 매길 수 있음.