ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [About _ MySQL _ Sub Query]
    About_Datascience/SQL 2023. 2. 2. 19:37

    sub query는 query 문 안에 있는 query를 의미하며 SELECT절 , FROM절, WHERE 등에 사용이 가능하다.


     

    <world dataset>

     

    1. SELECT 절에 사용되는 Sub Query 문

    # 전체 국가 수, 전체 도시 수, 전체 언어 수를 1개의 row로 출력하는 구문
    # SELECT 안에 또 SELECT 구문을 넣어 sub query작성
    
    SELECT   (SELECT COUNT(*) FROM country) AS total_country,
    	 (SELECT COUNT(*) FROM city) AS total_city,
             (SELECT COUNT(distinct(language)))
    FROM countrylanguage AS total_language;

    1번 query 실행 결과

     

     

    2. FROM 절에 사용되는 Sub Query문 

     

    world dataset에서 도시 인구수가 900만 이상인 도시의 국가코드 , 국가이름, 도시이름, 도시인구수 출력하려 한다. 

    이번에는 JOIN 과 HAVING 을 이용한 방법 1Sub Query와 JOIN을 이용한 방법 2를 나누어 설명하고자 한다. 

     

     

    첫 번째 방법 : JOIN , HAVING 

    SELECT country.code , country.name, city.name , city.population
    FROM country
    JOIN city
    ON country.code = city.countrycode
    HAVING city.population >= 900 * 10000;

     

    두 번째 방법 : Sub Query , JOIN 

    SELECT country.code , country.name, sub.name , sub.population
    FROM country
    JOIN (
    	SELECT countrycode, name, population 
        FROM city
        WHERE population >= 900 * 10000
    ) AS sub
    ON country.code = sub.countrycode;

     

    Sub Query 를 사용한 방법과 , HAVING을 사용한 방법의 결과는 같지만 어떤 게 더 좋은 쿼리일까 ?

    정답은 2번째 Sub Query를 이용한 방법이다.

     

    그 이유는 첫 번째 HAVING을 쓰는 방법은 JOIN을 먼저 한 후에 filtering (population > 900*10000) 을 진행하고 , 

    두 번째 Sub Query를 이용하는 방법은 JOIN절 안에 서브 쿼리를 통해 filtering(population > 900*10000) 후에 JOIN을 하게된다.

     

    따라서 JOIN을 통해 만들어내야 하는 테이블 데이터HAVING을 사용할 때 훨씬 많고 ,

    Sub Query를 이용한 방법은 이미 안에서 한 번 필터링을 하고 JOIN을 하기 때문에 만들어내는 테이블 데이터가 훨씬 적을 수 밖에 없다

     

    결론적으로 Sub Query를 사용하는 것이 더 효율적이 쿼리가 되는 것이다.

     

     

    3. WHERE 절에 사용되는 Sub Query문 

    # 한국의 인구 수보다 많은 나라의 국가 코드 , 국가 이름, 인구 수 출력
    SELECT code, name, population
    FROM country
    WHERE population >=(SELECT population FROM country WHERE code ='kor');

    만약 같은 결과의 쿼리를 Sub Query 없이 작성하려면 

    SELECT population
    FROM country 
    WHERE code ='kor';
    # 46844000명인 것을 확인 후
    
    SELECT code, name, population
    FROM country
    WHERE population >46844000;

    이런 식으로 쿼리를 두 개나 작성해야 하고 , 인구 수가 바뀔 때마다 수정해줘야 하는 번거로움이 있을 것이다. 

    'About_Datascience > SQL' 카테고리의 다른 글

    [About _ MySQL _ INDEX]  (0) 2023.02.03
    [About _ MySQL _ join]  (0) 2023.02.01
    [About_MySQL _ group by 와 having]  (0) 2023.02.01
    [About_MySQL _ 함수 , 조건절]  (0) 2023.01.31
    [About_MySQL 기본문법(2)_DML의 CRUD]  (0) 2023.01.31
Designed by Tistory.