본문 바로가기
자격증/sqld

[sqld 과목2]SQL Server 과 Oracle 차이점 정리 & connect by prior

by 딸기뚜왈기 2025. 2. 13.

✅ SQL Server와 Oracle의 실행 차이점 정리

 

비교 항목 SQL Server Oracle
트랜잭션 자동 커밋 DML(DELETE, UPDATE, INSERT) 실행 시 자동 커밋 ❌  (명시적 COMMIT 필요) DML(DELETE, UPDATE, INSERT) 실행 시 자동 커밋 ❌  (명시적 COMMIT 필요)
DDL (CREATE, ALTER, DROP 등) 실행 후 자동 커밋 여부 ❌ 자동 커밋 안 됨 (ROLLBACK 가능) 자동 커밋됨 (ROLLBACK 불가능)
DML 실행 후 자동 COMMIT 여부
❌ 자동 COMMIT 안 됨 (트랜잭션 유지) ❌ 자동 COMMIT 안 됨 (트랜잭션 유지)
DML 실행 후 명시적 COMMIT 필요 여부 ✅ 필요 (COMMIT;을 실행해야 반영됨) ✅ 필요 (COMMIT;을 실행해야 반영됨)
DML 실행 후  ROLLBACK 가능 여부 ✅ 가능 (ROLLBACK; 실행 시 원복됨) ✅ 가능 (ROLLBACK; 실행 시 원복됨)
SELECT 실행 시 트랜잭션 영향
❌ 트랜잭션 시작 안 함 (SELECT만 실행해도 자동 COMMIT 없음) ✅ SELECT 실행만으로도 트랜잭션이 시작됨
IDENTITY(자동 증가) IDENTITY 사용 (AUTO_INCREMENT와 유사) SEQUENCE 객체 사용
문자열 타입 VARCHAR, NVARCHAR 사용 VARCHAR2, NVARCHAR2 사용 (VARCHAR 비권장)
날짜 타입 DATETIME, DATE, TIME, DATETIME2 사용 DATE, TIMESTAMP 사용
문자열 연결 연산자 + (예: 'Hello' + ' World')  || (예: 'Hello' || ' World')
LIMIT (결과 행 제한) TOP N 사용 (SELECT TOP 10 * FROM EMP;) ROWNUM 또는 FETCH FIRST N ROWS ONLY 사용
기본 값 설정 DEFAULT 사용 DEFAULT 사용 가능 (SYSDATE 같은 함수도 가능)
DELETE 속도 차이 DELETE 실행 시 하드 딜리트 (바로 삭제) DELETE 후 UNDO 영역에서 복구 가능
NULL 처리 (비교 연산) NULL = NULL → FALSE NULL = NULL → FALSE
VARCHAR 비교 시 공백 처리 VARCHAR(10) = 'A ' → 다름 (길이 비교) VARCHAR2(10) = 'A ' → 동일 (자동 트림)
조인 방식 차이 INNER JOIN, OUTER JOIN 사용 (+), INNER JOIN, OUTER JOIN 사용
함수 차이 GETDATE() (현재 날짜/시간) SYSDATE, SYSTIMESTAMP (현재 날짜/시간)
SELECT 실행 후 트랜잭션 영향 트랜잭션 시작 아님 (SELECT만 실행해도 자동 커밋 없음) SELECT 실행만으로도 트랜잭션이 시작됨 (명시적 COMMIT 필요)

🔹 주요 실행 차이점 예제

1️⃣ 자동 증가(AUTO_INCREMENT) 차이

SQL Server

#sql

CREATE TABLE EMP ( EMP_ID INT IDENTITY(1,1) PRIMARY KEY, NAME VARCHAR(50) );

Oracle

CREATE TABLE EMP ( EMP_ID NUMBER PRIMARY KEY, NAME VARCHAR2(50) ); 

CREATE SEQUENCE EMP_SEQ START WITH 1 INCREMENT BY 1; 
INSERT INTO EMP VALUES (EMP_SEQ.NEXTVAL, '홍길동');

2️⃣ 문자열 연결 연산자 차이

SQL Server

SELECT 'Hello' + ' World'; -- 결과: Hello World

Oracle

SELECT 'Hello' || ' World' FROM DUAL; -- 결과: Hello World

3️⃣ 상위 10개 행 조회

SQL Server

SELECT TOP 10 * FROM EMP;
 

Oracle

SELECT * FROM EMP FETCH FIRST 10 ROWS ONLY;
 

4️⃣ 현재 날짜 및 시간 조회

SQL Server

 
SELECT GETDATE();

Oracle

SELECT SYSDATE FROM DUAL;
 

5️⃣ DELETE 후 복구 가능 여부(delete는 DML이므로 둘 다 ROLLBACK 가능)

SQL Server

DELETE FROM EMP WHERE EMP_ID = 1; ROLLBACK; -- 가능 (트랜잭션이 살아 있을 경우)
 

Oracle

DELETE FROM EMP WHERE EMP_ID = 1; ROLLBACK; -- 가능 (UNDO 영역에 저장됨)
 

 

 

🚀 결론

  • SQL ServerOracle은 기본 SQL 문법이 유사하지만, 트랜잭션 처리, AUTO_INCREMENT, 문자열 처리, LIMIT, 조인 방식 등에서 차이가 있음.
  • DDL 실행 후 자동 커밋 여부: SQL Server는 ROLLBACK 가능, Oracle은 ROLLBACK 불가능.
  • VARCHAR 처리 방식 차이: SQL Server는 공백 비교, Oracle은 자동 TRIM.
  • 데이터 삭제 방식 차이: Oracle은 UNDO를 활용해 DELETE 후 복구 가능.

 


📌 SQL Server vs. Oracle DDL 실행 후 ROLLBACK 차이

 

구분 SQL Server Oracle
DDL 실행 후 ROLLBACK 가능 여부 ✅ 가능 (트랜잭션 시작 시) ❌ 불가능 (자동 COMMIT)
DDL 실행 후 자동 COMMIT 여부 ❌ 자동 COMMIT 안됨 (트랜잭션이 없으면 즉시 반영) ✅ 자동 COMMIT 발생
DDL 실행 후 되돌리는 방법 BEGIN TRANSACTION 후 ROLLBACK Flashback 기술 사용 필요 (FLASHBACK TABLE)

 

 

🔎 DDL 실행 후 ROLLBACK 가능 여부 (SQL Server vs. Oracle)

DDL (Data Definition Language) 명령어 (CREATE, ALTER, DROP, TRUNCATE)는 데이터 구조를 변경하는 명령어이며, Oracle과 SQL Server에서 ROLLBACK 처리 방식이 다릅니다.

SQL ServerDDL 실행 후에도 ROLLBACK 가능 (명시적 트랜잭션 내에서 실행 시)
OracleDDL 실행 후 자동 COMMIT, ROLLBACK 불가능


📌 SQL Server vs. Oracle DDL 실행 후 ROLLBACK 차이

 

구분 SQL Server Oracle
DDL 실행 후 ROLLBACK 가능 여부 ✅ 가능 (트랜잭션 시작 시) ❌ 불가능 (자동 COMMIT)
DDL 실행 후 자동 COMMIT 여부 ❌ 자동 COMMIT 안됨 (트랜잭션이 없으면 즉시 반영) ✅ 자동 COMMIT 발생
DDL 실행 후 되돌리는 방법 BEGIN TRANSACTION 후 ROLLBACK Flashback 기술 사용 필요 (FLASHBACK TABLE)

✅ 실행 예제 비교 (SQL Server vs. Oracle)

1️⃣ DROP TABLE 실행 후 ROLLBACK

✅ SQL Server (ROLLBACK 가능)

BEGIN TRANSACTION; 
DROP TABLE EMP; -- 테이블 삭제 
ROLLBACK; -- 테이블 복구 가능 

SELECT * FROM EMP; -- 삭제되지 않고 그대로 유지됨

SQL Server에서는 BEGIN TRANSACTION으로 트랜잭션을 시작하면 DDL도 ROLLBACK 가능


❌ Oracle (ROLLBACK 불가능)

DROP TABLE EMP; -- 테이블 삭제 (자동 COMMIT 발생) 
ROLLBACK; -- ❌ 복구 불가능 

SELECT * FROM EMP; -- 오류 발생 (테이블이 삭제됨)

Oracle에서는 DROP TABLE 실행 즉시 자동 COMMIT 발생 → ROLLBACK 불가능


2️⃣ TRUNCATE TABLE 실행 후 ROLLBACK

✅ SQL Server (ROLLBACK 가능)

BEGIN TRANSACTION; 
TRUNCATE TABLE EMP; -- 모든 데이터 삭제 
ROLLBACK; -- 데이터 복구 가능 

SELECT * FROM EMP; -- 데이터가 복구됨

SQL Server에서는 TRUNCATE도 트랜잭션 내에서 ROLLBACK 가능


❌ Oracle (ROLLBACK 불가능)

TRUNCATE TABLE EMP; -- 데이터 삭제 (자동 COMMIT 발생) 
ROLLBACK; -- ❌ 복구 불가능 

SELECT * FROM EMP; -- 데이터가 삭제된 상태

Oracle에서는 TRUNCATE 실행 즉시 자동 COMMIT 발생 → ROLLBACK 불가능


3️⃣ ALTER TABLE 실행 후 ROLLBACK

✅ SQL Server (ROLLBACK 가능)

BEGIN TRANSACTION; 
ALTER TABLE EMP ADD AGE NUMBER; -- 컬럼 추가 
ROLLBACK; -- 컬럼 추가 취소 

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'EMP'; 
-- AGE 컬럼이 존재하지 않음 (ROLLBACK 성공)

SQL Server에서는 ALTER TABLE도 트랜잭션 내에서 ROLLBACK 가능


❌ Oracle (ROLLBACK 불가능)

ALTER TABLE EMP ADD AGE NUMBER; -- 컬럼 추가 (자동 COMMIT 발생) 
ROLLBACK; -- ❌ 복구 불가능 

SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'EMP'; 
-- AGE 컬럼이 여전히 존재함 (ROLLBACK 안 됨)

Oracle에서는 ALTER TABLE 실행 즉시 자동 COMMIT 발생 → ROLLBACK 불가능


🔹 Oracle에서 DDL을 되돌리는 방법

  1. FLASHBACK TABLE 사용 (Oracle 10g 이상)
DROP TABLE EMP; 
FLASHBACK TABLE EMP TO BEFORE DROP;

Oracle에서 테이블 삭제 후 복구 가능 (RECYCLEBIN이 활성화된 경우)

  1. UNDO TABLESPACE 활용 (일반적으로 DELETE만 복구 가능, DDL 복구 불가능)

🚀 정리

구분 SQL server Oracle
DROP TABLE 후 ROLLBACK ✅ 가능 (트랜잭션 내에서) ❌ 불가능 (자동 COMMIT)
TRUNCATE TABLE 후 ROLLBACK ✅ 가능 (트랜잭션 내에서) ❌ 불가능 (자동 COMMIT)
ALTER TABLE 후 ROLLBACK ✅ 가능 (트랜잭션 내에서) ❌ 불가능 (자동 COMMIT)
DDL 실행 후 자동 COMMIT 여부 ❌ 없음 (트랜잭션 내에서 실행 시 ROLLBACK 가능) ✅ 있음 (자동 COMMIT)
ROLLBACK 대신 사용할 수 있는 방법 BEGIN TRANSACTION 후 실행 FLASHBACK TABLE 사용 가능

 

💡 결론:

  • SQL Server는 DDL도 BEGIN TRANSACTION으로 감싸면 ROLLBACK 가능
  • Oracle은 DDL 실행 시 자동 COMMIT 발생 → ROLLBACK 불가능
  • Oracle에서 DDL을 복구하려면 FLASHBACK TABLE 같은 기능을 사용해야 함

 

 

ORDER BY 1, 2의 의미

정렬 방식 설명

1️⃣ 첫 번째 기준(1):

  • SELECT 절의 첫 번째 컬럼을 기준으로 정렬합니다.
  • 이 컬럼의 값이 같다면 다음 기준으로 넘어갑니다.

2️⃣ 두 번째 기준(2):

  • SELECT 절의 두 번째 컬럼을 기준으로 정렬합니다.
  • 첫 번째 컬럼 기준으로 정렬이 다 되지 않은 경우, 이 기준이 적용됩니다.

 

더보기
더보기

예제

SELECT 이름, 나이, 주소 
FROM 회원정보 
ORDER BY 1, 2;

🔍 해석

  • 첫 번째 기준(1): 이름을 오름차순으로 정렬
  • 두 번째 기준(2): 나이를 오름차순으로 정렬
    → 즉, 이름이 같은 경우 나이 순으로 추가 정렬됨.

DESC (내림차순)와 함께 사용

SELECT 이름, 나이, 주소 
FROM 회원정보 
ORDER BY 1 ASC, 2 DESC;
  • 이름은 오름차순
  • 나이는 내림차순

왜 숫자를 사용할까?

  • 컬럼 이름 대신 숫자를 사용하면 가독성이 좋아질 때가 있어요.
  • 특히 복잡한 계산식이나 별칭(AS)이 사용된 경우 유용합니다.

예시:

SELECT 제품명, 가격 * 수량 AS 총가격 
FROM 주문내역
ORDER BY 2 DESC;

→ 총가격 컬럼(두 번째 컬럼)을 기준으로 내림차순 정렬합니다.

 

일반 집합 연산자를 SQL과 비교

  • UNION 연산은  UNION 기능
  • INTERSECTION 연산은 INTERSECT 기능
  • DIFFERENCE 연산은 EXCEPT(ORACLE은 MINUS) 기능
  • PRODUCT 연산은 CROSS JOIN 기능으로 구현함.

 

계층형 질의 : 테이블에 계층형 데이터가 존재하는 경우 데이터 조회를 위해 사용됨.

계층형 데이터 : 동일 테이블에 계층적으로 상위와 하위 데이터가 포함된 데이터.

EX) 사원 테이블에서는 사원들 사이에 상위 사원(관리자)과 하위 사원 관계가 존재하고 조직 테이블에서는 조직들 사이에 상위 조직과 하위 조직 관계가 존재한다.

 

ORACLE 계층형 질의

 

  • START WITH: 계층 구조 시작 지점(루트)을 지정합니다.
  • PRIOR: 부모와 자식 관계를 설정하며, 부모->자식 또는 자식->부모 방향을 지정합니다.
    • 오라클 계층형 질의문에서 PRIOR 키워드는 SELECT, WHERE 절에서도 사용할 수 있다.
  • ORDER SIBLINGS BY: 형제 관계의 자식들을 정렬하는 방식입니다.
  • 오라클 계층형 질의에서 루트 노드의 LEVEL 값은 1이다.
  • 오라클의 계층형 질의문에서 WHERE 절은 모든 전개를 진행한 이후 필터 조건으로서 조건을 만족하는 데이터만을 추출하는데 활용된다.

CF) SQL Server에서는 재귀적 CTE 방식이 가장 흔하게 사용되는 계층형 질의 처리 방법입니다.

SQL Server에서의 계층형 질의문은 앵커 멤버를 실행하여 기본 결과 집합을 만들고 이후 재귀 멤버를 지속적으로 실행한다.

 

 

문제 예시>>

C1 C2 C3
1 NULL A
2 1 B
3 1 C
4 2 D

 

 

SELECT C3 
FROM TAB1 
START WITH C2 IS NULL 
CONNECT BY PRIOR C1=C2 
ORDER  SIBLINGS BY C3 DESC;

 

더보기
더보기

쿼리 설명:

  1. START WITH C2 IS NULL:
    • C2=NULL인 첫 번째 행에서 시작합니다.
    • 첫 번째 행: C1=1, C2=NULL, C3=A.

CONNECT BY PRIOR C1 = C2의 의미:

  • PRIOR C1 = C2는 부모-자식 관계를 형성하는 조건입니다. C1 값이 부모이고, 그 부모의 C1 값이 자식의 C2 값과 같을 때 연결이 됩니다.

첫 번째 행 (C1=1, C2=NULL, C3=A)에서 시작:

  1. **C1=1**은 C2=NULL이기 때문에 부모가 되며, 그다음 자식들은 C2=1인 행들로 연결됩니다.

두 번째 행 (C1=2, C2=1, C3=B)과 세 번째 행 (C1=3, C2=1, C3=C):

  • 두 번째 행과 세 번째 행의 C2=1이 **부모인 C1=1**과 연결됩니다.
  • 이 두 행은 C1=1을 부모로 가지며, 형제 관계로 이어집니다.

이제 중요한 점: 네 번째 행 (C1=4, C2=2, C3=D)은 **부모가 C1=2**입니다.

연결 과정:

  1. 두 번째 행과 세 번째 행에서 부모가 C1=1이었고, 이들은 형제 관계로 연결됩니다.
  2. 네 번째 행 (C1=4, C2=2, C3=D)에서 부모는 **C1=2**입니다.
    • **C2=2**는 **C1=2**와 연결되기 때문에, 네 번째 행은 **C1=2**를 부모로 가지는 자식이 됩니다.

계층적 관계:

  1. C1=1에서 시작하여, 자식들인 C1=2, C1=3이 부모 C1=1과 연결됩니다.
  2. C1=2를 부모로 가지는 **C1=4**가 마지막 자식으로 이어집니다.

최종 출력 결과:

  1. C3=A: C1=1, C2=NULL (부모)
  2. C3=C: C1=3, C2=1 (형제)
  3. C3=B: C1=2, C2=1 (형제)
  4. C3=D: C1=4, C2=2 (부모 C1=2의 자식)

 

더보기
더보기

[테이블 : 사원]

사원번호(PK) 사원명 입사일자 매니저사원번호(FK)
001 홍길동  2012-01-01 NULL
002 강감찬 2012-01-01 001
003 이순신 2013-01-01 001
004 이민정 2013-01-01 001
005 이병헌 2013-01-01 NULL
006 안성기 2014-01-01 005
007 이수근 2014-01-01 005
008 김병만 2014-01-01 005

[SQL]

SELECT 사원번호, 사원명, 입사일자, 매니저사원번호 
FROM 사원
START WITH 매니저사원번호 IS NULL
CONNECT BY PRIOR 사원번호 = 매니저사원번호
AND 입사일자 BETWEEN '2013-01-01' AND '2013-01-01'
ORDER SIBLINGS BY 사원번호;

 

 

[결과]

사원번호(PK) 사원명 입사일자 매니저사원번호(FK)
001 홍길동 2012-01-01 NULL
003 이순신 2013-01-01 001
004 이민정 2013-01-01 001
005 이병헌 2013-01-01 NULL

🎯 최종 정리

  • START WITH 절은 루트 노드 조건을 충족하는 모든 행을 루트 노드로 포함합니다.
  • AND 입사일자 BETWEEN ... 조건은 하위 노드 탐색 시 적용됩니다.
  • 따라서, 홍길동(001)과 이병헌(005) 모두 루트 노드로 선택됩니다.
  • ORDER SIBLINGS BY 사원번호 조건으로 인해 **사원번호가 낮은 홍길동(001)**이 먼저 출력됩니다.

 

 

 

#91 번 (96PG) 

'CONNECT BY 상위부서코드 = PRIOR 부서코드' 와 'CONNECT BY PRIOR 부서코드 = 상위부서코드' 

둘의 차이

 

🔍 1. CONNECT BY 상위부서코드 = PRIOR 부서코드

💡 탐색 방향: 부모 → 자식 (하향식 탐색, Top-Down)

  • 의미:
    • 부모의 부서코드가 자식의 상위부서코드와 일치할 때 연결합니다.
    • **루트 노드(상위부서코드가 NULL)**부터 시작하여 **하위 부서(자식)**로 내려가며 탐색합니다.

📊 예시 데이터:

부서코드 부서명 상위부서코드
100 본사 NULL
200 영업부 100
300 마케팅부 100
400 영업1팀 200
500 영업2팀 200

📝 쿼리 예시:

SELECT 부서코드, 부서명, 상위부서코드 
FROM 부서 
START WITH 상위부서코드 IS NULL 
CONNECT BY 상위부서코드 = PRIOR 부서코드;

🖇️ 결과 (Top-Down 탐색):

100 본사
├─ 200 영업부
│ ├─ 400 영업1팀
│ └─ 500 영업2팀
└─ 300 마케팅부

 


🔄 2. CONNECT BY PRIOR 부서코드 = 상위부서코드

💡 탐색 방향: 자식 → 부모 (상향식 탐색, Bottom-Up)

  • 의미:
    • 자식의 상위부서코드가 부모의 부서코드와 일치할 때 연결합니다.
    • **하위 노드(자식 부서)**에서 시작하여 **상위 노드(부모 부서)**로 올라갑니다.

📝 쿼리 예시:

SELECT 부서코드, 부서명, 상위부서코드 
FROM 부서 
START WITH 부서코드 = 400 -- 영업1팀에서 시작 
CONNECT BY PRIOR 부서코드 = 상위부서코드;

🖇️ 결과 (Bottom-Up 탐색):

 
400 영업1팀
└─ 200 영업부
└─ 100 본사

더보기
더보기

📝 쿼리 로직 분석

  • START WITH 부서코드 = 400:
    • **영업1팀(400)**이 루트 노드로 시작됩니다.
  • CONNECT BY PRIOR 부서코드 = 상위부서코드:
    • 이 조건은 **자식(현재 행)의 상위부서코드 = 부모(이전 행)의 부서코드**인 경우 두 행을 연결합니다.
    • 즉, PRIOR가 부모를 나타내므로, 탐색 방향은 자식 → 부모입니다.

🔄 400에서 상위 부서 탐색 과정

  1. 루트 노드 설정:
    • 부서코드 = 400 (영업1팀) 선택됨.
    • 이때 400이 포함된 행은 루트 노드 역할만 합니다.
    • 즉, 400이 포함된 행 자체가 다른 행의 자식 노드로 사용되지는 않습니다.
  2. 첫 번째 상위 노드 탐색:
    • 영업1팀(400)의 상위부서코드는 200.
    • 조건: PRIOR 부서코드 = 상위부서코드에 따라, **현재 행의 상위부서코드(200)**와 **이전(루트) 행의 부서코드(400)**가 일치하는지를 검사합니다.
    • 💡 여기서 중요한 점:
      • 영업부(200)는 영업1팀(400)의 부모 노드가 되며, 바로 400의 상위 노드로 연결됩니다.
  3. 다음 상위 노드 탐색:
    • 영업부(200)의 상위부서코드는 100.
    • 같은 방식으로 본사(100)와 연결됩니다.

최종 결과

markdown
복사편집
400 영업1팀 └─ 200 영업부 └─ 100 본사

💡 핵심 요점:

  • START WITH에서 지정한 **루트 노드(400)**가 탐색의 출발점입니다.
  • 400이 포함된 행루트 노드 역할만 수행하고,
    👉 이후 탐색은 해당 루트 행의 상위부서코드를 통해 상위 노드와 연결됩니다.
  • 500이 포함된 행은 별도로 탐색되지 않습니다. (왜냐하면, 탐색 경로가 400에서 시작해 상위 노드로만 올라가기 때문입니다.)

🎯 결론

  • START WITH 절에서 지정된 행(400)은 단순히 루트로 시작합니다.
  • 루트 행 자체가 다른 행의 상위부서코드에 자동으로 포함되는 것은 아닙니다.
  • 탐색은 루트의 상위부서코드 값을 따라 상위 계층으로만 연결됩니다.

 

⚖️ 비교 요약

구문탐색 방향탐색 흐름용도

CONNECT BY 상위부서코드 = PRIOR 부서코드 Top-Down 부모 → 자식 전체 조직도 출력, 하위 부서 탐색
CONNECT BY PRIOR 부서코드 = 상위부서코드 Bottom-Up 자식 → 부모 특정 부서의 상위 조직 추적, 보고 경로 탐색

🎯 실전 팁

  • 조직도, 제품 카테고리와 같은 트리 구조 출력 시:
    ✅ CONNECT BY 상위부서코드 = PRIOR 부서코드 (부모 → 자식)
  • 특정 부서의 상위 경로를 추적할 때:
    ✅ CONNECT BY PRIOR 부서코드 = 상위부서코드 (자식 → 부모)

핵심 요약 한 줄

  • PRIOR가 앞에 있으면 → 상향식(Bottom-Up) 탐색
  • PRIOR가 뒤에 있으면 → 하향식(Top-Down) 탐색

 

 

 

예시를 들어

CONNECT BY PRIOR 보충 설명.

📚 테이블 데이터

장치이름 상위장치
하드웨어 NULL
중앙처리장치 하드웨어
기억장치 하드웨어
입출력장치 하드웨어
입력장치 입출력장치
   
출력장치 입출력장치

 

1. EX)CONNECT BY PRIOR 장치이름 = 상위장치

더보기
더보기

📝 쿼리 설명

SELECT 장치이름, 상위장치, LEVEL FROM TAB1 
START WITH 상위장치 IS NULL 
CONNECT BY PRIOR 장치이름 = 상위장치 
ORDER SIBLINGS BY 장치이름 DESC;

🔍 쿼리 해석

  • START WITH 상위장치 IS NULL: 상위장치가 NULL인 루트 노드(여기서는 '하드웨어')부터 시작.
  • CONNECT BY PRIOR 장치이름 = 상위장치: 부모(PRIOR 장치이름)와 자식(상위장치) 관계를 따라 계층적으로 탐색.
  • ORDER SIBLINGS BY 장치이름 DESC: 같은 부모를 가진 형제 노드끼리는 장치이름 기준으로 내림차순 정렬.

🌳 실행 결과 (예상)


장치이름 상위장치 LEVEL
하드웨어 NULL 1
중앙처리장치 하드웨어 2
입출력장치 하드웨어 2
출력장치 입출력장치 3
입력장치 입출력장치 3
기억장치 하드웨어 2

 

🌳 계층 구조 시각화(SCSS)

 

하드웨어 (LEVEL1)
├── 중앙처리장치(LEVEL2)
├── 입출력장치(LEVEL2)
│   ├── 출력장치(LEVEL3)
│   └── 입력장치(LEVEL3)
└── 기억장치(LEVEL2)
 

🔎 3. 왜 입출력장치 그룹이 먼저 나오는가?

LEVEL 2에서 하드웨어의 자식들은 다음과 같이 내림차순 정렬돼:

  • 입출력장치
  • 중앙처리장치
  • 기억장치

👉 내림차순(DESC)이므로 입출력장치가 가장 먼저 출력됨.


🛠 4. 자식 노드 탐색 규칙

  • CONNECT BY는 부모의 자식을 출력할 때 해당 자식의 하위 노드까지 모두 탐색한 후
    다음 형제 노드를 탐색해.
  • 그래서 입출력장치를 출력한 직후, **그 자식인 출력장치, 입력장치**를 LEVEL 3에서 내림차순으로 출력하고,
    이후에 **LEVEL 2의 나머지 형제 노드인 중앙처리장치와 기억장치**를 출력하는 것.

5. 최종 결과 해석


장치이름 상위장치 LEVEL 설명
하드웨어 NULL 1 루트 노드
입출력장치 하드웨어 2 하드웨어의 자식 (내림차순 중 첫 번째)
출력장치 입출력장치 3 입출력장치의 자식 (내림차순 첫 번째)
입력장치 입출력장치 3 입출력장치의 자식 (내림차순 두 번째)
중앙처리장치 하드웨어 2 하드웨어의 두 번째 자식
기억장치 하드웨어 2 하드웨어의 세 번째 자식

 

 

2. EX)CONNECT BY PRIOR 상위장치 = 장치이름 

더보기
더보기

📝 쿼리 설명

SELECT 장치이름, 상위장치, LEVEL 
FROM TAB1
START WITH 상위장치 IS NULL
CONNECT BY PRIOR 상위장치 = 장치이름
ORDER SIBLINGS BY 장치이름 DESC;

 

🔍 쿼리 해석

  • START WITH 상위장치 IS NULL: '하드웨어'부터 시작.
  • CONNECT BY PRIOR 상위장치 = 장치이름: 자식에서 부모 방향으로 탐색 (역방향 트리).
  • ORDER SIBLINGS BY 장치이름 DESC: 같은 레벨의 형제 노드를 내림차순 정렬.

🌳 쿼리 실행 결과


장치이름 상위장치 LEVEL
하드웨어 NULL 1
중앙처리장치 하드웨어 2
입출력장치 하드웨어 2
출력장치 입출력장치 3
입력장치 입출력장치 3
기억장치 하드웨어 2

 

🌳 계층 구조 시각화(SCSS)

하드웨어 (LEVEL1)
├── 중앙처리장치(LEVEL2)
├── 입출력장치(LEVEL2)
│   ├── 출력장치(LEVEL3)
│   └── 입력장치(LEVEL3)
└── 기억장치(LEVEL2)

📌 💡 1번과 2번 차이점 요약

1번 쿼리 (CONNECT BY PRIOR 장치이름 = 상위장치)2번 쿼리 (CONNECT BY PRIOR 상위장치 = 장치이름)

  1번 쿼리 (CONNECT BY PRIOR 장치이름 = 상위장치) 2번 쿼리 (CONNECT BY PRIOR 상위장치 = 장치이름)
🔄 탐색 방향 부모 (상위장치) → 자식
Top-down
자식  → 부모 (상위장치)
Bottom-up

트리구조

루트부터 하위 노드로 내려감. 리프 노드부터 부모 노드로 거슬러 올라감.
🧩 결과 구조 하드웨어부터 자식 노드를 단계적으로 탐색 하위 노드부터 상위 노드까지 역순으로 탐색
🎯 출력 순서 동일 (내림차순 형제 정렬로 같은 결과) 동일 (탐색 방식만 다름)
LEVEL 2 순서 중앙처리장치 → 입출력장치 → 기억장치 동일 (단, 탐색 경로 차이 있음)
LEVEL 3 순서 출력장치 → 입력장치 동일 (입출력장치 하위에서 적용)