SQLD · SQL 개발자
문자·숫자·날짜·변환·NULL 관련 함수
단일행 함수 전반을 다룹니다. 함수 이름을 외우는 것보다 NULL 이 들어갔을 때 각 함수가 무엇을 돌려주는지가 훨씬 자주 출제됩니다. NVL, NULLIF, COALESCE, CASE 의 동작 차이는 반드시 손으로 따져 보고 넘어가야 합니다.
이 주제에서 다루는 내용
- 문자 함수 — SUBSTR, INSTR, REPLACE, LPAD/RPAD, TRIM
- 숫자 함수 — ROUND, TRUNC, MOD 의 음수 처리
- 날짜 함수와 날짜 연산의 결과 자료형
- 암시적 형변환과 명시적 형변환 — TO_CHAR, TO_DATE, TO_NUMBER
- NVL, NVL2, NULLIF, COALESCE, CASE 의 차이
자주 틀리는 지점
- SUBSTR 의 시작 위치를 0 부터로 세는 실수. 1 부터입니다.
- NULL 과의 산술 연산 결과를 0 으로 보는 실수. 결과는 NULL 입니다.
- NULLIF 와 NVL 을 반대로 기억하는 경우.
연습문제 3문항
아래 문항은 오리지널 문제입니다. 기출문제가 아닙니다.
다음 설명 중 SQL 처리 규칙에 대한 내용으로 옳지 않은 것은? [ORDERS 테이블] ORDER_ID | CUSTOMER_ID | AMOUNT | STATUS ---------|-------------|--------|------- 1001 | C001 | 50000 | NULL 1002 | C002 | NULL | PAID 1003 | C001 | 75000 | PAID 1004 | C003 | NULL | NULL 1005 | C002 | 30000 | CANCEL 1006 | C001 | 40000 | PAID
- A. COUNT(*)는 NULL 값이 포함된 행도 세어서 전체 6개 행을 반환한다.
- B. COUNT(AMOUNT)는 AMOUNT가 NULL인 행을 제외하여 4개를 반환한다.
- C. SUM(AMOUNT)는 NULL 값을 0으로 치환하여 계산하므로 195000을 반환한다.
- D. WHERE AMOUNT IS NULL 조건으로 검색하면 ORDER_ID 1002와 1004가 조회된다.
정답: C
해설. 정답은 C다. SUM 함수는 NULL 값을 0으로 치환하지 않고 계산에서 완전히 제외한다. AMOUNT가 NULL이 아닌 값들만 더해서 50000+75000+30000+40000=195000이 되는 것이지, NULL을 0으로 변환해서 더하는 것이 아니다. A는 맞다(COUNT(*)는 모든 행을 센다). B도 맞다(COUNT(컬럼)은 NULL 제외). D도 맞다(IS NULL로 NULL 검색 가능).
다음 테이블과 SQL을 보고, 실행 결과를 올바르게 설명한 것은? [CUSTOMER 테이블] CUST_ID | CUST_NAME | CITY --------|-----------|------ 1 | 김철수 | 서울 2 | 이영희 | 부산 3 | 박민수 | NULL 4 | 최지은 | 대구 [ORDER 테이블] ORDER_ID | CUST_ID | ORDER_AMT ---------|---------|---------- 101 | 1 | 50000 102 | 1 | 30000 103 | 2 | 40000 104 | 5 | 60000 105 | NULL | 20000 [SQL] SELECT C.CUST_NAME, COUNT(O.ORDER_ID) AS ORDER_COUNT FROM CUSTOMER C LEFT JOIN ORDER O ON C.CUST_ID = O.CUST_ID WHERE C.CITY IS NOT NULL GROUP BY C.CUST_NAME HAVING COUNT(O.ORDER_ID) = (SELECT COUNT(*) FROM ORDER WHERE CUST_ID = 1);
- A. 김철수 고객만 조회되며, ORDER_COUNT는 2이다.
- B. 김철수와 이영희 고객이 조회되며, 각각의 ORDER_COUNT는 2, 1이다.
- C. 박민수 고객도 포함되어 총 3명이 조회되며, 박민수의 ORDER_COUNT는 0이다.
- D. CITY가 NULL인 박민수는 WHERE 조건에 의해 제외되고, 최지은은 주문이 없어 HAVING 조건에서 제외된다.
정답: A
해설. 서브쿼리 (SELECT COUNT(*) FROM ORDER WHERE CUST_ID = 1)는 2를 반환한다. WHERE C.CITY IS NOT NULL 조건으로 박민수(CITY=NULL)가 제외되고, LEFT JOIN으로 김철수(2건), 이영희(1건), 최지은(0건)이 남는다. HAVING 조건에서 ORDER_COUNT = 2인 김철수만 선택된다. 이영희는 주문 1건으로 HAVING 조건 불만족하여 제외된다.
다음 제품 재고 테이블과 SQL문을 보고, 실행 결과로 옳은 것은? [INVENTORY 테이블] PRODUCT_ID | CATEGORY | STOCK_QTY | WAREHOUSE_ID -----------+----------+-----------+------------- P001 | 부품 | 150 | W01 P002 | 부품 | 200 | W01 P003 | 완제품 | 80 | W02 P004 | 완제품 | 120 | W02 P005 | 부품 | NULL | W03 [SQL문] SELECT CATEGORY, AVG(STOCK_QTY) FROM INVENTORY GROUP BY CATEGORY;
- A. 부품: 175, 완제품: 100
- B. 부품: 116.67, 완제품: 100
- C. 부품: 140, 완제품: 100
- D. 부품: NULL, 완제품: 100
정답: A
해설. AVG 함수는 NULL 값을 제외하고 계산합니다. 부품 카테고리의 경우 P001(150), P002(200)만 계산되어 (150+200)/2 = 175가 됩니다. P005의 NULL 값은 평균 계산에서 제외됩니다. 완제품 카테고리는 P003(80), P004(120)로 (80+120)/2 = 100입니다. 옵션 B는 NULL을 0으로 처리한 오답이고, 옵션 C는 전체 평균을 구한 오답, 옵션 D는 NULL이 있으면 결과도 NULL이라는 잘못된 이해입니다.