문제와 정답은 하단에 있습니다!
도움되셨다면 공감♥, 댓글 부탁드려요!
2과목은 16문제 이상 맞춰야 과락을 피할 수 있습니다!
30회 단답형 해설을 여기!
https://ori-gina-l.tistory.com/17?category=891355
21회 해설은 여기있습니다!
https://ori-gina-l.tistory.com/21
34, 35회 해설은 여기서 봐주세요!
https://ori-gina-l.tistory.com/category/%EC%9E%90%EA%B2%A9%EC%A6%9D/SQLD
12번 이해하는 고수님은 알려주세요! 저는 모르겠네용...
11.
SQLD_30_11_01
COL1 VARCHAR2(30)
COL2 NUMBER
1) SELECT A.COL1, A.COL2
FROM SQLD_30_11_01 A
WHERE A.COL1 > 0;
==> VARCHAR : 가변 문자열인데 1)에서는 비교연산하려함
2) SELECT A.COL1, B.COL4
FROM SQLD_30_11_01 A
INNER JOIN SQLD_30_11_02 B
ON (A.COL1 = B.COL1)
WHERE B.COL3 > 'X';
==> FROM A테이블에서 INNER JOIN함(같은 것만 남기기)
A.COL1이랑 B.COL1은 같으니 다 남음
==> WHERE B.COL3 > 'X' 는 문자열 연산, X문자열 보다 큰것만 남김
A~, D~는 X보다 작은 문자열이고, XY는 X가 동일하지만 알파벳이 추가되있어 더 기니까 선택
==> (3, XY, 15) 선택
3) SELECT COUNT(*)
FROM SQLD_30_11_01 A
WHERE EXISTS (SELECT 'X'
FROM SQLD_30_11_02 B
WHERE A.COL2 = B.COL4);
==> A 테이블 선택
==> EXISTS 1개라도 존재하냐, B테이블 설정하고, A.COL2=B.COL4가 같은 것이ㅡ> 없음
(SELECT 'X'는 그냥 무시해도 괜찮아용)
==> NULL값 출력하겠죠?
4) SELECT SUM(A.COL2)
FROM SQLD_30_11_01 A
INNER JOIN SQLD_30_11_02 B
ON (A.COL1 = B.COL1)
WHERE B.COL4 > '1';
==> INNER JOIN해서 전체선택
==> B.COL.1 데이터와 문자 1 비교연산
문자가 유효한 숫자형태기 때문에 숫자로 형변환, 비교연산 진행
12.
단일행 비교 연산자 : =,<,>,<>, IN, ALL, ANY, SOME , 반드시 1건 이하 반환
다중 행 비교 연산자 : IN, ALL, ANY, SOME, 2건 이상 반환
1) SELECT A.COL1,
(SELECT COL3 FROM SQLD_30_12_03 B
WHERE A.COL1 = B.COL1) AS B_COL3
FROM SQLD_30_12_01 A
WHERE A.COL2 > 10;
==> A테이블 선택, A.COL2>10이니 A 전체
==> A.COL1=B.COL1 에서 A가 2개 중복되서 오류
2) SELECT A.COL1,
(SELECT COL5 FROM SQLD_30_12_03 B
WHERE A.COL4 = B.COL4) AS B_COL3
FROM SQLD_30_12_02 A
WHERE A.COL4 > 0;
==> A 테이블에서, A.COL4>0 인 경우, 마지막 행 빼고 모두 선택
==> B테이블 선택하고, A.COL4=B.COL4 인 경우 COL5 선택, COL5 모두 선택
==> 1~A까지 A테이블에서 최종선택인데
( ) 안은 서브쿼리기 때문에 1개씩 반환이라 오류X
3) SELECT A.COL1, B.COL3
FROM SQLD_30_12_01 A
INNER JOIN SQLD_30_12_02 B
ON (A.COL1 = B.COL1)
INNER JOIN SQLD_30_12_03 C
ON (B.COL4 = C.COL4)
WHERE C.COL4 > 5
AND A.COL2 > 10;
==> A테이블 선택하고, B테이블 선택, A.COL1 = B.COL1
13.
JOB_ID에 대한 합과, 총합을 구하기 때문에
==> ROLLUP(JOB_ID, MANAGER_ID)
인수 순서 바뀌면 값 달라짐!!!
(CUBE였으면 JOB_ID합 MANAGER_ID합, 총합 다 구함)
(GROUPING SET은 합 없음)
14.
COL1=A, COL2=50 인거 찾는 문제
==> 1개
15.
SELECT SUM(COL2)
FROM SQLD_30_15_01
WHERE COL1 IN ('A', 'X', NULL);
==> 표 선택, COL1=A OR COL1=X OR COL1=NULL 인 것 찾기
(X, 30) (A, 40) (A, 50) 선택, NULL넣는다고 뽑히지X
==> 30+40+50
16.
제일 안쪽부터 실행하되, 계층구조 파악필요
(정확히는 모르겠으나 구글링으로 여러 예시를 살펴본 결과
FULL이 아닌 BY INDEX ROWID가 붙은 경우는 가장 안쪽부터 읽으면 되는듯)
(선행테이블ㅡ> 인덱스ㅡ> 조인) (맞는지 모르겠음)
0- SELECT
1- NESTED LOOP JOIN
2- NESTED LOOP JOIN
3- TABLE ACCESS (FULL)
4- TABLE ACCESS (BY INDEX ROWID)
5- INDEX (RANGE SCAN)
6- TABLE ACCESS (BY INDEX ROWID)
7- INDEX (RANGE SCAN)
=> 5번이 가장 안쪽이지만 위에 TABLE ACCESS(FULL)있음
=> 3ㅡ> 5ㅡ> 4 (3번과 4번은 같은 위치니까 위에 있는 3번ㅡ>4번 순서)
(5번이 원래 제일 먼저였는데, 3번을 우선 넣어준 것)
=> 7번이 더 안쪽이지만
2번 아래에 3~5번 계획이 있었던 것, 계획 다 수행했으니 2번 수행하고 마무리
=> 3ㅡ> 5ㅡ> 4ㅡ> 2ㅡ> 7ㅡ> 6 (5ㅡ> 4와 동일)
=> 나머지는 더 안쪽에 있는 순으로 정리
3ㅡ> 5ㅡ> 4ㅡ> 2ㅡ> 7ㅡ> 6ㅡ> 1ㅡ> 0
17.
SELECT NVL(COUNT(*), 9999)
FROM SQLD_30_15_01
WHERE 1=2;
=> 표 선택
=> WHERE 1=2는 공집합이라는 뜻(FALSE)
=> COUNT(*)=0 (공집합이니까)
NVLㅡ> COUNT(*) IS NULL 이면 9999 , 아니면 COUNT(*) 반환
0이기 때문에 ISNULL 아님 정답 0
18.
SELECT COL1, SUM(COL2)
FROM SQLD_30_15_01
GROUP BY COL1;
=> 표 선택, COL1로 그룹 묶고
=> COL1과 SUM(COL2) 선택
NULL + 숫자 = NULL 이지만
집계함수 SUM은 NULL 무시
=> 2번 정답
(헷갈린다면 17번 참고 https://ori-gina-l.tistory.com/13
19.
SAVEPOINT 이름이 같다면 나중에 저장한 값으로 ROLLBACK함
=> 최댓값 출력이니까 4
20.
Procedure | Trigger | User defined function |
EXECUTE 명령어로 실행 | 자동 실행(이벤트 발생하면) | |
CREATE Procedure | CREATE Trigger | |
COMMIT, ROLLBACK 가능 | COMMIT, ROLLBACK 불가 | |
DML 많이 쓴다 | ||
반드시 값 RETURN 필요X | 반드시 값 RETURN |
DELETE ON TRIGGER에서 OLD(삭제 전 데이터) / NEW(삭제 후 데이터)
UPDATE TRIGGER에서 OLD(수정 전) / NEW(수정 후)
특정 테이블에 DML 시행되면 자동실행
트리거는 DB자체에 저장, 테이블, 뷰에 가능
21.
1) COALESCE('AB', 'BC', 'CD') FROM DUAL;
NULL이 아닌 최초값 출력 : AB
2) SELECT CASE 'AB' WHEN 'BC' THEN 'CD' END FROM DUAL;
IF문과 같다
AB = BC면 CD출력 ㅡ> 아니니까 NULL 출력
3) SELECT DECODE ('AB', 'CD', 'DE') FROM DUAL;
AB=CD면 DE출력 아니면 NULL
4) SELECT NULLIF ('AB', 'AB') FROM DUAL;
AB=AB면 NULL 출력 아니면 AB출력
22.
한 줄씩 수행한다
SELECT COALESCE(COL1, COL2*50, 50) FROM SQLD_30_11;
=> (100, 100) 일때, COL1= 100 이니까 100 출력
=> (NULL, 60) 일때, COL1은 NULL이니까 패스, COL2=60 이니까
60*50=300 출력
=> (NULL, NULL) 이면 COL1, COL2 모두 패스, 50 출력
23.24.
DDL : CREATE, DROP, MODIFY(오라클), ALTER(SQL서버)
DML : SELECT, INSERT, DELETE, UPDATE
DCL : GRANK, REVOKE
TCL : COMMIT, ROLLBACK
25.
1) CHARACTER : 고정길이 문자열, S만큼 최대길이(그보다 작으면 공백으로 채움)2) VARCHAR : 가변 문자열3) NUMERIC(SQL서버) : 정수, 실수 NUMBER(오라클)4) DATETIME(SQL서버) : 날짜정보 DATE(오라클)
26.
ROWNUM : 그냥 상위 N개 추출
TOP : ORDER BY가 있다면 정렬 후 상위 N개 추출
SELECT TOP(10) FIRST_NAME, JOB_ID
FROM HR.EMPLOYEES
ORDER BY SALARY;
=> HR.EMP에서 SALARY로 정렬ㅡ> 위에서 10줄 추출
FROMㅡ> WHEREㅡ> GROUP BYㅡ> HAVINGㅡ> SELECTㅡ> ORDER BY
1) SELECT FIRST_NAME, JOB_ID
FROM HR.EMPLOYEES
WHERE ROWNUM <= 10
ORDER BY SALARY;
==> HR.EMP선택, 위에서 10줄 선택ㅡ> SALARY로 정렬
(정렬하기 전에 그냥 10줄 뽑아오는 거)
2) SELECT TOP(10) WITH TIES FIRST_NAME, JOB_ID
FROM HR.EMPLOYEES
ORDER BY SALARY;
=> HR.EMP에서 SALARY로 정렬
=> 상위 10개 뽑되, 같은 SALARY 받는 사람 같이 출력
3) SELECT FIRST_NAME, JOB_ID
FROM (
SELECT FIRST_NAME, JOB_ID, ROWNUM RN
FROM HR.EMPLOYEES
ORDER BY SALARY
)
WHERE RN <= 10;
=> HR.EMP에서 FIRST_NAME, JOB_ID 선택하고, ROWNUM이 먼저 시행된다
=> 그 후 SALARY로 정렬 (이건 명확히 모르겠네용)
4) SELECT FIRST_NAME, JOB_ID
FROM (
SELECT FIRST_NAME, JOB_ID
FROM HR.EMPLOYEES
ORDER BY SALARY
)
WHERE ROWNUM <= 10;
=> HR에서 FIRST_NAME, JOB_ID 선택, SALARY로 정렬
=> 상위 10줄 추출
27.
SELECT LEVEL
LPAD('**', (LEVEL-1)*2, '**') || EMPLOYEE_ID AS EMP_TREE,
MANAGER_ID,
EMPLOYEE_ID
FROM HR.EMPLOYEES
WHERE 1=1
START WITH ( )
CONNECT BY PRIOR ( )
START WITHㅡ> CONNECT BYㅡ> WHERE
==> HR에서 ( )에서 시작(루트노드)
표를 보면 MANAGER_ID가 비어있음ㅡ> MANAGER_ID IS NULL
==> PRIOR 자식노드 = 부모노드, 이전 자식노드 값 = 현재 부모노드값
PRIOR EMPLOYEE_ID = MANAGER_ID
28.
합집합 : UNION
중복허용 합집합 : UNION ALL (빠르다)
교집합 : INTERSECT
차집합 : MINUS
29.
NL Join | Sort Merge Join | Hash Join |
랜덤 액세스 | 등가, 비등가 조인 가능 | 등가조인만 가능 |
대용량 sort 작업 유리 (sort가 포인트) | 조인키 기준 정렬 각 테이블 정렬 후 조인 |
(대량이 포인트) |
함수 처리함 | ||
선행테이블 작다 | ||
별도 저장공간 필요함 | ||
인덱스 없으면 유리 |
30.
1) FROM SQLD_30_30_고객 A
INNER JOIN SQLD_30_30_주문 C ON A.고객ID = C.고객ID
INNER JOIN SQLD_30_30_상품 B ON C.상품ID = B.상품ID
=> 이 경우 모든 고객의 총 주문금액인데
INNER JOIN하면 서로 겹치는 것만 선택함ㅡ> 주문한 고객ID만 남음
(문제풀이 해본 결과 모든~~ 나타내는, 뭐를 꼭 나타내는~ 이런 식일 때 INNER JOIN이 오답인 경우가 많은듯)
31.
SELECT DISTINCT COL1, COL2
FROM SQLD_30_31_01
UNION ALL
SELECT COL1, COL2
FROM SQLD_30_31_02
=> DISTINCT 중복제거, UNION ALL 중복 허용 합집합
COL1 | COL2 |
1 | 2 |
1 | 3 |
1 | 2 |
1 | 4 |
1 | 5 |
32.
SELECT COUNT(*)
FROM SQLD_30_11_01 A, SQLD_30_11_02 B
WHERE A.COL1 = B.COL1
AND NVL(A.COL2, -1) = NVL(B.COL2, -1)
AND NVL(A.COL3, -1) = NVL(B.COL3, -1)
=> A,B 선택
=> A.COL1=B.COL1 AND NVL(A.COL2, -1) = NVL(B.COL2, -1)
A.COL1=B.COL1는 2번째 행까지 만족 (1,2)
NVL(A.COL2, -1) = NVL(B.COL2, -1) 2번째 행만 만족 (NULL, NULL)
=> 2번째 행 AND NVL(A.COL3, -1) = NVL(B.COL3, -1)
=> 위 조건 만족, 최종 2번째 행만 출력
33.
Unique Index Scan은 1개 값 추출하는 방식
PK는 KEY1, KEY2인데 4) KEY1에만 조건 줌, 1개 이상 나올 수 있다
34.
주문 REFERENCES 고객 (고객이 부모, 주문이 자식)
4) 부모에 없는 데이터가 자식에 있음?ㅡ> 오류
3) 고객ID(FK) 외래키인데
참조무결성 : 외래키는 부모키(기본키)값과 같거나 NULL값일 것
35.
Cross Join : Where 절에서 조건을 걸 수 있다
Join Key 가 없을 경우 발생
Natural Join : Where 절에서 조건을 걸 수 없다.
특정 Join 컬럼을 명시적으로 적을 수 없다.(OWNER명 불가)(EX EMP.DEPT)
Join Key 는 컬럼명으로 결정된다.
36.
RANGE : 관리 쉽다 / 가장 많이 쓰임 / 숫자값으로 분리O
LIST : 대량 데이터 / 특정컬럼(생성일자}) 없음 / PK
HASH : 관리어렵 / 데이터 위치모름
37.
FROM SQLD_30_11_01 A ( ) SQLD_30_11_02 B
=> 결과에 B값은 모두 나오고 A값은 B와 겹치는 것만 출력
=> 오른쪽의 B값 모두 출력한 것 : RIGHT OUTER JOIN
38.
1) LAST_VALUE() OVER : 가장 마지막 값
2) FIRST_VALUE() OVER : 제일 처음값
3) MAX() OVER : 제일 큰 값
39.
테이블 이름으로 말장난, 앞에 있는 테이블의 SUM 구하면 된다
40.
SELECT AVG (NVL (COL2, 0) ) AS AVG_COL
FROM SQLD_30_40
=> 표 선택, NVL (COL2, 0)ㅡ> (10, 20, 0) 출력ㅡ> 걔네 평균은 10
41.
SELECT JOB, COUNT(*) AS CNT=> JOB과 행 수 세는 것 선택 (2개) 4) ORDER BY 3 , 3번째 열이 없어서 오답
42.MERGE 사용 시 DELETE는 UPDATE절에 종속
MERGE INTO SQLD_30_40_01 A
USING SQLD_30_40_02 B
ON (A.COL1 = B.COL1)
WHEN MATCHED THEN
UPDATE SET A.COL3 = 4
WHERE A.COL3 = 2
DELETE WHERE A.COL3 <= 2
WHEN NOT MATCHED THEN
INSERT (A.COL1,A.COL2,A.COL3) VALUES(B.COL1,B.COL2,B.COL3);
=> A 표를 수정하는데, A.COL1=B.COL1이 같다면 (A~C까지 선택)
A.COL3=2인 곳을 A.COL3=4로 바꾸고
A.COL3=4인 줄이 A.COL3 <= 2이라면 지워라 (안 지우겠죠?)
=> 같지 않다면 (X)(D,E)부분을 A표에 추가해라!
COL1 | COL2 | COL3 |
A | X | 1 |
B | Y | 4 |
C | Z | 3 |
X | T | 1 |
D | 가 | 4 |
E | 나 | 5 |
출처는 여기
https://cafe.naver.com/sqlpd/8352
정답
'자격증 > SQLD' 카테고리의 다른 글
[SQLD 35회 1과목] 문제공유 + 자세한 해설 (비전공자도 가능) + 문제링크 추가 (2) | 2020.09.01 |
---|---|
[SQLD 30회 단답형] 문제공유 + 자세한 해설 (비전공자도 가능) (2) | 2020.09.01 |
[SQLD 30회 1과목] 문제공유 + 자세한 해설 (비전공자도 가능) (0) | 2020.08.31 |
[SQLD 34회 단답형] 문제공유 + 자세한 해설 (비전공자도 가능) (3) | 2020.08.31 |
[SQLD 34회 2과목] 문제공유 + 자세한 해설 (비전공자도 가능) (21) | 2020.08.30 |
댓글