---------------------------------------------------------------------------------------------------------------------------------------------
★★ - 사원 테이블에 사원번호는 기본키르 설정되어있음, SQL문으로 사원번호 1번을 검색하는데 사원 테이블에는 하나의 ROW만 저장되어 있음, 이때 유리한 스캔 방식은 무엇인가?
1. UNIQUE INDEX SCAN
2. NON-UNIQUE INDEX SCAN
3. INDEX FULL SCAN
4. TABLE FULL SCAN
답 : 4번
하나의 데이터(행)을 읽기 위해서는 인덱스를 사용하지 않고 테이블 FULL SCAN하는 것이 효율적임
즉, 검색되는 행이 1건이므로 굳이 인덱스를 읽지 않고 바로 테이블을 검색하는 것
---------------------------------------------------------------------------------------------------------------------------------------------
★★ - 다음 중 해시 조인(HASH JOIN)에 대한 설명으로 올바르지 않은 것은?
1. 해시 조인은 해시 함수를 사용해서 주소를 계산하고 조인을 수행함
2. 해시 조인을 할 때는 선행 테이블의 크기가 작아야 함
3. 해시 조인은 CPU 연산이 많이 발생함
4. 해시 조인은 랜덤 액세스로 인해 부하가 발생함
답 : 4번
해시 조인은 해시 함수를 사용하므로 CPU를 많이 사용하지만 랜덤 액세스를 발생하지 않음
* 랜덤 액세스는 NESTED LOOP 조인에서 발생함
---------------------------------------------------------------------------------------------------------------------------------------------
★★ - NESTED LOOP 방식의 조인 절차로 옳은 것?
관리자(1) 인덱스에서 추출한 레코드 식별자를 이용해 후행 테이블을 액세스함
(2) 선행 테이블의 조인 키를 가지고 후행 테이블에 조인 키가 존재하는지 찾으러 가서 조인을 시도함
(3) 후행 테이블의 인덱스에 선행 테이블의 조인 키가 존재하는지 확인함
(4) 선행 테이블에서 조건을 만족하는 첫 번째 행을 찾음
답 : 4-2-3-1
---------------------------------------------------------------------------------------------------------------------------------------------
★★- SORT MERGE 방식의 조인이 NESTED LOOP방식 조인보다 효율적으로 판단되는 것을 고르시오
1. 기본키와 외래키 관계에서 외래키에 인덱스가 없을 때
2. 사용자가 발주한 주문에 대해서 체결 정보 한 건을 확인할 때
3. 병렬로 테이블을 읽고 SORT_AREA_SIZE가 작은 경우
4. RANDOM ACCESS가 자주 발생하지 않을 때
답 : 1번
SORT MERGE 방식의 조인은 두 개의 테이블을 SORT 한 후에 MERGE를 함, MERGE가 완료되면 한 번의 FULL SCAN으로 데이터를 검색함, 따라서 기본키와 외래키 관계에서 외래키의 인덱스가 없을 때 옵티마이저가 SORT MERGE 방식으로 조인이 진행됨
---------------------------------------------------------------------------------------------------------------------------------------------
★★- SELECT문에서 TABLE을 탐색하지 않고 FETCH하려고 함, INDEX 생성문으로 올바른 것은?
SELECT EMPNO, ENAME FROM EMP WHERE EMPNO = 1 ;
답 : CREATE TABLE EMP_TEST(EMPNO VARCHAR2(20) PRIMARY KEY, ENAME VARCHAR2(50)) ORGANIZATION INDEX;
# 인덱스 생성, IOT(Index-Organized Table)
(CREATE TABLE 테이블명 (컬럼명1 VARCHAR(5) PRIMARY KEY, 컬럼명2 VARCHAR(10)) ORGANIZATION
테이블을 탐색하지 않고 Fetch
테이블을 참조하지 않는 인덱스를 생성
인덱스의 Key가 Fetch하는추출의 컬럼으로 이루어진 인덱스
---------------------------------------------------------------------------------------------------------------------------------------------
- 다음 중 홍길동 사용자에게 아래의 작업을 실행할 수 있도록 권한을 부여한 것으로 올바른 것은?
UPDATE EMP SET SAL = 1000
WHERE DEPTNO = 100;
1. GRANT SELECT, UPDATE ON EMP TO 홍길동 ;
2. GRANT SELECT, UPDATE ON EMP;
3. REVOKE SELECT, UPDATE ON EMP;
4. GRANT CREATE TABLE ON 홍길동 ON EMP;
답 : 1번
권한 부여 문법 : GRANT 권한 ON 테이블 TO 사용자
---------------------------------------------------------------------------------------------------------------------------------------------
- 릴레이션 EMPLOYEE와 DEPARTMENT에서 다음 SQL 질의문의 수행 결과는?
[EMPLOYEE]
ENO | ENAME | ADDRESS | SCORE | DNO |
10 | HONG | 서울 | 80 | 100 |
20 | KIM | 대전 | 90 | 200 |
30 | LEE | 강릉 | 90 | 100 |
40 | KIM | 대전 | 95 | 200 |
50 | HONG | 서울 | 65 | 300 |
[DEPARTMENT]
DNO | DNAME |
100 | 영업 |
200 | 개발 |
300 | 서비스 |
SELECT E.DNO, D.DMANE, E.ENAME, E.SCORE
FROM EMPLOYEE E, DPARTMENT D
WHERE E.DNO=D.DNO AND(E.DNO, SCORE) IN (SELECT DNO, MAX(SCORE)
FROM EMPLOYEE GROUP BY DNO
답 : {(100, 영업, LEE, 90),(200, 개발, KIM, 95),(300, 서비스, HONG, 65)}
부서별 최고 점수 사원을 구하는 SQL문
---------------------------------------------------------------------------------------------------------------------------------------------
- 다음의 데이터베이스에서 '부양가족을 2명 이상 가진 사원의 사번(ENO), 성명(ENAME), 부양가족 수를 검색'하는 질의를 SQL로 적절하게 표현한 것은?
EMPLOYEE(ENO, ENAME, ADDRESS, SCORE, DNO)
DEPENDENT(ENO, ENAME, BIRTHDAY, RELATION)
답 :
SELECT E.ENO, E.ENAME, T.CNT
FROM EMPLOYEE E,(SELECT ENO, COUN(*) AS CNT FROM DEPENDENT GROUP BY ENO HAVING COUNT(*) >=2) T
WHERE E.ENO = T.ENO;
* 오답 주의
SELECT E.ENO, E.ENAME, COUNT(*)
FROM EMPLOYEE E, DEPENDENT D
WHERE EXISTS(SELECT * FROM DEPENDENT GROUP BY ENO HAVING COUNT(*)>=2)
GROUP BY E.ENO, E.ENAME ;
서브쿼리 SELECT문에 집계함수가 존재하지 않으므로 오답임
---------------------------------------------------------------------------------------------------------------------------------------------
- 다음 중 인덱스 튜닝에 대해 잘못 설명하고 있는 것은?
1. 인덱스를 경유한 테이블의 RANDOM 액세스 부하가 심할 때, 클러스터 테이블이나 IOT를 활용할 수 있음
2. 인덱스를 경유한 테이블 액세스 횟수가 같더라도 인덱스 구성에 따라 스캔 효율이 달라짐, 따라서 인덱스 스캔 효율을 높이기 위해 인덱스 칼럼 순서를 바꿔야 할 때가 종종 있음
3. 조건절이 WHERE DEPTNO = 10 AND ENMAE = 'SCOTT'일 때 인덱스를 [DEPTNO + ENAME]으로 구성하나 [ENAME + DEPTNO]로 구성하나 인덱스 스캔 효율에 차이가 없음
4. 인덱스 튜닝의 핵심 요소 중 하나는 불필요한 테이블 RANDOM 액세스가 발생하지 않도록 하는 데에 있음, 이를 위해 인덱스 칼럼 순서를 바꿔주는 것도 큰 효과가 있음
답 : 4번
3번은 두개의 항목이 모두 이퀄(=)비교이기에 순서가 상관 없음, 만약 하나는 동등비교고 하나는 범위 검색이라면 순서가 상관 있음
4번은 테이블 랜덤 액세스를 줄이기 위해서는 인덱스 항목을 추가해야함
---------------------------------------------------------------------------------------------------------------------------------------------
- 다음 SQL문의 실행 결과는?
SELECT COALESCE(NULL, '2', '1') FROM DUAL;
답 : '2'
COALESCE함수는 NULL이 아닌 첫 번째 값을 RETURN하는 함수임
---------------------------------------------------------------------------------------------------------------------------------------------
- 다음 SQL문의 실행 결과는?
SELECT * FROM DAUL WHERE NULL=NULL;
답 : 공집합
NULL과 NULL은 비교할 수 없음 따라서 공집합이 나옴
---------------------------------------------------------------------------------------------------------------------------------------------
- 그룹 내 행 순서 관련 함수에 속하지 않는 함수는?
1. FIRST_VALUE
2. LAST_VALUE
3. RANK
4. LAG
답 : 3번
RANK 함수는 순위를 구하는 윈도우 함수
LAG 함수는 기준 데이터의 이전행의 값을 반환해 주는 함수
---------------------------------------------------------------------------------------------------------------------------------------------
- 다음은 윈도우 함수에 대한 설명임, 현재 행을 기준으로 파티션 내에서 앞의 한 건, 현재행, 뒤의 한 건을 범위를 지정하는 OVER 옵션은?
답 : ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
---------------------------------------------------------------------------------------------------------------------------------------------
- CONNECT BY에 대한 설명으로 맞지 않은 것은?
1. CONNECT_BY_ISLEAF는 전개과정에서 LEAF 데이터이면 0, 아니면 1을 가짐
2. CONNECT_BY_ISCYCLE는 ROOT 까지의 경로에 존재하는 데이터를 의미함
3. CONNECT_BY_ROOT는 ROOT 노드의 정보를 표시함
4. SYS_CONNECT_BY_PATH는 하위 레벨의 칼럼까지 모두 표시함
답 : 1번
CONNECT_BY_ISLEAF는 전개과정에서 LEAF 데이터면 1을 아니면 0을 가짐
---------------------------------------------------------------------------------------------------------------------------------------------
- 100 그룹 내 순위 관련 WINDOW 함수의 특징으로 올바르지 않은 것은?
1. RANK 함수는 동일한 값에 대해서는 동일한 순위를 부여함
2. DENSE_RANK 함수는 RANK함수와 흡사하며, 동일한 순위를 하나의 건수로 취급함
3. RCUMM_RANK 함수는 누적된 순위를 부여함
4. RANK함수가 동일한 값에 대해서는 동일한 순위를 부여하는데 반해, ROW_NUMBER함수는 고유한 순위를 부여함
답 : 3번
RCUMM_RANK는 존재하지 않는 함수
---------------------------------------------------------------------------------------------------------------------------------------------
- CASE문에서 ELSE를 생략하면 어떤 현상이 발생하는가?
답 : ELSE 조건이 만족하게 되면 NULL이 됨
---------------------------------------------------------------------------------------------------------------------------------------------
- 서브쿼리의 종류 중에 서브쿼리를 실행하고 한 행, 한 칼럼을 반환하는 서브쿼리를 무엇이라고 하는가?
답 : SCALA SUBQUERY
스칼라 서브쿼리 : SELECT 문에서 사용하는 서브쿼리로 한 행만 반환함
인라인 뷰 : FROM절에 있는 서브쿼리를 의미
서브쿼리 : WHERE절에 있는 서브쿼리
---------------------------------------------------------------------------------------------------------------------------------------------
★★- 다음 중 ROWNUM을 올바르게 사용하지 않은 것은?
1. SELECT ROWNUM, ENAME FROM EMP;
2. SELECT EMPNO FROM EMP WHERE ROWNUM=1;
3. SELECT EMPNO FROM EMP WHERE ROWNUM=2;
4. SELECT DEPTNO FROM EMP WHERE ROWNUM <10;
답 : 3번
ROWNUM은 1 제외 등호가 성립하지 않음, 부등호는 가능함
ROWNUM은 SELECT문에서 행이 인출될 때 부여되는 일렬번호로 만약 ROWNUM을 1,2,3,4로 인출하고 조건에 부여하려면 인라인 뷰를 사용해야함
3번 정정 예시 :
SELECT * FROM (SELECT ROWNUM TOP, ENAME FROM EMP)A WHERE A.TOP=2;
---------------------------------------------------------------------------------------------------------------------------------------------
- SUBQUERY의 종류 중에서 SUBQUERY가 MAINQUERY의 제공자 역할을 하고 MAINQUERY의 값이 SUBQUERY에 주입되지 않는 유형은 무엇인가?
1. FILTER 형 SUBQUERY
2. EARLY FILTER형 SUBQUERY
3. ASSOCIATIVE SUBQUERY
4. ACCESS SUBQUERY
답 : 4번
ACCESS SUBQUERY : 쿼리의 변형이 없고 제공자의 역할을 하는 서브쿼리
FILTER SUBQUERY : 쿼리의 변형이 없고 확인자(FILTER) 역할을 하는 서브쿼리
EARLY FILTER SUBQUERY : 쿼리의 변형이 없고 서브쿼리가 먼저 실행하여 데이터를 걸러내는 서브쿼리
---------------------------------------------------------------------------------------------------------------------------------------------
- ANSI/ISO 표준 SQL에서 두 테이블 간에 동일한 칼럼 이름을 가지는 것을 모두 출력하는 조인 방식은?
1. INNER JOIN
2. CROSS JOIN
3. NATURAL JOIN
4. USING
답 : 3번
NATURAL JOIN은 두 테이블 간에 동일한 칼럼 이름을 가진 것을 모두 출력함
ALIAS를 사용할 수 없음
두 테이블에서 동일한 칼럼 이름을 가지느 칼럼은 모두 조인됨
동일한 칼럼이 두 개 이상일 경우 JOIN~USING문장을 사용함
---------------------------------------------------------------------------------------------------------------------------------------------
- 다음 STUDENT 테이블을 이용하여 아래의 SQL을 수행했을 때 실행 결과는?
NAME | TERM | DEGREE | DEPARTMENT |
A | 5 | 3 | COMPUTER |
B | 5 | 4 | COMPUTER |
C | 7 | 2 | PHYSICS |
D | 7 | 3 | PHYSICS |
E | 6 | 3 | MATH |
F | 3 | 1 | MATH |
G | 1 | 3 | MATH |
SELECT COUNT(*)
FROM STUDENT
GROUP BY DEPARTMENT
HAVING COUNT(*)>2;
답 : 3개
SELECT COUNT(*)은 전체 행 갯수를 가져옴, NULL은 제외함
---------------------------------------------------------------------------------------------------------------------------------------------
- 다음 SQL 문장이 성공적으로 수행되었을 때 SELECT 문장의 결과는 각각 무엇인가?
[SQL 문장]
CREATE TABLE 학과
(학과번호 CHAR(10) PRIMARY KEY, 학과명 CHAR(10));
CREATE TABLE 학생
(학번 CHAR(10) PRIMARY KEY, 소속학과 CHAR(10) , FOREIGN KEY(소속학과) REFERENCES 학과(학과번호)
ON DELETE CASCADE);
INSET INTO 학과 VALUES('1' '전산과');
INSET INTO 학과 VALUES('2' '전산과');
INSET INTO 학생 VALUES('100' '1');
INSET INTO 학생 VALUES('200' '2');
INSET INTO 학생 VALUES('300' '2');
[SELECT 문]
SELECT COUNT(학번) FROM 학생;
DELETE FROM 학과 WHERE 학과번호='2';
SELECT COUNT(학번) FROM 학생;
답 : 3,1
첫 SELECT 문에는 학생 3명이 INSERT 되었으므로 3이 출력됨
ON DELETE CASCADE(부모 데이터 삭제 시 자식 데이터도 삭제)에 의해 DELETE문에서 학생의 학과번호가 '2'인 2명이 없어짐
따라서 마지막 SELECT문에서는 1명의 학생이 COUNT됨
---------------------------------------------------------------------------------------------------------------------------------------------
- SQL 문장 중 COLUMN1의 값이 NULL이 아닌 경우를 찾아내는 목적의 문장인 것은?
답 : SELECT * FROM T_TEST WHERE COLUMN1 IS NOT NULL;
SELECT문으로 NULL값 조회시 IS NULL을, NULL이 아닌 것을 조회시 IS NOT NULL을 사용함
---------------------------------------------------------------------------------------------------------------------------------------------
- 숫자형 함수 적용과 그 결괏값이 올바르지 않은 것은?
1. ABS(-30 = 30
2. SIGN(-50) = -1
3. MOD(7,3)=2
4. CEIL(38.12)=39
답 : 3번
MOD 함수는 나머지를 나타내는 함수
ABS(숫자) : 절대값을 되돌려줌
SIGN(숫자) : 양수면 1을 음수면 -1을 0이면 0을 출력함
CEIL/CEILING(숫자) : 숫자보다 크거나 같은 최소의 정수를 출력, 가우스기호와 유사
FLOOR(숫자) : 숫자보다 작거나 같은 최소의 정수를 출력
ROUND(숫자,M) : M의 기본값은 0으로 M+1자리에서 반올림
TRUNC(숫자,M) : M의 기본값은 0으로 M+1자리에서 절삭
---------------------------------------------------------------------------------------------------------------------------------------------
- 다음 SQL 문의 결과로 출력되는 데이터는 무엇인가?
SELECT NEXT_DAY
(ADD_MONTHS(SYSDAY,6),'월요일')
FROM DAUL;
답 : 오늘 날짜로부터 6개월 후 첫 번째 월요일을 출력함
---------------------------------------------------------------------------------------------------------------------------------------------
- 다음 결과는 2개의 테이블을 어떤 JOIN으로 진행한 것인가?
EMPNO | DEPTNO |
7878 | 20 |
5496 | 10 |
60 | |
4895 |
답 : FULL OUTER JOIN
위의 결과는 EMPNO와 DEPTNO 각각에 서로 없는 것이 있으므로 FULL OUTER JOIN임
---------------------------------------------------------------------------------------------------------------------------------------------
- 다음 설명 중 옳지 않은 것은?
1. UNION과 UNION ALL은 성능 차이가 없음
2. NATURAL 조인에 해당하는 칼럼은 테이블 칼럼명이 동일함
3. VIEW는 실제 데이터를 갖고 있지 않음
4. 서브쿼리는 ORDER BY절에 사용할 수 있음
답 : 1번
UNION : 쿼리의 결과를 합침, 중복된 ROW는 제거함, 내부적으로 SORT(정렬)가 발생함
UNION ALL : 쿼리의 결과를 합침, 중복을 제거하지 않음
---------------------------------------------------------------------------------------------------------------------------------------------
- 다음 SQL 문에서 ( )에 들어갈 알맞은 명령은?
SELECT * FROM EMP A ( ) DEPT B ON A.DEPTNO=B.DEPTNO
[결과]
EMPNO | ENAME | DEPTNO | DEPTNO_1 | LOC |
78 | A | 20 | 20 | ㄱ |
75 | B | 10 | 10 | ㄴ |
79 | C | 30 | 30 | ㄷ |
40 | ㄹ |
답 : RIGHT OUTER JOIN
DEPT 테이블에 있는 40번이 조회되고 EMP 테이블은 NULL로 조회되었으므로 RIGHT OUTER JOIN임
---------------------------------------------------------------------------------------------------------------------------------------------
★★- 다음 SQL 실행 결과가 한 행으로 1,1이 조회되게 변경하시오
SELECT 1, 0 FROM DUAL
UNION ALL
SELEECT 0, 1 FROM DAUL;
답: 전체 SQL을 INLINE뷰로 해서 SUM 함수를 사용함
서브쿼리를 사용하고 집계 함수로 SUM을 함
SELECT SUM(X1), SUM(X2)
FROM (SELECT 1 X1, 0 X2 FROM DUAL
UNION ALL
SELECT 0 X1, 1 X2 FROM DUAL) ;
---------------------------------------------------------------------------------------------------------------------------------------------
'공부 > 【SQLD】' 카테고리의 다른 글
【SQLD】 1과목 데이터 모델링의 이해 기출문제 정리 (0) | 2024.08.22 |
---|---|
【SQLD】 2과목 SQL 기본 및 활용 연습문제 정리(5) (0) | 2024.08.21 |
【SQLD】 2과목 SQL 기본 및 활용 연습문제 정리(4) (0) | 2024.08.16 |
【SQLD】 2과목 SQL 기본 및 활용 연습문제 정리(2) (0) | 2024.08.15 |
【SQLD】 2과목 SQL 기본 및 활용 연습문제 정리(1) (0) | 2024.08.15 |