본문 바로가기
Resource/SQLD

[SQLD] SQL 기본 및 활용 문제 (1 ~ 50)

by 우창욱 2024. 2. 27.

1. 데이터 제어어(DCL)에 해당하는 명령어는?

① INSERT (DML)

② RENAME (DDL)

③ COMMIT (TCL)

④ REVOKE (DCL)

 

2. 아래에서 빈칸 ㉠에 들어갈 내용으로 가장 적절한 것은?

INSERT는 테이블에 데이터를 입력할 때 사용한다.
[ ㉠ ]는 입력한 정보 중에 잘못 입력되거나 변경이 발생하여 정보를 수정할 때 사용한다.
DELETE는 테이블의 정보가 필요 없게 되었을 경우 데이터 삭제를 수행한다.

① UPDATE
② SELECT
③ ALTER
④ REVOKE

 

3. 아래 내용에 해당하는 SQL 명령어의 종류는?

논리적인 작업의 단위를 묶어 DML에 의해 조작된 결과를 작업단위(Transaction)별로 제어하는 명령어인 COMMIT, ROLLBACK,
SAVEPOINT 등이 여기에 해당하며, 일부에서는 DCL(Data Control Language)로 분류하기도 한다.

① DDL
② DML
③ TCL
④ TML

 

4. SELECT 문에 대한 설명으로 가장 적절하지 않은 것은?

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

 

5. SQL의 종류와 해당되는 명령어를 바르게 연결한 것은?

① DML - SELECT
② TCL - GRANT
③ DCL - DROP
④ DML - ALTER

 

6. 아래 내용의 범주에 해당하는 SQL 명령어로 가장 적절하지 않은 것은?

테이블의 구조를 생성, 변경, 삭제하는 등 데이터 구조를 정의하는 데 사용되는 명령어이다.

① CREATE
② GRANT
③ ALTER
④ DROP

 

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

① WHERE 절
② GROUP BY 절
③ ORDER BY 절
④ HAVING 절

 

8. SQL 문을 실행했을 때 오류가 발생하는 부분으로 가장 적절한 것은?

① SELECT DEPNO, ROUND(AVG(SAL), 2)
② FROM EMP
③ WHERE AVG(SAL) >= 1800 (= WHERE 절에는 집계함수를 사용할 수 없다.)
④ GROUP BY DEPTNO;

 

9. 아래 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 COL1 IS NOT NULL;
SELECT SUM(COL2) + SUM(COL3) FROM TAB_A WHERE COL1 IS NULL;

 

[TAB_A]

COL1 COL2 COL3
30 <NULL> 20
<NULL> 50 10
0 10 <NULL>

① 60, NULL, 30, 60 
② 60, 20, 30, 60
③ 90, NULL, 30, 60
④ 90, 20, 30, 60

 

10. 다음 SQL 문장 중 COLUMN1의 값이 NULL이 아닌 경우를 찾아내는 문장으로 가장 적절한 것은? (ANSI 표준 기준)

① SELECT * FROM MYTABLE WHERE COLUMN1 IS NOT NULL;
② SELECT * FROM MYTABLE WHERE COLUMN1 <> NULL;
③ SELECT * FROM MYTABLE WHERE COLUMN1 != NULL;
④ SELECT * FROM MYTABLE WHERE COLUMN1 NOT NULL;

 

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

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

--SQL
SELECT * FROM 서비스 WHERE 서비스번호 = 1; --㉠
INSERT INTO 서비스 VALUES ('999', '', '2015-11-11'); --㉡
SELECT * FROM 서비스 WHERE 서비스명 = ''; --㉢
SELECT * FROM 서비스 WHERE 서비스명 IS NULL; --㉣

① 서비스번호 컬럼의 레코드 중 하나의 레코드라도 '001'과 같은 숫자 형식으로 입력되어 있다면 ㉠은 오류 없이 실행된다. (서비스번호 컬럼의 모든 레코드가 숫자형식으로 입력되어 있어야 오류가 발생하지 않는다.)
② 오라클에서 ㉡과 같이 데이터를 입력하였을 때, 서비스명 컬럼에 공백 문자 데이터가 입력된다. (오라클에서 빈 문자열은 NULL로 취급된다.)
③ 오라클에서 ㉡과 같이 데이터를 입력하고 ㉢과 같이 조회하였을 때, 데이터는 조회된다. (오라클에서 빈 문자열은 NULL로 취급된다.)
④ SQL SERVER에서 ㉡과 같이 데이터를 입력하고 ㉣과 같이 조회하였을 때, 데이터는 조회되지 않는다. (SQL SERVER에서는 빈 문자열이 그대로 빈 문자열로 저장된다.)

 

12. 함수의 실행 결과로 가장 적절하지 않은 것은?

① LOWER('SQL Expert') : 'sql expert'
② UPPER('SQL Expert'): 'SQL EXPERT'
③ ASCII('A'): 65
④ LTRIM('xxYYZZxYZxx', 'x'): 'YYZZxYZ'

 

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

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;


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;


④ (= TO_DATE('201501', 'YYYYMM') 은 '2015년 1월 1일'로 변환된다.) 

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;

 

14. GROUP BY 절과 HAVING 절에 대한 설명으로 가장 적절한 것은?

① 집계 함수의 통계 정보는 NULL 값을 가진 행을 포함하여 수행한다.
② GROUP BY 절에서는 SELECT 절과 같이 ALIAS 명을 사용할 수 있다.
③ 집계 함수는 WHERE 절에도 올 수 있다.
④ HAVING 절은 일반적으로 GROUP BY 절 뒤에 위치한다.

 

(참고) GROUP BY 절과 HAVING 절의 특성

1. GROUP BY 절을 통해 소그룹별 기준을 정한 후, SELECT 절에 집계 함수를 사용한다.

2. 집계 함수의 통계 정보는 NULL 값을 가진 행을 제외하고 수행한다.

3. GROUP BY 절에서는 SELECT 절과는 달리 ALIAS 명을 사용할 수 없다.

4. 집계 함수는 WHERE 절에는 올 수 없다. (집계 함수를 사용할 수 있는 GROUP BY 절보다 WHERE 절이 먼저 수행된다.)

5. WHERE 절은 전체 데이터를 GROUP 으로 나누기 전에 행들을 미리 제거한다.

6. HAVING 절은 GROUP BY 절의 기준 항목이나 소그룹의 집계 함수를 이용한 조건을 표시할 수 있다.

7. GROUP BY 절에 의한 소그룹별로 만들어진 집계 데이터 중, HAVING 절에서 제한 조건을 두어 조건을 만족하는 내용만 출력한다.

8. HAVING 절은 일반적으로 GROUP BY 절 뒤에 위치한다.

 

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

 

[TAB1]

ROWNUM C1
1 A
🠗
A
2 B
🠗
B
🠗
B

 

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

① 2
② 3
③ 5 (= REPLACE(C1, CHR(10))은 줄바꿈을 제거한다. 3 🠒 2, 5 🠒 3)

④ 6

 

16. 아래 SQL의 실행 결과로 가장 적절한 것은? (단, DBMS는 오라클로 가정)

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

① 2023.01.10 11:01:00
② 2023.01.10 10:05:00
③ 2023.01.10 10:10:00
④ 2023.01.10 10:30:00

 

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

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

-- (나)
SELECT LOC,
  [  ㉠  ] as AREA
FROM DEPT;

 

① CASE WHEN LOC IS 'NEW YORK' THEN 'EAST' ELSE 'ETC' END (= IS는 문법적으로 올바르지 않다. =을 써야한다.)
② CASE LOC WHEN 'NEW YORK' THEN 'EAST' ELSE 'ETC' END
③ CASE LOC WHEN 'NEW YORK' THEN 'EAST' DEFAULT 'ETC' END (=CASE 문법에서 DEFAULT는 사용되지 않는다.)
④ DECODE (LOC, 'EAST', 'NEW YORK', 'ETC') (= DECODE는 첫 번째 인자와 일치하는 두 번째 인자를 발견했을 때 세 번째 인자를 반환한다. 일치하는 것이 없으면 네 번째 인자를 반환한다. 문법도 옳지 않고 문제의 요구사항과도 일치하지 않는다.)

 

18. 각 팀별로 FW, MF, DF,GK 포지션의 인원수와 팀별 전체 인원수를 구하는 SQL을 작성할 때 결과가 다른 하나는? (단, ①은 SQL Server 환경이고 ②, ③, ④는 오라클 환경이다.)

① (= SQL Server에서는 ISNULL 함수를 사용하여 NULL 값을 0으로 변환한다.)

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;


② (= 오라클 환경에서는 NVL 함수를 사용하여 NULL 값을 0으로 변환한다.)

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;


④ (= CASE WHEN 구문을 잘못 사용하고 있다. 특정 포지션에 대해 1을 카운트하지 않고 모든 경우에 1을 카운트한다. 포지션별 인원이 아닌 전체 인원수를 반환한다.)

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

 

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

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

[SQL]

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

 

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

 

(참고) 단일행 NULL 관련 함수의 종류

일반형 함수 함수 설명
NVL(표현식1, 표현식2): 오라클 /
ISNULL(표현식1, 표현식2): SQL Server
표현식1의 결과값이 NULL이면 표현식2를 출력한다. 단, 표현식1과 표현식2의 결과 데이터 타입이 같아야 한다. 
NULLIF(표현식1, 표현식2) 표현식1이 표현식2와 같으면 NULL을, 같지 않으면 표현식1을 리턴한다.
COALESE(표현식1, 표현식2, ....) 임의의 개수 표현식에서 NULL이 아닌 최초의 표현식을 나타낸다. 모든 표현식이 NULL이라면 NULL을 리턴한다.

 

 

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

SELECT ENAME, EMPNO, MGR, [ ㉠ ] (MGR, 7698) as NM
FROM EMP;

 

① NULLIF (= 첫 번째 인자의 결과값이 두 번째 인자의 결과와 같으면 NULL을 표시하고 다르면 첫 번째 인자를 출력한다.)
② NVL (= 첫 번째 인자의 결과값이 NULL이면 두 번째 인자의 값을 출력한다. 인자들의 타입이 같아야 한다.)
③ IFNULL (= 오라클엔 IFNULL 없음. NVL)
④ COALESCE (= 임의의 개수의 인자들을 받고, NULL이 아닌 최초의 인자를 출력한다. 모든 인자들이 NULL이면 NULL을 반환한다.)

 

21. 실행 결과가 다른 하나는?

① 

SELECT DNAME, LOC, DEPTNO
FROM DEPT
ORDER BY DNAME, LOC, 3 DESC;


SELECT DNAME, LOC AREA, DEPTNO
FROM DEPT
ORDER BY DNAME, AREA, DEPTNO DESC;


SELECT DNAME, LOC AREA, DEPTNO 
FROM DEPT
ORDER BY 1, AREA, 3 DESC;


④ (= DNAME (별칭 DEPT)을 기준으로 내림차순 정렬.)

SELECT DNAME DEPT, LOC AREA, DEPTNO
FROM DEPT
ORDER BY DEPT DESC, LOC, 3 DESC;

 

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

SELECT 학번
FROM 학생
WHERE 학생.이름 LIKE [ ㉠ ]

① '%S_ _ _' (=%에는 아무런 문자가 들어가지 않을 수도 있다.)
② '_S% _ _'
③ '_S_%_'
④ '_S_ _%'

 

23. 전공이름별로 묶어 전공이름과 학점 평균을 전공이름의 내림차순으로 정렬하여 출력하고자 할 때, 빈칸 ㉠, ㉡에 들어갈 명령어로 가장 적절한 것은?

SELECT 전공이름, AVG(학점)
FROM 전공, 학생
WHERE 전공.전공번호 = 학생.전공번호
[ ㉠ ] 전공이름
ORDER BY 전공이름 [ ㉡ ];

① ㉠ GROUP BY ㉡ DESC
② ㉠ HAVING ㉡ DESC
③ ㉠ GROUP BY ㉡ ASC
④ ㉠ HAVING ㉡ ASC

 

24. SQL의 실행 결과로 가장 적절하지 않은 것은?

① ROUND(4.875, 2) = 4.88
② LENGTH('KOREAN') = 6
③ DATE_FORMAT('2022-11-02', '%Y-%m-%d') = 2022-11-02
④ SUBSTR('Gangneung Wonju', 8, 4) = 'g Wo' (=ng w)

 

25. 아래를 참고할 때 광고매체 ID별 최초로 게시한 광고명과 광고시작일자를 출력하기 위하여 빈칸 ㉠ 에 들어갈 SQL로 가장 적절한 것은?

 

[SQL]

SELECT C.광고매체명, B.광고명, A.광고시작일자
FROM 광고게시 A, 광고 B, 광고매체 C,
  ( ㉠ ) D
WHERE A.광고시작일자 = D.광고시작일자
AND A.광고매체ID = D.광고매체ID
AND A.광고ID = B.광고ID
AND A.광고매체ID = C.광고매체ID
ORDER BY C.광고매체명;

SELECT D.광고매체ID, MIN(D.광고시작일자) AS 광고시작일자
FROM 광고게시 D
WHERE D.광고매체ID = C.광고매체ID
GROUP BY D.광고매체ID


SELECT D.광고매체ID, MIN(D.광고시작일자) AS 광고시작일자
FROM 광고게시
WHERE D.광고매체ID


SELECT MIN(광고매체ID) AS 광고매체ID, MIN(광고시작일자)
  AS 광고시작일자
FROM 광고게시
GROUP BY 광고ID


④ 

SELECT MIN(광고매체ID) AS 광고매체ID, MIN(광고시작일자)
  AS 광고시작일자
FROM 광고게시

 

 

26. 아래 SQL을 순서대로 실행했을 때 최종적으로 반영되는 SQL을 모두 고른 것은?

(가) INSERT INTO emp (empno, ename, deptno) VALUES (999, 'Smith', 10);
SAVEPOINT a;
(나) DELETE emp WHERE empno = 202;
SAVEPOINT b;
(다) UPDATE emp SET ename = 'Clark';
ROLLBACK TO SAVEPOINT a;
(라) INSERT INTO emp (empno, ename, deptno) VALUES (300, 'Thomas', 30);
SAVEPOINT c;
(마) DELETE emp WHERE deptno = 20;
COMMIT;

① (가), (나), (다), (라), (마)
② (가), (나), (다), (라)
③ (나), (다), (라), (마)
④ (가), (라), (마)

 

27. 아래 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>

[SQL]

SELECT COLB,
MAX(COLA) AS COLA1,
MIN(COLA) AS COLA2,
SUM(COLA + COLC) AS SUMAC
FROM TABLE_A
GROUP BY COLB;

 

 

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


② 

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


③ 

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


④ 

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

 

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

[TBL]

ID
100
100
200
200
200
999
999

[SQL]

SELECT ID FROM_TBL
GROUP BY ID
HAVING COUNT(*) = 2
ORDER BY (CASE WHEN ID = 999 THEN 0 ELSE ID END);

 

ID
100
999


② 

ID
999
100


③ 

ID
100
200
999


④ 

ID
999
200
100

 

(참고) ORDER BY 절 특징

번호 설명
1 기본적인 정렬 순서는 오름차순 (ASC) 이다.
2 숫자형 데이터 타입은 오름차순으로 정렬했을 경우에 가장 작은 값부터 출력된다.
3 날짜형 데이터 타입은 오름차순으로 정렬했을 경우 날짜 값이 가장 이른 값이 먼저 출력된다. 예를 들어
'01-JAN-2012'는
'01-SEP-2012' 보다 먼저 출력된다.
4 오라클에서는 NULL 값을 가장 큰 값으로 간주하여 오름차순으로 정렬했을 경우에는 가장 마지막에, 내림차순으로 정렬했을 경우에는 가장 먼저 위치한다.
5 반면, SQL Server 에서는 NULL 값을 가장 작은 값으로 간주하여 오름차순으로 정렬했을 경우에는 가장 먼저, 내림차순으로 정렬했을 경우에는 가장 마지막에 위치한다.

 

 

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

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


② 

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


③ (GROUP BY 절을 사용하고 있으나, ORDER BY 절에서 그룹화되지 않은 열인 '년'을 사용하고 있음. GROUP BY로 그룹화된 결과에서는 그룹화된 열 또는 집계 함수로 계산된 열만을 'SELECT', 'HAVING', 'ORDER BY'등 에서 참조할 수 있다.)

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


④ 

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

 

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

SELECT TO_CHAR(TO_DATE('2019.02.25', 'YYYY.MM.DD') + 1/12/(60/30), 'YYYY.MM.DD HH24:MI:SS')
FROM DUAL;

 

 

① 2019.02.25 02:00:00
② 2019.02.25 01:30:00
③ 2019.02.25 01:00:00
④ 2019.02.25 00:30:00

 

31. 실행 결과가 NULL인 SQL은? (단, DBMS는 오라클로 가정)

SELECT COALESCE(NULL, 'A') FROM DUAL;


② 

SELECT NULLIF('A', 'A') FROM DUAL;


③ 

SELECT NVL('A', NULL) FROM DUAL;


④ 

SELECT NVL(NULL, 0) + 10 FROM DUAL;

 

32. SELECT 문장의 실행 순서를 올바르게 나열한 것은?

① SELECT - FROM - WHERE - GROUP BY - HAVING - ORDER BY
② FROM - SELECT - WHERE - GROUP BY - HAVING - ORDER BY
③ FROM - WHERE - GROUP BY - HAVING - ORDER BY - SELECT
④ FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY

 

(참고) SELECT 문장 실행 순서

순서 설명
1. 발췌 대상 테이블을 참조한다. (FROM)
2. 발췌 대상 데이터가 아닌 것은 제거한다. (WHERE)
3. 행들을 소그룹화한다. (GROUP BY)
4. 그루핑된 값의 조건에 맞는 것만을 출력한다. (HAVING)
5. 데이터 값을 출력/계산한다. (SELECT)
6. 데이터를 정렬한다. (ORDER BY)

 

(참고) EQUI JOIN 문장 → WHERE 절에 JOIN 조건을 넣는다.

SELECT 테이블1.컬럼명, 테이블2.컬럼명, ....

FROM 테이블1, 테이블2

WHERE 테이블1.컬럼명1 = 테이블2.컬럼명2;

 

(참고) ANSI/ISO SQL 표준 EQUI JOIN 문장 → ON 절에 JOIN 조건을 넣는다.

SELECT 테이블1.컬럼명, 테이블2.컬럼명, ...

FROM 테이블1, INNER JOIN 테이블2

ON 테이블1.컬럼명1 = 테이블2.컬럼명2;

 

33. 5개의 테이블로부터 필요한 컬럼을 조회하려고 할 때, 최소 몇 개의 JOIN 조건이 필요한가?

① 2개
② 3개
③ 4개
④ 5개

 

34. 출연료가 8888 이상인 영화명, 배우명, 출연료를 구하는 SQL로 가장 적절한 것은? (단, 밑줄 친 속성들은 테이블의 기본키이다.)

배우(배우번호, 배우명, 성별)
영화(영화번호, 영화명, 제작년도)
출연(배우번호, 영화번호, 출연료)

SELECT 출연.영화명, 영화.배우명, 출연.출연료
FROM 배우, 영화, 출연
WHERE 출연료 >= 8888
AND 출연.영화번호 = 영화.영화번호
AND 출연.배우번호 = 배우.배우번호;


② 

SELECT 영화.영화명, 배우.배우명, 출연료
FROM 영화, 배우, 출연
WHERE 출연.출연료 > 8888
AND 출연.영화번호 = 영화.영화번호
AND 영화.영화번호 = 배우.배우번호;


③ 

SELECT 영화명, 배우명, 출연료
FROM 배우, 영화, 출연
WHERE 출연료 >= 8888
AND 영화번호 = 영화.영화번호
AND 배우번호 = 배우.배우번호;


④ 

SELECT 영화.영화명, 배우.배우명, 출연료
FROM 배우, 영화, 출연
WHERE 출연료 >= 8888
AND 출연.영화번호 = 영화.영화번호
AND 출연.배우번호 = 배우.배우번호;

 

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

구분 설명
(가) 일반적으로 조인은 PK와 FK값의 연관성에 의해 성립된다.
(나) DBMS 옵티마이저는 FROM 절에 나열된 테이블들을 임의로 3개 정도씩 묶어서 조인을 처리한다.
(다) EQUI JOIN은 조인에 관여하는 테이블 간의 컬럼 값들이 정확하게 일치하는 경우에 사용되는 방법이다.
(라) EQUI JOIN은 '=' 연산자에 의해서만 수행되며, 그 이외의 비교 연산자를 사용하는 경우에는 모두 NON EQUI JOIN 이다.
(마) 대부분 NON EQUI JOIN을 수행할 수 있지만, 때로는 설계상의 이유로 수행이 불가능한 경우도 있다.

① (가), (다), (라)
② (가), (나), (다)
③ (가), (나), (다), (라)
④ (가), (다), (라), (마)

 

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

[EMP_TBL]

EMPNO ENAME
1000 SMITH
1050 ALLEN
1100 SCOTT

 

[RULE_TBL]

RULE_NO RULE
1 S%
2 %T%

 

[SQL]

SELECT COUNT(*) CNT
FROM EMP_TBL A, RULE_TBL B
WHERE A.ENAME LIKE B.RULE;

① 0
② 2
③ 4
④ 6

 

37. 순수 관계 연산자로 가장 적절하지 않은 것은? 

① SELECT
② UPDATE (순수 관계 연산자는 SELECT, PROJECT, JOIN, DIVIDE가 있다. UPDATE는 테이블의 데이터를 수정하는 데 사용된다.)
③ JOIN
④ DIVIDE

 

38. 아래를 참고할 때 가장 적절한 SQL은?

[데이터 모델]

[설명]

우리는 매일 배치작업을 통하여 고객에게 추천할 컨텐츠를 생성하고 고객에게 추천서비스를 제공한다.

추천 컨텐츠 엔터티에서 언제 추천을 해야 하는지를 정의하는 추천 대상일자가 있어 해당일자에만 컨텐츠를 추천해야 한다.

또한 고객이 컨텐츠를 추천 받았을 때 선호하는 컨텐츠가 아닌 경우에는 고객이 비선호 컨텐츠로 분류하여 더 이상 추천 받기를 원하지 않는다. 그러므로 우리는 비선호 컨텐츠 엔터티에 등록된 데이터에 대해서는 추천을 수행하지 않아야 한다.

 

① (올바른 조건으로 비선호 컨텐츠를 제외하고 있으나, 비선호 컨텐츠를 확인할 때 컨텐츠ID가 아닌 고객ID만을 조건으로 사용하고 있어서 고객의 모든 비선호 컨텐츠를 제외하지 않음.)

SELECT C.컨텐츠ID, C.컨텐츠명
FROM 고객 A INNER JOIN 추천컨텐츠 B
ON (A.고객ID = B.고객ID) INNER JOIN 컨텐츠 C
ON (B.컨텐츠ID = C.컨텐츠ID)
WHERE A.고객ID = #custId#
AND B.추천대상일자 = TO_CHAR(SYSDATE, 'YYYY.MM.DD')
AND NOT EXISTS (SELECT X.컨텐츠ID FROM 비선호컨텐츠 X WHERE X.고객ID = B.고객ID);


② (RIGHT OUTER JOIN을 사용하는 구조는 비선호 컨텐츠가 아닌 컨텐츠에 대한 정보를 얻기 위해 잘못 설계되었음. 비선호 컨텐츠에 대한 정보도 반환할 수 있음.)

SELECT C.컨텐츠ID, C.컨텐츠명
FROM 고객 A INNER JOIN 추천컨텐츠 B
ON (A.고객ID = #custId# AND A.고객ID = B.고객ID) INNER JOIN 컨텐츠 C
ON (B.컨텐츠ID = C.컨텐츠ID) RIGHT OUTER JOIN 비선호컨텐츠 D
ON (B.고객ID = D.고객ID AND B.컨텐츠ID = D.컨텐츠ID)
WHERE B.추천대상일자 = TO_CHAR(SYSDATE, 'YYYY.MM.DD')
AND B.컨텐츠ID IS NOT NULL;


③ (이 쿼리는 비선호 컨텐츠인 경우에만 결과를 반환하고 있음. 즉, 고객이 선호하지 않는 컨텐츠만 제공하고 있음.)

SELECT C.컨텐츠ID, C.컨텐츠명
FROM 고객 A INNER JOIN 추천컨텐츠 B
ON (A.고객ID = B.고객ID) INNER JOIN 컨텐츠 C
ON (B.컨텐츠ID = C.컨텐츠ID) LEFT OUTER JOIN 비선호컨텐츠 D
ON (B.고객ID = D.고객ID AND B.컨텐츠ID = D.컨텐츠ID)
WHERE A.고객ID = #custId#
AND B.추천대상일자 = TO_CHAR(SYSDATE, 'YYYY.MM.DD')
AND D.컨텐츠ID IS NOT NULL;


④ (이 쿼리는 비선호 컨텐츠를 제외하고 추천 대상일자에 맞는 컨텐츠를 제대로 추천하고 있음. NOT EXISTS 절을 사용해서 비선호 컨텐츠가 아닌 것들만 필터링하고 있으며, 고객 ID와 일자 조건도 적절히 설정되어 있음.)

SELECT C.컨텐츠ID, C.컨텐츠명
FROM 고객 A INNER JOIN 추천컨텐츠 B
ON (A.고객ID = #custId# AND A.고객ID = B.고객ID) INNER JOIN 컨텐츠 C
ON (B.컨텐츠ID = C.컨텐츠ID)
WHERE B.추천대상일자 = TO_CHAR(SYSDATE, 'YYYY.MM.DD')
AND NOT EXISTS (SELECT X.컨텐츠ID FROM 비선호컨텐츠 X WHERE X.고객ID = B.고객ID AND X.컨텐츠ID = B.컨텐츠ID);

 

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

 

① 제품, 생산제품, 생산라인 엔터티를 INNER JOIN 하기 위해서 생산제품 엔터티는 WHERE 절에 최소 3번 나타나야 한다.
② 제품과 생산라인 엔터티를 JOIN 시 적절한 JOIN 조건이 없으므로 카티시안 곱 (Cartesian Product)이 발생한다.
③ 제품과 생산라인 엔터티에는 생산제품과 대응되지 않는 레코드는 없다.
④ 특정 생산라인번호에서 생산되는 제품의 제품명을 알기 위해서는 제품, 생산제품, 생산라인까지 3개 엔터티의 INNER JOIN이 필요하다.

 

40. 아래 SQL의 빈칸 ㉠, ㉡에 들어갈 내용으로 가장 적절한 것은?

[테이블]

고객(고객번호, 이름, 등급), 구매정보(구매번호, 구매금액, 고객번호)

* 구매정보 테이블의 고객번호는 고객 테이블의 고객번호를 참조하는 외래키(Foreign Key)이다.

[조건]

구매 이력이 있는 고객 중 구매 횟수가 3회 이상인 고객의 이름과 등급을 출력.

[SQL]

SELECT A.이름, A.등급
FROM 고객 A
㉠
GROUP BY A.이름, A.등급
㉡;

① 

㉠: INNER JOIN 구매정보 B ON A.고객번호=B.고객번호

㉡: HAVING SUM(B.구매번호) >= 3

㉠: INNER JOIN 구매정보 B ON A.고객번호=B.고객번호

㉡: HAVING COUNT(B.구매번호) >= 3

㉠: LEFT OUTER JOIN 구매정보 B ON A.고객번호=B.고객번호

㉡: HAVING SUM(B.구매번호) >= 3

㉠: INNER JOIN 구매정보 B ON A.고객번호=B.고객번호

㉡: WHERE B.구매번호 >= 3