체인의정석

MySQL) 쿼리 실행 순서 및 테이블 합치기 본문

개발/database

MySQL) 쿼리 실행 순서 및 테이블 합치기

체인의정석 2023. 2. 14. 15:18
728x90
반응형

먼저 FROM 2개의 테이블을 합칠 때는 JOIN을 사용해야 한다.

select * from 
테이블1 AS 별명1
INNER JOIN 
테이블명2 AS 별명2 
ON 테이블1.block_number = 테이블명2.block_number
where 조건;

이런 식으로 가져오고자 하는 테이블 2개를 선택한 후에 기준점으로 잡을 열을 ON으로 두고 where 조건을 걸면 된다.

이를 기본으로 하여 여러 테이블에서 합산한 값을 바탕으로 여러 조건을 필터링 하여 결과 값을 내는 경우 아래와 같이 낼 수 있다.

SELECT 
	MAX(row1) as 별명1, rowB as 별명2
	FROM (
		SELECT row1, row2 FROM 테이블1
		UNION ALL
		SELECT row1, row2 FROM 테이블2
    ) AS 테이블별명1
	INNER JOIN(
		SELECT rowA, rowB FROM 테이블A
		UNION ALL
		SELECT rowA, rowB FROM 테이블B
	) AS 테이블별명2
 	ON 테이블1.block_number = 테이블명2.block_number
WHERE 조건 AND 조건2
GROUP BY rowB; //순서를 고려했을 때 select가 더 뒤이므로 별명 사용 불가 & 모든 연산이 여기에 다 들어가게
HAVING 조건3
ORDER BY 열이름

이렇게 여러 명령어가 들어가게 되면 명령어의 실행 순서가 중요한데

 

아래 블로그를 참고하여 정리를 해봤다.

 

https://nohriter.tistory.com/129

 

[MySQL] SELECT 쿼리 문법 순서 및 실행 순서

SQL 쿼리문을 작성할 때 사용되는 WHERE, GROUP BY, ORDER BY 절과 같은 구문을 실행하는데 순서가 존재합니다. 이 순서에 의해서 쿼리가 처리되고 어떻게 쿼리문을 작성하느냐에 따라 성능 차이가 발생

nohriter.tistory.com

먼저 순서는 보는것 처럼 아래 순서로 작성이 된다.

 

1. SELECT 컬럼명

2. FROM 테이블명

3. WHERE

4. GROUP BY

5. HAVING

6. ORDER BY

 

하지만 실행 순서의 경우 조금 다르다

 

1. FROM

2. WHERE

3. GROUP BY (단일 값으로 축소, 이 때 합산 수식이 적용되지 않는 모든 열은 select 안에 다 나열해주어야 한다. 아니면 아래와 같은 에러가 난다.)

" SELECT list is not in GROUP BY clause and contains nonaggregated column '' which is not functionally dependent on columns in GROUP BY clause" => 해당 오류는 group by에 select에 누락된 모든 값을 써줘야 해결된다. (합산이 되는) 따라서 group by 이후에 조건을 having으로 걸고 그 뒤에 select로 거는 순서를 고려하여 쿼리문을 작성하여야 한다.

 

4. HAVING - where절 이후에 group by와 세트로 와서 다음 순서에서 조건절로 사용된다.

5. SELECT - 조건을 다 처리한 후 남은 데이터에서 마지막으로 가져온다. 여기서 쓰인 연산은 마지막으로 적용된다.

6. ORDER BY - 행의 순서를 가장 마지막에 정렬한다.

 

이에 따라서 정리하게 될 시에는 결국 조건을 순서에 따라 복잡하지만 차근차근히 필터링을 할 수 있었다.

728x90
반응형
Comments