Humility

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

공부하는 블로그

자격증/SQL

오답노트 ( SQL 기본_1 )

새벽_글쓴이 2025. 5. 19. 00:53
반응형

1️⃣ SELECT 문에 대한 설명으로 가장 적절하지 않은 것은?

  1. WHERE 절은 필수가 아니므로 생략 가능하다
  2. DISTINCT 옵션을 통해 중복된 데이터가 있을 경우 1건으로 처리해 출력할 수 있다
  3. FROM 절이 없는 다음 문장 “SELECT COL1, COL2”은 에러 없이 수행된다
  4. SELECT List에 서브쿼리가 사용될 수 있다
더보기

3

해설: SELECT, FROM은 필수이므로 생략되면 에러가 발생함

1. WHERE 절은 필수가 아니므로 생략 가능하다

맞는 말입니다

  • WHERE는 조건 필터링 절이기 때문에,
  • 필요할 때만 쓰는 옵션입니다.

📌 예:

SELECT * FROM employees;       -- WHERE 없음 (전체 조회)
SELECT * FROM employees WHERE age > 30;  -- WHERE 있음

2️⃣ 데이터베이스에서 조회되는 데이터에 대한 조건을 설정하여 원하는 데이터만을 검색하기 위해 사용하는 절로 가장 적절한 것은?

  1. WHERE 절
  2. GROUP BY 절
  3. ORDER BY 절
  4. HAVING 절
더보기

1

WHERE 절은 SQL을 이용하여 데이터베이스로부터 데이터를 검색할 때 조회되어야 하는 데이터를 필터링 하는 데 사용된다

🔍 보기별 절 비교

보기 이름 역할
WHERE 개별 행(레코드)에 대한 조건 필터링→ GROUP BY 전에 실행됨
GROUP BY 행들을 그룹으로 묶음→ 집계 함수와 함께 사용
ORDER BY 출력 결과를 정렬→ 오름차순/내림차순 지정 가능
HAVING 그룹 조건 필터링→ GROUP BY로 묶인 그룹에 조건 걸 때 사용

✅ 예시로 비교해 보기

SELECT department_id, AVG(salary)
FROM employees
WHERE job = 'CLERK'           -- ① 행 필터링
GROUP BY department_id        -- ② 그룹화
HAVING AVG(salary) > 3000     -- ④ 그룹 조건
ORDER BY department_id;       -- ③ 결과 정렬
  • WHERE: 개별 직원이 CLERK인지 확인
  • GROUP BY: 부서별로 묶기
  • HAVING: 묶인 그룹의 평균 급여 조건
  • ORDER BY: 출력 결과 정렬

3️⃣ 아래 SQL의 수행 결과로 가장 적절한 것은?

[SQL]
SELECT SUM(COL2) + SUM(COL3) FROM TAB_A;
SELECT SUM(COL2) + SUM(COL3) FROM TAB_A WHERE COL1 > 0;
SELECT SUM(COL2) + SUM(COL3) FROM TAB_A WHERE COL 1 IS NOT NULL;
SELECT SUM(COL2) + SUM(COL3) FROM TAB_A WHERE COL 1 IS NULL;

 

[TAB_A]

COL1 COL2 COL3
30 NULL 20
NULL 50 10
0 10 NULL
  1. 60, NULL, 30, 60
  2. 60,20,30,60
  3. 90,NULL,30,60
  4. 90,20,30,60
더보기

3

해설:

✅ 쿼리 1:

SELECT SUM(COL2) + SUM(COL3) FROM TAB_A;
  • 조건 없이 전체 행에 대해 계산
  • SUM() 함수는 NULL을 제외하고 합산

📌 COL2: NULL, 50, 10 → 합: 60

📌 COL3: 20, 10, NULL → 합: 30

▶️ 결과: 60 + 30 = 90


✅ 쿼리 2:

SELECT SUM(COL2) + SUM(COL3) FROM TAB_A WHERE COL1 > 0;
  • COL1 > 0 → ①번 행만 해당 (COL1 = 30)
  • 해당 행: COL2 = NULL, COL3 = 20

📌 SUM(COL2): NULL → 합 없음 = NULL

📌 SUM(COL3): 20 → 합: 20

▶️ 결과: NULL + 20 = NULL ❌

NULL이 포함되면 전체 결과도 NULL


✅ 쿼리 3:

SELECT SUM(COL2) + SUM(COL3) FROM TAB_A WHERE COL1 IS NOT NULL;
  • COL1 IS NOT NULL → 행 ① (30), 행 ③ (0)
  • 해당 행:
    • COL2: NULL, 10 → 합: 10
    • COL3: 20, NULL → 합: 20

▶️ 결과: 10 + 20 = 30


✅ 쿼리 4:

SELECT SUM(COL2) + SUM(COL3) FROM TAB_A WHERE COL1 IS NULL;
  • COL1 IS NULL → 행 ②만 해당
  • COL2 = 50, COL3 = 10

📌 SUM(COL2): 50

📌 SUM(COL3): 10

▶️ 결과: 50 + 10 = 60

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

CREATE TABLE 서비스
(
		서비스 번호 VARCHAR2(10) PRIMARY KEY,
		서비스명 VARCHAR2(100) NULL,
		개시일자 DATE NOT NULL
);

[SQL]
[1] SELECT * FROM 서비스 WHERE 서비스 번호 = 1;
[2] INSERT INTO 서비스 VALUES ('999'. '', '2015-11-11');
[3] SELECT * FROM 서비스 WHERE 서비스명 = '';
[4] SELECT * FROM 서비스 WHERE 서비스 명 IS NULL;
  1. 서비스번호 칼럼의 레코드 중 ‘001’과 같은 숫자 형식으로 된 레코드가 하나라도 입력되어 있다면 [1]은 오류 없이 실행된다
  2. 오라클에서 [2]와 같이 데이터를 입력하였을 때, 서비스명 칼럼에 공백 문자 데이터가 입력된다.
  3. 오라클에서 [2]와 같이 데이터를 입력하고 [3]과 같이 조회하였을 때, 데이터는 조회된다
  4. SQL Server에서 [2]와 같이 데이터를 입력하고 [4]와 같이 조회하였을 때, 데이터는 조회되지 않는다
더보기

4

1.

“서비스번호에 ‘001’ 같은 값이 있으면 [1]은 오류 없이 실행된다”

  • [1]에서 **숫자 1 = 문자형 ‘001’**을 비교함
  • 문자와 숫자 비교 → Oracle에서는 암시적 형변환이 일어나지 않으면 오류 발생
  • '001'은 문자열, 1은 숫자
  • 정확히 비교가 되지 않으며, 조건 자체가 불일치

틀림


2.

"Oracle에서 [2]처럼 입력하면 서비스명에 공백 문자 데이터가 들어간다"

  • Oracle에서는 '' (빈 문자열)을 → NULL로 처리
  • 즉, 공백이 아니라 NULL이 들어감

틀림


3.

"Oracle에서 [2]를 입력하고, [3]으로 조회하면 데이터가 조회된다"

  • [2] → 서비스명에 '' 입력 → Oracle에서는 NULL로 저장됨
  • [3] → 서비스명 = ''은 NULL = '' → 항상 FALSE

조회 안 됨틀림


4.

"SQL Server에서 [2]처럼 입력하고, [4]처럼 조회하면 데이터가 조회되지 않는다"

  • SQL Server는 ''를 빈 문자열 그대로 저장
  • 서비스명 IS NULL은 NULL만 필터링
  • ''는 NULL이 아님 → 조회 안 됨

정답

5️⃣ 아래를 참고할 때 실행 결과가 다른 SQL은?

[서비스 가입]
고객ID
서비스ID
가입일자
가입시간
---------
서비스시작일시
서비스종료일시

(논리)

[SVC_JOIN]
CUST_ID:VARCHAR2(10) NOT NULL
SVC_ID: VARCHAR(5) NOT NULL
JOIN_YMD: VARCHAR2(8) NOT NULL
JOIN_HH: VARCHAR2(4) NOT NULL
-------------------------------
SVC_START_DATE: DATE NULL
SVC_END_DATE: DATE NULL

(물리)

 

1.

SELECT SVC_ID, COUNT(*) AS CNT
FROM SVC_JOIN
WHERE SVC_END_DATE ≥ TO_DATE(’20150101000000’,YYYYMMDDHH24MISS’)
AND SVC_END_DATE <= TO_DATE('20150131235959','YYYYMMDDHH24MISS')
AND CONCAT(JOIN_YMD,JOIN_HH) = '2014120100'
GROUP BY SVC_ID;

 

2.

SELECT SVC_ID, COUNT(*) AS CNT
FROM SVC_JOIN
WHERE SVC_END_DATE >= TO_DATE('20150101','YYYYMMDD')
AND SVC_END_DATE < TO_DATE('20150201','YYYYMMDD')
AND (JOIN_YMD, JOIN_HH) IN (('20141201','00')
GROUP BY SVC_ID

 

3.

SELECT SVC_ID, COUNT(*) AS CNT
FROM SVC_JOIN
WHERE '201501' = TO_CHAR(SVC_END_DATE,'YYYYMM')
AND JOIN_YMD = '20141201'
AND JOIN_HH = '00'
GROUP BY SVC_ID

 

4.

SELECT SVC_ID, COUNT(*) AS CNT
FROM SVC_JOIN
WHERE TO_DATE('201501','YYYYMM') = SVC_END_DATE
AND JOIN_YMD||JOIN_HH = '2014120100'
GROUP BY SVC_ID
더보기

정답

4

해설:

TO_DATE('201501','YYYYMM') = SVC_END_DATE

  • TO_DATE('201501','YYYYMM')는 내부적으로 → 2015-01-01 00:00:00
  • 즉, 이 조건은 SVC_END_DATE가 정확히 2015-01-01 00:00:00인 경우만 TRUE
항목 3번 4번
비교 방식 문자열(년월) 비교 날짜 값 직접 비교
포함 범위 1월 전체 (YYYYMM) 1월 1일 00:00:00 단 하나
실무에서 유용성 월 단위 필터링에 적절 실수하기 쉬운 비교

 

6️⃣ 아래를 참고할 때 SQL 의 실행 결과로 가장 적절한 것은? ( 단, 이해를 돕기 위해 → 는 줄바꿈을 의미하며 실제 저장값이 아님, 또한 CHR(10)의 ASCII 값은 줄바꿈을 의미)

[TAB1]

ROWNUM C1
1 A
 
  A
  B
 
  B
 
  B
SELECT SUM(CC)
FROM

(

SELECT(LENGTH(C1) - LENGTH(REPLACE(C1, CHR(10))) +1) CC
FROM TAB1

);
  1. 2
  2. 3
  3. 5
  4. 6
더보기

정답

3

해설

각 행별 CC 계산

SQL 구문:

SELECT (LENGTH(C1) - LENGTH(REPLACE(C1, CHR(10), '')) + 1) CC
FROM TAB1;

▶ ROWNUM 1: A\\nA

  • LENGTH(C1) = 3 (A, \\n, A)
  • REPLACE(C1, CHR(10), '') = "AA" → 길이 = 2
  • → 3 - 2 + 1 = 2

▶ ROWNUM 2: B\\nB\\nB

  • LENGTH(C1) = 5 (B, \\n, B, \\n, B)
  • REPLACE(C1, CHR(10), '') = "BBB" → 길이 = 3
  • → 5 - 3 + 1 = 3

✅ 최종 합계

SELECT SUM(CC) ...
  • 2 + 3 = 5

"반복문도 아닌데 어떻게 행별로 계산돼?"

SQL은 선언형(선언적) 언어라서,

명령문 한 줄을 쓰면 내부적으로는 '각 행마다' 자동 반복해서 적용돼.

예를 들어:

SELECT salary * 1.1 FROM employees;

→ 라고 쓰면, employees 테이블의 모든 행마다 salary × 1.1을 알아서 계산해줘.

→ 이걸 일일이 for문 돌리지 않아도 자동으로 해주는 게 SQL의 특징이야.

같은 원리로 아래 쿼리도:

SELECT (LENGTH(C1) - LENGTH(REPLACE(C1, CHR(10), '')) + 1) AS CC
FROM TAB1;

→ TAB1의 각 행마다 C1 컬럼에 대해 LENGTH와 REPLACE를 적용해서 CC 컬럼을 만들어냄.

→ 그 결과들을 SUM(CC)으로 다시 합산하는 구조.

7️⃣ 아래 (가)와 (나)가 동일한 결과를 출력한다고 할 때, 빈칸 (ㄱ)에 들어갈 내용으로 가장 적절한 것은? (단, 스칼라 서브쿼리는 제외함)

(가)
SELECT LOC,
	CASE WHEN LOC = 'NEW YORK' THEN 'EAST'
	ELSE 'ETC'
	END as AREA
FROM DEPT;

(나)
SELECT LOC,
		(ㄱ) as AREA
FROM DEPT;
  1. CASE WHEN LOC IS ‘NEW YORK’ THEN ‘EAST’ ELSE ‘ETC’ END
  2. CASE LOC WHEN ‘NEW YORK’ THEN ‘EAST’ ELSE ‘ETC’ END
  3. CASE LOC WHEN ‘NEW YORK’ THEN ‘EAST’ DEFAULT ‘ETC’ END
  4. DECODE (LOC, ‘EAST’, ‘NEW YORK’. ‘ETC’)
더보기

정답

2

🔸 1번

CASE WHEN LOC IS ‘NEW YORK’ THEN ‘EAST’ ELSE ‘ETC’ END
  • ❌ 오답
  • LOC IS 'NEW YORK' → 문자열에 IS는 사용할 수 없음
  • → IS는 NULL, TRUE, FALSE 판단에만 씀
  • 오류 발생

🔸 2번

CASE LOC
  WHEN 'NEW YORK' THEN 'EAST'
  ELSE 'ETC'
END
  • ✅ 정답
  • 이건 "simple CASE" 문법
  • CASE 열값 WHEN 값1 THEN 결과1 ... 형식
  • LOC가 'NEW YORK'이면 'EAST', 아니면 'ETC'
  • → (가)와 동일한 결과

🔸 3번

CASE LOC WHEN 'NEW YORK' THEN 'EAST' DEFAULT 'ETC' END
  • ❌ 오답
  • SQL의 CASE 문에는 DEFAULT가 존재하지 않음
  • ELSE를 사용해야 함
  • 문법 오류

🔸 4번

DECODE(LOC, 'EAST', 'NEW YORK', 'ETC')
  • ❌ 오답
  • 문법이 잘못됨
  • DECODE(LOC, 비교값, 반환값, ...) 형식이어야 함
  • 현재는 "LOC가 'EAST'이면 'NEW YORK', 아니면 'ETC'"라는 잘못된 의미
  • → (가)와 논리 다름

✅ 결론

보기 결과 이유
1번 문자열 비교에 IS 사용 불가
2번 CASE LOC WHEN 구문으로 동일 결과
3번 DEFAULT는 SQL CASE문에서 허용되지 않음
4번 DECODE 사용법과 논리 모두 틀림

8️⃣ EMP 테이블에서 MGR의 값이 7698과 같으면 NULL을 표시하고, 같지 않으면 MGR을 표시하려고 할 때 빈칸 (ㄱ)에 들어갈 함수는?

SELECT ENAME, EMPNO, MGR, (ㄱ) (MGR,7698) as NM
FROM EMP;
  1. NULLIF
  2. NVL
  3. IFNULL
  4. COALESCE
더보기

정답

1

해설:

IFNULL — MySQL 전용 함수

👉 NULL이면 대체값 반환

IFNULL(표현식, 대체값)

예:

SELECT IFNULL(COMM, 0) FROM EMP;
  • COMM이 NULL이면 0을 반환
  • COMM이 NULL이 아니면 원래 값 반환

NULLIF — ✅ ANSI 표준 함수

👉 두 값이 같으면 NULL 반환, 다르면 첫 번째 값 반환

NULLIF(표현식1, 표현식2)

예:

SELECT NULLIF(100, 100) FROM DUAL;  -- 결과: NULL
SELECT NULLIF(100, 200) FROM DUAL;  -- 결과: 100
  • 둘이 같으면 → NULL
  • 다르면 → 첫 번째 값

주로 쓰는 상황:

  • 0으로 나누기 방지
SELECT SAL / NULLIF(COMM, 0) FROM EMP;

→ COMM이 0이면 NULL 반환 → 0으로 나누기 오류 회피

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

[TABLE_A]

TABKEY COLA COLB COLC
1 NULL NULL
2 1 5
3 NULL 2
4 3 0
5 NULL NULL 3
6 5 0
7 NULL NULL
SELECT COLB,
       MAX(COLA) AS COLA1,
       MIN(COLA) AS COLA2,
       SUM(COLA + COLC) AS SUMAC
FROM TABLE_A
GROUP BY COLB;

 

1.

 

COLB COLA1 COLA2 SUMAC
NULL NULL NULL NULL
1 1 6
3 3 3
5 5 5

 

2.

COLB COLA1 COLA2 SUMAC
1 NULL 6
3 NULL 3
5 NULL 5

 

3.

COLB COLA1 COLA2 SUMAC
NULL NULL NULL 3
1 1 6
3 3 5
5 5 5

 

4.

COLB COLA1 COLA2 SUMAC
1 NULL 6
3 NULL 5
5 NULL 5
더보기

정답

1

해설:

정리할 포인트

  • GROUP BY COLB → NULL도 그룹핑 대상에 포함됨 (SQL 표준에서 NULL은 그룹 하나로 봄)
  • MAX, MIN 함수는 NULL 무시
  • 산술연산에서 NULL + 값 = NULL
  • SUM 함수는 NULL 값 무시

중요한 요약

구문 결과 이유
NULL + 3 NULL 산술연산
SUM(NULL, 3) 3 집계함수는 NULL 무시
SUM(COLA + COLC) COLA+COLC가 NULL인 행은 무시 개별 연산 결과가 NULL이면 집계에서 제외

1️⃣0️⃣ 오류가 발생하는 SQL은?

  1. SELECT 지역, SUM(매출금액) AS 매출금액 FROM 지역별매출 GROUP BY 지역 ORDER BY 매출금액 DESC;
  2. SELECT 지역, 매출금액 FROM 지역별매출 ORDER BY 년 ASC;
  3. SELECT 지역, SUM(매출금액) AS 매출금액 FROM 지역별매출 GROUP BY 지역 ORDER BY 년 DESC;
  4. SELECT 지역, SUM(매출금액) AS 매출금액 FROM 지역별매출 GROUP BY 지역 HAVING SUM(매출금액) > 1000 ORDER BY COUNT(*) ASC;
더보기

정답

3

해설:

2번은 원본 칼럼에 ‘년’이 존재하면 오류가 아니므로 조건부 오류임

하지만 3번은 GROUP BY 지역 이므로 데이터는 이미 지역별로 요약된 상태임

그렇기에 ‘년’ 이라는 칼럼이 존재하지 않으므로 확실한 오류

GROUP BY가 하는 일

GROUP BY 지역이라는 말은 이렇게 해석돼:

"지역이 같은 데이터끼리 묶고, 그 묶음(그룹)별로 하나의 결과만 출력하겠다."

즉, GROUP BY가 실행된 후에는

지역별로 한 줄씩만 남게 되고,

다른 컬럼들(예: 년, 고객, 상품명 등)은 전부 그룹 내에서 직접 쓰지 않는 이상 사라짐.

📌 GROUP BY 이후 남는 건 딱 두 가지:

  • 그룹핑에 사용한 컬럼 (지역)
  • 집계함수(SUM(매출금액) 같은 것)로 계산된 결과

SELECT 절 결과는 이렇게 됨

| 지역 | 매출금액 (SUM 결과) |
|------|---------------------|
| 서울 | 12345               |
| 부산 | 5678                |
| 대구 | 2345                |

이제 행 하나하나에 년이라는 컬럼은 아예 존재하지 않음

왜냐하면 년은 GROUP BY에도 없고, 집계에도 포함되지 않았기 때문


ORDER BY 년 DESC 는 왜 오류?

ORDER BY 절은 기본적으로 SELECT 결과에 있는 컬럼 또는

SELECT에 없더라도 FROM 테이블에 남아 있는 원래 컬럼을 사용해야 해.

그런데 지금은 GROUP BY로 인해 테이블이 "지역별 매출 요약"만 남은 상태야.

❌ 그래서 ORDER BY 년은 다음 중 아무것도 아님:

  • SELECT 절에 없음
  • GROUP BY 절에 없음
  • 집계함수로 사용된 것도 아님

→ 즉, GROUP BY 후에는 년이라는 컬럼은 존재할 수 없고

→ ORDER BY 년은 존재하지 않는 컬럼을 정렬하려는 시도이므로 오류!

반응형

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

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