You are looking for information, articles, knowledge about the topic nail salons open on sunday near me 서브 쿼리 조인 on Google, you do not find the information you need! Here are the best content compiled and compiled by the Toplist.maxfit.vn team, along with other related topics such as: 서브 쿼리 조인 서브쿼리 조인 속도 차이, 서브쿼리 조인 차이, 서브쿼리 조인 성능, inner join 서브쿼리, 조인을 서브쿼리로, 오라클 서브쿼리 조인, left outer join 서브쿼리, mysql 서브쿼리 조인
SUBQUERY 와 JOIN 의 차이 (上)
- Article author: kimsyoung.tistory.com
- Reviews from users: 12788 Ratings
- Top rated: 3.1
- Lowest rated: 1
- Summary of article content: Articles about SUBQUERY 와 JOIN 의 차이 (上) 서브 쿼리의 구조는 간단할 수도 있고 조금 복잡할 수도 있습니다. 간단한 형태의 서브 쿼리는 내부 쿼리가 외부 쿼리의 열에 의존하지 않습니다. 내부 쿼리만으로도 … …
- Most searched keywords: Whether you are looking for SUBQUERY 와 JOIN 의 차이 (上) 서브 쿼리의 구조는 간단할 수도 있고 조금 복잡할 수도 있습니다. 간단한 형태의 서브 쿼리는 내부 쿼리가 외부 쿼리의 열에 의존하지 않습니다. 내부 쿼리만으로도 … SQL 쿼리문을 작성하면서 마주할 고민 중 하나는 바로 서브 쿼리와 조인 중 어떤 문법을 사용하는 것이 좋을지 판단하는 것입니다. 상황에 따라 조인을 사용하는 것이 훨씬 좋을 때도 있고, 반면에 서브 쿼리를 사..
- Table of Contents:
고정 헤더 영역
메뉴 레이어
검색 레이어
상세 컨텐츠
태그
추가 정보
페이징
[MYSQL] 📚 JOIN과 서브쿼리 차이 및 변환 💯 정리
- Article author: inpa.tistory.com
- Reviews from users: 9784 Ratings
- Top rated: 4.6
- Lowest rated: 1
- Summary of article content: Articles about [MYSQL] 📚 JOIN과 서브쿼리 차이 및 변환 💯 정리 조인(JOIN) vs 서브쿼리(Sub Query) 조인과 서브쿼리는 때로 동일한 결과를 얻을 수 있다. 상황에 따라 조인을 사용하는 것이 훨씬 좋을 때도 있고, … …
- Most searched keywords: Whether you are looking for [MYSQL] 📚 JOIN과 서브쿼리 차이 및 변환 💯 정리 조인(JOIN) vs 서브쿼리(Sub Query) 조인과 서브쿼리는 때로 동일한 결과를 얻을 수 있다. 상황에 따라 조인을 사용하는 것이 훨씬 좋을 때도 있고, … 조인(JOIN) vs 서브쿼리(Sub Query) 조인과 서브쿼리는 때로 동일한 결과를 얻을 수 있다. 상황에 따라 조인을 사용하는 것이 훨씬 좋을 때도 있고, 반면에 서브 쿼리를 사용하는 것이 좋을 때도 있다. 서브 쿼리..
- Table of Contents:
조인(JOIN) vs 서브쿼리(Sub Query)
방문해 주셔서 감사드립니다
공지사항
최근 댓글 new
최근 글 new
인기 글 hot
티스토리툴바
서브쿼리 기초 WHERE, JOIN 조건으로 실습해보기
- Article author: for-my-wealthy-life.tistory.com
- Reviews from users: 9044 Ratings
- Top rated: 4.4
- Lowest rated: 1
- Summary of article content: Articles about 서브쿼리 기초 WHERE, JOIN 조건으로 실습해보기 서브쿼리는 코딩할 때 정말 많이 쓰인다. 특히 DB2에서는 한 통으로 쿼리문을 짜는 경우가 대부분이기 때문에 거의 모든 쿼리가 서브쿼리 형태로 되어 … …
- Most searched keywords: Whether you are looking for 서브쿼리 기초 WHERE, JOIN 조건으로 실습해보기 서브쿼리는 코딩할 때 정말 많이 쓰인다. 특히 DB2에서는 한 통으로 쿼리문을 짜는 경우가 대부분이기 때문에 거의 모든 쿼리가 서브쿼리 형태로 되어 … 서브쿼리는 코딩할 때 정말 많이 쓰인다. 특히 DB2에서는 한 통으로 쿼리문을 짜는 경우가 대부분이기 때문에 거의 모든 쿼리가 서브쿼리 형태로 되어 있다. 서브쿼리란? -SELECT 쿼리문 안에 또 SELECT 쿼리문이..
- Table of Contents:
태그
‘SQL’ Related Articles
[SQL] JOIN, 서브쿼리 · Don’t Panic
- Article author: soliloquiess.github.io
- Reviews from users: 8151 Ratings
- Top rated: 3.1
- Lowest rated: 1
- Summary of article content: Articles about [SQL] JOIN, 서브쿼리 · Don’t Panic JOIN? 둘 이상의 테이블에서 데이터가 필요한 경우 테이블 조인이 필요. … 서브쿼리는 다른쿼리 내부에 포함되어있는 select문을 의미한다. …
- Most searched keywords: Whether you are looking for [SQL] JOIN, 서브쿼리 · Don’t Panic JOIN? 둘 이상의 테이블에서 데이터가 필요한 경우 테이블 조인이 필요. … 서브쿼리는 다른쿼리 내부에 포함되어있는 select문을 의미한다. JOIN? 둘 이상의 테이블에서 데이터가 필요한 경우 테이블 조인이 필요. 일반적으로 조인조건을 포함하는 WHERE 절을 작성해야함 조인 조건은 일반적으로 각 테이블의 PK 및 FK로 구성됨.
- Table of Contents:
JOIN
JOIN의 종류
서브쿼리
서브쿼리 종류
Share this post
About
Related Posts
Comments
5.07.3 SELECT절 서브쿼리와 조인 – 평생 필요한 데이터 분석 – MySQL과 주식 데이터로 재밌게
- Article author: wikidocs.net
- Reviews from users: 19668 Ratings
- Top rated: 3.4
- Lowest rated: 1
- Summary of article content: Articles about 5.07.3 SELECT절 서브쿼리와 조인 – 평생 필요한 데이터 분석 – MySQL과 주식 데이터로 재밌게 SELECT절 서브쿼리를 조인으로 변경할 때는 이너 조인과 아우터 조인 중에 선택을 잘해야 한다. 테스트를 위해 아래 SQL을 사용해 STOCK 테이블에 중국 … …
- Most searched keywords: Whether you are looking for 5.07.3 SELECT절 서브쿼리와 조인 – 평생 필요한 데이터 분석 – MySQL과 주식 데이터로 재밌게 SELECT절 서브쿼리를 조인으로 변경할 때는 이너 조인과 아우터 조인 중에 선택을 잘해야 한다. 테스트를 위해 아래 SQL을 사용해 STOCK 테이블에 중국 … 온라인 책을 제작 공유하는 플랫폼 서비스
- Table of Contents:
JOIN 안에 SUB쿼리를 JOIN으로 바꿔보자
- Article author: redbinalgorithm.tistory.com
- Reviews from users: 32530 Ratings
- Top rated: 4.4
- Lowest rated: 1
- Summary of article content: Articles about JOIN 안에 SUB쿼리를 JOIN으로 바꿔보자 하지만 아시다시피 SELECT 절안에 또하나의 서브쿼리가 존재합니다. 이런경우에는 똑같은 테이블에 N개의 CODE_NUMBER가 존재한다면 총 N*N번 N^2번읜 … …
- Most searched keywords: Whether you are looking for JOIN 안에 SUB쿼리를 JOIN으로 바꿔보자 하지만 아시다시피 SELECT 절안에 또하나의 서브쿼리가 존재합니다. 이런경우에는 똑같은 테이블에 N개의 CODE_NUMBER가 존재한다면 총 N*N번 N^2번읜 … 이 글을 쓰는 이유는 예전 프로젝트를 진행하면서 특정 테이블의 GROUP을 만들어서 특정 값을 만든 후 추가 속성으로 다른 값을 그룹화 해야하는 경우가 발생하였는데 그때 SUB쿼리를 쓰고 POST MAN으로 호출시 성..
- Table of Contents:
DATABASE
1 가장 원초적인 코드를 짜보자
2 구룹화된 테이블 두개를 만들고 다시 한번더 조인
태그
‘TOPIC’ Related Articles
티스토리툴바
SQL – Join, 서브쿼리 :: 미현 개발 TIL
- Article author: xianeml.tistory.com
- Reviews from users: 10284 Ratings
- Top rated: 4.0
- Lowest rated: 1
- Summary of article content: Articles about SQL – Join, 서브쿼리 :: 미현 개발 TIL SQL의 Join과 서브쿼리를 알아본다. JOIN 검색하고자 하는 컬럼이 여러개의 테이블에 분산되어있는 경우 여러 테이블을 연결해서 필요한 데이터를 … …
- Most searched keywords: Whether you are looking for SQL – Join, 서브쿼리 :: 미현 개발 TIL SQL의 Join과 서브쿼리를 알아본다. JOIN 검색하고자 하는 컬럼이 여러개의 테이블에 분산되어있는 경우 여러 테이블을 연결해서 필요한 데이터를 … 🎯 SQL의 Join과 서브쿼리를 알아본다. JOIN 검색하고자 하는 컬럼이 여러개의 테이블에 분산되어있는 경우 여러 테이블을 연결해서 필요한 데이터를 조회하는 방법 EMP테이블과 DEPT 테이블에는 DEPTNO 라는 공..Today I Learned
- Table of Contents:
JOIN
서브쿼리
TAG
관련글 관련글 더보기
티스토리툴바
SUBQUERY 와 JOIN 의 차이
- Article author: velog.io
- Reviews from users: 30165 Ratings
- Top rated: 3.6
- Lowest rated: 1
- Summary of article content: Articles about SUBQUERY 와 JOIN 의 차이 서브 쿼리는 복잡한 SQL 쿼리문에 많이 사용됩니다. 반면에, 조인은 여러 개의 쿼리를 필요로 하지 않습니다. 조인은 쿼리문이 복잡해지더라도 서브 쿼리 … …
- Most searched keywords: Whether you are looking for SUBQUERY 와 JOIN 의 차이 서브 쿼리는 복잡한 SQL 쿼리문에 많이 사용됩니다. 반면에, 조인은 여러 개의 쿼리를 필요로 하지 않습니다. 조인은 쿼리문이 복잡해지더라도 서브 쿼리 … 묵시적 조인SELECT 속성명FROM 테이블1, 테이블2WHERE 테이블1.속성1 = 테이블2.속성1명시적 조인SELECT 속성명FROM 테이블1 JOIN 테이블2ON 테이블1.속성1 = 테이블2.속성1서브 쿼리는 복잡한 SQL 쿼리문에 많이 사용됩니다.반면에, 조인은
- Table of Contents:
SQL
📌 JOIN 의 종류
📌 SUBQUERY 와 JOIN 의 차이
Subquery는 Join으로 바꿉시다! — 전지적 송윤섭시점 TIL 1.0 documentation
- Article author: til.songyunseop.com
- Reviews from users: 1763 Ratings
- Top rated: 4.9
- Lowest rated: 1
- Summary of article content: Articles about Subquery는 Join으로 바꿉시다! — 전지적 송윤섭시점 TIL 1.0 documentation 서브 쿼리를 사용해 필터링을 하는 경우가 있는데, 이는 성능저하를 야기한다. LEFT [OUTER] JOIN은 서브쿼리 보다 Optimizer가 더 최적화 하기 쉬워서 빠를 수 있다. …
- Most searched keywords: Whether you are looking for Subquery는 Join으로 바꿉시다! — 전지적 송윤섭시점 TIL 1.0 documentation 서브 쿼리를 사용해 필터링을 하는 경우가 있는데, 이는 성능저하를 야기한다. LEFT [OUTER] JOIN은 서브쿼리 보다 Optimizer가 더 최적화 하기 쉬워서 빠를 수 있다.
- Table of Contents:
Examples¶
Refer¶
[SQL] Advanced SQL – 조인, 서브쿼리 활용
- Article author: kimunderground.tistory.com
- Reviews from users: 34888 Ratings
- Top rated: 4.9
- Lowest rated: 1
- Summary of article content: Articles about [SQL] Advanced SQL – 조인, 서브쿼리 활용 Advanced SQL – 조인, 서브쿼리 활용 ※ JOIN시 참고 사항 첫 번째 : 테이블이 모델링 될때 대부분 1 : N의 관계가 됨 두 번째 : 두 테이블이 JOIN될 … …
- Most searched keywords: Whether you are looking for [SQL] Advanced SQL – 조인, 서브쿼리 활용 Advanced SQL – 조인, 서브쿼리 활용 ※ JOIN시 참고 사항 첫 번째 : 테이블이 모델링 될때 대부분 1 : N의 관계가 됨 두 번째 : 두 테이블이 JOIN될 … Advanced SQL – 조인, 서브쿼리 활용 ※ JOIN시 참고 사항 첫 번째 : 테이블이 모델링 될때 대부분 1 : N의 관계가 됨 두 번째 : 두 테이블이 JOIN될 때 다른 테이블에 중복이 되는 값이 있는 경우가 있음 -> 회..KimYaKi
- Table of Contents:
티스토리툴바
See more articles in the same category here: Top 287 tips update new.
SUBQUERY 와 JOIN 의 차이 (上)
SQL 쿼리문을 작성하면서 마주할 고민 중 하나는 바로 서브 쿼리와 조인 중 어떤 문법을 사용하는 것이 좋을지 판단하는 것입니다. 상황에 따라 조인을 사용하는 것이 훨씬 좋을 때도 있고, 반면에 서브 쿼리를 사용하는 것이 좋을 때도 있습니다. 그래서 이번 글에서는 각 상황을 훑어보려고 합니다.
서브 쿼리는 복잡한 SQL 쿼리문에 많이 사용됩니다. 보통은 메인 쿼리라고 부르는 외부 쿼리가 있고, 외부 쿼리 내에 다른 쿼리문, 즉 내부 쿼리가 있는 구조입니다. 서브 쿼리의 구조는 간단할 수도 있고 조금 복잡할 수도 있습니다. 간단한 형태의 서브 쿼리는 내부 쿼리가 외부 쿼리의 열에 의존하지 않습니다. 내부 쿼리만으로도 충분히 쿼리가 실행 가능해야 합니다. 반면에 좀 더 복잡한 형태의 서브 쿼리는 내부 쿼리가 외부 쿼리의 열에 의존합니다. 즉, 내부 쿼리만으로 쿼리가 실행이 불가능하다는 말입니다. 서브 쿼리에 관해 더 자세한 내용은 서브 쿼리의 종류에는 무엇이 있을까? 를 읽어주세요.
반면에, 조인은 여러 개의 쿼리를 필요로 하지 않습니다. 조인의 역할은 2개 혹은 그 이상의 테이블을 연결하고, 연결한 테이블로부터 필요한 열을 조회할 수 있도록 합니다.
서브 쿼리와 조인 모두 여러 개의 테이블로부터 데이터를 추출하기 위한 복잡한 쿼리문에 사용될 수는 있으나, 이 둘의 데이터를 추출하기 위한 접근 방식은 다릅니다. 여러분의 분석에 따라 서브 쿼리와 조인 중 어느 것을 사용하든 상관이 없을 때도 있고, 둘 중 하나만이 유일한 해결 방법일 수도 있습니다. 지금부터 다양한 사례를 살펴보도록 하겠습니다.
이번 글에서는 아래의 2개 테이블을 예시로 사용할 것입니다.
첫 번째 테이블 : product
id name cost year city 1 chair 245.00 2017 Chicago 2 armchair 500.00 2018 Chicago 3 desk 900.00 2019 Los Angeles 4 lamp 85.00 2017 Cleveland 5 bench 2000.00 2018 Seattle 6 stool 2500.00 2020 Austin 7 tv table 2000.00 2020 Austin
두 번째 테이블 : sale
id product_id price year city 1 2 2000.00 2020 Chicago 2 2 590.00 2020 New York 3 2 790.00 2020 Cleveland 5 3 800.00 2019 Cleveland 6 4 100.00 2020 Detroit 7 5 2300.00 2019 Seattle 8 7 2000.00 2020 New York
서브 쿼리를 조인으로 대체할 수 있는 경우
SQL이 아직 익숙하지 않으신 분들은 조인으로 쉽게 작성할 수 있는 쿼리문을 서브 쿼리로 작성하곤 합니다. 서브 쿼리가 조인에 비해 직관적이라서 이해하기 쉽기 때문에 실제로 많은 SQL 사용자들이 선호하기는 하지만, 때로는 조인이 훨씬 효과적이랍니다. 조인은 쿼리문이 복잡해지더라도 서브 쿼리에 비해 읽어내기 수월합니다. 그래서 가장 첫 번째로 서브 쿼리를 조인으로 대체할 수 있는 경우들을 살펴보고자 합니다.
1) 스칼라 서브 쿼리
첫 번째 경우는 스칼라 서브 쿼리입니다. 스칼라 서브 쿼리는 내부 쿼리가 단일 값을 반환하거나 1개의 열과 1개의 행을 반환하는 경우를 말합니다. 즉, 내부 쿼리가 단일한 값을 반환한다면 이는 조인으로도 충분히 구현할 수 있다는 이야기입니다. 예시를 볼까요?
2,000 달러에 팔린 상품의 이름과 가격을 알고 싶다고 가정해봅시다. 서브 쿼리를 이용해 아래와 같이 작성할 수 있습니다.
SELECT
name,
cost
FROM product
WHERE id =
( SELECT product_id
FROM sale
WHERE price = 2000
AND product_id = product.id );
결과는 다음과 같습니다.
name cost armchair 500.00 tv table 2000.00
외부 쿼리가 상품의 이름과 가격(cost)을 조회했습니다. 우리는 모든 상품에 관해 알고 싶은 것이 아니므로 WHERE 절을 사용하여 서브 쿼리를 통해 구한 상품 아이디만 조회될 수 있도록 하였습니다. 그럼 서브 쿼리, 즉 내부 쿼리를 살펴보도록 하죠. sale 테이블은 각 상품의 판매가(price)에 관한 정보를 담고 있습니다. 서브 쿼리는 제일 먼저 1) 판매가가 2,000 달러인 상품만 남겨둔 후 2) 외부 쿼리의 id와 내부 쿼리의 product_id를 비교하여 일치하는 상품의 아이디만 반환해줍니다. 여기서 주의할 점은 아이디를 비교하는 과정에서 각 아이디를 비교할 때마다 내부 쿼리가 실행됩니다. 그래서 매번 단일한 값이 반환되므로 스칼라 서브 쿼리라고 볼 수 있습니다. 또한, 이렇게 내부 쿼리가 실행되기 위해서 외부 쿼리에 의존하는 것을 상관관계가 있는 서브 쿼리라고 부릅니다. 결과는 2개의 상품이 2,000 달러에 판매되었습니다.
하지만, 해당 쿼리문은 효율적이지 못합니다. 그 이유는 서브 쿼리 내에서 외부 쿼리의 id와 내부 쿼리의 product_id를 매칭 하는 과정에서 각 아이디마다 내부 쿼리가 실행되므로 결과적으로 전체 쿼리가 실행되는 시간이 길어질 수밖에 없습니다. 그렇다면, 이를 어떻게 수정하면 좋을까요?
조인을 사용하여 똑같은 결과를 얻어낼 수 있습니다. 이번에는 조인을 사용한 쿼리문입니다.
SELECT
p.name,
p.cost
FROM product AS p
JOIN sale AS s
ON p.id = s.product_id
WHERE s.price = 2000;
쿼리문을 보면, 조인을 통해 product 테이블과 sale 테이블을 연결했습니다. 두 테이블을 연결하기 위해 product 테이블의 아이디 열과 sale 테이블의 product_id 열을 서로 매칭 하였고요. 마지막 문장에 WHERE 절을 통해 판매가(price)가 2,000 달러인 상품만 조회될 수 있도록 필터링하였습니다.
2) IN 연산자 안에 있는 서브 쿼리
IN 연산자 안에 서브 쿼리가 있다면 해당 서브 쿼리를 조인으로 바꿔 쓸 수 있습니다. 이 경우는 내부 쿼리, 즉, 서브 쿼리가 여러 개의 값을 반환합니다. 예를 들어, 판매된 상품들의 이름과 가격을 알고 싶다고 가정해봅시다. 원하는 결과를 얻기 위해 아래와 같은 쿼리문을 작성할 수 있습니다.
SELECT
name,
cost
FROM product
WHERE id IN ( SELECT product_id FROM sale );
외부 쿼리는 proudct 테이블에서 이름과 가격을 조회합니다. 그런 후 서브 쿼리에서 반환된 아이디들을 통해 결과값을 추가로 필터링하는 과정을 거칩니다. 참고로, 서브 쿼리가 반환한 아이디 목록은 sale 테이블에서 가져왔기 때문에, 이는 오직 판매된 상품의 아이디만을 의미합니다.
name cost armchair 500.00 lamp 85.00 bench 2000.00 desk 900.00
product 테이블에는 상품의 종류가 7개이지만, 결과를 보니 팔린 상품의 종류는 4개뿐인 것을 확인할 수 있습니다.
그렇다면 똑같은 결과를 얻기 위해 이번에는 조인을 사용해 보도록 하겠습니다.
SELECT DISTINCT
p.name,
p.cost
FROM product AS p
JOIN sale AS s
ON p.id = s.product_id;
이는 꽤나 간단한 쿼리문입니다. product_id 로 2개의 테이블은 연결한 후 그 테이블에서 상품 이름과 가격을 조회하였습니다. 여기서 쓰인 조인의 종류는 이너 조인인데, 그 이유는 우리가 판매된 상품들의 정보만 보고 싶었기 때문입니다. 이너 조인을 사용함으로써 sale 테이블에 아이디가 없는 상품들은 결과 테이블에 조회되지 않습니다.
또한, 결과 중에서 혹시나 있을 중복값을 제거하고자 DISTINCT 키워드를 사용했습니다. 이는 IN 또는 NOT IN 연산자를 조인으로 바꿔 쓸 때 종종 거쳐야 하는 작업입니다.
3) NOT IN 연산자 안에 있는 서브 쿼리
이는 바로 직전에 살펴본 IN 연산자 대신에 NOT IN 연산자를 사용했다는 차이밖에 없습니다. 이번에는 판매되지 않은 상품의 이름과 가격을 알아보고자 합니다. 아래는 NOT IN 연산자를 사용한 서브 쿼리문입니다. 한 번 보시죠.
SELECT
name,
cost
FROM product
WHERE id NOT IN ( SELECT product_id FROM sale );
결과는 다음과 같습니다.
name cost chair 245.00 stool 2500.00
서브 쿼리가 sale 테이블에서 팔린 상품의 아이디의 목록을 반환했습니다. 그래서 그것들을 가지고 외부 쿼리의 상품 아이디와 비교하여 결과를 얻어낼 수 있었습니다. NOT IN 연산자이므로 서브 쿼리를 통해 얻어낸 아이디가 외부 쿼리 테이블에 존재하지 않는다면, 그 아이디의 상품명과 가격이 조회됩니다. 그렇다면, 해당 서브 쿼리를 어떻게 조인으로 바꿔 쓸 수 있을까요?
SELECT
DISTINCT p.name,
p.cost
FROM product AS p
LEFT JOIN sale AS s
ON p.id = s.product_id
WHERE s.product_id IS NULL ;
이 쿼리는 상품 아이디로 product 테이블과 sale 테이블을 연결합니다. IN 연산자가 들어가 있기 때문에 서브 쿼리를 조인으로 바꿀 때 DISTINCT 키워드를 사용하여 혹시나 있을 중복값을 제거합니다.
이번 쿼리문에서 주의하여 살펴볼 점은 NOT IN 연산자 안의 서브 쿼리를 새로 작성하는 과정에서 LEFT JOIN과 WHERE 절을 사용했다는 점입니다. LEFT JOIN을 통해 상품의 판매 유무와는 상관없이 모든 상품들이 조인한 테이블에 나타나게 됩니다. 그런 후, WHERE 절에서 product_id 가 존재하지 않는 경우를 찾음으로써 서브 쿼리의 아이디가 외부 쿼리 테이블에 존재하지 않는 경우를 재현하였습니다.
4) EXISTS, NOT EXISTS 연사자 안의 상관관계 서브 쿼리
EXISTS와 NOT EXISTS 연산자 안에 있는 서브 쿼리도 조인으로 대체하여 쓰기에 쉽습니다.
실제 예시를 살펴보도록 합시다. 아래 쿼리를 통해 2020년도에 팔리지 않은 상품들의 정보를 조회할 수 있습니다.
SELECT
name,
cost,
city
FROM product
WHERE NOT EXISTS
( SELECT id
FROM sale
WHERE year = 2020 AND product_id = product.id );
결과는 다음과 같습니다.
name cost city chair 245.00 Chicago desk 900.00 Los Angeles bench 2000.00 Seattle stool 2500.00 Austin
위 쿼리는 외부 쿼리 테이블이 가지고 있는 상품들을 가지고 서브 쿼리의 조건과 일치하는지 확인합니다. 서브 쿼리가 정한 조건은 판매 연도가 2020년이면서 sale 테이블의 product_id와 외부 쿼리의 id 가 일치될 수 있도록 product 테이블의 id 가 sale 테이블에도 존재해야 한다는 것입니다. 하지만 사용된 연산자가 NOT EXISTS 이므로 서브 쿼리가 정한 조건과 정확히 일치하지 않으면 됩니다. 따라서 판매 연도가 2020년이 아님과 동시에 sale 테이블에 아무런 정보가 존재하지 않는 상품들이 해당 쿼리의 결과입니다.
이를 조인을 사용하여 다시 작성해보면 아래와 같습니다.
SELECT
p.name,
p.cost,
p.city
FROM product AS p
LEFT JOIN sale AS s
ON p.id = s.product_id
WHERE s.year != 2020 OR s.year IS NULL ;
여기서 LEFT JOIN을 통해 product 테이블과 sale 테이블을 연결하였습니다. LEFT JOIN을 사용했기 때문에 팔리지 않은 상품도 결과 테이블에서 찾아볼 수 있습니다. 그런 후 WHERE 절을 통해 1) sale 테이블에 아무런 정보가 없고(s.year IS NULL) 2) 판매 연도가 2020년이 아닌 값(s.year != 2000)들만 필터링해주었습니다.
다음 글에서는 서브 쿼리를 조인으로 대체할 수 없는 경우를 알아보도록 하겠습니다.
원문 : Subquery vs. JOIN
[MYSQL] 📚 JOIN과 서브쿼리 차이 및 변환 💯 정리
조인(JOIN) vs 서브쿼리(Sub Query)
조인과 서브쿼리는 때로 동일한 결과를 얻을 수 있다.
상황에 따라 조인을 사용하는 것이 훨씬 좋을 때도 있고, 반면에 서브 쿼리를 사용하는 것이 좋을 때도 있다.
서브 쿼리는 복잡한 SQL 쿼리문 에 많이 사용된다.
보통은 메인 쿼리라고 부르는 외부 쿼리가 있고, 외부 쿼리 내에 다른 쿼리문, 즉 내부 쿼리가 있는 구조다.
반면에, 조인은 여러 개의 쿼리를 필요로 하지 않는다.
조인의 역할은 2개 혹은 그 이상의 테이블을 연결하고, 연결한 테이블로부터 필요한 열을 조회할 수 있도록 한다.
서브 쿼리와 조인 모두 여러 개의 테이블로부터 데이터를 추출하기 위한 복잡한 쿼리문에 사용될 수는 있으나, 이 둘의 데이터를 추출하기 위한 접근 방식은 다르다.
분석에 따라 서브 쿼리와 조인 중 어느 것을 사용하든 상관이 없을 때도 있고, 둘 중 하나만이 유일한 해결 방법일 수도 있다.
서브쿼리는 가독성이 좋지만 성능이 조인에 비해 매우 좋지않다.
따라서 최신 MySQL은 사용자가 서브쿼리문을 사용하면 자체적으로 조인문으로 변환하여 실행시키도록 업데이트 되었다.
비록 내부적으로 변환해준다 하지만 꼭 필요한 경우를 제외하고는 너무 서브쿼리를 남용하지 않는 것을 권하는 편이다.
강의에 앞서, 아래의 2개 테이블을 예시로 사용할 예정이다.
[ 상품 목록 테이블 – product ]id name cost year city 1 chair 245.00 2017 Chicago 2 armchair 500.00 2018 Chicago 3 desk 900.00 2019 Los Angeles 4 lamp 85.00 2017 Cleveland 5 bench 2000.00 2018 Seattle 6 stool 2500.00 2020 Austin 7 tv table 2000.00 2020 Austin
[ 판매 이력 테이블 – sale ]id product_id (외래키) price year city 1 2 2000.00 2020 Chicago 2 2 590.00 2020 New York 3 2 790.00 2020 Cleveland 5 3 800.00 2019 Cleveland 6 4 100.00 2020 Detroit 7 5 2300.00 2019 Seattle 8 7 2000.00 2020 New York
서브 쿼리를 조인으로 대체할 수 있는 경우
1) 중첩 서브 쿼리 (단일 행)
중첩 서브 쿼리란, where 절에 서브쿼리를 사용하는 것을 의미한다.
만일 내부 쿼리가 단일한 값을 반환한다면 이는 조인으로도 충분히 구현할 수 있게 된다.
Q. 2,000 달러에 팔린 product의 이름과 가격을 알고 싶다고 가정해보자.
서브 쿼리를 이용해 아래와 같이 작성할 수 있다.
— sale에서 2000원에 팔린 product_id와 projuct테이블의 id와 일치한 것을 가져온다. SELECT name, cost FROM product WHERE id = ( SELECT product_id FROM sale WHERE price = 2000 AND product_id = product.id );
name cost armchair 500.00 tv table 2000.00
여기서 주의할 점은 아이디를 비교하는 과정에서 각 id 와 product_id 필드를 비교할 때마다 내부 쿼리가 실행된다는 점이다.
쿼리를 계속해서 반복해서 날리니, 성능이 낮아질수 밖에 없다.
이는 조인을 사용하여 똑같은 결과를 얻어낼 수 있다.
[ INNER JOIN으로 변환 ]SELECT p.name, p.cost FROM product AS p JOIN sale AS s — inner join ON p.id = s.product_id WHERE s.price = 2000;
2) 중첩 서브 쿼리 (복수행)
IN 연산자 안에 서브 쿼리가 있다는 것은 서브 쿼리가 여러 개의 값을 반환하여, id를 여러개와 비교한다는 뜻이다.
이 역시 해당 서브 쿼리를 조인으로 바꿔 쓸 수 있다.
Q. 예를 들어, 판매된 상품들의 이름과 가격을 알고 싶다고 가정해보자.
SELECT name, cost FROM product WHERE id IN ( SELECT product_id FROM sale ); — 서브 쿼리가 반환한 product_id 목록은 sale 테이블에서 가져왔기 때문에, 이는 오직 판매된 상품을 의미.
name cost armchair 500.00 lamp 85.00 bench 2000.00 desk 900.00
product 테이블에는 상품의 종류가 7개이지만, 결과를 보니 팔린 상품의 종류는 4개뿐인 것을 확인할 수 있다.
[ INNER JOIN으로 변환 ]# 1:1 inner join을 하고 중복되는 레코드는 제거 SELECT distinct p.name, p.cost FROM product AS p JOIN sale AS s ON p.id = s.product_id;
3) 중첩 서브 쿼리 (복수행) – NOT IN 연산자
SELECT name, cost FROM product WHERE id NOT IN ( SELECT product_id FROM sale ); — sale 즉 팔리지 않는 상품들만 출력
name cost chair 245.00 stool 2500.00
[ Exclusive JOIN으로 변환 ]A가 product / B가 sale 이라 보면 된다
— sale 테이블과 조인해도 sale 레코드값을 가지고 있지 않는 product 컬럼 풀력 SELECT DISTINCT p.name, p.cost FROM product AS p LEFT JOIN sale AS s ON p.id = s.product_id WHERE s.product_id IS NULL;
LEFT JOIN을 통해 상품의 판매 유무와는 상관없이 모든 상품들이 조인한 테이블에 나타나게 된다.
그런 후, WHERE 절에서 product_id 가 존재하지 않는 경우(NULL)를 찾음으로써 서브 쿼리의 아이디가 외부 쿼리 테이블에 존재하지 않는 경우를 재현할 수 있다.
4) EXISTS / NOT EXISTS 서브 쿼리
EXISTS와 NOT EXISTS 연산자 안에 있는 서브 쿼리도 조인으로 대체하여 쓰기에 쉽다.
EXISTS 연산자란?
exists는 서브쿼리 전용 연산자로서, 서브쿼리가 반환하는 결과값이 있는지를 조사한다.
서브쿼리는 부모쿼리의 컬럼값을 가져와 사용할 수 있는데 (마치 java의 자식클래스의 상속개념 같이), 서브쿼리 내에서 비교하고, 단지 반환된 행이 있는지 없는지만 보고 값이 있으면 참 없으면 거짓을 반환한다.
Q. 2020년도에 팔리지 않은(NOT EXISTS) 상품들의 정보를 조회
SELECT name, cost, city FROM product as p WHERE NOT EXISTS ( SELECT id FROM sale WHERE year = 2020 AND product_id = p.id — 부모쿼리 p.id 와 서브쿼리 product_id 끼리 비교하고 반환값이 있는지 없는지 );
name cost city chair 245.00 Chicago desk 900.00 Los Angeles bench 2000.00 Seattle stool 2500.00 Austin
[ LEFT JOIN으로 변환 ]SELECT p.name, p.cost, p.city FROM product AS p LEFT JOIN sale AS s ON p.id = s.product_id WHERE s.year != 2020 OR s.year IS NULL; — 2020년도에 안팔리거나, left join 결과 sale테이블에 없는 상품일경우 (null인경우)
EXISTS는 상황에 따라 조인(JOIN) 보다 수행시간이 더 빠를 수도 있다.
EXISTS의 경우는 inner query를 만족하는 레코드를 처음 만나는 순간 EXISTS가 true이므로 inner query를 더 이상 평가하지 않는다.
그래서 일반적으로 EXISTS보다 JOIN 속도가 빠르다고 하지만, 중복된 값이 많이 나올 경우에는 EXISTS가 더 빠르다.
서브 쿼리를 조인으로 대체할 수 없는 경우
1) GROUP BY 를 사용한 서브 쿼리가 FROM 절에 있을 때
집계된 값들을 구하고자 GROUP BY 를 사용한 서브 쿼리가 FROM 절에 들어 있을 때 (스칼라 서브쿼리) 조인으로 변환이 불가능하다.
SELECT city, sum_price FROM ( SELECT city, SUM(price) AS sum_price FROM sale GROUP BY city — group by 를 쓴 스칼라 서브쿼리 ) AS s WHERE sum_price < 2100; city sum_price Chicago 2000.00 Detroit 100.00 Cleveland 1590.00 2) 집계된 값을 반환하는 서브 쿼리가 WHERE 절에 있을 때 서브 쿼리가 집계된 하나의 값을 반환하고 그 값을 WHERE 절에서 외부 쿼리의 값과 비교할 때 변환이 불가능하다. SELECT name FROM product WHERE cost < ( SELECT AVG(price) FROM sale ); -- 평균값을 반환하고 비교 name chair armchair desk lamp 3) 서브 쿼리가 ALL 연산자에 있을 때 서브쿼리를 IN 이나 EXISTS 연산자를 사용할 경우 변환이 가능했지만, 서브 쿼리가 ALL 연산자 안에 들어 있는 경우 변환이 불가능하다. SELECT name FROM product WHERE cost > ALL( SELECT price FROM sale )
name stool
서브쿼리 기초 WHERE, JOIN 조건으로 실습해보기
서브쿼리는 코딩할 때 정말 많이 쓰인다. 특히 DB2에서는 한 통으로 쿼리문을 짜는 경우가 대부분이기 때문에 거의 모든 쿼리가 서브쿼리 형태로 되어 있다.
서브쿼리란?
-SELECT 쿼리문 안에 또 SELECT 쿼리문이 있는 것
-단일 SELECT문으로는 조건식을 만들기 어려울 때 사용, 혹은 서로 다른 테이블에 있는 값을 조인하거나 조건문으로 사용할 때 사용
실제 코드로 알아보자.
위와 같이 상품 테이블과 매출 테이블이 있다.
판매량이 1,000 이상인 상품의 상품코드, 상품명, 상품가격만 가져오고 싶다면 쿼리를 어떻게 짜면 될까?
우선 상품 테이블에는 상품의 판매량이 없다. 판매량은 매출 테이블에 있기 때문에 판매량>=1000이라는 조건을 걸기 위해서는 매출 테이블이 필요하다. 이 때 사용하는 것이 바로 서브쿼리이다.
select p_code, p_name, p_price from 상품테이블 where (select s_p_code from 매출테이블 where s_qty>=1000)
만약 판매량까지 같이 보고 싶다면 두 테이블을 join하면 된다.
select p_code, p_name, p_price from 상품테이블 A left join (select s_p_code, s_qty from 매출테이블 where s_qty>=1000) B on A.p_code=B.s_p_code
서브쿼리는 무한정으로 사용가능하다.
So you have finished reading the 서브 쿼리 조인 topic article, if you find this article useful, please share it. Thank you very much. See more: 서브쿼리 조인 속도 차이, 서브쿼리 조인 차이, 서브쿼리 조인 성능, inner join 서브쿼리, 조인을 서브쿼리로, 오라클 서브쿼리 조인, left outer join 서브쿼리, mysql 서브쿼리 조인