본문 바로가기
db

where절 외의 서브쿼리

by 오우지 2022. 8. 31.

인자 where절 외의 select, from 절 서브쿼리에 대해 알아보자

 

1. select 절 서브쿼리

select문은 스칼라 서브쿼리만 가능하다. select절의 역할에 대해 생각해보면 당연하다.

상품 라인별 평균 소비자가격을 검색해보면

select productLine, name, MSRP 소비자가격,
		(
			select ROUND(AVG(MSRP), 2)
			  from products Y
			 where Y.productLine = X.productLine
		) '상품라인별 평균 소비자가격'
  from products X
 order by 1;
 
 
 select city 지점,
		(
			select count(*)
			  from employees Y
			 where Y.officeCode = X.officeCode
		) 직원수
  from offices X
 order by city;

지점명과 지점에 근무하는 직원의 수를 검색하면 아래 쿼리와 같다.

둘 다 연관, 단일값 서브쿼리다. 이전페이지에서 두개에 대해 설명했다. 

 

2. from절 서브쿼리(inline view)

from절 서브쿼리는 임시 테이블을 생성하기 위해 사용된다.

지금까지 사용했던 with와 동일한 동작을 한다.

 

inline view가 where절 서브쿼리와 다른 점

- 메인 쿼리에서 inline view의 컬럼을 자유롭게 참조

- order by 절을 사용할 수 있다.

 

권장 소비자가격이 가장 비싼 5개 상품을 검색

select name, scale, buyPrice, MSRP
  from (
    select *
      from products
     where MSRP is not null
     order by MSRP DESC
    ) as temp
 limit 5;

 

3. having절 서브쿼리

where절 서브쿼리가 존재하는 것 처럼 having절 서브쿼리도 존재한다.

 

Motorcycles의 평균 구매단가보다 적은 평균 구매단가를 갖는 상품라인과 평균 구매단가를 검색

select productLine 상품라인, avg(buyPrice) '평균 구매단가'
  from products
 group by productLine 
having avg(buyPrice) < (
                    select avg(buyPrice)
                      from products
                     where productLine = 'Motorcycles'
                    );

 

정리해보자면 서브쿼리의 용도는

1. 테이블 필터로 사용(where절 서브쿼리)

2. 새로운 컬럼을 생성(select절 서브쿼리)

3. 임시 테이블을 생성(from절 서브쿼리)

 

하지만 결국 일 하면서 느낀건 복잡한 서브쿼리를 사용해서 성능 최적화를 하려면

join과 서브쿼리의 적절한 사용이 필수였다.

 

4. update절 서브쿼리

우선 원래 있던 테이블에 컬럼을 추가하고

alter table offices
add column noOfEmployees tinyint;

서브쿼리를 이용해 데이터를 삽입해보자

update offices o
   set o.noOfEmployees = (
                        select count(*)
                          from employees e
                         where e.officeCode = o.officeCode 
                        );

select city, noOfEmployees
  from offices o ;

 

짠 데이터가 삽입됐다.

 

insert into employees (employeeId, lastName, firstName, extension
						email, jobTitle, officeCode)
values (
        (
            select max(employeeId) + 1
              from employees 
        ),
        'Julia', 'Roberts', 'x1111', 'julia@gmail.com', 'Sales Rep', 1
    )

표준SQL에서는 사용할 수 있지만 MySql에서는 같은 테이블에서 SELECT해 INSERT/UPDATE할 수 없다. 그래서 야는 에러가 뜬다. 이놈 이거 아주 이단아다.

 

사실 이렇게 insert할 일은 거의 없다. auto_increment 옵션을 써주면 되니까

'db' 카테고리의 다른 글

where절 서브쿼리  (0) 2022.08.24
MySQL  (2) 2022.07.04