본문 바로가기
스터디/SQL

[기출문제] 2과목(SQL기본.1) - 2024 개정판, 해설 포함

by 견습생L 2024. 8. 23.

[기출문제] 2과목(SQL기본.1) - 2024 개정판, 해설 포함

 


기출문제

1. SQL 문을 실행했을 때 오류가 발생하는 부분으로 가장 적절한 것은?
① SELECT DEPTNO, ROUND(AVG(SAL),2)
② FROM EMP
③ WHERE AVG(SAL) <= 1800
④ GROUP BY DEPTNO;

2. 다음 중 SQL 문장 중 COLUMN1의 값이 NULL이 아닌 경우를 찾아내는 문장으로 가장 적절한 것은? (ANSI 표준 기준)
① SELECT * FROM MYTABLE WHERE COLUMN1 NOT NULL;
SELECT * FROM MYTABLE WHERE COLUMN1 != NULL;
SELECT * FROM MYTABLE WHERE COLUMN1 <> NULL;
SELECT * FROM MYTABLE WHERE COLUMN1 IS NOT NULL;

3. 아래에 대한 설명으로 가장 적절한 것은?

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

[SQL]
ⓐ SELECT * FROM 서비스 WHERE 서비스번호 =1;
ⓑ INSERT INTO 서비스 VALUES ('999',' ','205-11-11');
ⓒ SELECT * FROM 서비스 WHERE 서비스명 = ' ';
ⓓ SELECT * FROM 서비스 WHERE 서비스명 IS NULL;

① 오라클에서 ⓑ와 같이 데이터를 입력하였을 때, 서비스명 칼럼에 공백 문자 데이터가 입력된다.
② 오라클에서 ⓑ와 같이 데이터를 입력하고 ⓒ와 같이 조회하였을 때, 데이터는 조회된다.
③ SQL Server에서 ⓑ와 같이 데이터를 입력하고 ⓓ와 같이 조회하였을 때 데이터는 조회되지 않는다.
④ 서비스번호 칼럼의 레코드 중 하나의 레코드라도 '001'과 같은 숫자 형식으로 입력되어 있다면 ⓐ은 오류 없이 실행된다.

4. 함수의 실행 결과로 가장 적절하지 않은 것은? (단, A의 ㅇ아스키코드는 65이다)
UPPER('SQL Expert') : 'SQL EXPERT'
LOWER('SQL Expert') : 'sql expert'
③ LTRIM('xxxYYZZxYZxx','x') : 'YYZZxYZ'
④ ASCII('A') : 65

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

 

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;


SELECT SVC_ID, COUNT(*) AS CNT
  FROM SVC_JOIN
 WHERE SVC_END_DATE >= TO_DATE('20150101000000','YYYYMMDDHH24MISS')
   AND SVC_END_DATE <= TO DATE('20140131235959','YYYYMMDDHH24MISS')
   AND CONCAT(JOIN_YMD, JOIN_HH) = '2014120100'
 GROUP BY SVC_ID;

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;

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;

 

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

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

① 2
 3
 4
 5

6. 아래 SQL에 대한 설명으로 가장 적절한 것은? (단, 고객이름은 중복되지 않는다고 가정)

고객 (고객번호, 고객이름, 주소, 전화번호)
상품 (상품번호, 상품이름, 무게, 가격)
주문 (고객번호, 상품번호, 수량, 날짜)

[SQL]
SELECT 고객이름, SUM(수량)
  FROM 고객, 상품, 주문
 WHERE 고객.고객번호 = 주문.고객번호
   AND 상품.상품번호 = 주문.상품번호
 GROUP BY 고객.고객이름
HAVING MAX(수량) > 10;

① 주문한 수량의 합이 10보다 큰 고객이름과 주문한 수량의 합을 구한다.
열한 번 이상 상품을 주문한 고객이름과 주문한 수량의 합을 구한다.
수량이 10보다 큰 주문을 한 고객이름과 주문한 수량의 합을 구한다.
 고객번호가 10보다 큰 고개이름과 주문한 수량의 합을 구한다.

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

SELECT ENAME, EMPNO, MGR, ⓐ(MGR,7698) AS NM
  FROM EMP;

① NVL
 IFNULL
NULLIF
COALESCE

9. 아래는 이름이 4 문자 이상이고 2번째 문자가 S인 학번을 출력하는 SQL이다. 빈칸 ⓐ에 들어갈 수 있는 내용으로 가장 적절하지 않은 것은?

SELECT 학번
  FROM 학생
 WHERE 학생.이름 LIKE ⓐ

① '_S%_ _'
 '_S_%_'
 '_S_ _%'
 '%S_ _ _'

10. 아래 SQL의 실행 결과로 가장 적절한 것은?

11. 오류가 발생하는 SQL은?

SELECT 지역, SUM(매출금액) AS 매출금액
  FROM 지역별매출
 GROUP BY 지역
 HAVING SUM(매출금액) > 1000
 ORDER BY COUNT(*) ASC;

SELECT 지역, SUM(매출금액) AS 매출금액
  FROM 지역별매출
 GROUP BY 지역
 ORDER BY 년 DESC;


SELECT 지역, 매출금액
  FROM 지역별매출
 ORDER BY 년 ASC;


SELECT 지역, SUM(매출금액) AS 매출금액
  FROM 지역별매출
 GROUP BY 지역
 ORDER BY 매출금액 DESC;

 

정답 및 해설

1. ③, WHERE 절에서는 집계 연산자는 쓸 수 없다.

2. ④, NULL 값을 조건절에서 사용하는 경우 IS NOT NULL, IS NULL을 사용해야 한다.

3. ③, ⓑ 과 같이 데이터가 입력되어 있을 때 SQL Server에서 데이터를 조회하려면 서비스명 = ' '로 조회하여야 한다. (오라클에서는 공백문자를 NULL로 인지하고, SQL Server에서는 공백문자도 문자로 인지한다.

 4. ③, LTRIM(대상, 해당조건)의 경우 대상에서 해당조건이 끝나는 경우까지 왼쪽에서 삭제하는 명령어다.  LTRIM('xxxYYZZxYZxx','x')의 결과는 'YYZZxYZxx' 이다.

5. ①, SQL의 가입조건은 동일하지만, 서비스 종료 일시가 2015년 01월 01일 00시 00분 00초에 종료되는 SQL을 찾는 조건이다. (날짜함수의 경우 YYYYMM만 기재되어 있다면 나머지는 01일 00시 00분 00초로 인지된다)

6. ④, LENGTH는 문자 길이를 숫자로 반환하며, SQL Server의 경우 줄 띄움↓(공백)은 문자로 인지한다. CHR은 주어진 ASCII 코드에 대한 문자를 반환하는 함수이다. (CHR(10)은 줄 바꿈), REPLACE는 대상을 문자열을 치환하는 함수로 REPLACE(C1, CHR(10))은 빈 문자열 전달 시 찾을 문자열 삭제가능하기에 줄 바꿈을 제거하는 것으로으로 전환, 스칼라 서브쿼리에서 계산된 내용은 아래와 같다.
ROWNUM 1은 3-2+1=2 , ROWNUM 2는 5-3+1=3 , 2+3 = 5

7. , HAVING은 주로 집계함수(COUNT, SUM, AVG, MAX..) 결과에 대한 조건을 확인하는 용도로 사용한다.

8. ③, NULLIF는 NULLIF(대상 1, 대상 2)의 경우 대상 1과 대상 2의 값이 같으면 NULL을 같지 않으면 대상 1을 반환한다.

9. ④, % 위치에 아무런 문자가 들어가지 않을 수도 있다. 따라서 s가 첫 문자가 될 수도 있으므로 틀림

10. ④, ID건수가 2개인 것은 100과 999이다. ORDER BY 절의 CASE문의 의해 999의 값은 0(최솟값)으로 치환되어 해당 값으로 오름차순 정렬이 되기 때문이다. ID로 정렬을 했다면 ③이 정답이다.

11. ②, ORDER BY는 SELECT 절에 없거나 GROUP BY절에 없는 비집계 칼럼 사용하는 경우 오류가 발생한다. 참고로  ③번은 논리적으로 맞지 않지만, 오라클은 행기반 DATABASE이므로 데이터를 액세스 할 때 행 전체 칼럼을 메모리에 로드한다. (따로 보이진 않지만, 년에 대한 값은 가지고 있는 것이다.) 이와 같은 특성으로 인해 기술되지 않은 칼럼으로 정렬할 수 있다. 대신 아래와 같은 SQL에서는 오라클이라도 정렬할 수 없다.

SELECT 지역, 매출금액
  FROM (
        SELECT 지역, 매출금액
          FROM 지역별매출
       )
 ORDER BY 년 ASC;

IN-LINE VIEW가 먼저 수행됨에 따라 더 이상 SELECT절 외 칼럼을 사용할 수 없기 때문이다.


이론에 대한 추가 확인은 아래 SQL관련 카테고리를 참고하기 바란다.

반응형