✅ 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 Server와 Oracle은 기본 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 Server → DDL 실행 후에도 ROLLBACK 가능 (명시적 트랜잭션 내에서 실행 시)
❌ Oracle → DDL 실행 후 자동 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을 되돌리는 방법
- FLASHBACK TABLE 사용 (Oracle 10g 이상)
DROP TABLE EMP;
FLASHBACK TABLE EMP TO BEFORE DROP;
✔ Oracle에서 테이블 삭제 후 복구 가능 (RECYCLEBIN이 활성화된 경우)
- 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;
쿼리 설명:
- 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)에서 시작:
- **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**입니다.
연결 과정:
- 두 번째 행과 세 번째 행에서 부모가 C1=1이었고, 이들은 형제 관계로 연결됩니다.
- 네 번째 행 (C1=4, C2=2, C3=D)에서 부모는 **C1=2**입니다.
- **C2=2**는 **C1=2**와 연결되기 때문에, 네 번째 행은 **C1=2**를 부모로 가지는 자식이 됩니다.
계층적 관계:
- C1=1에서 시작하여, 자식들인 C1=2, C1=3이 부모 C1=1과 연결됩니다.
- C1=2를 부모로 가지는 **C1=4**가 마지막 자식으로 이어집니다.
최종 출력 결과:
- C3=A: C1=1, C2=NULL (부모)
- C3=C: C1=3, C2=1 (형제)
- C3=B: C1=2, C2=1 (형제)
- 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 탐색):
🔄 2. CONNECT BY PRIOR 부서코드 = 상위부서코드
💡 탐색 방향: 자식 → 부모 (상향식 탐색, Bottom-Up)
- 의미:
- 자식의 상위부서코드가 부모의 부서코드와 일치할 때 연결합니다.
- **하위 노드(자식 부서)**에서 시작하여 **상위 노드(부모 부서)**로 올라갑니다.
📝 쿼리 예시:
SELECT 부서코드, 부서명, 상위부서코드
FROM 부서
START WITH 부서코드 = 400 -- 영업1팀에서 시작
CONNECT BY PRIOR 부서코드 = 상위부서코드;
🖇️ 결과 (Bottom-Up 탐색):
📝 쿼리 로직 분석
- START WITH 부서코드 = 400:
- **영업1팀(400)**이 루트 노드로 시작됩니다.
- CONNECT BY PRIOR 부서코드 = 상위부서코드:
- 이 조건은 **자식(현재 행)의 상위부서코드 = 부모(이전 행)의 부서코드**인 경우 두 행을 연결합니다.
- 즉, PRIOR가 부모를 나타내므로, 탐색 방향은 자식 → 부모입니다.
🔄 400에서 상위 부서 탐색 과정
- 루트 노드 설정:
- 부서코드 = 400 (영업1팀) 선택됨.
- 이때 400이 포함된 행은 루트 노드 역할만 합니다.
- 즉, 400이 포함된 행 자체가 다른 행의 자식 노드로 사용되지는 않습니다.
- 첫 번째 상위 노드 탐색:
- 영업1팀(400)의 상위부서코드는 200.
- 조건: PRIOR 부서코드 = 상위부서코드에 따라, **현재 행의 상위부서코드(200)**와 **이전(루트) 행의 부서코드(400)**가 일치하는지를 검사합니다.
- 💡 여기서 중요한 점:
- 영업부(200)는 영업1팀(400)의 부모 노드가 되며, 바로 400의 상위 노드로 연결됩니다.
- 다음 상위 노드 탐색:
- 영업부(200)의 상위부서코드는 100.
- 같은 방식으로 본사(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 순서 | 출력장치 → 입력장치 | 동일 (입출력장치 하위에서 적용) |
'자격증 > sqld' 카테고리의 다른 글
[sqld 2장]PL/SQL 구문에서의 DML, DCL, DDL 사용법 (0) | 2025.03.05 |
---|---|
maria db 테이블에 데이터 넣기 (0) | 2025.02.20 |
maria db 테이블 생성하기 (0) | 2025.02.20 |
10061 Can't connect to server on 문제 해결 방법 (0) | 2025.02.20 |
[sqld 과목 1]데이터 모델링의 이해 (0) | 2025.02.11 |