-
[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 을 이용한 방법 1과 Sub 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