- 다음 주어진 테이블에서 아래와 같은 결과가 반환되도록 SQL문의 빈칸에 들어갈 올바른 것을 고르시오
[SQLD_64]
남성의류 | 여성의류 | 의류번호 |
아웃솔더 | 양말 | 1 |
가디건 | 아웃솔더 | 2 |
겨울외투 | 가디건 | 3 |
자켓 | 겨울외투 | 4 |
자켓 | 5 | |
숏바지 | 롱바지 | 6 |
양말 | 숏바지 | 7 |
[결과]
남성의류 | 여성의류 | 의류번호 |
자켓 | 5 | |
자켓 | 겨울외투 | 4 |
겨울외투 | 가디건 | 3 |
가디건 | 아웃솔더 | 2 |
아웃솔더 | 양말 | 1 |
양말 | 숏바지 | 7 |
숏바지 | 롱바지 | 6 |
SELECT * FROM SQLD_64
START WITH ( ㄱ )
CONNECT BY PRIOR ( ㄴ ) ;
답 : (ㄱ) : 남성의류 IS NULL , (ㄴ) 여성의류 = 남성의류
# 계층형 쿼리 : 테이블에 계층형 구조 즉, 수직적 구조가 존재할 때 이를 조회하기 위한 쿼리
START WITH : 트리 구조의 최상위 행을 지정
CONNECT BY : 연결고리를 만들고 PRIOR 연산자로 계층구조를 표현가능
CONNECT BY PRIOR A=B : 최상위 행에서 A값을 B값으로 갖는 다음 행을 검색
---------------------------------------------------------------------------------------------------------------------------------------------
★ ★- 다음 주어진 테이블에서 부서코드 100의 상위부서코드를 찾는 SQL문을 만들도록 빈칸을 채워 넣으시오
[SQLD_65]
부서ID | 부서코드 | 상위부서코드 |
10 | 50 | 0 |
20 | 100 | 50 |
30 | 150 | 100 |
40 | 200 | 150 |
50 | 250 | 200 |
SELECT 상위부서코드
FROM SQLD_65
( ㄱ ) 부서코드 = 100
( ㄴ ) 상위부서코드 = 0
( ㄷ ) 부서코드 = 상위부서코드
답 : (ㄱ) WHERE, (ㄴ) START WITH, (ㄷ) CONNECT BY PRIOR
실행 순서는 START WITH→CONNECT BY PRIOR →WHERE 순서임
---------------------------------------------------------------------------------------------------------------------------------------------
- 다음 주어진 테이블에서 아래와 같은 결괏값을 반환하는 SQL문을 고르시오
[SQLD_67]
반 | 이름 |
1 | A |
1 | A |
1 | A |
2 | B |
2 | C |
3 | D |
3 | D |
[결과]
반 | 결괏값 |
1 | 1 |
2 | 2 |
3 | 1 |
답 :
SELECT 반,COUNT(DISTINCT 이름) AS "결괏값"
FROM SQLD_67
GROUP BY 반 ;
테이블을 '반' 속성별로 그룹화한 다음 각 '반' 속성별 행의 행의 수를 COUNT하는데, DISTINCT 인자로 중복되는 이름을 제외함
---------------------------------------------------------------------------------------------------------------------------------------------
★★ - 다음 주어진 테이블에서 SELECT문을 수행했을 때 결괏값으로 다른 것?
[A]
COL1 |
NULL |
0 |
NULL |
0 |
NULL |
1. SELECT CAS A.COL1 WHEN NULL THEN -1 ELSE 0 END AS C1 FROM A;
2. SELECT CASE WHEN A. COL1 IS NULL THEN -1 ELSE 0 END AS C2 FROM A;
3. SELECT DECODE(A.COL1,NULL,-1,A.COL1) AS C3 FROM A;
4. SELECT NVL(A.COL1,-1) AS C4 FROM A;
답 : 1번
C1 | C2 | C3 | C4 |
0 | -1 | -1 | -1 |
0 | 0 | 0 | 0 |
0 | -1 | -1 | -1 |
0 | 0 | 0 | 0 |
0 | -1 | -1 | -1 |
1번 : A.COL1 WHEN NULL >> A.COL1의 값 = NULL 을 비교한 것, 그런데 NULL끼리는 비교가 안되므로 모두 0이 나옴
2번 : NULL은 IS NULL, IS NOT NULL로 비교
3번 : DECODE( A, B, X, Y) >> A=B이면 X를 출력, A≠B이면 Y를 출력
4번 : NVL(X,Y) >> X의 값이 NULL이면 Y를 출력
*NVL2(X,Y,Z) >> X의 값이 NULL이 아니면 Y를 NULL이면 Z를 출력
---------------------------------------------------------------------------------------------------------------------------------------------
★★ - 다음 주어진 테이블에서 아래의 SQL문을 수행했을 때 결괏값으로 올바른 것?
[SQLD_71]
COL1 | COL2 | COL3 |
1 | NULL | 1 |
2 | 10 | 13 |
2 | 10 | 12 |
SELECT * FROM SQLD_71
ORDER BY COL1 DESC, COL2 DESC, COL3 DESC ;
답 :
COL1 | COL2 | COL3 |
2 | 10 | 13 |
2 | 10 | 12 |
1 | NULL | 1 |
ASC(오름차순)일 경우 NULL 값은 맨 마지막에 위치함
DESC(내림차순)일 경우 NULL 값은 맨 위에 위치함
---------------------------------------------------------------------------------------------------------------------------------------------
- 아래의 계층형 SQL에서 리프 데이터이면 1, 그렇지 않으면 0을 출력하고 싶을 때 사용하는 키워드로 알맞은 것은?
SELECT LEVEL, LPAD(' ', 4*(LEVEL -1)||EMPNO,MGR,( ) AS ISLEAF FROM SCOTT.EMP
START WITH MGR IS NULL
CONNECT BY PRIOR EMPNO = MGR;
답 :CONNECT_BY_ISLEAF
CONNECT_BY_ISLEAF : 전개 과정에서 해당 데이터가 리프 데이터면 1,아니면 0
CONNECT_BY_ISCYCLE : 전개 과정에서 자식을 갖는데, 해당 데이터가 조상으로 존재하면 1, 그렇지 않으면 0
* 여기서 조상이란 자신으로부터 루트까지의 경록에 존재하는 데이터를 말함
SYS_CONNECT_BY_PATH : 하위 레벨의 컬럼까지 모두 표시해줌 (구분자 지정 가능)
CONNECT_BY_ROOT : Root 노드의 정보를 표시
---------------------------------------------------------------------------------------------------------------------------------------------
- 다음 중 인덱스를 효율적으로 액세스할 수 없는 검색 조건은?
1. WHERE 주문번호 BETWEEN 1 AND 10
2. WHERE 주문자명 LIKE '%홍길동%'
3. WHERE 주문일자 >= '20181201'
4. WHERE 주문일자 = '20181201'
답 : 2번
LIKE 단어% 를 사용하여 검색할 때는 부분 문자열 검색에 인덱스를 사용할 수 있음
LIKE %단어나 LIKE %단어% 로 조회할 때는 인덱스가 적용되지 않고 테이블 Full Scan을 하게 됨
---------------------------------------------------------------------------------------------------------------------------------------------
- 다음 중 인덱스를 사용할 수 없는 조건에 해당되지 않는 것은?
1. 인덱스가 사용되는 칼럼에 NVL(KEY,0)을 사용함
2. 인덱스가 사용되는 칼럼에 TO_CHAR(VINTAGEDATE, 'YYYYMMDD') = SYSDATE를 사용함
3. 인덱스가 사용되는 칼럼에 VINTAGEYEAR = TO_CHAR(SYSDAT,'YYYY')를 사용함
4. 인덱스가 사용되는 칼럼에 NAME || '' = 'LIM'을 사용함
답 : 3번
3번의 경우 SYSDATE를 TO_CHAR() 함수를 사용해서 VINTAGEYEAR로 형변환을 했기에 VINTAGEYEAR가 형변환이 발생하지 않음 따라서 인덱스를 사용가능
1번 : NVL()함수로 NULL 값을 검사하여 인덱스 사용 불가
2번 : TO_CHAR()함수로 인덱스 키 칼럼을 형변환하여 인덱스 사용 불가
4번 : 문자열을 ||를 통해 결합하여 NAME의 인덱스를 변경했으므로 인덱스 사용 불가
'공부 > 【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 기본 및 활용 연습문제 정리(3) (1) | 2024.08.15 |
【SQLD】 2과목 SQL 기본 및 활용 연습문제 정리(1) (0) | 2024.08.15 |