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절 외 칼럼을 사용할 수 없기 때문이다.