개념적 데이터 모델링을 ERD 로 나타낸다. ERD ( Entity Relationship Diagram / 개체 관계도 ) 에서의 엔터티 또는 관계는 논리적 모델링 단계에서 테이블 ( 릴레이션 ) 로 표현할 수 있다. 실무에서는 개념적 데이터 모델링과 논리적 데이터 모델링의 구분이 보편적으로 없고, 엔터티라고 하는 것은 논리적 모델링에서의 테이블을 의미한다.
( 하나의 ) 테이블을 기준으로 계층형 데이터를 나타낼 수 있다면 ( 생성할 수 있다면 ), 여기서 계층형 데이터란 예를 들어 직원 테이블에는 기본적으로 직원의 정보를 담고 있다. 모두 회사의 직원이지만 직급 ( 계급 ) 이 존재할 경우 한 명의 회장 [ 한 명의 직원 ] 이 여러 명의 관리자 [ 여러 명의 직원 ] 를 관리할 수 있고, 한 명의 관리자 [ 한 명의 직원 ] 가 여러 명의 직원 [ 여러 명의 직원 ] 을 관리할 수 있다. 직원이 직원을 관리하는 형상이 마치 나무가지가 여러 개 뻗쳐 있는 나무와 같다 [ 왼쪽에 있는 그림 참고 ]
( 하나의 ) 테이블을 기준으로 행 ( 레코드 / 인스턴스 ) 과의 관계에 있어 단방향 관계를 나타낼 수 있을 경우 순환 관계라 할 수 있고, 순환 관계인 테이블을 계층형 구조로 나타낼 수 있다.
계층형 구조인 계층형 데이터는 계층형 질의를 통해 보다 효율적으로 접근할 수 있다.
계층형 질의에는 2가지 방향이 존재한다. 순방향 과 역방향 이다.
그래서 계층형 질의를 할 때는 순방향 인지 역방향 전개인지에 대한 정보를 포함해야 한다.
계층형 질의 방향: 어디서부터 시작할건지 ( 시작 조건 지정 ) START WITH 키워드와 함께 작성해준다.
예를 들어 START WITH MGR IS NULL 일 경우 MGR 컬럼에 대응하는 값이 NULL 인 행부터 시작한다는 것이다.
시작점은 MGR 컬럼에 대응하는 데이터의 값이 NULL 인 곳에서
어떤 방향으로 전개할 것인지에 대한 정보도 작성해야 하는데 ( 다음에 전개될 방향 지정 ) CONNECT BY 키워드와 함께 작성해준다.
순방향 계층형 질의시 START WITH 시작점이 여러 곳일 경우
SYS_CONNECT_BY_PATH 는 시작점으로부터 해당 데이터에 도착하기까지 어떤 경로를 거쳐 왔는지를 나타낸다.
LEVEL / CONNECT_BY_ISLEAP 칼럼에 대응하는 값은 어디서 시작하고, 어떤 방향으로 전개되는지에 따라 달라진다.
집합연산자는 여러 질의 ( SELECT 문 ) 결과를 하나로 결합하기 위해 사용한다 → 둘 이상의 SELECT 문을 결합하는 것
결합하기 위해 집합 연산 ( ex. UNION ) 의 대상이 되는 두 질의 ( SELECT문 ) 는
- SELECT절의 칼럼 수가 동일해야 하고 → 컬럼의 수가 다르면 에러가 난다.
- SELECT절의 동일 위치에 존재하는 칼럼의 데이터 타입이 상호 호환이 가능해야 한다 → 동일 위치에 있는 칼럼의 데이터 타입이 상호 호환이 불가능할 때 에러가 난다. 반드시 동일한 데이터 타입일 필요는 없다.
중복제거를 먼저 진행하고 합집합, 교집합, 차집합 연산을 진행한다.
집합 연산 질의 작성시 ORDER BY 는 집합 연산을 적용한 최종 결과에만 적용이 가능하기 때문에 맨 마지막 줄에 한 번만 기술한다.
UNION ALL 사용 예시
SELECT 'T' 구분코드, PLAYER_NAME, TEAM_ID
FROM PLAYER
WHERE TEMA_ID = 'K06' → PLAYER 테이블에서 TEAM_ID 가 'K06' 인 인스턴스 ( 레코드 ) 들을 추출한 후,
추출된 레코드에 기반하여 PLAYER_NAME과 TEAM_ID 칼럼을 뽑아낸다. 'T' 구분코드 → 구분코드 라는 이름을 가진 칼럼의
데이터는 모드 T 로 채운다. 구분코드는 어떤 SELECT절의 결과인지를 식별하는 컬럼이다.
UNION ALL
SELECT 'P' 구분코드, PLAYER_NAME, POSITION
FROM PLAYER
WHERE POSITION = 'GK'; → PLAYER 테이블에서 POSITION 칼럼에 대응하는 데이터 'GK'에 해당하는 레코드를 모두 추려낸 후,
추출된 레코드에 기반하여 PLAYER_NAME 과 TEAM_ID 칼럼을 뽑아내고, POSITION 컬럼의 데이터에 기반하여 레코드를 추출한 SELECT절의 결과라는 것을 나타내기 위해 'P' 구분코드를 SELECT 절에 추가한다.
집합 연산자 ( UNION ALL ) 이 작성된 질의의 결과를 정렬하고 싶을 때
맨 마지막에 ORDER BY 절을 작성하는데 출력 컬럼의 컬럼명의 첫 SELECT문의 칼럼명이 적용된다.
만약 ORDER BY 구분코드, POSITION 이라고 작성했다면 에러가 난다.
INTERSECT 연산자를 사용한 결과가 출력되어야 하는데
INTERSECT 집합 연산자를 사용하지 않고 구현해야한다면 조건절에 AND 를 사용하여
동일한 결과를 구현할 수 있다 → INTERSECT 연산자는 조건절에서 AND 로 구현할 수 있다.
집합 연산자 사용시 ORDER BY 는 맨 마지막 줄에
ORDER BY 에 사용되는 컬럼명은 첫 번째 SELECT문에 사용된 컬럼명만 허용이 가능하고,
만약 컬럼명에 별칭을 작성했다면 별칭이 ORDER BY 절에 사용되어야 한다.
별칭을 작성했는데, 별칭을 사용하지 않고, 원래의 컬럼명을 작성한다면 에러가 발생한다.
'SQLD · DB' 카테고리의 다른 글
[ SQLD ] SQL - Join & Set Operation 240818 (0) | 2024.08.18 |
---|---|
[ SQLD ] SQL - TCL / DCL 240817 (0) | 2024.08.17 |
[ SQLD ] Function 240817 (0) | 2024.08.17 |
[ SQLD ] DDL 240816 (0) | 2024.08.16 |
[ SQLD ] SQL - DDL 240815 (0) | 2024.08.16 |