본문 바로가기

배우기/복습노트[oracle sql]

[실습문제] 2023. 11. 9.(목) 문제 풀이(3문제)

728x90
반응형

실습문제 1. uesr_constraint, user_cons_columns 테이블을 사용하여, 각 테이블의 제약조건이 있는 경우 제약조건 이름, 종류, 테이블명, 컬럼명, 참조테이블명, 참조컬럼명을 출력하는 쿼리를 작성하여라.

 

위 테이블에 7번 라인과 8번 라인을 주석처리 후 실행을 해보면 

 

이런 결과가 출력된다.

여기서 EMP 테이블의 DEPTNO 컬럼이 PK라는 참조키가 걸려있는데 어느 테이블의 어느 컬럼에서 가져왔는지가 알고싶다.

그렇다면 user_constraint와 user_cons_columns를 한 테이블로 묶고 또 같은 테이블을 불러와서 join을 하면 추출할 수 있을 것이다.

 

 

 

실습문제 2. student4 테이블을 만들고 비만여부를 나타내는 컬럼을 새로 추가한 후, 각 학생들의 비만정보를 update 하여라. 비만여부는 체중이 표준체중보다 크면 과체중, 작으면 저체중, 같으면 표준으로 분류하여라.

** 표준체중 = (키 - 100) * 0.9

 

insert는 왜 적용이 안되는지 질문해야겠다.

insert도 될 것 같은데 시도해보면 자꾸 누락된 표현식이라는 에러가 뜬다.

 

728x90

 

 

실습문제 3. 3년 이상 참가자 이름 연속 출력(carol, john)

 

가독성면이나 성능면에서 서브쿼리보다는 join으로 풀 것을 권장하셨다.

두 가지 풀이 방식이 있는데 하나는 join으로 푼 방식이고 하나는 아직 배우지 않았지만 lag 라는 방식으로 푼 방법이다.

 

먼저 join을 푼 방식이다.

join을 먼저 해보면 carol만 봤을 때 result라인의 7번과 28번처럼 연속된 결과를 보이는 것만 추출하면 된다.

그래서 where절에 조건을 더 추가하면,

 

그래서 이름만 추출되도록 쿼리를 정리하면,

 

이렇게 출력이 된다.

 

 

다음은 lag를 이용하여 푼 방식이다. lag는 window function이라고 하셨는데 이게 무슨 뜻인지는 모르겠다. 다음에 알려주신다고 하시니 일단 이런 게 있다고 알아둬야겠다.

일단 이런 형식으로 되어있다.

대상에 year가 오고 위치에 2라고 쓰면 year의 이전, 이전 값을 가져온다. 만일 위치에 1이라고 쓰면 이전 값을 가져온다.

여기서 2라고 쓴 이유, 그러니까 이전, 이전 값을 가져오는 이유는, year와 lag_value의 차가 2이면 3년 연속이라는 뜻이다.

그걸 이용한 풀이이다.

그럼 위 쿼리를 이용하여 서브쿼리를 작성하면,

이렇게 풀이가 가능하다.

 

window function은 SQLD에 두 문제 이상이 나온다고 한다.

잘 기억해둬야겠다.

728x90
반응형