SQLD
in Study on Database
<1-1 데이터 모델링>
- 데이터 모델링의 특징
- 추상화. 단순화. 명확성
- 데이터 모델링의 단계
- 개념적 → 논리적 → 물리적
- 데이터 모델링의 관점(View)
- 데이터. 프로세스. 데이터&프로세스
ERD(Entity Relationship Model) 1.엔티티 도출 2.엔티티 배치 3.엔티티 관계 설정 4.관계명 서술 5.관계 참여도 6.관계 필수 여부 표현
- 데이터 모델링 고려사항
- 독립성(정규화). 고객 요구사항 표현. 데이터 품질 확보
- 3층 스키마
- 데이터 베이스 독립성 확보하기 위한 방법 → 데이터 복잡도 상승. 데이터 중복 X. 사용자 요구사항 변경에 따른 대응령 상승. 관리 및 유지보수 비용 감소
- 3층 스키마의 독립성
- 논리적 독립성. 물리적 독립성
- 3층 스미카의 구조
- 외부. 개념. 내부
- 엔티티
- 데이터 집합/ 개념. 사건. 장소 등의 명사
- 엔티티의 특징
- 식별자. 인스턴스 집합. 속성. 관계. 업무
엔티티 종류 -무형&유형: 유형. 개념. 사건 엔티티 -발생 시점: 기본(키엔티티). 중심(메인). 행위 엔티티
- 속성
- 엔티티가 가지는 항목/ 인스턴스 구성요소. 더 이상 분해 X
- 속성의 특징
- 하나의 값. 주식별자에게 함수적으로 종속됨
속성의 종류 -분해여부: 단일. 복합(여러개의 의미가 있는 것 ex.주소). 다중값(여러개의 값을 가질 수 있는 것 ex.상품리스트) -특성: 기본. 설계(데이터 모델링 과정에서 발생. 유일한 값에 부여 ex.상품코드). 파생(다른 속성에 의해서 만들어지는 속성 ex.합계 평균 등)
- 도메인
- 속성이 가질 수 있는 값의 범위 ex.성별은 여자와 남자
관계 -존재: 두 개의 엔티티 존재 여부의 관계가 있는 것 -행위: 두 개의 엔티티가 어떤 행위에 의한 관련성 있는 것
관계의 종류 -존재 관계: 엔티티간의 상태 -행위 관계: 엔티티간의 어떤 행위가 있는 것
- 관계차수
- 두개의 엔티티 간의 관계에 참여하는 수 -1대 1(완전 1대1/ 선택적 1대1) -1대N -1대 M(관계형 DB. M대 N 관계의 조인은 카테시안 곱이 발생 and M대 N 관계 → 1대N, N대 1로 해소해야 됨)
-필수적 관계(반드시 하나 있어야 됨. 표기법 ‘|’) -선택적 관계(없을수도 있는 관계. 표기법 ‘O’)
식별 관계&비식별 관계 -식별 관계: 강한 개체(어떤 다른 엔티티 의존X. 독립적으로 존재) ex.고객 엔티티의 기본키인 회원ID. 계좌 엔티티의 기본키의 하나로 공유하는 것 -비식별 관계: 강한 개체의 기본키. 다른 엔티티의 기본키X. 일반 칼럼으로 관계 가지는 것
- 주식별자(기본키. Primary Key)
- 최소성. 대표성. 유일성. 불변성
키의 종류 -기본키(Primary Key) -후보키(Candidate Key): 유일성&최소성 만족 -슈퍼키(Super Key): 유일성O. 최소성X -대체키(Alternate Key) -외래키(Foreign Key): 참조 무결성
식별자의 종류 -대표성: 주식별자/보조 -생성 여부: 내부/외부 -속성의 수: 단일/복합 -대체 여부: 본질. 인조(Sequence Number)
<1-2 데이터 모델과 성능>
- 정규화
- 데이터의 일관성. 최소한의 데이터 중복. 최대한의 데이터 유연성을 위한 방법 → 데이터 모델의 독립성을 확보하기 위한 방법
정규화 절차 -제1정규화: 속성의 원자성 확보. 기본키 설정 -제2정규화: 기본키 2개 이상 컬럼 경우에 발생. 부분 함수 종속성 제거 -제3정규화: 이행 함수 종속성(기본키 제외. 컬럼 간에 종속성 발생) 제거 -BCNF(Boyce-Code Normal Form): 복수의 후보키. 후보키들 복합 속성. 서로 중첩 → 후보키가 기본키 종속시키면 분해 -제4정규화: 여러 칼럼들. 하나의 컬럼 종속시키는 경우 → 분해하여 다중값 종속성 제거 -제5정규화: 조인에 의해서 종속이 발생. 분해
- 정규화의 문제점
- 테이블 분해 → 데이터 중복 제거 → 데이터 모델의 유연성 증가 but 데이터 조회 시 조인 유발. CPU&메모리 많이 사용
- 정규화를 사용한 성능 튜닝
- 조인으로 인한 성능 저하 문제 → 반정규화 통해 해결 but 반정규화는 데이터 중복 → 또 다른 문제점 발생
- 반정규화
- DB 성능 향상 위해 데이터 중복 O. 조인 사용 떨어짐 == 성능 향상 방법. SELECT 속도 향상 but 데이터 모델 유연성 하락
반정규화 수행하는 경우 -정규화 충실하면 종속성. 활용성 상승 but 수행속도 하락 -다량의 범위. 자주 처리해야되는 경우 -특정 범위 데이터만 자주 처리할 때 -요약/집계 정보 자주 요구할 때
반정규화 절차 -대상 조사 및 검토: 데이터 처리 범위. 통계성 등 확인 및 대상 조사 -다른 방법 검토: 클러스터링. 뷰. 인덱스튜닝. 응용프로그램. 파티션 등… -반정규화 수행: 테이블. 속성. 관계 등을 반정규화
- 클러스터링
- 인덱스 정보 저장 할 때. 물리적으로 정렬해서 저장하는 방법 → 조회 시. 인접 블록 연속적으로 읽음 → 성능 향상
반정규화 기법 -계산된 칼럼 추가: 배치 프로그램 통해 총판매액. 평균잔고. 계좌평가 등 미리 계산하여 결과를 특정 칼럼에 추가 -테이블 수직분할: 1개의 테이블 → 2개 이상의 테이블로 분할 (칼럼 분할해서 new 테이블 만드는 것) -테이블 수평분할: 1개의 테이블 값 → 기준 정해 테이블 분할
- 파티션 기법
- 논리적 하나의 테이블. 파티션 사용해서 여러 개의 데이터 파일에 분산되어 저장 -Range Parition: 데이터 값의 범위를 기준 -List Parition: 특정한 값 지정 -Hash Parition: 특정한 값 지정 -Composite Parition: 범위&해시 복합작 사용. 파티션 수행
- 테이블 병합
- 1대 1 관계 테이블. 하나의 테이블로 병합해서 성능 향상 1대 N 관계 테이블. 병합 성능 향상 but 많은 양의 데이터 중복 발생 슈퍼 타입&서브 타입 관계 발생. 테이블 통합 성능 향상
- Super type&Sub type
- 부모자식 관계 -배타적 관계: or -포괄적 관계: and
슈퍼타입 및 서브타입 변환 방법 -One ToOne Type: 슈퍼&서브. 개별 테이블별로 도출. 테이블 수 증가. 조인 발생 증가. 관리 Hard -Plus Type: 슈퍼&서브 타입 테이블로 도출. 조인 발생. 관리 Hard -Single Type: 슈퍼. 서브 하나의 테이블로 도출. 조인 성능 Good but 입출력 성능 X
- 분산 데이터베이스
- 물리적 떨어진 데이터베이스 + 네트워크 연결 = 사용자에게 단일 데이터베이스 이미지. 분산된 작업 처리
분산 데이터베이스 투명성 -분할 투명성: 사용자는 논리적 릴레이션. 여러 단편으로 분할되어 있는것. 인식할 필요X -위치 투명성: 사용자는 사용하려는 데이터 저장 장소 명시X. 데이터 어느 위치에 있더라도 동일한 명령 사용하여 데이터 접근 가능하게 -지역사상 투명성: 지역 DBMS&물적 데이터베이스 사이 사상 보장. 각 지역 시스템 이름과 무관하게 사용 가능 -중복 투명성: 데이터베이스 객체. 여러 시스템 중복되어 있어도. 고객과는 무관 - 데이터 일관성 유지 -장애 투명성: DB가 분산된 지역의 시스템 or 통신망 이상 - 데이터 무결성 보장 -병행 투명성: 많은 사용자. 응용 프로그램이 동시에 분산. 데이터베이스 트랜잭션 수행회로 Not Bad. 결과 이상 X
분산 데이터베이스 설계 방식 -상향식 설계 방식: 지역 스키마 작성 → 전역스키마 작성 -하향식 설계 방식: 전역 스키마 → 해당 지역 스키마 작성
분산 데이터베이스 장점 및 단점 -장점: 데이터베이스 신뢰성&가용성 증가. 병렬처리 빠른 응답. 시스템 용량 추가 쉬움 -단점: 관리 및 통제 Hard. 보안관리 Hard. 데이터 무결성 관리 Hard. DB설계 복잡→
<2-1 SQL 기본>
데이터베이스 종류 -계층형 데이터베이스: 트리(Tree)형태. 1대N 관계 -네트워크형 데이터베이스: 오너(Owner)&멤버(Member)형태. 1대 N + M대 N 표현 가능 -관계형: 릴레이션에 데이터 저장 및 관리. 릴레이션 사용하여 집합 연산&관계 연산 가능
- DBMS(Database Management System)
- 데이터베이스 등을 관리하기 위한 소프트웨어 -종류: Oracle. MS-SQL. MySQL. Sybase 등… 모두 관계형 데이터베이스 지원
관계형 데이터베이스 집합 연산&관계 연산 집한 연산 -합집합(Union): 두 개의 릴레이션 → 하나로 합/ 중복된 행(튜플)은 한 번만 조회 가능 -차집합(Difference) -교집합(Intersection) -곱집합(Cartesian product)
관계연산 -선택 연산(Selection) -투영 연산(Projection): 릴레이션에서 조건에 맞는 속성만 조회 -결합 연산(Join) -나누기 연산(Division)
SQL의 종류 -DDL(Data Definition Language): 관계형 데이터베이스 구조 정의
CREATE. ALTER. DROP. RENAME
-DML(Date Manipulation Language): 테이블에서 데이터 입력. 수정. 삭제. 조회
INSERT. UPDATE. DELETE. SELECT
-DCL(Data Control Language): 데이터베이스 사용자에게 권하는 부여 및 회수
GRANT. REVOKE. TRUMCATE
-TCL(Transaction Control Language): 트랜잭션 제어 명령어
COMMIT. ROLLBACK. SAVEPOINT
트랜잭션의 특징 -원자성(Atomictiy): ALL or NOTHING -일관성(Consistency) -고립성(Isoaltion): 트랜잭션의 중간결과 다른 트랜잭션 접근 X -영속성(Durability)
SQL 실행 순서 -파싱(Parsing): 구문분석 -실행(Exection): 옵티마이저(Otimizer) 수립한 실행 계획에 따라 SQL 실행 -인출(Fetch): 데이터 읽어서 전송
테이블 관리 SQL문 -Create Table: 새로운 테이블 생성/ 기본키. 외래키. 제약사항 등 설정 -Alter Table: 생성된 테이블 변경/ 칼럼 추가 및 변경. 삭제 가능/ 기본키 설정 or 외래키 설정 가능 -Drop Table: 해당 테이블 삭제/ 테이블 구조 + 저장된 데이터 삭제
- 제약조건 사용
- 기본키. 외래키. 기본값. not null 등 테이블 생성할 때 지정 가능 -constraint: 기본키 + 기본키의 이름 지정 가능
comstraint p_name primary key(empno)
-외래키 지정
constrain f_name foreign key(emp_deptno)
referneces dept(dept_deptno)
- CASCADE 사용
- 참조 관계(기본키와 외래키 관계) 있을 경우 데이터 자동 반영 -ON DELETE CASCADE 옵션: 자신이 참조하고 있는 테이블의 데이터 삭제 → 자동적으로 자신도 삭제되는 옵션/ 참조 무결성 준수할 수 있음
테이블 변경 -테이블변경(ALTER TABLE ~ RENAME TO)
ALTER TABLE EMP
RENAME TO NEW_EMP;
-칼럼 추가(ALTER TABLE ~ ADD)
ALTER TABLE EMP
ADD (age number(2) default 1);
-칼럼 변경 (ALTER TABLE ~ MODIFY)
ALTER TABLE EMP
MODIFY (ename varchar2(40) not null);
-칼럼 삭제(ALTER TABLE ~ DROR COLUMN)
ALTER TABLE EMP
DROP COLUM age;
-칼럼명 변경(ALTER TABLE ~ RENAME COLUMN ~ TO)
ALTER TABLE EMP
RENAME COLUMN name to new_ename;
테이블 삭제
DROP TABLE
-EMP 테이블의 데이터 + 테이블 구조 모두 삭제
DROP TABLE EMP
-위에 문항 + 참조된 제약사항까지도
DROP TABLE CASCADE CONSTRAINT;
뷰(View) 생성과 삭제 -뷰: 테이블로부터 유도된 가상 테이블
뷰의 특징 -참조한 테이블 변경되면 뷰도 변경 -뷰에 대한 입력. 수정. 삭제에는 제약 있음 -특정 칼럼만 조회 → 보안성 향상 -한번 생성된 뷰는 변경 X (변경원하면 삭제 후 재생성) -뷰의 조회 일반 테이블과 동일 (SELETE)
뷰 생성
CREATE VIEW T_EMP AS
SELETE * FROM EMP;
뷰 삭제
DROP VIEW T_EMP;
INSERT문 :테이블에 데이터 입력하는 DML문
INSERT INTO table (column1, column2, ...) VALUES(expression1, expression2, ...);
INSERT INTO table VALUES(expresstion1, expression2, ...);
- Nologging
- 로그파일 기록 최소화시켜 입력 시 성능 향상시키는 방법/ Buffer Cache.메모리 영역 생략 후 기록
ALTER TABLE DEPT NOLOGGING;
- UPDATE문
- 입력된 데이터 값 수정
UPDATE EMP
SET ENAME = '조조'
WHERE EMPNO = '100'
→ EMP 테이블에서 EMPNO가 100번인 직원의 이름을 조조로 수정
- DELETE문
- 원하는 조건을 검색 후 해당되는 행 삭제
DELETE FROM EMP
WHERE EMPNO = 100;
→ EMP 테이블에서 EMPNO가 100번인 직원 삭제
테이블 모든 데이터 삭제 -DELETE FROM 테이블명: 테이블 모든 데이터 삭제 but 테이블 용량 감소 X -TRUNCATE TABLE 테이블명: 테이블 모든 데이터 삭제 and 테이블의 용량 초기화
- SELETE문
- 테이블 입력된 데이터 조회
SELECT *
FROM EMP
WHERE 사원번호 = 1000;
→ 사원번호 1000번 직원의 모든 칼럼 조회
SELECT ENAME || '님' FROM EMP;
→ ENAME 칼럼 뒤에 '님' 문자 결합
- Order by. 정렬
- SELECT문 사용할 때 Order by 같이 사용
-ASC: 오름차순 -DESC: 내림차순
SELECT * FROM EMP
ORDER BY ENAME, SAL DESC;
→ ENAME 오름차순. SAL 내림차순
- Index 정렬
- 정렬 사용하면 Oracle 데이터베이스에 부하 발생 ← 인덱스 사용하여 Order by 회피 피할 수 있음
SELECT /* INDEX_DESC(A) */
FROM EMP A;
→ INDEX 힌트(Hint)
- Distinct
- 중복된 데이터 한 번만 조회
SELECT DEPTNO FROM EMP
ORDER BY DEPTNO;
→ 중복 포함 결과값 출력
SELECT [DISTINCT] DEPTNO FROM EMP
ORDER BY DEPTNO;
→ 중복 제외 결과값 출력
WHERE문 -비교 연산자: =. <. <=. >. >= -부정 비교 연산자: !=. ^=. <>. NOT 칼럼명=. NOT 칼럼명 > -논리 연산자: AND. OR. NOT -SQL 연산자: LIKE ‘%비교 문자열%’. BETWEEN A AND B. IN(list). IS NULL -부정 SQL 연산자: NOT BETWEEN A AND B. NOT IN (list). IS NOT NULL
Like문 -%: 어떤 문자를 포함한 모든 것을 조회/ 예) ‘조%’는 ‘조’로 시작하는 모든 문자를 조회 -_(underscore): 한 개인 단일 문자 의미
- IN문
- “OR”의 의미를 가지고 있어 하나의 조건만 만족해도 조회가 됨
예) JOB이 "CLEPK"이거나 "MANAGER"인 것을 조회할 때
SELECT * FROM EMP
WHERE JOB IN ('CLEPK', 'MANAGER');
예) IN문에 두 개의 칼럼 지정
SELECT * FROM
WHERE (JOB, ENAME)
IN (('CLERK', 'test1'), ('MANAGER', 'test4'));
NULL 관련 함수 -NVL 함수: NULL이면 다른 값으로 바꾸는 함수/ NVL(MGR, 0) ← MGR 칼럼이 NULL이면 0으로 변경 -NVL2 함수: NVL 함수 + DECODE 함수/ NUL2(MGR, 1, 0) ← MGR 칼럼이 NULL이 아니면 1, NULL이면 0으로 반환 -NULLIF 함수: 두 개의 값이 같으면 NULL 아니면 첫 번째 값 반환/ NULLIF(exp1, exp2) 같으면 NULL, 아니면 exp1 반환 -COALESCE 함수: NULL이 아닌 최초의 인자 값 반환 / COALESCE(exp1, exp2, exp2, …) NULL이 아니면 exp1의 값 아니면 그 뒤의 값의 NULL 여부 판단하여 반환
- GROUP BY문
- 테이블에서 소규모 행 그룹화하여 합계. 평균. 최댓값. 최소값 등을 계산 할 수 있음
-HAVING: 조건문 -ORDER BY: 정렬
SELECT DEPTNO, SUM(SAL)
FROM EMP
GROUP BY DEPTNO HAVING SUM(SAL) > 10000;
→ GROUP BY 결과에서 급여합계가 10000이상만 조회
집계 함수 -COUNT(): 행 수 조회/ COUNT(*) NULL ← NULL값 포함한 모든 행 수/ COUNT(칼럼명) ← NULL 값 제외한 행 수 -SUM() -ANG() -MAX() 와 MIN() -STDDEV(): 표준편차 계산 -VARIAN(): 분산 계산
- SLEECT문 실행 순서
- FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
- 명시적(Explicit)형변환. 암시적(Implicit)형변환
- 형변환? 두 개의 데이터의 데이터 타입(형)이 일치하도록 변환하는 것
-명시적 형변환: 개발자가 SQL을 사용할 때 형변환 함수 사용해야 함/ 인덱스 사용 O -암시적 형변환: 개발자가 형변환 하지 않은 경우 DBMS 자동으로 형변환 하는 것/ 인덱스 사용 X
형변환 함수 -TO_NUMBER(문자열): 문자열 숫자로 변환 -TO_CHAR(숫자 혹은 날짜, [FORMAT]): 숫자 혹은 날짜를 지정된 FORMAT 문자로 변환 -TO_DATE(문자열, FORMAT): 문자열 지정된 FORMAT의 날짜형으로 변환
- DUAL 테이블
- Oracle 데이터베이스에 의해서 자동으로 생성되는 테이블/ Oracle 데이터베이스의 모든 사용자가 사용할 수 있음
내장형 함수 -ASCII(문자): 문자 혹은 숫자 → ASCII 코드값 변환 -CHAR(ASCII 코드값): ASCII 코드 → 문자 변환 -SUBSTR(문자열, m, n): 문자열 m번째 위치부터 n개 자름 -CONCAT(문자열1, 문자열2): 문자열 1번과 문자열 2번 결합/ Oracle ‘||’. MS-SQL ‘+’ -LOWER(문자열): 영문자 소문자 변환 -UPPER(문자열): 영문자 대문자 변환 -LENGTH 혹은 LEN(문자열): 공백 포함 문자열 길이 -LTRIM(문자열, 지정문자): 왼쪽 지정된 문자 삭제/ 지정된 문자 생략하면 공백 삭제 -RTRIM(문자열, 지정문자): 오른쪽 지정된 문자 삭제/ 지정된 문자 생략하면 공백 삭제 -TRIM(문자열, 지정된 문자): 왼쪽 및 오른쪽에서 지정된 문자 삭제/ 지정된 문자 생략하면 공백 삭제
날짜형 함수 -SYSDATE: 오늘의 날짜를 날짜 타입으로 알려줌 -EXTRACT(‘YEAR’ | ‘MONTH’ | ‘DAY’ from dual): 날짜에서 년, 월, 일을 조회
숫자형 함수 -ABS(숫자): 절댓값 계산 -SIGN(숫자): 양수. 음수. 0 구별 -MOD(숫자): 나머지 계산/ % 사용가능 -CEIL/CEILNG(숫자): 숫자보다 크거나 같은 최소의 정수 -FLOOR(숫자): 숫자보다 작거나 같은 최대의 정수 -ROUND(숫자, m): 소수점 m 자리에서 반올림/ m의 기본값은 0 -TRUNC(숫자, m): 소수점 m 자리에서 절삭/ m의 기본값은 0
DECODE 와 CASE문 -DECODE: IF문 구현 가능. 특정 조건이 참이면 A 거짓이면 B로 응답
DECODE(EMPNO, 1000, 'TRUE', 'FALSE');
-CASE: IF~THEN~ELSE-END 프로그래밍 언어처럼 조건문 사용 가능/ 조건을 WHEN구. THEN 해당 조건 참이면 실행. 거짓이면 ELSE 실행
SELECT CASE
WHEN EMPNO = 1000 THEN 'A'
WHEN EMPNO = 1001 THEN 'B'
ELSE 'C'
END
FROM EMP;
ROWNUM 과 ROWID -ROWNUM: DRACLE 데이버베이스의 SELECT문 결과에 대해서 논리적인 일렬번호 부여/ 조회되는 행 수를 제한할 때 많이 사용 동일한 표현으로 SQL Server(TOP)/ MYSQL(LIMIT)
SELECT * FROM EMP
WHERE ROWNUM <= 1
→ 한 행을 조회
-ROWID: ORACLE 데이터베이스 내에서 데이터를 구분할 수 있는 유일한 값 SELECT ROWID, EMONO FROM EMP 와 같은 SELECT 문으로 확인 가능
ROWID의 구조 -오브젝트 번호(길이 1~6): 오브젝트별로 유일한 값 존재. 해당 오브젝트가 속해 있는 값 -상대 파일 번호(길이 7~9): 테이블스페이스에 속해 있는 데이터 파일에 대한 상대 파일번호 -블록 번호(길이 10~15): 데이터 파일 내부에서 어느 블록에 데이터 있는지 알려줌 -데이터 번호(길이 16~18): 데이터 블록 데이터가 저장되어 있는 순서 의미
- WITH구문
- 서브쿼리를 사용해서 임시 테이블이나 뷰처럼 사용할 수 있는 구문/ 서브쿼리 블록에 별칭 지정/ 옵티마이저는 SQL을 인라인 뷰나 임시 테이블로 판단
WHIT viewData AS
(SELECT * FROM EMP
UNION ALL
SELECT * FROM EMP
)
SELECT * FROM viewData WHERE EMPNO=1000;
- GRANT
- 데이터베이스 사용자에게 권한 부여
권한 -SELECT -INSERT -UPDATE -DELETE -REFERENCES -ALTER -INDEX -ALL
WITH GRANT OPTION -WITH GRAND OPTION: 특정 사용자에게 권한 부여할 수 있는 권한 부여/ 권한 취소하면 모든 권한 회수 -WITH ADMIN OPTION: 테이블에 대한 모든 권한 부여/ A사용자 권한만 회수
- REVOKE
- 데이터베이스 사용자에게 부여된 권한 회수
-REVOKE privileges ON object FROM user;
- COMMIT
- INSERT. UPDATE. DELETE문으로 변경된 데이터를 데이스터베이스에 반영
- ROLLBACK
- 데이터에 대한 변경 사용을 모두 취소하고 트랜잭션 종료/ 이전에 COMMIT한 곳까지만 복구
- SAVEPOINT(저장점)
- 트랜잭션 작게 분할하여 관리하는 것/ SAVEPOINT를 사용하면 지정된 위치 이후의 트랜잭션만 ROLLBACK 할 수 있음
-SAVEPOINT 지정: SAVEPOINT
<2-2 SQL 활용>
- EQUI(등가) 조인 (교집합)
- 조인의 가장 기본. 두 개의 테이블 간에 일치하는 것을 조인
SELETE * FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO ← '='로 두 개의 테이블 연결
AND EMP.ENAME LIKE '임%' ← 조인문에 추가 조건 및 정렬 가능
OREDR BY ENAME;
- INNER JOIN
- ON문을 사용해서 테이블 연결
SELETE * FROM EMP INNER JOIN DEPT ← INNER JOIN구로 테이블 정의
ON EMP.DEPTNO = DEPT.DEPTNO ← ON구를 사용해서 조인 조건 넣음
AND EMP.ENAME LIKE '임%' ← 조인문에 추가 조건 및 정렬 가능
OREDER BY ENAME
해시 조인(Hash Join) -먼저 선행 테이블 결정 → 주어진 조건(Where구)에 해당하는 행 선택 → 조인 키(Join Key) 기준. 해시 함수 사용 → 해시 테이블(메인 메모리에 생성) → 후행 테이블에서 주어진 조건 만족하는 행 찾기
-후행 테이블의 조인 키를 사용해서 해시 함수를 적용하여 해당 버킷 검색
- INTERSECT 연산
- 두 개의 테이블에서 교집합 조회 → 두 개의 테이블에서 공통된 값을 조회
SELECT DEPTNO FROM EMP
INTERSECT
SELECT DEPTNO FROM DEPT;
- Non-EQUI(비등가) 조인
- 두 개의 테이블 간에 조인하는 경우 → 정확하게 일치하지 않는 것을 조인 -‘=’ 사용 하지 않고 ‘>’. ‘<’. ‘>=’. ‘<=’ 사용함
- OUTER JOIN
- 두 개의 테이블 간에 교집합(EQUI JOIN) 조회 + 한쪽 테이블에만 있는 데이터도 포함시켜 조회 Oracle 데이터베이스에서는 OUTER JOIN을 할 때 “(+)” 기호를 사용해서 할 수 있음
SELETE * FROM DEPT, EMP
WHERE EMP.DEPTNO (+)= DEPT.DEPTNO;
-LEFT OUTER JOIN
SELETE * FROM DEPT LEFT OUTER JOIN EMP
ON EMP.DEPTNO = DEPT.DEPTNO;
-RIGHT OUTER JOIN
SELETE * FROM DEPT RIGHT OUTER JOIN EMP
ON EMP.DEPTNO = DEPT.DEPTNO;
-FULL OUTER JOIN(LEFT + RIGHT)
- CROSS JOIN
- 조건구 없이 2개의 테이블을 하나로 조인 ← 조인구 없어서 카테시안 곱 발생
SELECT * FROM EMP CROSS JOIN DEPT
EMP 테이블 14건 and DEPT 테이블 4건 = 총 조인 4 * 14 = 60
- UNION(합집합)
- 두 개의 테이블 하나로 만드는 연산 → 중복된 데이터 제거하면서 테이블을 합침 → 정렬(SORT) 과정 발생 (주의사항) 두 개의 테이블의 칼럼 수. 칼럼의 데이터 형식 모두가 일치해야 됨
SELECT DEPTNO FROM EMP
UNION
SELECT DEPTNO FROM EMP;
- UNION ALL
- 단순하게 테이블을 합친다 (중복 제거 or 정렬 하지 않음)
SELECT DEPTNO FROM EMP
UNION ALL
SELECT DEPTNO FROM EMP;
- MINUS(차집합)
- 두 개의 테이블에서 차집합 조회 → 먼저 쓴 SELECT문에는 있고 뒤에 쓰는 SELECT문에는 없는 집합을 조회
SELECT DEPTNO FROM DEPT
MINUS
SELECT DEPTNO FROM EMP;
DEPT(10, 20, 30, 40) EMP(10,20,30) → 40만 조회됨
- 계층형 조회(Connect by)
- Oracle 데이터베이스에서 지원하는 것. 계층형으로 데이터 조회 가능
SELECT MAX(LEVEL) ← LEVEL에는 계층값을 가지고 있음(최대 계층 수 구할 수 있음)
FROM Limbest.EMP
START WITH MGR IS NULL
CONNECT BY PRIOR EMPNO = MGR;
Connect by: 트리(Tree) 형태의 구조로 질의를 수행하는 것
STARY WITH: 시작 조건 의미
CONNECT BY PRIOR: 조인 조건
→ 결과값 4(트리의 최대 깊이)
SELECT LEVEL, EMPNO, MGR, ENAME
FROM Limbest.EMP
START WITH MGR IS NULL
CONNECT BY PRIOR EMPNO = MGR;
LPAD함수: 계층형 조회 결과를 명확하게 볼 수 있다
SELECT LEVEL, LPAD(''. 4*(LEVEL -1)) || EMPNO, MGR, CONNECT_BY_ISLEAF ~
←4*LEVEL-1(LEVEL 값이 Root이면 1이 됨. 트리 형태를 보기 위해서 사용함)
CONNECT BY 키워드 -LEVEL: 검색 항목의 깊이. 계층 구조에서 가장 상위 레벨이 1 -CONNECT_BY_ROOT: 계층구조에서 가장 최상위 값 표시 -CONNECT_BY_ISLEAF: 계층구조에서 가장 최하위 표시 -SYS_CONNECT_BY_PATH: 계층구조의 전체 전개 경로 표시 -NOCYCLE: 순환구조가 발생지점까지만 전개 -CONNECT_BY_ISCYCLE: 순환구조 발생 지점 표시
- Subquery
- SELECT문에 다시 SELECT문을 사용하는 SQL
-인라인 뷰(View): FROM구에 SELECT문을 사용. 가상의 테이블을 만드는 효과를 얻을 수 있음
SELECT *
FROM (SELECT ROWNUM NUM, ENAME
FROM EMP) a
WHERE NUM < 5;
-스칼라 서브쿼리(Scala Subquery): SELECT문에 Subquery를 사용. 반드시 한 행과 한 컬럼만 반환하는 서브쿼리. 여러 행이 반환되면 오류 발생
SELECT ENAME AS "이름" SAL AS "급여",
(SELECT AVG(SAL)) ← 한 개의 행만 조회 되어야 함
FROM EMP) AS "평균급여"
FROM EMP
WHERE EMPNO=1000;
-서브쿼리(Subquery): WHERE구에 SELECT문을 사용
SELECT *
FROM EMP
WHERE DEPTNO =
(SELECT DEPTNO FROM DEPT
WHERE DEPTNO=10);
서브쿼리 종류(반환 행) -단일 행 서브쿼리(Signle row subquery): 결과는 반드시 한 행만 조회/ 비교 연산자(=, <, <=, >, >=, <>) 사용 -다중 행 서브쿼리(Multi row subquery): 결과는 여러 개의 행이 조회/ 다중 행 비교 연산자(IN, ANY, ALL, EXISTS) 사용
다중 행 비교 연산자 -IN(Subquery): Main query의 비교조건. Subquery 결과 중 하나만 동일하면 참 (OR조건) -ALL(Subquery): Main query와 Subquery의 결과가 모두 동일하면 참/ < ALL(최소값 반환)/ > ALL(최대값 반환) -ANY(Subquery): Main query의 비교조건. Subquery의 결과 중 하나 이상 동일하면 참/ < ANY(하나라도 크게 되면 참)/ > ANY(하나라도 작게 되면참) -EXIST(Subquery): Main query와 Subquery의 결과가 하나라도 존재하면 참
- IN
- 반환되는 여러 개의 행 중에서 하나만 참이 되어도 참이 되는 연산
SELECT ENAME, DNAME, SAL
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
AND EMP.EMPNO
IN (SELECT EMPNO FROM EMP
WHERE SAL >2000); ← 급여(SAL)가 2000원 보다 큰 사원번호 조회 후 EMP, EMPNO을 조회
- ALL
- 메인쿼리와 서브쿼리의 결과가 모두 동일하면 참
SELECT *
FROM EMP
WHERE DEPTNO <= ALL (20, 30) ← DEPTNO가 20, 30보다 작거나 같은 것 조회
- EXISTS
- Subquery로 어떤 데이터 존재 여부 확인 → 결과로 참과 거짓이 반환
SELECT ENAME, DNAME, SAL
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
AND EXIST (SELECT 1 FROM EMP
WHERE SAL > 2000); ← 급여(SAL)가 2000원 보다 큰 사원이 있으면 TRUE 조회
- 연관(Correlated) Subquery
- Subquery 내에서 Main Query 내의 칼럼을 사용하는 것을 의미
FROM EMP a
WHERE a.DEPTNO =
(SELECT DEPTNO FROM DEPT b
WHERE b.DEPTNO = a. DEPTNO)
- ROLLUP
- GROUP BY의 칼럼에 대해서 Subtotal 생성/ GROUP BY구에 칼럼이 두 개 이상 오면 순서에 따라서 결과가 달라짐
SELECT DECODE(DEPTNO, NULL, '전체합계'), SUB(SAL) ← DEPTNO가 NULL이면 '전체합계'문자 출력
FROM EMP
GROUP BY ROLLUP(DEPTNO); ← ROLLUP을 사용하면 부서별 합계 및 전체합계가 계산
SELECT DEPTNO, JOB, SUM(SAL)
FROM EMP
GROUP BY ROLLUP(DEPT, JOB); ← 부서별, 직업별 합계를 구함. ROLLUP은 subtotal을 구함
- GROUPING 함수
- ROLLUP, CUBE, GROUPING SETS에서 생성되는 합계값을 구분하기 위해서 만들어진 함수
SELECT DEPTNO, GROUPING(DEPTNO), JOB, GROUPING(JOB), SUM(SAL)
FROM EMP
GROUP BY ROLLUP(DEPTNO, JOB)
SELECT DEPTNO, DECODE(GROUPING(DEPTNO), 1, '전체합계') TOT, JOB
DECOED(GROUPING(JOB),1,'부서합계') T_DEPT, SUB(SAL)
FROM EMP
GROUP BY ROLLUP(DEPTNO, JOB)
- GROUPING SETS 함수
- GROUP BY에 나오는 칼럼의 순서와 관계없이 다양한 소계 생성 가능 and 칼럼의 순서와 관계없이 개별적으로 모두 처리
SELETE DEPTNO, JOB, SUM(SAL)
FROM EMP
GROUP BY GROUPTING SETS(DEPTNO, JOB); ← DEPTNO와 JOB을 각각의 그룹으로 합계를 계산. DEPT와 JOB 순서 바꿔도 결과는 같음
- CUBE 함수
- 제시한 칼럼에 대해서 결합 가능한 모든 집계를 계산. 다차원 집계 제공 다양하게 데이터를 분석 → 조합할 수 있는 경우의 수가 모두 조합
SELECT DEPTNO, JOB, SUM(SAL)
FROM EMP
GROUP BY CUBE(DEPTNO, JOB);