문제출처: https://selgii.tistory.com/44
1.
테이블 간의 제약조건 지정은 도메인의 특징이 아니다.
속성에 대한 값의 범위, 유형, not null, check 등을 지정한다.
2.
보조식별자(AK, alternate key)
본질식별자: 업무에 의해 만들어지는 식별자 <-> 인조식별자: 업무에 의해 만들어지지 않지만 본질식별자가 복잡한 구성을 가져 임의로 구만든 식별자.
식별자를 여러개 사용: 복합식별자.
3.
주식별자를 도출하기 위한 기준이라고 했다.
식별자의 값은 변경될 수도 있으나 변경될 수 있다는 것을 기준으로 주식별자를 도출하지 않는다.
주식별자의 특징 중 불변성은 주식별자가 한번 지정되면 그 값은 변하지 말아야 한다고 정의했다.
6.
반정규화는 자주 사용하고, 찾기 위해 조인을 해야하는 데이터의 중복저장으로 조인 성능을 높인다.
외래키 관계의 속성을 추가하는 것은 이에 걸맞지 않다.
8.
점선은 비식별 관계를 의미. 두 테이블이 서로가 존재하지 않아도 각자 스스로 존재 가능.
9.
유비와 손권은 둘 다 상품번호가 같은 스마트폰을 주문했으나, 기본키인 고객번호가 다르다. 정보를 업데이트 하려면 각자 해줘야한다.
11.
Truncate table
특정 로우를 선택하여 지울 수 없음.
테이블의 데이터가 모두 삭제되나 테이블 자체가 지워지는 건 아님.
정상적인 복구가 불가능함.
delete table 보다 시스템 부하가 더 크거나 하지 않음.
drop table 과는 다른 명령어임.
13.
procedure, trigger 모두 execute 명령어를 사용하지 않음.
둘 모두 create 명령어로 생성함.
procedure는 commit, rollback 사용 가능.
trigger는 commit, rollback 사용 불가.
14
순방향이니까 KING이다.
15
오름차순, 내림차순을 명시하는 asc, desc는 컬럼명 뒤에 와야함.
17.
sum(col1 + col2 + col3) 과 같이 합계를 여러 컬럼에서 구하면 그 컬럼에 대한 로우 단위로 집계함.
col1, 2, 3이 합쳐진 1행의 합계 구하기, 2행의 합계 구하기, 3행의...
그런데 1행은 구했는데 2행부터 끝까지 행에 전부 null이 포함되어 1행의 합계인 4만 구했음.
18
NULLIF(a, b) -> a, b의 값이 같으면 NULL을 반환함. 다르면 첫번째 값을 반환함.
NULLIF('oracle', 'oracle') -> Null
NULLIF('a', 'b') -> 'a'
NVL(a, b) -> a의 결과가 NULL이면 대신 b의 값을 출력한다.
NVL(NULL, 'A') -> 'A'
NVL = IFNULL = ISNULL 이름만 다르지 다 똑같이 동작함
COALESCE(a, b) -> 인자 둘 중 null이 아닌 첫 번째 값을 반환함.
20
ROLLUP: group by로 묶인 소그룹 별로 합계를 구해주고 소그룹 전체의 합계를 구해줌.
Group by rollup (a, b)
21
Group by rollup (a, b) 일 때
rollup은 a, b 둘 모두를 기준으로 각 소그룹으로 묶은 후 이들에 대해 각각 합계를 구하고 전체 소그룹의 총계를 구했음.
Group by cube (a, b) 일 때
cube는 a를 기준으로 한 소그룹 별로 합계를 구해주고, b를 기준으로 한 소그룹 별로 합계를 구해주고, 전체 소그룹에 대한 총계를 구해줌.
Group by grouping sets (a, b) 일 때
a를 기준으로 묶은 소그룹 별 합계, b를 기준으로 묶은 소그룹 별 합계를 구해준다. 위 두 집계함수보다 결과가 단순하다.
22.
1. rollup은 인수의 순서가 바뀌면 결과도 바뀐다.
2. rollup, cube, grouping sets는 특정 칼럼 정렬, 계층간 정렬이 가능하다.
3. rollup이 cube에 비해 시스템에 많은 부담을 주지는 않음.
23.
조건절 where, having의 조건이 거짓이라 불러올 조회결과가 없다면 공집합(0 Rows)를 출력한다.
25
union all은 그냥 합쳐버림.
첫 select 의 건수 [1, 2, 3, 5, 6]
두번째 select 의 건수 [1, 2, 2, 4, 5]
이 둘을 그냥 합쳐버려서 건수가 10개가 된다.
26
이너 조인(동일 조인) 은 동일 값이 있는 행만 결합함.
이전 과정에서 left outer join을 어떻게 하든간에
t3과 t4가 이너조인 하는데 같은 행이 1번째 행 밖에 없어서 행 하나만 리턴 된다.
27
over, partition, row_number을 이해해야 한다.
row_number() over(partition by dept_id order by salary desc)
-> salary 칼럼을 기준으로 row_number를 매기기, 매길 때 dept_id 별로 구분하기. salary는 내림차순 정렬.
내림차순 정렬 빼먹고, sql도 이상하게 해석해서 오답.
28
rank() 순위 출력. 동일 순위는 동일한 등수 매김. 중복순위 다음 순위는 동일 순위 중복값만큼 떨어뜨림.
danse_rank() 순위 출력. 동일순위는 동일한 등수 매김. 중복순위 다음 순위는 순차적으로 매김.
ratio_to_report 비율, 백분율 구하기
29
savepoint 가 같은 값이 두개 있을 때 롤백을 하면 나중에 나온 savepoint로 롤백됨. 덮어쓴다 생각하기.
30
오라클은 auto commit 을 false 로 해놔도 ddl은 묵시적으로 commit 함. 이건 설정 불가능.
sql server는 auto commit을 false 하면 그대로 commit 안됨.
오라클은 ddl 실행 시 자동으로 커밋.
sql server는 롤백시 위 두 구문 전부 취소됨.
31
보기는 union인데 1번 보기는 카티션 곱(크로스 조인) 즉 중복들도 죄다 조회됨.
35
round 반올림 후 출력
ceil 주어진 숫자와 가장 근접한 큰 정수 출력
floor 주어진 숫자와 가장 근접한 작은 정수 출력
trunc 주어진 숫자를 버리고 출력함
exp 자연로그의 밑 e의 n제곱을 반환함
36
특정 칼럼에만 값을 넣는다는 명시를 하지 않고 칼럼 수에 비해 값을 적게 insert를 하면 오류
주문 테이블에 칼럼이 4개일 때
insert into 주문 (c1, c2, c3) values (1, sysdate, 'test1');
은 가능하나
insert into 주문 values (2, sysdate, 'test2') 하면 오류 생김.
delete 주문 (O)
delete from 주문 (O)
update [table] set [column = value] where [조건];
37
오더바이는 기본으로 오름차순이다.
select 구문에 사용 안된 칼럼을 기준으로 오더바이 정렬 가능하다.
order by 1, col1 과 같이 숫자와 칼럼을 혼용 가능
오라클은 null을 가장 큰 값으로 취급하여 오더바이 시 가장 밑으로 정렬되고, sql server는 반대로 가장 앞으로 정렬한다.
38
A.AMT BETWEEN B.MIN_AMT AND B.MAX_AMT
-> A.AMT가 B.MIN_AMT와 B.MAX_AMT 사이의 값이어야 한다.
39
1. 해시 조인은 정렬 작업이 없어 정렬이 부담되는 대량배치작업에 유리하다.
2. 대용량 데이터를 가진 두 개의 테이블을 조인할 때 nested loop join 보다 hash join이 더 유리하다.
3. 옵티마이저는 조인컬럼에 인덱스가 존재해야 nested loop join을 선호한다.
4. nested loop join 기법은 배치작업에서 선호하지 않는 조인기법이다.
40
계층 문제.
최상위 관리자는 레벨1. manager_id가 null이거나 없음.
41
intersect는 결과에 대해 교집합 수행. 중복된 행은 모두 하나의 행으로 표시함.
42
partition과 group by는 둘 다 파티션을 분할한다는 의미에서는 유사하다.
window function 처리를 쓴다고 결과 건수가 줄어들진 않는다.
윈도우 함수와 group by는 병행하여 사용할 수 없다.
43
사원이 없는 부서도 보여주고 싶다 -> 부서 테이블을 기준으로 삼아 전부 가져온 뒤, 부서 테이블에 매칭 되는 사원 테이블의 데이터만 가져오기. 매칭 안된건 null로 표시.
LEFT OUTER JOIN
48
and 연산과 or 연산이 동시에 나오면 and 연산이 우선순위가 높다.
where salary > 200 or mgr_id is null and code = 'B'
= where salary > 200 or (mgr_id is null and code = 'B')
or의 왼쪽 값이 False지만 오른쪽의 salary > 200 으로 행 3개를 고를 수 있음. 결과는 3
49
ntile(n)
전체 행 데이터 수를 n개의 그룹으로 나눈다.
50
'프로그래밍 > 데이터베이스' 카테고리의 다른 글
SQLD 30회 기출문제 오답정리 (틀림, 햇갈림) (0) | 2023.06.10 |
---|---|
이경오의 SQLD ch5 연습문제 (1) | 2023.06.09 |
SQL 자격검정 실전문제 1과목 1차 오답노트 (23.06.03) (1) | 2023.06.04 |
ANSI SQL과 다른 SQL 구현체들의 차이점 (0) | 2023.03.14 |
데이터베이스 튜닝이란? (0) | 2023.03.07 |