Notice
Recent Posts
Recent Comments
Link
05-02 00:03
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

<<개발일지>>

sqld 노랭이 기출 풀이(출처: 홍쌤 데이터랩) 본문

sqld

sqld 노랭이 기출 풀이(출처: 홍쌤 데이터랩)

개발하는지호 2024. 3. 8. 19:17

출처: 홍쌤 데이터랩

제 3정규화 했을때 생기는 테이블 수는?
 
=> 이 문제 같은 경우 두 가지 방식으로 분리하면 된다.
 
일단 기본적으로 생성되어 있는 테이블은 그대로 둔다.
 
첫째, 학과 번호, 학과 명 이런 것처럼 하나로 인해 다른 것도 변하는 것들을 분리 해준다. (일반적으로 명 과 번호로 되어 있으면 분리해준다.)
 
둘째, 너무 많은 속성이 있다면 이 또한 분리를 해준다. (속성 중복 형태인데 이런 경우 제 1정규화와 같다.)
 
 

=> where을 쓰지 않는다면, 카티션이 발생해서 n x m 이 된다. 
여기서는 첫번째 자리가 S인 경우 와 중간에 T인 것을 가져와야 한다.
고로 4개가 된다

=> '' 같은 경우 oracle이냐 sql server 이냐에 따라 다르게 저장이된다.
 
oracle -> null
sql server -> 빈문자
 
1. 빈문자열 또는 null로 출력이 된다.
2. ISNULL(a, b) -> a가 null이면 b가 출력이 된다는 개념으로 풀면 된다. 고로 정답니다.
3. col = null 같은 연산자는 사용이 불가능하다. 할 거면 is null , is not null 로 해줘야한다.
4. col1 번 값이 'b'이냐 또는 'c' 인 경우를 의미한다. 여기서 count나 sum 은 null 제외하고 계산하기 때문에 주의 해야하는데
sql server는 ''로 반환한다는 점을 감안했을 때 경우에 따라 다르다고 볼  수 있다.
 

 
=> 풀이 TO_DATE 로 특정한 형태로 날짜로 변환
 
1은 1일을 의미하고 24는 24시간을 의미한다. 고로 나누면 1시간을 의미하고 뒤에 6을 나누면 10분을 의미한다.
따라서, 10시 + 10분을 해주면 된다.
 

=>
 
1. varchar 같은 경우 문자를 의미한다. 이런 문자가 to number(오라클) 없이는 숫자랑 비교가 불가능하다.
즉 이 '001' 같은 경우는 제대로 단정 짓기는 어렵다고 볼 수 있다. (애초에 지금 잘못된 형태이다.)
 
2.  oracle에서는 ''는 null이다.
 
3. 따라서 조회 자체가 안 된다.
 
4. sql server는 공백문자로 입력에 되기 때문에 조회가 된다. 따라서 isnull 했을때 조회가 되지 않는다.

=>
not > and > or 의 순서로 진행이 된다.
따라서 한 개이다.

=> 정답 3
위에서 말한 것 처럼 avg, sum 그리고 > 같은 연산자는 Null 제외하고 진행이 된다.
 
 
 
??

 
 
=> 
1. 메인 커리에서 이미 조인을 걸고 있는 where 절이 존재한다.  
2. 정답이다. 
 
일단 3, 4 번 문제 같은 경우는 하나만 넣어서 될거 같아 보이지만, 사실상 서브쿼리 다음 쿼리를 본면 해답이 나온다 두가지 속성을 이용하고 있는데 3,4번은 하나의 속성만 있다.
3. 
4. 
 

 
=> 한 테이블에 있다면 where 로 다 가능하지만 먄약 분리되어 있는 테이블이라면 연관되어 있을 시 조인으로 만들어야 한다.
이때 join을 쓰지 않고 where a.c =b.c 이러한 방식을 사용한다.
 

 
 
=>
case 문제 같은 경우 else가 주어지지 않는다면 null로 반환한다. 
ISNULL, NVL 일 때 null 이면 다음 것을 리턴
 
4. else 1 에 의해서 없더라도 1을 반환하는 문제가 발생해서 오답
 

=> 상위 n에 중복된 등수는 함께 출력하는 명령어는 TOP(n) WITH TIES 를 사용한다.
 
따라서 정답은 4 번이다.
 
1,2,3은 무조건 3개만 출력이 된다.
 
 
 

 

 
=> ON 에서 특정 부분만을 명시한다면 그 조인 된 것들을 데이터를 연관지어서 작성해 주되, 조인 안 한 부분들은 null로 출력이 된다.
where에 저런 조건이 있었다면 행이 2개일 것이다.
 
 
 
 

 

=> 정답 : 1번
1. (+) 가 있는 부분은 left outer join ~ 등으로 바꿀 수 있다. 이때 (+) 오른 쪽에 있다면 left outer join이다. 그리고 조건 절에도 (+)가 있는데, 이역시 (*) 를 작서해줘야 하지만 없다 (+)  
2. 사용여부 같은 경우는 where에 있어야 한다.
3. on절에도 없다.
4. right outer join이라서 틀렸다.

추천대상이 없어도 된다 ~? => left outer 그런데 굳이 알릴 필요가 없다면 inner join 
 

 
 

 
=> 
정답 : 4
NOT EXISTS (a = b) 이면  a = b 인것을 지우겠다는 의미이다.
#custId# -> 입력해서 들어오는 값
 
 
 

=>

ROW_NUMBER() -> 순위를 구하는 문법이다. 동일한 등수는 없다.
PARTION BY ** -> ** 별
SUM ORDER BY **->**별 누적합
BETWEEN UNROUNDED PRECEDING AND CURRENT ROW -> 행마다 계산해라 -> 일반적인 누적합 범위(누적합)

 
 

 
=>
원래 null 인데 값이 있는 이유는 grouping을 한 것이다.
null일때 1이 반환이된다.
Rollup(a, b) -> a, (a,b) , 전체 
 
 
 
 

 
 

 
 
=> 
LEN -> 이전 값을 들고 온다.
LEAD -> 이후 값을 들고 온다.
 

 

 
=>
정답 3
1. update할 때 set 담당자 이면 = (담당자)가 나와야 한다. 하지만 부서코드가 나옴으로써 틀린 답이 된다.
또한 부서임시에 변경된 내용이 없다면, null이 반환된다.
 
2. 이 역시 마찬가지인다.
 
3. 일단 위에서 언급한 담당자이면 (담당자) 여야 한다는 것이 맞다. 그리고 변경일자가 최대인 것은 가장 최근일자이기 때문에 새롭게 업데이트 된 것만 가져오게 된다.

4 번 같은 경우는 특정 날짜만 되어버리면 최신 날짜를 안 들고 오게 되고 업데이트도 안 된다.
 
 
 

 
급여 비중을 반환하는 방법은 두 가지이다. 
1. RATIO_TO_REPORT
2. 하드 코딩
 

 

 
4. sum over order by 는 누적합이다. 그렇기 때문에 총합을 구해서 나누면 오답이 나오게 된다.
 
 

 
=> 
정답 1번
USING() -> 이는 안에서 조건 사용이 불가능하다 ex. a = b 단지 양쪽에 같은 속성이 있다면 알아서 조인을 해주기 때문에, 속성 이름 하나만 넣어주면 된다. 
 
나머지는 잘 표현함
 

 
=> 계층형 질의
 
이 문제의 핵심은 시작점을 찾아야 한다. lvl 1
 
반대 방향으로 같은 레벨로 표현할 수 없다.  -> 두 개가 결합 되었음을 알 수 있다.
 
또한, 오른쪽 null로 채워지는 것을 보면 left outer join을 예상할 수 있다.

 
정답 1번
 
 
 

 
=>
NOT NULL 이다. 근데 2 번에 의해 null 이 들어가게 된다. 그래서 오류가 발생한다.

=>
정답 3번
oracle 같은 경우는 auto commit false 자체가 불가능하다. 그리고 create를 작성하면 바로 commit이 된다.
이로인해 rollback이 불가능해진다.
 
3. 최종적으로 B 테이블은 생성되지 않았다 x
 

=> 
정답 3번
 
 

 
 
=> 
정답 2번
ON DELETE CASCADE :  부모가 삭제가 되면 자식도 같이 삭제가 된다.
ON DELETE SET NULL : 부모가 삭제가 되면 자식은 null이 된다.