본문 바로가기
번역/MariaDB

[MariaDB Tutorial 번역] 15. Subqueries

by 촌쥐 2021. 7. 9.

[MariaDB Tutorial 번역 글]

  1. Select : https://rural-mouse.tistory.com/43
  2. Order By : https://rural-mouse.tistory.com/44
  3. Where : https://rural-mouse.tistory.com/45
  4. Distinct : https://rural-mouse.tistory.com/46
  5. Between : https://rural-mouse.tistory.com/48
  6. Like : https://rural-mouse.tistory.com/49
  7. In : https://rural-mouse.tistory.com/50
  8. Limit : https://rural-mouse.tistory.com/51
  9. Is Null : https://rural-mouse.tistory.com/52
  10. Joins : https://rural-mouse.tistory.com/53
  11. Inner Join : https://rural-mouse.tistory.com/54
  12. Left Join : https://rural-mouse.tistory.com/55
  13. Group By : https://rural-mouse.tistory.com/56
  14. Having : https://rural-mouse.tistory.com/59
  15. Subqueries ←←
  16. Insert : https://rural-mouse.tistory.com/61
  17. Insert Multiple Rows : https://rural-mouse.tistory.com/62
  18. Insert Into Select : https://rural-mouse.tistory.com/63
  19. Update : https://rural-mouse.tistory.com/64

원문 : https://www.mariadbtutorial.com/mariadb-basics/mariadb-subqueries/

 

MariaDB Subqueries

In this tutorial, you will learn about the MariaDB subqueries to form more complex queries.

www.mariadbtutorial.com


여기에 있는 모든 예제는 MariaDB sample database인 nation을 가지고 진행됩니다.

만약 읽고 따라 해 보시는 게 목적이라면 다운로드를 받고 읽어보시길 추천합니다.

원본 링크 : https://www.mariadbtutorial.com/getting-started/mariadb-sample-database/

 

MariaDB Sample Database

In this tutorial, you will learn about a MariaDB sample database nation and how to load the sample database into the MariaDB server.

www.mariadbtutorial.com


Subquery는 무엇일까요?

Subquery는 쿼리문 안에 있는 또하나의 쿼리문입니다.

샘플 데이터베이스에서 countries Table을 사용하겠습니다.

 

만약 5,000,000km2 보다 큰 면적을 가진 나라를 찾고 싶어한다고 가정합시다. 찾기 위해서 다음의 단계들을 수행합니다.

첫번째로 면적이 5,000,00보다 큰 나라들의 id를 찾습니다.

select country_id 
from countries 
where area > 5000000;

그리고 난 뒤 id들을 이용하여 다음과 같이 나라들의 정보를 쿼리문으로 얻습니다.

select 
    name, 
    area
from countries
where country_id in (12,15,31,38,42,182,224)
order by 
    area, 
    name;

 

이 접근 방식에는 몇가지 문제가 있습니다.

  • 만약 나라들의 면적이 업데이트된다면 두번째 쿼리를 업데이트 해주어야합니다.
  • DB서버에서 두개의 쿼리문을 실행시켜줘야하며 직접 id들을 두번째 쿼리문에서 업데이트 해주어야합니다.

Subqueries서브쿼리는 다른 시간에 쿼리문 두개를 실행하는 것 대신에 두번째 쿼리문을 첫번째 쿼리문 안에 중첩하여 이러한 문제들을 해결할 수 있도록 해줍니다. 

select 
    name, 
    area
from 
    countries
where country_id in (
    select 
        country_id 
    from 
       countries 
    where 
        area > 5000000
)
order by 
    area, 
    name;

다음 쿼리문은 서브쿼리라고 불립니다.

select country_id 
from countries 
where area > 5000000

그리고 서브쿼리를 포함하는 쿼리문은 outer query라고 불립니다.

outer query와 subquery

이번 튜토리얼에서는 세가지 타입의 서브쿼리에 집중합니다. scalar subqueries, row subqueries, 그리고 Select문의 from 절에 나타나는 subqueries

Scalar subqueries

Scalar 서브쿼리는 하나의 값을 반환합니다. Scalar 서브쿼리는 리터럴 혹은 하나의 Column값이 사용되는 SQL문에서 사용 할 수 있습니다.

다음 쿼리문은 가장 면적이 큰 국가를 반환합니다.

select max(area) 
from countries;

쿼리문이 하나의 값을 반환하기 때문에 이를 서브쿼리로 사용하여 가장 면적이 가장 큰 국가를 찾을 수 있습니다.

select *
from countries
where area = (
    select max(area)
    from countries
);

 

Row subqueries

Row 서브쿼리는 하나의 Row를 반환합니다.

coutries와 countrys_stats를 사용합시다.

다음은 2018년의 모든 나라의 GDP 와 인구 평균을 반환하는 명령문입니다.

select 
    avg(population), 
    avg(gdp) 
from country_stats
where year = 2018;

이 쿼리는 두 개의 Column으로 구성된 row를 반환합니다. 이 쿼리를 서브쿼리로 사용하여 2018년에 평균보다 GDP와 인구가 더 많았던 나라들을 찾을 수 있습니다.

select 
    name
from 
    country_stats
inner join countries 
    using (country_id)
where 
    year = 2018 and 
    (population, gdp) > (
        select 
            avg(population), 
            avg(gdp) 
        from country_stats
        where year = 2018)
order by 
    name;

 

From 절 안에서의 Subqueries 

일반적으로는 Select 명령문의 From 절에 Table을 배치합니다.

쿼리는 가상 Table과 비슷한 Result Set도 반환하므로 서브쿼리도 From 절에 사용될 수 있습니다.

select select_list
from (subquery) as table_alias
...;

From 절에서 나타내는 서브쿼리를 Derived Table(파생 테이블) 이라고도 합니다. 파생 테이블은 반드시 별칭(alias)이 있어야 하고 없다면 문법 오류가 발생합니다.

다음 명령문은 모든 지역의 평균 면적을 반환해주는 예제입니다.

select avg(region_area)
from (
    select sum(area) region_area
    from countries
    group by region_id
) t;
  • 첫번째로 서브쿼리가 각 region의 전체 면적을 반환해줍니다.
  • 그 다음으로 outer 쿼리가 전체 지역의 평균 면적을 계산합니다.

 

 

이번 튜토리얼에서는 복합 쿼리를 만들어주는 서브쿼리에 대해 배워봤습니다. 

다음은 Table에 Row를 삽입하는 Insert에 대해서 배워보겠습니다.

댓글