티스토리 뷰
database 에서 두개의 테이블 사이에 데이터 검색 방법
쿼리를 다루다보면 두가지 테이블을 연관지어 데이터를 조회할 때가 있는데
PROGRAM_INFO 와 NEWS_01 테이블의 연관관계가 외래키 idx
로 묶여있다면 프로그램이 가진 뉴스 콘텐츠를
쉽게 확인할 수 있을것이다.
-- SUBQUERY 방식
select *
from NEWS_01 a, PROGRAM_INFO b
where (select count(join_key) from ATTACH where join_key=a.join_key)=0
-- JOIN 방식
select *
from NEWS_01 a join PROGRAM_INFO b ON a.m_cd=b.m_cd
where (SELECT COUNT(*) from NEWS_01 a right OUTER JOIN ATTACH b ON a.join_key=b.join_key WHERE b.join_key IS NULL)=0;
두 쿼리는 동일한 테이블을 생성해 내지만 우리는 쿼리의 특성을 확인해야한다.
SUBQUERY : 하위질의 / 중첩질문
본래 쿼리는 질문
의 의미를 가지고 있다.
그런데 SUB
이라는 접두사가 붙는다면 중첩 질문 으로 봐야한다.
즉, 질문안에 질문인데 사람이 연속적인 질문에 머리를 써야하듯 컴퓨터도 연산처리가 필요하다.
위 쿼리를 말로 옮긴다면 다음과 같이 되지 않을까?
PROGRAM 중에 NEWS 콘텐츠 중에 첨부파일이 없는 것을 보여줘
JOIN : 집합
우리가 join은 배울때 집합을 빼 놓을 수 없는데 실제 작동방식 또한 이와 비슷하기 때문이다.
위 쿼리를 말로 옮긴다면 다음과 같이 될 것이다.
PROGRAM과 NEWS의 데이터의 m_cd 교집합에서 NEWS과 ATTACH의 차집합인 것
정리
1만 개의 데이터를 대상으로 두 방식을 비교하면 SUBQUERY
는 1초 JOIN
은 0.5초의 작업시간을 보여주었다.
정리하면 두 쿼리 모두 같은 목적을 가지지만 작동 방식에서 차이를 보이며 처리시간또한 큰 차이를 보여주었다.
SUBQUERY
의 경우 적은 데이터 테이블에서 우수한 쿼리 속도를 보여주며JOIN
은 상대적으로 대량의 데이터에서 빠르게 작동했다.
만약 실무에서 게시판 혹은 외래키로 구성되어 있는 여러 테이블을 사용한다면 두 쿼리로 모두 작성해보고
좋은 결과를 보여주는 쿼리문으로 선택해야할 것이다.
CHAT_GPT의 의견
join문은 두 개 이상의 테이블을 연결하여 하나의 결과 집합을 생성합니다.
이 방법은 데이터 양이 많고 인덱스가 적절하게 구성되어 있는 경우 매우 빠를 수 있습니다.
join문은 일반적으로 데이터를 처리하는 데 필요한 시간이 적으므로 대규모 데이터베이스에서 자주 사용됩니다.
반면에 subquery는 하위 질의라고도 불리며, 다른 질의 결과를 필터링하거나 참조하는 방법입니다.
subquery를 사용하면 중첩된 질의를 작성할 수 있으므로 데이터 양이 적은 경우 유용합니다.
그러나 subquery는 데이터 양이 많아질수록 성능이 저하될 가능성이 있습니다.
특히 subquery가 매우 복잡하거나 인덱스가 부적절하게 구성되어 있는 경우 이러한 문제가 발생할 수 있습니다.
서브 쿼리를 조인으로 대체할 수 없는 경우
1) GROUP BY 를 사용한 서브 쿼리가 FROM 절에 있을 때
2) 집계된 값을 반환하는 서브 쿼리가 WHERE 절에 있을 때
3) 서브 쿼리가 ALL 연산자에 있을 때
대체할 수 없는 위 3가지 공통점은 테이블 형식이 아닌 정수 혹은 참/거짓 처럼 단순 데이터라는 것이다.
join은 두 테이블 사이의 연관관계에서 집합을 찾아내는 구조이므로 테이블 형식이 아닌 위 방식들은 사용할 수 없는 것이다.
'DataBase' 카테고리의 다른 글
SphinxSE는 Join 쿼리를 지원하는가? (2) | 2024.07.05 |
---|---|
[work 기록장] 반복되는 컬럼 개선 (0) | 2023.06.16 |
스핑크스 SQL의 특징과 문제점 (0) | 2022.10.18 |
Common Table Expression (0) | 2022.09.17 |
DB 암호화 기법 (1) | 2022.09.16 |
- Total
- Today
- Yesterday
- 자격증
- ajax
- nginx
- 릿코드
- 프로그래머스
- springboot
- 디자인패턴
- 자바
- Solid
- java
- OOP
- security
- docker
- Matlab
- 백준
- 수학
- interview
- Spring
- 스프링
- spring-cloud
- 스프링부트
- 매트랩
- kakao
- JPA
- 면접
- CS
- Algorithm
- C언어
- 그래프
- 알고리즘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |