Certification/SQLD 개발자

[SQLD] SQLD 문제 풀이 41-50

개발자하소서 2023. 10. 14. 19:53
728x90
반응형
SMALL

📌 SQLD 문제 풀이 41- 50 

 
 
41. 다음 중 아래와 같은 2건의 데이터 상황에서 SQL 의 수행결과로 가장 적절한 것은?

( 단, 이해를 돕기 위해 ↓는 줄바꿈을 의미, → 실제 저장값이 아님, CHR(10) : ASCII 값 → 줄바꿈을 의미)

 

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

② 3
 
③ 5
  
6

 

더보기

정답 : ③

- 라인수를 구하기 위해서 함수를 이용해 작성한 SQL이다 

- LENGTH : 문자열의 길이를 반환하는 함수 

- CHR : 주어진 ASCII 코드에 대한 문자를 반환하는 함수 ( CHR(10) --> 줄바꿈)

- REPLACE : 문자열을 치환하는 함수 (REPLACE(C1, CHR(10)) ----> 줄바꿈 제거)

 

[함수 결과 값]

 

ROWNUM C1 LENGTH(C1) REPLACE(C1, CHR(10)) LENGTH(REPLACE(C1, CHR(10)))
1 A
A
3 변경 전

A
A
변경 후 

A A
2
2 B
B
B
5 변경 전 

B
B
B
변경 후 

BBB


3

 

- length()는 괄호안의 길이를 리턴해주는 것이다. 

- replace(a, b, c)는 a컬럼에서 b라는 것을 찾아서 c로 변환해주는 함수이다.

- char(10)은 문제에 나와있듯이 줄바꿈, 즉 엔터키 적용하라는 것이다. 

 

-  select안에를 보면 length(c1)-length(replace(c1, chr(10)))+1이라는 게 있고

- c1을 보게되면 a줄바꿈a  =3  /   b줄바꿈b줄바꿈b = 5 가 있는데

  줄바꿈도 1의 길이를 리턴하기 때문에 length(c1)의 길이는 각각 3, 5가 되고

  replace(c1, chr(10))은 컬럼 c1에서 chr(10)-> 줄바꿈을 없애라는거니까

   rownum 1, 2에서 줄바꿈을 없애버리면 각각 길이는 2, 3이되고

    각각 계산을 해보면 (3-2+1) + (5-3+1) = 5가 된다. 

 

즉,

1로우 : 3-2+1
2로우 : 5-3+1
총 계산 : 2+3=5

 

-  일반적으로 어떤 테이블에서 select를 할 때 1행 2행 이렇게 행마다 select를 하는 것처럼 계산도

   마찬가지로 행마다 계산한다. 

 

 

[REPLACE 함수의 사용법] 

 

 

 

 

 

42. 오라클환경에서 날짜형 데이터를 다룰 경우, 아래 SQL 결과로 가장 적절한 것은? 

 

SELECT TO_CHAR(TO_DATE('2015.01.10 10' , 'YYYY.MM.DD HH24')
+ 1/24/(60/10), 'YYYY.MM.DD HH24:M1:SS') FROM DUAL;

 

① 2015.01.10 11:01:00  

② 2015.01.10 10:05:00  

③  2015.01.10 10:10:00

④ 2015.01.10 10:30:00
  

 

더보기

정답 : ③

 

- 오라클에서 날짜의 연산은 숫자의 연산과 같다. 특정 날짜에 1을 더하면 하루를 더한 결과와 같으므로 

   1/24/60 = 1분을 의미한다.  1/24/(60/10) = 10분과 같으므로 2015년 1월 10일 10시에 10분을 더한 결과와 같다.

 

- 주로 날짜계산을 할떄 날짜 +1에서 +1은 하루를 뜻하고 하루를 24로 나누면 1시간, 1시간을 (60/10)로 나누면 10분 즉 1/24/(60/10)은 10분을 뜻한다.

 

- 1/24/(60/10)은 하루를 24로 나누고 6으로 나눈 것, 즉 10분  

 

SELECT SYSDATE, SYSDATE - 1/24/60 FROM DUAL;

 

1/24            :    1시간  ( 1일을 24로 나누기 )

1/24/60        :    1분     (1일 / 24시간 = 1시간 / 60 = 1분)

1/24/6         :     10분

1.5/24          :    1시간 30분

1.5/24/6        :    15분

1/24/60/6      :    10초

 

 

 

 

 

[DUAL 테이블의 특성]

 

- 사용자 SYS가 소유하며 모든 사용자가 엑세스 가능한 테이블이다. 

- SELECT ~ FROM ~ 의 형식으로  갖추기 위한 일종의 DUMMY 테이블이다. 

- DUMMY라는 문자열 유형의 칼럼에 'X'라는 값이 들어 있는 행을 1건 포함하고 있다. 

 

 

[TO_DATE 함수]

 

 

 

 

[TO_CHAR 함수]

 

SELECT TO_CHAR(SYSDATE, 'YYYYMMDD')              --20200723
     , TO_CHAR(SYSDATE, 'YYYY/MM/DD')            --2020/07/23
     , TO_CHAR(SYSDATE, 'YYYY-MM-DD')            --2020-07-23
     , TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') --2020-07-23 11:10:52
  FROM dual

 

 

 

 

43. 아래는 SEARCHED_CASE_EXPRESSION SQL문장이다.

     이때 사용된 SEARCHED_CASE_EXPRESSION 은 

     SIMPLE_CASE_EXPRESSION 을 이용해 똑같은 기능을 표현할 수 있다.

     아래 SQL문장의 (ㄱ) 안에 들어갈 표현을 작성하시오( 스칼라 서비쿼리는 제외함) 

 

[SEARCHED_CASE_EXPRESSION 문장 사례]

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




[SIMPLE_CASE_EXPRESSION 문장 사례]

SELECT LOC, 
	CASE       (ㄱ)
   	ELSE 'ETC'
    END as AREA
FROM DEPT;

 

더보기

정답 : LOC WHEN 'NEW YORK' THEN 'EAST'

 

- SEARCHED_CASE_EXPRESSION을 SIMPLE_CASE_EXPRESSION으로 변환하는 문제다.

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

 

when ~~일때 then 그러면 else 아니라면

case
when Loc = 'NEW YORK'
Loc이 'NEW YORK'일 때

then 'EAST'
그러면 'EAST'이다

ELSE 'ETC'
아니라면 'ETC이다.

case when Loc = 'NEW YORK' then 'EAST' else 'ETC'
LOC이 'NEW YORK' 이라면 'EAST' 이고 아니라면 'ETC'이다

====================================================================================

Loc when 'NEW YORK'
Loc이 'NEW YORK' 일 때

then 'EAST'
그러면 'EAST' 이다

ELSE 'ETC'
아니라면 'ETC이다.

Loc when 'NEW YORK' then 'EAST' ELSE 'ETC'
LOC이 'NEW YORK' 이라면 'EAST' 이고 아니라면 'ETC'이다

같은 의미이지만 표현방식이 다를뿐입니다.
when Loc = 과 Loc when 정도의 표현방식이 다릅니다

 

 

 

 

 

 

44. 팀별 포지션별 FW, MF, DF, GK 포지션의 인원수와 팀별 전체 인원수를 구하는 SQL을 작성할 때 결과가 다른 것은?

( 보기 1은 SQL Server 환경이고, 보기 2,3,4는 ORACLE 환경이다.) 

 

① SELECT TEAM_ID, 
	ISNULL(SUM(CASE WHEN POSITION = 'FW' THEN 1 END) , 0) FW, 
    ISNULL(SUM(CASE WHEN POSITION = 'MF' THEN 1 END) , 0) MF, 
    ISNULL(SUM(CASE WHEN POSITION = 'DF' THEN 1 END) , 0) DF,
    ISNULL(SUM(CASE WHEN POSITION = 'GK' THEN 1 END) , 0) GK,
    	COUNT(*) SUM 
        FROM PLAYER
        GROUP BY TEAM_ID;
    

② SELECT TEAM_ID, 
	NVL(SUM(CASE POSITION WHEN = 'FW' THEN 1 END) , 0) FW, 
    NVL(SUM(CASE POSITION WHEN = 'MF' THEN 1 END) , 0) MF, 
    NVL(SUM(CASE POSITION WHEN = 'DF' THEN 1 END) , 0) DF,
    NVL(SUM(CASE POSITION WHEN = 'GK' THEN 1 END) , 0) GK,
    	COUNT(*) SUM 
        FROM PLAYER
        GROUP BY TEAM_ID;



③ SELECT TEAM_ID, 
	NVL(SUM(CASE WHEN POSITION = 'FW' THEN 1 END) , 0) FW, 
    NVL(SUM(CASE WHEN POSITION = 'MF' THEN 1 END) , 0) MF, 
    NVL(SUM(CASE WHEN POSITION = 'DF' THEN 1 END) , 0) DF,
    NVL(SUM(CASE WHEN POSITION = 'GK' THEN 1 END) , 0) GK,
    	COUNT(*) SUM 
        FROM PLAYER
        GROUP BY TEAM_ID;


④ SELECT TEAM_ID, 
	NVL(SUM(CASE POSITION WHEN = 'FW' THEN 1 ELSE 1 END) , 0) FW, 
    NVL(SUM(CASE POSITION WHEN = 'MF' THEN 1 ELSE 1 END) , 0) MF, 
    NVL(SUM(CASE POSITION WHEN = 'DF' THEN 1 ELSE 1 END) , 0) DF,
    NVL(SUM(CASE POSITION WHEN = 'GK' THEN 1 ELSE 1 END) , 0) GK,
    	COUNT(*) SUM 
        FROM PLAYER
        GROUP BY TEAM_ID;

 

 

더보기

정답 : ④

 

- 지문 4는 CASE 문장에서 데이터가 없는 경우를 0으로 표시해야 (ELSE 0), 다른 3개의 지문과 같은 결과가 나온다.

- 보기 4번은 POSITION 중 FW가 있다면 1을 추가하고 아니라도 1을 추가하라는 의미로, 

  다른 지문들은 POSTION 중 FW가 있다면 1을 추가하고 아니라면 0으로 반환하라는 의미이기에 

  4번만 다르다. 

 

 

 

 

45. 다음 중 아래 TAB1을 보고 각 SQL  실행 결과를 가장 올바르게 설명한 것을 고르시오. 

 

 

① SLEECT COL2 FROM TAB1 WHERE COL1 = 'b';
 
    → 실행결과가 없다(공집합)

② SELECT INSULL(COL2, 'X') FROM TAB1 WHERE COL1 = 'a'; 
    
   → 실행결과로 'X'를 반환한다.


③ SELECT COUNT(COL1) FROM TAB1 WHERE COL2 = NULL;

   → 실행결과는 1이다.
  
④  SELECT COUNT(COL2) FROM TAB1 WHERE COL1 IN('b', 'c');

   →  실행 결과는 1이다. 

 

더보기

정답 : ②

 

- ISNULL 함수는 결과값이 NULL일 경우 지정된 값을 반환한다. 칼럼의 NULL 값을 확인할 때는 ISNULL을 사용해야 한다 

 

 

 

① SLEECT COL2 FROM TAB1 WHERE COL1 = 'b';
 
    → 실행결과가 없다(공집합) (X)

       빈 공백값 1건이 조회된다

② SELECT INSULL(COL2, 'X') FROM TAB1 WHERE COL1 = 'a'; 
    
   → 실행결과로 'X'를 반환한다. (O)



③ SELECT COUNT(COL1) FROM TAB1 WHERE COL2 = NULL;

   → 실행결과는 1이다.(X)

   → COL2 IS NULL 로 조회를 하여야 한다. 
  
④  SELECT COUNT(COL2) FROM TAB1 WHERE COL1 IN('b', 'c');

   →  실행 결과는 1이다. (X)

    →  실행 결과는 2이다. 

 

 

 

[NULL 의 특성]

 

- NULL 값은 아직 정의되지 않은 값으로 0 또는 공백과는 다르다. 0은 숫자이고, 공백은 하나의 문자이다. 

- 테이블을 생성할 때 NOT NULL 또는 PRIMARY KEY 로 정의되지 않은 모든 데이터 유형은 널 값을 포함할 수 있다.

- NULL 값을 포함하는 연산의 경우 결과 값도 NULL 값이다. 모르는 데이터에 숫자를 더하거나 빼도 결과는 마찬가지로 모르는 데이터인 것과 같다. 

- 결과값을 NULL이 아닌 다른 값을 얻고자 할 때 NVL/ISNULL 함수를 사용한다. 

- NULL 값의 대상이 숫자 유형 데이터인 경우는 주로 0(Zero)으로 , 문자 유형 데이터인 경우는 블랭크보다는 'x' 같이 해당 시스템에서 의미없는 문자로 바꾸는 경우가 많다. 

 

 

 

46. 사원 테이블에서 MGR의 값이 7698과 같으면 NULL을 표시하고 같지않으면 MGR을 표시하려고 한다.

 아래 SQL 문장의 (ㄱ) 안에 들어갈 함수명을 작성하시오. 

 

 

SELECT ENAME, EMPNO, MGR,  (ㄱ)  (MGR, 7698) as NM 
FROM EMP;

 

더보기

정답 : NULLIF

 

- NULLIF(EXPR1, EXPR2)

- NULLIF 함수는 EXPR1이 EXPR2와 같으면 NULL을, 같지 않으면 EXPR1을 리턴한다. 

- 특정 값을 NULL로 대체하는 경우에 유용하게 사용할 수 있다. 

 

 

 

일반형 함수 함수 설명
NVL(표현식1, 표현식2) 

ISNULL (표현식1, 표현식2)
표현식 1의 결과값이 NULL이면  표현식2의 값을 출력한다. 
단, 표현식1과 표현식2의 결과 데이터 타입이 같아야 한다. 
NULL 관련 가장 많이 사용되는 함수이므로 상당히 중요하다. 
NULLIF(표현식1, 표현식2) 표현식1이 표현식2와 같으면 NULL을 , 같지 않으면 표현식 1을 리턴한다. 
COALESCE(표현식1, 표현식2,,,) 임의의 개수 표현식에서 NULL이 아닌 최초의 표현식을 나타낸다. 
모든 표현식이 NULL이라면 NULL을 리턴한다, 

 

- MYSQL : IFNULL(VALUE1, VALUE2)

- MSSQL : ISNULL(VALUE1, VALUE2)

- ORACLE : NVL(VALUE1, VALUE2)

 

 

47. 다음 주 아래 데이터를 가지고 있는 EMP_Q 테이블에서  세개의 SQL 결과로 가장 적절한 것은?

 

SELECT SAL/COMM FROM FROM EMP_Q WHERE ENAME = 'KING';
SELECT SAL/COMM FROM FROM EMP_Q WHERE ENAME = 'FROD';
SELECT SAL/COMM FROM FROM EMP_Q WHERE ENAME = 'SCOTT';

** 단, SCOTT의 COMM은 NULL 값임

① 0, NULL, NULL

② 0, 에러발생, 에러발생
 
③ 에러발생, 에러발생, NULL
  
④  0, 에러발생, NULL

 

더보기

정답 : ④

 

- NULL이 포함된 연산의 결과는 NULL이다. 

- 분모가 0이 들어가는 경우 연산 자체가 에러를 발생하며 원하는 결과를 얻을 수 없다.

- 0/300 = 0

- 5000/0 : 에러발생

- 1000/NULL = NULL 

 

[NULL 포함 연산의 결과]

 

NULL + 2 2 + NULL, 

NULL - 2, 2 - NULL,

NULL * 2, 2 * NULL, 

NULL / 2 , 2/ NULL

의 결과 모두 NULL이다 

 

 

 

48. 다음 중 아래와 같은 데이터 상황에서 SQL 의 수행결과로 가장 적절한 것은? 

 

 

SELECT SUM(COALESCE (C1, C2, C3)) 
FROM TAB1

 

① 0

② 1

③  6

④ 14  

 

더보기

정답 : ③

- 따라서 결과의 합은 6이다. 

- COALESCE 함수는 첫번째 NULL이 아닌 값을 반환한다. 

- COALESCE(C1, C2, C3)는 각 ROW에서 첫번째로 NULL이 아닌 값인 1,2,3을 반환한다. 

- 1번째 행에서 ---> 2번째 행에서 -----> 3번째 행에서 

 

 

 

 

 

49. 아래의 각 함수에 대한 설명 중 ㄱ, ㄴ, ㄷ 에 들어갈 함수를 차례대로 작성하시오. 

 

    ㄱ   (표현식1, 표현식2) : 표현식1의 결과값이 NULL이면 표현식 2의 값을 출력한다. 

    ㄴ   (표현식1, 표현식2) : 표현식1이 표현식 2와 같으면 NULL을, 같지 않으면 표현식1을 리턴한다.

    ㄷ   (표현식1, 표현식2) : 임의의 개수 표현식에서 NULL이 아닌 최초의 표현식을 나타낸다. 

 

더보기

정답 

ㄱ: NVL

ㄴ : NULLIF

ㄷ : COALESCE

 

-  ISNULL, NVL 함수는 표현식1의 결과값이 NULL이면, 표현식2의 값을 출력하며,

-  NULLIF는 표현식1이 표현식2와 같으면 NULL을,  같지 않으면 표현식 1을 리턴한다.

- COALESCE는 임의의 개수 표현식에서 NULL이 아닌 최초의 표현식을 나타낸다.  

 

[ NULL 관련 함수 ]

 

- Oracle 함수 

NVL(표현식1, 표현식2)  ISNULL(표현식1, 표현식2)

 

- SQL Server함수 

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

 

 

 

 

 

50. 다음 중 아래 각각 3개의 SQL 수행 결과로 가장 적절한 것은? 

 

 

SELECT AVG(COL3) FROM TAB_A;
SELECT AVG(COL3) FROM TAB_A WHERE COL1 > 0;
SELECT AVG(COL3) FROM TAB_A WHERE COL1 IS NOT NULL;

 

① 20, 20, 20

② 20, 10, 10
 
③ 10, 20, 20

④ 10, 10 ,10 

 

더보기

정답 : ③

 

SELECT AVG(COL3) FROM TAB_A; --> (20 + 0) / 2건 = 10

----> 세번째 행 COL3의 NULL은 AVG 연산 대상에서 제외

 

COL1 COL2 COL3
30 NULL 20
NULL 40 0
0 10 NULL

 

SELECT AVG(COL3) FROM TAB_A WHERE COL1 > 0; ----> (20)/1건 = 20

-----> WHERE 절에 의해 COL1이 NULL인 두번째 행은 NULL 연산 제외 조건으로 제외됨

-----> WHERE 절에 의해  COL1이 0인 세번째 행은 연산 대상에서 제외됨 

 

COL1 COL2 COL3
30 NULL 20

 

SELECT AVG(COL3) FROM TAB_A WHERE COL1 IS NOT NULL; ---> (20)/1건 = 20

----> COL1이 NULL인 두번째 행은 NOT NULL 조건으로 인해 제외됨

----> 세번째 행 COL3의 NULL은 AVG 연산 대상에서 제외됨

 

COL1 COL2 COL3
30 NULL 20
0 10 NULL 

 

 

728x90
반응형
LIST

'Certification > SQLD 개발자' 카테고리의 다른 글

[SQLD] 1단원 11-20 문제  (0) 2023.11.13
[SQLD] 1단원 1-10문제  (0) 2023.11.13
[SQLD] SQLD 문제 풀이 31-40  (1) 2023.10.14
[SQLD] SQLD 문제 풀이 21-30  (1) 2023.10.11
[SQLD] SQLD 문제 풀이 11-20  (0) 2023.10.10