본문 바로가기

Data/MariaDB

DB] 서브쿼리 , 상하관계쿼리

 

서브쿼리란?
  • 쿼리 안의 쿼리
  • 사전에 추출된 내용에서 재검색 하거나, 검색된 내용을 가상 컬럼을 만들어 추가할 수 있음
  • 가져온 데이터를 재정제 하기 위해 사용한다.

 

서브쿼리는 특별한 문법이 없다.

해결해야 할 문제를 단계별로 적어보고,

테이블 간의 연관관계( 공통점)를 찾아보고 쿼리문을 적어보면 된다.

 

dept 테이블과 emp 테이블의 ERD

 

문제1) han 의 근무 부서 이름을 찾아라.

두 개의 쿼리문을 서브쿼리로 합쳐본다.

위의 쿼리문 실행과 아래 쿼리문 실행의 결과가 같다. 

 

문제2) 부서위치가 LA 이거나 BOSTON 인 부서에 속한 사람들의 이름과 직책은?

순차적으로 문제 해결해보기
서브쿼리

 

ALL / EXSITS

ALL : 서브쿼리의 결과 중에서 모든 값이 일치하면 참 반환

EXSITS : 기본적으로 IN과 같으나 참/거짓 반환

 

문제3) sales 부서에 근무하는 사원 데이터 가져오기

 

문제4) 직책(job)이 manager인 사원들(여러 명일 경우엔 입사일이 가장 빠른 사원 기준)
보다 입사일이 빠른 직원 데이터 가져오기

order by 써야하나 하다가 min 사용
내가 쓴 서브쿼리

 

입사일 가장 빠른 데이터 하나만 뽑는 방법?

order by 에서 limit로 하나만 뽑기 / min() 이용

 

최종 해결 방법

강사님 서브쿼리

 

>> 내가 group by를 처음에 쓴 이유는 아무래도 group by의 쓰임을 헷갈린 것 같다. (order by 시도하다가 잘 안되니까 그냥 냅다 group by 써본 듯)

group by는 각 직책별로 모아서 볼 때 사용하는 것이고 지금 여기선 애초에 직책이 매니저인 사람들만 뽑기 때문에 group by가 필요 없다.

 

limit n / min() / max()

 

limit n : 상위 n 개 까지만 나타낸다.

min() : 최소값을 찾아온다.

max() : 최대값을 찾아온다.

 

ANY

: IN과 같지만 차이점이 있다.

= ANY : IN과 같은 효과

> ANY : 최소값 보다 크면

< ANY : 최대값 보다 작으면

헷갈릴 수 있는데 any가 최소값, 최대값이 되어주는 거네

 

min() 과 any 사용

 

문제5) 부서별로 직원이 몇 명인지 나태내기(부서명, 부서위치, 부서인원수)

문제5번을 해결하기 위해서는 상하관계 쿼리를 사용했다.

 

상하관계쿼리란?

하나의 쿼리에서 나온 내용을 다른 쿼리의 컬럼, 테이블 등으로 사용하는 것