Humility

아무리 노력해도 최고가 되지 못할 수 있다⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀그럼에도 노력하는자가 가장 겸손한 것 아닌가

공부하는 블로그

자격증/SQL

오답노트 ( SQL_2 )

새벽_글쓴이 2025. 5. 19. 01:06
반응형

1️⃣1️⃣ 아래에서 JOIN에 대한 설명으로 가장 적절한 것은?

(가) 일반적으로 조인은 PK와 FK값의 연관성에 의해 성립된다.
(나) DBMS 옵티마이저는 FROM 절에 나열된 테이블들을 임의로 
		 3개 정도씩 묶어서 조인을 처리한다
(다) EQUI JOIN은 조인에 관여하는 테이블 간의 칼럼 값들이 
		 정확하게 일치하는 경우에 사용되는 방법이다
(라) EQUI JOIN은 '=' 연산자에 의해서만 수행되며, 
		 그 이외의 비교 연산자를 사용하는 경우에는 모두 NON EQUI JOIN 이다
(마) 대부분 NON EQUI JOIN을 수행할 수 있지만, 때로는
		 설계상의 이유로 수행이 불가능한 경우도 있다		 
  1. 가, 다, 라
  2. 가, 나, 다
  3. 가, 나, 다, 라
  4. 가, 다, 라, 마
더보기

정답

4

해설

(가) "조인은 PK와 FK값의 연관성에 의해 성립된다."

맞음.

일반적으로 테이블 간 조인은 기본키(PK) ↔ 외래키(FK) 관계를 바탕으로 설정됨.

(예: 고객 테이블과 주문 테이블의 관계)


(나) "DBMS 옵티마이저는 FROM 절에 나열된 테이블들을 임의로 3개 정도씩 묶어서 조인을 처리한다."

틀림.

옵티마이저는 통계정보, 인덱스, 조인조건 등을 기반으로 최적의 실행계획을 선택하며,

임의로 3개씩 묶는다는 설명은 부정확해.

→ 옵티마이저는 임의가 아니라 최적화된 방식으로 조인 순서를 결정함.


(다) "EQUI JOIN은 조인에 관여하는 테이블 간의 칼럼 값들이 정확하게 일치하는 경우에 사용된다."

맞음.

EQUI JOIN은 두 테이블 간의 동일한 값을 기준으로 조인하는 방식.

→ 보통 WHERE A.col = B.col 또는 ON A.col = B.col

(예: SELECT * FROM A, B WHERE A.id = B.id)


(라) "EQUI JOIN은 '=' 연산자에 의해서만 수행되며, 그 이외의 비교 연산자는 모두 NON EQUI JOIN이다."

맞음.

  • EQUI JOIN → = 연산자만 사용
  • NON EQUI JOIN → <, >, BETWEEN, != 등 비교 연산자 사용
  • 예:
SELECT * FROM 직원, 급여기준
WHERE 직원.연봉 BETWEEN 기준.최소 AND 기준.최대;

(마) "대부분 NON EQUI JOIN을 수행할 수 있지만, 때로는 설계상의 이유로 수행이 불가능한 경우도 있다."

맞음.

  • 이 문장은 SQL 자체가 불가능하다는 말이 아니라,
  • 논리적 설계상 조인을 할 수 없는 상황도 있다는 의미로 출제
  • 예를 들어, 두 테이블 간 조인 조건이 설계상 정의되어 있지 않거나 의미가 없는 경우

1️⃣2️⃣ 아래 SQL의 실행 결과로 가장 적절한 것은?

[EMP_TBL]

EMPNO ENAME
1000 SMITH
1050 ALLEN
1100 SCOTT

 

[RULE_TBL]

RULE_NO RULE
1 S%
2 %T%
SELECT COUNT(*) CNT
FROM EMP_TBL A, RULE_TBL B
WHERE A.ENAME LIKE B.RULE
  1. 0
  2. 2
  3. 4
  4. 6
더보기

정답

3

해설

LIKE 연산자란?

LIKE는 문자열을 비교할 때 사용하는 조건 연산자야.

특정 패턴에 맞는 문자열을 찾을 때 쓰여.


기호 의미
% 임의의 문자열 (0자 이상)
_ 임의의 한 글자

예시

WHERE ENAME LIKE 'S%'   -- S로 시작하는 값
WHERE ENAME LIKE '%T%'  -- T를 포함하는 값
WHERE ENAME LIKE '__TT' -- 두 글자 뒤에 TT로 끝나는 4글자

📌 SQL 해석

SELECT COUNT(*) CNT
FROM EMP_TBL A, RULE_TBL B
WHERE A.ENAME LIKE B.RULE
  • EMP_TBL과 RULE_TBL 간 카티션 곱 (3 × 2 = 6건) 생성
  • 각 조합에 대해 ENAME LIKE RULE 조건 비교
  • 이 구문은 조인 조건 없이, 그냥 두 테이블을 나란히 나열한 것이야.
  • 이럴 경우 SQL은 모든 행의 조합을 다 만들어냄
ENAME RULE LIKE 결과
SMITH S% ✅ (S로 시작)
SMITH %T% ✅ (T 포함)
ALLEN S%
ALLEN %T%
SCOTT S% ✅ (S로 시작)
SCOTT %T% ✅ (T 포함)

1️⃣3️⃣ 아래를 참고할 때 가장 적절한 SQL은?

[설명]

우리는 매일 배치작업을 통하여 고객에게 추천할 컨텐츠를 생성하고 고객에게 추천서비스를 제공한다

추천 컨텐츠 엔터티에서 언제 추천을 해야 하는지를 정의하는 추천 대상일자가 있어 해당일자에만 컨텐츠를 추천해야 한다. 또한 고객이 컨텐츠를 추천 받았을 때 선호하는 컨텐츠가 아닌 경우에는 고객이 비선호 컨텐츠로 분류하여 더 이상 추천 받기를 원하지 않는다. 그러므로 우리는 비선호 컨텐츠 엔터티에 등록된 데이터에 대해서는 추천을 수행하지 않아야 한다

 

배치작업이란? 어떤 처리를 연속적으로 하는 것이 아니고 일정량씩 나누어 처리하는 경우 그 일정량을 배치라고 한다 배치의 원뜻은 한 묶음이라는 의미다.


예) 상품을 주문하는 로직은 그 당시에 발생하는 트랜잭션에 대한 처리이므로 배치작업이라 표현하지는 않는다. 하지만 상품별 주문량을 집계하는 로직의 경우 특정조건(기간 등)으로 일괄처리를 해야하므로 배치작업이라 표현할 수 있다

 

1.

SELECT C.컨텐츠ID, C.컨텐츠명
FRO 고객 A INNER JOIN 추천컨텐츠 B
ON (A.고객ID = B.고객ID) INNER JOIN 컨텐츠 C
ON (B.컨텐츠ID = C.컨텐츠ID)
WHERE A.고객ID = #custId#
AND B.추천대상일자 = TO_CHAR(SYSDATE, 'YYYY.MM.DD')
AND NOT EXISTS (SELECT X.컨텐츠ID
								FROM 비선호컨텐츠 X
								WHERE X.고객ID = B.고객ID);

 

2.

SELECT C.컨텐츠ID, C.컨텐츠명
FROM 고객 A INNER JOIN 추천컨텐츠 B
ON (A.고객ID = #custID# AND A.고객ID = B.고객ID) INNER JOIN 컨텐츠 C
ON (B.컨텐츠ID = C.컨텐츠ID) RIGHT OUTER JOIN 비선호컨텐츠 D
ON (B.고객ID = D.고객ID AND B.컨텐츠ID = D.컨텐츠ID)
WHERE B.추천대상일자 = TO_CHAR(SYSDATE, 'YYYY.MM.DD')
AND B.컨텐츠ID IS NOT NULL;

 

3.

SELECT C.컨텐츠ID, C.컨텐츠명
FROM 고객 A INNER JOIN 추천컨텐츠 B
ON (A.고객ID = B.고객ID) INNER JOIN 컨텐츠 C
ON (B.컨텐츠ID = C.컨텐츠ID) LEFT OUTER JOIN 비선호컨텐츠 D
ON (B.고객ID = D.고객ID AND B.컨텐츠ID = D.컨텐츠ID)
WHERE A.고객ID = #custId#
AND B.추천대상일자 = TO_CHAR(SYSDATE, 'YYYY.MM.DD')
AND D.컨텐츠ID IS NOT NULL;

 

4.

SELECT C.컨텐츠ID, C.컨텐츠명
FROM 고객 A INNER JOIN 추천컨텐츠 B
ON (A.고객ID = #custId# AND A.고객ID = B.고객ID) INNER JOIN 컨텐츠 C
ON (B.컨텐츠ID = C.컨텐츠ID)
WHERE B.추천대상일자 = TO_CHAR(SYSDATE, 'YYYY.MM.DD')
AND NOT EXISTS (SELECT X.컨텐츠ID
								FROM 비선호컨텐츠 X
								WHERE X.고객ID = B.고객ID
								AND X.컨텐츠ID = B.컨텐츠ID);
더보기

정답

4

🔹 1번 보기

SELECT C.컨텐츠ID, C.컨텐츠명
FROM 고객 A
INNER JOIN 추천컨텐츠 B ON A.고객ID = B.고객ID
INNER JOIN 컨텐츠 C ON B.컨텐츠ID = C.컨텐츠ID
WHERE A.고객ID = #custId#
  AND B.추천대상일자 = TO_CHAR(SYSDATE, 'YYYY.MM.DD')
  AND NOT EXISTS (
    SELECT X.컨텐츠ID
    FROM 비선호컨텐츠 X
    WHERE X.고객ID = B.고객ID
  );

오답

  • NOT EXISTS 조건에서 X.컨텐츠ID = B.컨텐츠ID 조건이 빠져 있음
  • → 즉, 비선호 전체 컨텐츠가 없으면 추천한다는 논리, 특정 컨텐츠 제외 조건이 빠짐

🔹 2번 보기

... RIGHT OUTER JOIN 비선호컨텐츠 D ...
WHERE ... AND B.컨텐츠ID IS NOT NULL;

오답

  • RIGHT OUTER JOIN: 비선호컨텐츠를 기준으로 둠추천 로직 기준이 뒤바뀜
  • → 추천컨텐츠에 없어도 비선호가 있으면 포함되는 구조

🔹 3번 보기

... LEFT OUTER JOIN 비선호컨텐츠 D ...
WHERE ... AND D.컨텐츠ID IS NOT NULL;

오답

  • LEFT JOIN 했지만 WHERE D.컨텐츠ID IS NOT NULL은 비선호컨텐츠에 등록된 것만 보여줌
  • → 즉, 추천에서 제외해야 할 컨텐츠만 포함되는 논리정반대 결과

🔹 4번 보기 ✅

SELECT C.컨텐츠ID, C.컨텐츠명
FROM 고객 A
INNER JOIN 추천컨텐츠 B ON (A.고객ID = #custId# AND A.고객ID = B.고객ID)
INNER JOIN 컨텐츠 C ON B.컨텐츠ID = C.컨텐츠ID
WHERE B.추천대상일자 = TO_CHAR(SYSDATE, 'YYYY.MM.DD')
  AND NOT EXISTS (
    SELECT X.컨텐츠ID
    FROM 비선호컨텐츠 X
    WHERE X.고객ID = B.고객ID
      AND X.컨텐츠ID = B.컨텐츠ID
  );

정답

  • 고객ID 조건 명확히 적용됨
  • 추천대상일자 = 오늘 날짜
  • 비선호컨텐츠에 해당 고객+컨텐츠ID가 없을 경우만 추천

요구사항을 가장 정확하게 만족

1️⃣4️⃣ 아래에 대한 설명으로 가장 적절한 것은?

  1. 제품, 생산제품, 생산라인 엔터티를 INNER JOIN하기 위해서 생산제품 엔터티는 WHERE 절에 최소 3번 나타나야 한다
  2. 제품과 생산라인 엔터티를 JOIN 시 적절한 JOIN 조건이 없으므로 카티시안 곱이 발생한다
  3. 제품과 생산라인 엔터티에는 생산제품과 대응되지 않는 레코드는 없다
  4. 특정 생산라인번호에서 생산되는 제품의 제품명을 알기 위해서는 제품, 생산제품, 생산라인까지 3개 엔터티의 INNER JOIN이 필요하다
더보기

정답

2

해설

  1. 생산제품 엔터티는 WHERE 절에 최소 2번 나타나야 한다
  2. 제품과 생산라인은 직접 관계가 없기때문에 조인하려면 반드시 생산제품을 통해야 한다
  3. 데이터 모델을 보면 제품과 생산라인 엔터티에는 생산제품과 대응되지 않는 레코드가 있을 수 있다
  4. 특정 생산라인에서 생산되는 제품의 제품명을 알기 위해서는 제품과 생산제품까지 2개의 엔터티만을 INNER JOIN 하면 된다

3번이 아닌 이유

🔸 생산제품이 FK를 가진다는 건:

“생산제품이 참조하는 제품/라인은 항상 존재해야 한다”

→ 즉, 아이(자식)는 부모를 반드시 가져야 한다


🔸 하지만 3번 보기는 이렇게 말해:

“모든 부모는 자식을 가지고 있다”

→ ❌ 이건 FK로 보장되지 않아

  • 어떤 제품이 만들어지지 않았을 수도 있고
  • 어떤 생산라인은 아직 가동되지 않았을 수도 있음

1️⃣5️⃣ 실행 결과가 다른 하나는?

1.

SELECT T.REGION_NAME, T.TEAM_NAME, T.STADIUM_ID, S.STADIUM_NAME
FROM TEAM T INNER JOIN STADIUM S
		 USING (T.STADIUM_ID = S.STADIUM_ID);

 

2.

SELECT TEAM.REGION_NAME, TEAM.TEAM_NAME, TEAM.STADIUM_ID, STADIUM.STADIUM_NAME
FROM TEAM INNER JOIN STADIUM
		 ON (TEAM.STADIUM_ID = STADIUM.STADIUM_ID);

 

3.

SELECT T.REGION_NAME, T.TEAM_NAME, T.STADIUM_ID, S.STADIUM_NAME
FROM TEAM T, STADIUM S
WHERE T.STADIUM_ID = S.STADIUM_ID;

 

4.

SELECT TEAM.REGION_NAME, TEAM.TEA_NAME,TEAM.STADIUM_ID,STADIUM.STADIUM_NAME
FROM TEAM, STADIUM
WHERE TEAM.STADIUM_ID = STADIUM.STADIUM_ID
더보기

정답

1

해설

USING 조건절을 이용한 EQUI JOIN에서는 테이블 이름과 같은 접두사를 붙일 수 없다. 따라서 SYNTAX 에러가 발생한다

→ USING (STADIUM_ID) 이렇게 작성해야함

1️⃣6️⃣ 아래를 참고할 때 SQL 실행 결과로 가장 적절한 것은?

[OS]

OSID(PK) OS명
100 Android
200 iOS
300 Bada

 

[단말기]

단말기ID(PK) 단말기명 OSID(FK)
1000 A1000 100
2000 B2000 100
3000 C3000 200
4000 D3000 300

 

[고객]

고객번호(PK) 고객명 단말기ID(FK)
11000 홍길동 1000
12000 강감찬 NULL
13000 이순신 NULL
14000 안중근 3000
15000 고길동 4000
16000 이대로 4000
SELECT A.고객번호, A.고객명, B.단말기ID, B.단말기명, C.OSID, C.OS명
FROM 고객 A LEFT OUTER JOIN 단말기 B
ON (A.고객번호 IN(11000,12000) AND A.단말기ID = B.단말기ID) LEFT OUTER JOIN OS C
ON (B.OSID = C.OSID)
ORDER BY A.고객번호;

 

1.

고객번호 고객명 단말기ID 단말기명 OSID OS명
11000 홍길동 1000 A1000 100 Android
12000 강감찬 NULL NULL NULL NULL
13000 이순신 NULL NULL NULL NULL
14000 안중근 NULL NULL NULL NULL
15000 고길동 NULL NULL NULL NULL
16000 이대로 NULL NULL NULL NULL

 

2.

고객번호  고객명 단말기ID  단말기명 OSID OS명
11000 홍길동 1000 A1000 100 Android
12000 강감찬 NULL NULL NULL NULL

 

3.

고객번호 고객명 단말기ID 단말기명 OSID OS명
11000 홍길동 1000 A1000 100 Android

 

4.

고객번호 고객명 단말기ID 단말기명 OSID OS명
11000 홍길동 1000 A1000 100 Android
12000 강감찬 NULL NULL NULL NULL
13000 이순신 NULL NULL NULL NULL
14000 안중근 3000 C3000 200 iOS
15000 고길동 4000 D4000 300 Bada
16000 이대로 4000 D4000 300 Bada

 

더보기

정답

1

해설

핵심 포인트: ON절에 A.고객번호 IN (11000, 12000) 조건이 들어 있음

  • LEFT JOIN인데
  • JOIN 조건 자체에 A.고객번호 IN (...)를 포함했어!
  • 이 말은 곧, JOIN 자체가 11000과 12000인 고객에게만 적용되고,
  • 나머지 고객은 JOIN이 아예 안 됨 (즉, B.*, C.*는 모두 NULL)

IN의 기본 개념

A 컬럼 IN (값1, 값2, ..., 값N)

→ A 컬럼의 값이 괄호 안 목록 중 하나라도 일치하면 TRUE

예시

SELECT *
FROM 고객
WHERE 고객번호 IN (11000, 12000);

→ 고객번호가 11000이거나 12000인 행만 조회

1️⃣7️⃣ 아래 SQL에서 실행 결과가 같은 것은?

(가) SELECT A.ID, B.ID
		 FROM TBL1 A FULL OUTER JOIN TBL2 B
		 ON A.ID = B.ID
		 
(나) SELECT A.ID, B.ID
		 FROM TBL1 A LEFT OUTER JOIN TBL2 B
		 ON A.ID = B.ID
		 UNION
		 SELECT A.ID, B.ID
		 FROM TBL1 A RIGHT OUTER JOIN TBL2 B
		 ON A.ID = B.ID
		 
(다) SELECT A.ID, B.ID
		 FROM TBL1 A, TBL2 B
		 WHERE A.ID = B.ID
		 UNION ALL
		 SELECT A.ID, NULL
		 FROM TBL1 A
		 WHERE NOT EXISTS (SELECT 1 FROM TBL2 B WHERE A.ID = B.ID)
		 UNION ALL
		 SELECT NULL, B.ID
		 FROM TBL2 B
		 WHERE NOT EXISTS (SELECT 1 FROM TBL1 A WHERE B.ID = A.ID)
  1. 가, 나
  2. 가, 다
  3. 나, 다
  4. 가, 나, 다
더보기

정답

4

해설

(다)

✅ ① INNER JOIN

SELECT A.ID, B.ID
FROM TBL1 A, TBL2 B
WHERE A.ID = B.ID

→ 공통된 ID만 나옴


✅ ② TBL1에만 있는 값

SELECT A.ID, NULL
FROM TBL1 A
WHERE NOT EXISTS (
  SELECT 1 FROM TBL2 B WHERE A.ID = B.ID
)

→ TBL1에는 있는데, TBL2에는 없는 ID

FULL OUTER JOIN에서 A는 있고 B는 NULL인 행


✅ ③ TBL2에만 있는 값

SELECT NULL, B.ID
FROM TBL2 B
WHERE NOT EXISTS (
  SELECT 1 FROM TBL1 A WHERE B.ID = A.ID
)

→ 반대로 B에는 있지만 A에는 없는 ID


✅ 결과적으로

  • 공통 ID ✅
  • A에만 있는 ID ✅
  • B에만 있는 ID ✅

즉, FULL OUTER JOIN과 결과가 완전히 같음

1️⃣8️⃣ DEPT와 EMP를 조인하되 사원이 없는 부서 정보도 같이 출력하고자 할 때, 아래 SQL의 빈칸 (가)에 들어갈 내용으로 가장 적절한 것은?

SELECT E.ENAME, D.DEPTNO, D.DNAME
FROM DEPT D(가) EMP E
ON D.DEPTNO = E.DEPTNO;
  1. LEFT OUTER JOIN
  2. RIGHT OUTER JOIN
  3. FULL OUTER JOIN
  4. INNER JOIN
더보기

정답

1

해설

"사원이 없는 부서"를 보여주려는 목적이니까, LEFT JOIN이면 충분함

FULL OUTER JOIN양쪽 다 없는 것까지 포함하므로 불필요하게 넓은 결과

1️⃣9️⃣ 아래 SQL의 실행 결과로 가장 적절한 것은?

[TAB1] [TAB2]

C1 C2
A 1
B 2
C 3
D 4
E 5

 

[TAB2]

C1 C2
B 2
C 3
D 4
SELECT *
FROM TAB1 A LEFT OUTER JOIN TAB2 B
	ON ( A.C1 = B.C1 AND B.C2 BETWEEN 1 AND 3 )

 

1.

 

C1 C2 C1 C2
A 1 NULL NULL
B 2 B 2
C 3 C 3
D 4 D 4
E 5 NULL NULL

 

2.

C1 C2 C1 C2
A 1 NULL NULL
B 2 B 2
C 3 C 3
D 4 NULL NULL
E 5 NULL NULL

 

3.

C1 C2 C1 C2
A 1 NULL NULL
B 2 B 2
C 3 C 3

 

4.

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

 

더보기

정답

2

해설

💡 중요한 개념

  • BETWEEN x AND y는 **"해당 행의 컬럼값이 상수 x 이상, y 이하인지"**를 보는 조건입니다.
  • BETWEEN 절에서 비교 기준은 항상 개별 행 단위로 작동합니다.
  • 예: B.C2 = 2인 경우 → 2 BETWEEN 1 AND 3은 TRUE → 조인 가능

❌ 오해할 수 있는 부분

당신이 질문한 것처럼:

“1과 3이 행의 순서(차수)나 위치를 의미하는 거 아닌가요?”

→ 이런 식으로 해석하면 틀립니다.

BETWEEN에 들어가는 값은 테이블 내 행 번호나 인덱스와 무관하고, 숫자 상수 또는 다른 컬럼일 수 있습니다.


🎯 결론

  • BETWEEN 뒤에는 상수나 표현식이 들어가며
  • 각 행의 값을 조건에 따라 평가하는 것입니다.
  • 예: B.C2 BETWEEN 1 AND 3 → 각 행마다 B.C2가 이 범위 안에 있는지 확인

2️⃣0️⃣ 아래의 오라클 SQL을 동일한 결과를 출력하는 ANSI 표준 구문으로 변경 하고자 할 때 가장 적절한 SQL은?

SELECT A.게시판ID, A.게시판명, COUNT(B.게시글ID) AS CNT
FROM 게시판 A, 게시글 B
WHERE A.게시판ID = B.게시판ID(+)
AND B.삭제여부(+) = 'N'
AND A.사용여부 = 'Y'
GROUP BY A.게시판ID, A.게시판명
ORDER BY A.게시판ID;

 

1.

SELECT A.게시판ID, A.게시판명, COUNT(B.게시글ID) AS CNT
FROM 게시판 A LEFT OUTER JOIN 게시글 B
ON (A.게시판ID = B.게시글ID AND B.삭제여부 = 'N')
WHERE A.사용여부 = 'Y'
GROUP BY A.게시판ID, A.게시판명
ORDER BY A.게시판ID;

 

2.

SELECT A.게시판ID, A.게시판명, COUNT(B.게시글ID) AS CNT
FROM 게시판 A LEFT OUTER JOIN 게시글 B
ON (A.게시판ID = B.게시판ID AND A.사용여부 = 'Y')
WHERE B.삭제여부 = 'N'
GROUP BY A.게시판ID, A.게시판명
ORDER BY A.게시판ID;

 

3.

SELECT A.게시판ID, A.게시판명, COUNT(B.게시글ID) AS CNT
FROM 게시판 A LEFT OUTER JOIN 게시글 B
ON (A.게시판ID = B.게시판ID)
WHERE A.사용여부 = 'Y'
AND B.삭제여부 = 'N'
GROUP BY A.게시판ID, A.게시판명
ORDER BY A.게시판ID;

 

4.

SELECT A.게시판ID, A.게시판명, COUNT(B.게시글ID) AS CNT
FROM 게시판 A RIGHT JOIN 게시글 B
ON (A.게시판ID = B.게시판ID AND A.사용여부 = 'Y' AND B.삭제여부 = 'N')
GROUP BY A.게시판ID, A.게시판명
ORDER BY A.게시판ID;
더보기

정답

1

해설

✅ 1번 (정답) – 조건을 ON절에

SELECT A.게시판ID, A.게시판명, COUNT(B.게시글ID) AS CNT
FROM 게시판 A
LEFT OUTER JOIN 게시글 B
  ON (A.게시판ID = B.게시판ID AND B.삭제여부 = 'N')
WHERE A.사용여부 = 'Y'
GROUP BY A.게시판ID, A.게시판명

이 쿼리의 흐름은 다음과 같습니다:

  1. LEFT OUTER JOIN은 게시판 A의 모든 행을 기준으로 조인합니다.
  2. 조인 조건이→ 삭제된 게시글이거나 게시글이 없는 경우에도
  3. A는 살아남고, B는 NULL 처리됨
  4. A.게시판ID = B.게시판ID AND B.삭제여부 = 'N'
  5. WHERE A.사용여부 = 'Y'
  6. → 게시판 중 사용 중인 것만 필터링
  7. 결과적으로
    • 게시글이 없거나 삭제된 게시판: B.게시글ID = NULL
    • 삭제되지 않은 게시글이 있는 게시판: B.게시글ID 집계됨

👉 이걸 통해 게시글이 없더라도 게시판이 결과에 남을 수 있습니다!


❌ 3번 – 조건을 WHERE절에

FROM 게시판 A
LEFT OUTER JOIN 게시글 B
  ON A.게시판ID = B.게시판ID
WHERE A.사용여부 = 'Y'
  AND B.삭제여부 = 'N'
  1. LEFT OUTER JOIN으로 조인을 해놓고
  2. WHERE B.삭제여부 = 'N'으로 걸러버리면,
    • **게시글이 아예 없는 게시판(B.삭제여부가 NULL)**도 제외됨
    • → 결과적으로 INNER JOIN처럼 되어버림
반응형

'자격증 > SQL' 카테고리의 다른 글

SQL) 데이터 모델과 SQL  (0) 2025.05.20
오답노트 ( SQL 활용_1 )  (0) 2025.05.20
오답노트 ( SQL 기본_1 )  (0) 2025.05.19
오답노트 ( 데이터 모델링 )  (2) 2025.05.15
데이터 모델링의 이해  (2) 2025.05.14