blog

关于说下Mysql中从多表跟조인表的区别

이 글에서는 MySQL에서 FROM 다중 테이블과 INNER JOIN 작성의 차이점을 살펴보고, 실행 계획과 효과 측면에서 두 가지가 동등하다는 점을 강조합니다. 또한 예제를 통해...

Sep 4, 2025 · 7 min. read
シェア

시작하기 전에 두 개의 테이블 t_order와 t_address를 만듭니다.

sql
DROP TABLE IF EXISTS `t_order`;   CREATE TABLE `t_order`(    id                 bigint UNSIGNED AUTO_INCREMENT COMMENT ''기본 키 자체 추가'           PRIMARY KEY,    `order_no` varchar(16) NOT NULL DEFAULT '' COMMENT '주문 번호',   `create_time`      datetime        NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성 날짜 ',   ) ENGINE = InnoDB     AUTO_INCREMENT = 1     DEFAULT CHARSET = utf8mb4 COMMENT ='테스트 주문 양식 ';   DROP TABLE IF EXISTS `t_address`;   CREATE TABLE `t_order`(    id                 bigint UNSIGNED AUTO_INCREMENT COMMENT ''기본 키 자체 추가'           PRIMARY KEY,    `order_id` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '주문 ID',    `address_no` varchar(16) NOT NULL DEFAULT '' COMMENT '주소 번호 ',   `create_time`      datetime        NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성 날짜 ',   ) ENGINE = InnoDB     AUTO_INCREMENT = 1     DEFAULT CHARSET = utf8mb4 COMMENT ='테스트 주문 주소 목록 ';

비즈니스에 영향을 미치지 않는 테스트 테이블입니다.

FROM

여러 테이블에서 FROM을 사용하는 것은 SQL 쿼리에서 테이블 조인을 수행하는 간단한 방법입니다. FROM 절에 여러 테이블을 나열하면 해당 테이블의 행을 결합하여 결과 집합을 구성할 수 있습니다. 예시:

css
SELECT o.id,           o.order_no,           a.id,           a.order_id,          a.address_no   FROM t_order o,        t_address a   WHERE o.id = a.order_id;

위의 쿼리는 쉼표 를 사용하여 table1과 table2 테이블을 조인하고 WHERE 절을 통해 조인 조건을 지정합니다. 이는 간단하고 직관적으로 보이지만 실제로는 몇 가지 잠재적인 문제가 발생할 수 있습니다. 조인 조건을 명시적으로 지정하지 않으면 카르테시안 곱이 생성될 수 있습니다. 카르테시안 곱은 한 테이블의 모든 행을 다른 테이블의 모든 행과 결합하여 큰 결과 집합을 형성하는 것입니다. 이로 인해 성능이 저하되고 잘못된 쿼리 결과가 나올 수 있습니다. 다음은 이러한 방식으로 작성됩니다:

css
SELECT o.id,           o.order_no,           a.id,           a.order_id,          a.address_no   FROM t_order o,        t_address a 

INNER JOIN

INNER JOIN을 사용하면 여러 테이블에 대해 FROM을 직접 사용하는 것보다 더 유연하고 명시적인 조인을 수행할 수 있으므로 잠재적인 문제를 방지하고 쿼리 가독성을 개선하는 데 도움이 됩니다. INNER JOIN의 역할과 이점에 대해 자세히 살펴보겠습니다. INNER JOIN은 FROM 절에 INNER JOIN 키워드를 사용하여 조인 조건을 명시적으로 지정하는 명시적 조인 구문입니다. 구문은 다음과 같습니다:

css
SELECT o.id,          o.order_no,          a.id,          a.order_id,          a.address_no   FROM t_order o   INNER JOIN t_address a ON o.id = a.order_id;

INNER JOIN을 사용할 때의 주요 장점 중 하나는 조인 조건을 명시적으로 지정할 수 있다는 것입니다. ON 절에 조인 조건을 명시적으로 작성하면 조인 시 무시할 수 있는 쉼표 를 사용할 위험을 피할 수 있습니다. 이렇게 하면 코드의 가독성과 유지 관리가 쉬워지고 데카르트 곱이 생성될 가능성이 줄어듭니다.

물론 다음 글에서 다룰 왼쪽 조인 및 오른쪽 조인과 같은 다른 조인도 있습니다.

결론

Mysql에서 FROM을 사용하여 여러 테이블을 쿼리하고 INNER JOIN 조인을 사용하면 쿼리 결과, 쿼리 효율성은 동일합니다.

다음에서 실행 순서 분석

먼저 Msql의 SELECT 문의 실행 순서를 살펴보겠습니다:

  1. FROM 절: 지정된 테이블에서 데이터를 가져옵니다. 이 경우 테이블 a와 b가 관련되어 있습니다.
  2. 조인 연산: 쿼리에 조인 연산이 포함된 경우 조인 연산이 수행됩니다. 조인 작업의 목적은 서로 다른 테이블의 행을 결합하는 것입니다.
  3. ON 또는 WHERE 절: 조인 조건은 조인 작업 후에 적용됩니다. INNER JOIN의 경우 조인 조건은 일반적으로 ON 절에 포함됩니다. 쉼표로 구분된 부호 조인의 경우 조인 조건은 WHERE 절에 있습니다.
  4. SELECT 절: 반환할 열을 선택합니다. 이 경우 SELECT *는 모든 열을 선택하는 데 사용됩니다.
  5. GROUP BY 절: GROUP BY 절이 있는 경우 결과가 지정된 열을 기준으로 그룹화됩니다.
  6. HAVING 절: HAVING 절이 있는 경우 그룹화된 결과에 적용됩니다.
  7. ORDER BY 절: ORDER BY 절이 있는 경우 결과는 지정된 열을 기준으로 정렬됩니다.
  8. LIMIT 절 : LIMIT 절이 있는 경우 반환되는 행 수를 제한합니다.

이 실행 순서에 따라 두 쿼리 문의 동등성을 설명할 수 있습니다. 첫 번째 쿼리 SELECT o.*,a.* FROM t_order o INNER JOIN t_address a ON o.id = a.order_id 조인 조건이 ON 절을 통해 지정되고, 두 번째 쿼리 SELECT o.*,a.* FROM t_order o,t_address a WHERE o.id = a.order_id 조인 조건이 WHERE 절을 통해 지정됩니다. 그러나 실행 시점에 MySQL은 조인 작업 단계에서 두 조건을 모두 고려하고 적절한 조인 알고리즘을 선택하여 조인 작업을 수행합니다.

따라서 구문은 약간 다르지만 실행 시점에 MySQL은 조인 조건을 염두에 두고 두 쿼리를 해석하므로 동일한 기능을 갖습니다. 실제로 MySQL 최적화 도구는 동일한 결과를 보장하기 위해 가장 효율적인 실행 계획을 선택합니다.

실행 계획 분석 출처

실행 계획은 쿼리 최적화 도구에 의해 생성되며 쿼리 엔진이 데이터를 가져오고 처리하는 방법을 설명하는 계획입니다. 최적화 도구는 실행 계획을 생성할 때 테이블 크기, 인덱싱, 조인 조건 등 여러 가지 요소를 고려하여 최적의 실행 계획을 결정합니다.

FROM을 통해 계획을 실행하는 방법은 다음과 같습니다:

image.png

그런 다음 내부 조인 접근 방식에 대한 계획을 살펴보세요:

image.png

비교 결과 실행 계획 측면에서 둘 사이에 차이가 없는 것으로 나타났습니다.

인스턴스 유효성 검사

글의 시작 부분에서 만든 두 개의 테이블에서 시작하여 유효성 검사를 위해 t_order 테이블에 100W의 데이터를 삽입하고 t_address 테이블에 10W의 데이터를 삽입합니다.

FROM 방식으로 SQL 실행을 시작합니다:

css
SELECT o.id,        o.order_no,        a.id,        a.order_id,        a.address_no FROM t_order o,      t_address a WHERE o.id = a.order_id  limit 0, 100000;

구현 결과:

image.png

INNER JOIN 방식으로 SQL을 한 번 실행한 후:.

css
SELECT o.id,        o.order_no,        a.id,        a.order_id,        a.address_no FROM t_order o INNER JOIN t_address a ON o.id = a.order_id limit 0, 100000;

구현 결과:

image.png

두 쿼리에 소요되는 시간이 비슷하다는 것을 알 수 있습니다. 두 쿼리의 실행 계획을 살펴보면 동일합니다.

요약

위의 내용을 통해 Mysql에서 여러 테이블을 쿼리할 때 FROM을 사용하는 경우와 JOIN을 사용하여 조인하는 경우 쿼리 결과와 쿼리 효율성이 동일하다는 것을 알 수 있습니다.

그러나 옵티마이저가 보다 직관적이고 이해하기 쉬운 방식으로 작성되어 보다 최적화된 실행 계획을 생성하는 데 도움이 되는 내부 조인을 사용하는 것이 더 좋습니다.

저작권: 이 글은 공개 번호 "코드 파머 아카데미" 원본을 복제하여 인용한 것으로, 출처를 명시해 주세요.

Read next

Java 참조 사양 강력한 소프트 참조

참조는 Java에서 객체를 조작하는 주요 방법입니다. 참조를 사용하면 프로그램에서 객체를 생성, 액세스 및 조작할 수 있습니다. Java의 참조에 대해 얼마나 알고 계신가요?

Sep 3, 2025 · 6 min read