안녕하세요. SQLER의 코난 김대우입니다. 
이번 강좌에서는, 2-9.  JOIN - 테이블 연결을 진행 하겠습니다.


SQLER에서 진행되는, 챗GPT와 함께 배우는 SQL Server 강좌 목록

 

이번 강좌에서 소개해 드릴 내용은 JOIN - 테이블 연결입니다.  

 

 


TL;DR

JOIN 구문은 두 개 이상의 테이블을 연결해 결과를 조회합니다. INNER, LEFT, RIGHT, SELF JOIN 등이 있으며, ON 구문으로 테이블 간 연결 조건을 지정하여 연결합니다.

JOIN은 두 개 이상의 테이블을 연결해 결과를 조회하는 기능입니다. JOIN은 테이블 간의 관계를 활용하여 테이블을 연결합니다.

테이블 두 개를 연결한다고요? 관계? 어떤 의미입니까? 

JOIN 구문을 보시기 전에 예를 들어서 설명을 하겠습니다.

 

 

회사 직원 - 성별 테이블 예제


회사 직원 테이블

성명
성별
손석구
박서준
박은빈
구교환
김태리
한소희


이런 예제 데이터가 있습니다. 데이터는 위 형태로 100개 정도 있다고 가정합니다.


성별이 남 또는 여로 되어 있었는데 회사가 다국적 기업으로 커 나가면서 남 - MALE, 여 - FEMALE로 바꿔야만 합니다. 100개 정도 그냥 손으로 하면 될까요?


만약 데이터의 수가 10만 개라면 어떻게 하면 좋을까요? 단순히 남/여 값만 있는 게 아니라 직급 데이터나 제품 카테고리라면? 쉽게 처리하기 어려울 겁니다. 그렇다면 어떻게 이런 테이블을 잘 조직화할 수 있을까요?

 

회사 직원 테이블

성명
성별ID
손석구 1
박서준 1
박은빈 2
구교환 1
김태리 2
한소희 2


성별 테이블

성별ID
성별
1
2


이렇게 두 개의 테이블로 나눠서 테이블을 설계할 수 있습니다. 위쪽 회사 직원 테이블 - 성별 ID컬럼은 아래쪽 성별 테이블의 성별ID 컬럼을 참조합니다. 회사가 성장하면서 다국적 기업이 되어 남 - MALE, 여 - FEMALE로 바꿔야만 하는 상황이면 어떻게 할까요? 

 

성별 테이블

성별ID
성별
1 MALE
2 FEMAIL


회사 직원 테이블을 건드릴 필요 없이 성별 테이블만 수정하면 해결됩니다. 


지금은 이런 간단한 예제이지만, AdventureWorks와 같은 쇼핑몰 회사라면 제품 카테고리 - 제품 - 주문 - 회원 등 테이블들이 유기적으로 관계되어 있습니다.


나중에 회사 직원 테이블과 성별 테이블을 합쳐서 보고 싶을 때에 바로 오늘 배울 JOIN문을 사용합니다. JOIN 구문을 사용하면 위의 두 개 테이블을 이렇게 합쳐서 볼 수 있습니다.

 

성명
성별ID
손석구 MALE
박서준 MALE
박은빈 FEMAIL
구교환 MALE
김태리 FEMAIL
한소희 FEMAIL


그렇다면 SQL 구문으로 실제 JOIN을 수행하겠습니다. 코드상의 데이터베이스 생성이나 테이블 생성, 외래 키 설정 등은 추후에 상세히 배우게 되니 지금은 데이터와 JOIN에만 집중하세요.

 

USE AdventureWorks;
GO

-- 만약 테이블이 존재하면 삭제
IF OBJECT_ID(N'dbo.Employee', N'U') IS NOT NULL  
   DROP TABLE dbo.Employee;  
IF OBJECT_ID(N'dbo.EmployeeGender', N'U') IS NOT NULL  
   DROP TABLE dbo.EmployeeGender;  
GO

-- 성별 테이블 생성. 외래 키는 임시테이블에서 동작 안 해서 생성합니다.
CREATE TABLE EmployeeGender (
    GenderID INT PRIMARY KEY,
    GenderName NVARCHAR(10), 
);
GO

--회사 직원 테이블 생성
CREATE TABLE Employee (
    EmpName NVARCHAR(10) PRIMARY KEY,
    GenderID INT, 
    FOREIGN KEY (GenderID) REFERENCES EmployeeGender(GenderID)
);
GO

--예제 데이터 삽입
INSERT INTO EmployeeGender VALUES (1, N'MALE');
INSERT INTO EmployeeGender VALUES (2, N'FEMALE');
GO

INSERT INTO Employee VALUES (N'손석구', 1);
INSERT INTO Employee VALUES (N'박서준', 1);
INSERT INTO Employee VALUES (N'박은빈', 2);
INSERT INTO Employee VALUES (N'김태리', 2);
GO

-- 테스트 조회
SELECT * FROM EmployeeGender;
SELECT * FROM Employee;
GO

-- JOIN 구문 실행. 두 개의 테이블을 하나로 연결해 조회합니다.
SELECT 
  Employee.EmpName, 
  EmployeeGender.GenderName, 
  EmployeeGender.GenderID 
FROM 
  Employee
  INNER JOIN EmployeeGender ON Employee.GenderID = EmployeeGender.GenderID;
GO

-- 충분히 JOIN 구문을 살펴보고 다음 과정으로 예제 테이블을 삭제.
DROP TABLE Employee;
DROP TABLE EmployeeGender;
GO

 

 

쇼핑몰의 상품, 고객, 주문 예제

그렇다면 이번에는 조금 더 전형적인 예제를 다뤄보도록 하겠습니다. 쇼핑몰의 데이터에 고객과 제품, 주문 테이블이 있습니다. 아래 쿼리를 수행해 테이블을 생성합니다. 마찬가지로, 테이블 생성 구문은 무시하세요. 테이블 강좌에서 상세히 배웁니다. 어떤 데이터가 있는지, 특히 orders 테이블을 눈여겨보세요.
 

USE AdventureWorks;
GO

-- 만약 테이블이 존재하면 삭제
IF OBJECT_ID(N'dbo.orders', N'U') IS NOT NULL  
   DROP TABLE dbo.orders;
IF OBJECT_ID(N'dbo.products', N'U') IS NOT NULL  
   DROP TABLE dbo.products;  
IF OBJECT_ID(N'dbo.customers', N'U') IS NOT NULL  
   DROP TABLE dbo.customers;  
GO

-- customers 테이블 생성
CREATE TABLE customers (
  customer_id INT PRIMARY KEY,
  customer_name NVARCHAR(10),
  email NVARCHAR(15)
);
GO

-- products 테이블 생성
CREATE TABLE products (
  product_id INT PRIMARY KEY,
  product_name NVARCHAR(10),
  price DECIMAL(10, 0)
);
GO

-- orders 테이블 생성
CREATE TABLE orders (
  order_id INT PRIMARY KEY,
  customer_id INT,
  product_id INT,
  order_date DATE,
  total_amount DECIMAL(10, 0),
  FOREIGN KEY (customer_id) REFERENCES customers (customer_id),
  FOREIGN KEY (product_id) REFERENCES products (product_id)
);
GO

-- customers 테이블에 데이터 삽입
INSERT INTO customers (customer_id, customer_name, email)
VALUES
  (1, N'김대우', N'kdw@example.com'),
  (2, N'손석구', N'ssk@example.com'),
  (3, N'박은빈', N'peb@example.com');
GO

-- products 테이블에 데이터 삽입
INSERT INTO products (product_id, product_name, price)
VALUES
  (1, N'초코파이', 1200),
  (2, N'칸쵸', 800),
  (3, N'포테토칩', 1800),
  (4, N'꼬북칩', 1300);
GO

-- orders 테이블에 데이터 삽입
INSERT INTO orders (order_id, customer_id, product_id, order_date, total_amount)
VALUES
  (1, 1, 1, '2022-01-01', 100.50),
  (2, 1, 3, '2022-02-05', 75.20),
  (3, 2, 2, '2022-03-10', 150.80),
  (4, 2, 2, '2022-04-15', 200.00);
GO

-- 샘플 데이터 조회
SELECT * FROM customers;
SELECT * FROM products;
SELECT * FROM orders;
GO

 

일반적으로 이렇게 테이블을 생성하고 데이터를 적재합니다.

 

Q. 왜 이런 구조로 쪼개서 저장하나요? 한 테이블에 그냥 때려 넣어도 되지 않나요?
A. 이후 데이터베이스 정규화에 대해서 논의하니 그때에 강좌로 진행합니다.

 


테이블 간 관계 시각화 - 데이터베이스 다이어그램 생성

테이블들의 관계를 조금 더 잘 살펴보기 위해 데이터베이스 다이어그램을 그려 보겠습니다.
1) SSMS에서 데이터베이스 하위의 데이터베이스 다이어그램에서 새 데이터베이스 다이어그램을 선택

 

29-데이터베이스다이어그램.png

 

29-테이블선택.png

조금 전 생성한 customers, orders, products 테이블을 추가합니다. 만약 안 보일 경우 아래 “새로 고침”을 누르고 다시 확인하세요. 

 

29-관계도.png

완료하면 이런 다이어그램이 보이고 테이블 간의 관계를 시각적으로 볼 수 있습니다.

 

 

JOIN 종류

SQL에서 제공하는 JOIN 구문은 아래와 같이 5가지 종류가 있습니다.

1. INNER JOIN
2. OUTER JOIN
3. CROSS JOIN
4. FULL OUTER JOIN
5. SELF JOIN


너무 많아서 긴장되시나요? 1번 INNER JOIN과 2번 (LEFT) OUTER JOIN 정도가 주로 사용되며 나머지는 사용할 일이 많지 않습니다. 비율도 경험적으로 INNER JOIN이 70% 이상 사용됩니다.

 

물리적 조인 방식

물리적 조인 방식은 4가지로 나눠집니다. 

1. Nested loop(중첩 루프) JOIN
2. Hash(해시) JOIN
3. Merge(병합) JOIN
4. Adaptive(적응) JOIN

 


INNER JOIN

INNER JOIN은 JOIN 하려는 두 개의 테이블에서 일치하는 데이터만 가져옵니다. 고객 테이블과 주문 테이블에서 과자를 주문한 고객 목록을 출력하려고 합니다. 먼저 어떤 데이터가 있는지 확인합니다.

 

Customer 테이블

customer_id
customer_name email
1 김대우 kdw@example.com
2 손석구 ssk@example.com
3 박은빈 peb@example.com


Order 테이블

order_id
customer_id product_id order_date total_amount
1 1 1 2022-01-01 101
2 1 3 2022-02-05 75
3 2 2 2022-03-10 151
4 2 2 2022-04-15 200


이렇게 두 개의 테이블이 있으며, 다이어그램 등으로 확인한 결과, 이렇게 customer_id 컬럼이 두 개의 테이블을 연결하고 있습니다. 그렇다면 쿼리로는 어떻게 생성할까요?

 

INNER JOIN 예제 쿼리

-- INNER JOIN 예제
SELECT 
  customers.customer_id, 
  customers.customer_name, 
  orders.order_id, 
  orders.order_date, 
  orders.total_amount 
FROM 
  customers 
  INNER JOIN orders ON customers.customer_id = orders.customer_id;
GO

 

FROM 절 부분을 상세히 확인하세요.


1) INNER JOIN을 사이에 두고 두 개의 테이블을 나열합니다. 
2) ON 키워드로 두 테이블의 연결할 컬럼을 설정합니다.
3) SELECT 절에서 출력할 테이블명.컬럼명을 나열합니다.

 

실행 결과입니다.

customer_id
customer_name order_id order_date total_amount
1 김대우 1 2022-01-01 101
1 김대우 2 2022-02-05 75
2 손석구 3 2022-03-10 151
2 손석구 4 2022-04-15 200


☑️ 챗GPT 활용: 아래 구문이 있을 때 세 개 테이블을 JOIN 하는 ANSI SQL 구문을 생성해 줘. (3개의 테이블 생성 구문을 추가하고 프롬프트 실행)

 

INNER JOIN 정의

자 다시 INNER JOIN 정의를 살펴보시죠. INNER JOIN은 JOIN 하려는 두 개의 테이블에서 일치하는 데이터만 가져옵니다. 네, 일치하는 데이터만 가져옵니다. 고객 테이블의 3번 박은빈 님은 고객으로 가입은 했으나 주문은 한 번도 하신 적이 없는 것으로 판단됩니다. 이렇게 INNER JOIN으로 두 개의 테이블을 연결하고 정보를 출력할 수 있습니다. 

그렇다면, 상품 테이블과 주문 테이블을 조회해 판매된 상품 목록을 가져오려면 어떻게 해야 할까요. 상품 테이블과 주문 테이블을 살펴봅니다.

 

상품 테이블

product_id
product_name price
1 초코파이 1200
2 칸쵸 800
3 포테토칩 1800
4 꼬북칩 1300


주문 테이블

order_id
customer_id product_id order_date total_amount
1 1 1 2022-01-01 101
2 1 3 2022-02-05 75
3 2 2 2022-03-10 151
4 2 2 2022-04-15 200


두 테이블은 product_id로 연결되어 있습니다. INNER JOIN SQL 쿼리를 생성해 보겠습니다.

 

SELECT 
  p.product_name, 
  p.product_id, 
  o.order_id, 
  o.order_date, 
  o.total_amount 
FROM 
  products AS p 
  INNER JOIN orders as o ON p.product_id = o.product_id;
GO

 

결과

product_name
product_id order_id order_date total_amount
초코파이 1 1 2022-01-01 101
포테토칩 3 2 2022-02-05 75
칸쵸 2 3 2022-03-10 151
칸쵸 2 4 2022-04-15 200


이렇게 두 개의 테이블에서 일치하는 데이터만 가져옵니다. 제가 좋아하는 꼬북칩은 한 번도 판매되지 않았네요.


그런데, 처음 실행했던 INNER JOIN과 다르게 약간 테이블 이름이 짧습니다. FROM 절에서 테이블 이름을 각각 p와 o로 설정해 별명으로 참조합니다. 이런 방법으로 쿼리를 작성할 수도 있으며, 전체 테이블명을 쓰거나 별명을 선언해 쓰는 방법 중 선택해 사용하시면 됩니다.

 

SQL Server의 T-SQL에서만 사용되는 JOIN 방식

위의 ANSI-SQL92 표준 방식과 다르게 SQL Server에서는 이런 형태로 JOIN 구문을 실행할 수 있습니다. 주로 오래전에 진행된 프로젝트에서 종종 볼 수도 있습니다.

SELECT customers.customer_id, customers.customer_name, orders.order_id, orders.order_date, 
orders.total_amount
FROM customers, orders
WHERE customers.customer_id = orders.order_id;
GO

 

보시면 간단한 FROM 절이 보이고 ON 부분은 WHERE 절로 넘어가 있습니다. SQL Server로 개발하면서 이런 코드가 보여도 놀라지 마시고, 같은 JOIN이라고 생각하시면 됩니다. 하지만, 이 글을 보는 SQLER 분들은 SQL 쿼리를 작성하실 때 가능한 ANSI SQL 방식으로 개발하세요.

 

JOIN 쿼리 작성 시 주의사항

연결하는 컬럼은 JOIN에 포함된 테이블 데이터를 쉽게 일치 또는 비교할 수 있어야 합니다.
두 테이블 양쪽에 존재하는 컬럼 이름을 참조할 경우, 반드시 table_name.column_name 형식을 사용해야 합니다.

 

JOIN 구문 문법

이미 예제를 통해 살펴본 JOIN 구문 문법입니다. 이런 패턴이라는 것만 기억해 두세요.

SELECT table_name.column_name [, table_name.column_name…]
        FROM {table_name[join_type] JOIN table_name ON search_conditions}
        WHERE [search_condition…]


OUTER JOIN

OUTER JOIN은 왼쪽(또는 오른쪽) 테이블의 모든 행을 표시하고 오른쪽(또는 왼쪽)에는 일치하는 행을 표시합니다. LEFT OUTER JOIN 또는 RIGHT OUTER JOIN으로 왼쪽 오른쪽이 붙습니다. 설명이 조금 어렵죠? INNER JOIN은 일치하는 행만 표시한다고 하는데, LEFT OUTER JOIN은 왼쪽에 모든 행을 표시한다고 합니다. 어떻게 다른 걸까요? 다시 예제 코드를 살펴볼게요.

 

OUTER JOIN 예제

한 번도 팔리지 않은 제품을 포함해 모든 주문을 나열하는 쿼리를 작성하세요. 


주문 테이블을 살펴보고 제품 테이블을 보면 어떤 제품이 한 번도 판매되지 않았는지 알 수 있습니다.

 

주문테이블

order_id
customer_id product_id order_date total_amount
1 1 1 2022-01-01 101
2 1 3 2022-02-05 75
3 2 2 2022-03-10 151
4 2 2 2022-04-15 200


제품테이블

product_id
product_name price
1 초코파이 1200
2 칸쵸 800
3 포테토칩 1800
4 꼬북칩 1300


INNER JOIN에서는 일치하는 데이터만 출력했기 때문에 4번 꼬북칩이 아예 JOIN  결과에 없었습니다. 하지만, LEFT OUTER JOIN은 왼쪽 테이블의 모든 행을 표시하기 때문에 한 번도 안 팔린 제품도 리스트 됩니다. 예제 쿼리로 살펴볼게요.

 

SELECT 
  products.product_name, 
  products.product_id, 
  orders.order_id, 
  orders.order_date, 
  orders.total_amount 
FROM 
  products 
  LEFT OUTER JOIN orders ON products.product_id = orders.product_id;
GO

 

결과

product_name
product_id order_id order_date total_amount
초코파이 1 1 2022-01-01 101
칸쵸 2 3 2022-03-10 151
칸쵸 2 4 2022-04-15 200
포테토칩 3 2 2022-02-05 75
꼬북칩 4 NULL NULL NULL


이렇게 LEFT OUTER JOIN을 이용하면 왼쪽 테이블에 모든 행을 표시하기 때문에 일치하지 않는 정보도 출력 가능합니다.
그렇다면 RIGHT OUTER JOIN은 어떨까요?

 

SELECT 
  orders.order_id, 
  orders.order_date, 
  orders.total_amount, 
  products.product_name, 
  products.product_id 
FROM 
  orders 
  RIGHT OUTER JOIN products ON products.product_id = orders.product_id;
GO

 

결과

order_id
order_date total_amount product_name product_id
1 2022-01-01 101 초코파이 1
3 2022-03-10 151 칸쵸 2
4 2022-04-15 200 칸쵸 2
2 2022-02-05 75 포테토칩 3
NULL NULL NULL 꼬북칩 4


이렇게 오른쪽 테이블에 모든 정보를 출력하고 일치하는 행을 표시합니다. 경험적으로 우리는 왼쪽에서 오른쪽으로 글을 쓰는 국가이기 때문에 LEFT가 좀 더 직관적인 편입니다.


그렇다면 이런 예제는 어떨까요?

고객들 중에 한 번도 주문을 한 적 없는 고객의 리스트를 출력하세요.


이런 경우에도 LEFT OUTER JOIN이 유용합니다.

SELECT 
  customers.customer_id, 
  customers.customer_name, 
  orders.order_id, 
  orders.order_date, 
  orders.total_amount 
FROM 
  customers 
  LEFT JOIN orders ON customers.customer_id = orders.customer_id 
WHERE 
  orders.order_id IS NULL;
GO

 

결과

customer_id
customer_name order_id order_date total_amount
3 박은빈 NULL NULL NULL


JOIN 문 왼쪽 테이블이 customers 테이블이기 때문에 모든 고객이 출력되고 주문이 없는 고객은 NULL로 표시되기 때문에 이렇게 쿼리 하면 한 번도 주문한 적 없는 고객을 찾을 수 있습니다.

 

OUTER JOIN의 추가 정보

고려사항
- 관계된 테이블에서 OUTER 테이블과 일치하지 않는 모든 로우를 보여준다.
- 두 테이블만 처리 가능
- 기본 키와 외래 키가 동기화되었는지 알아볼 경우에도 유용하게 사용된다.

 

 

CROSS JOIN

두 개의 테이블에서 로우들의 가능한 모든 조합(교차곱-Cartesian product)을 찾아 출력합니다. 모든 조합, 교차곱 등 CROSS JOIN이 잘 와닿지 않습니다. 우선 예제를 실행하면 바로 이해하실 겁니다.


고객 테이블과 제품 테이블 두 개를 CROSS JOIN 하겠습니다.

 

customer 테이블

customer_id
customer_name email
1 김대우 kdw@example.com
2 손석구 ssk@example.com
3 박은빈 peb@example.com

 

product 테이블

product_id
product_name price
1 초코파이 1200
2 칸쵸 800
3 포테토칩 1800
4 꼬북칩 1300


두 테이블은 아무 관련이 없습니다.

 

CROSS JOIN 수행

SELECT 
  * 
FROM 
  customers CROSS 
  JOIN products;
GO


결과

customer_id
customer_name email product_id product_name price
1 김대우 kdw@example.com 1 초코파이 1200
1 김대우 kdw@example.com 2 칸쵸 800
1 김대우 kdw@example.com 3 포테토칩 1800
1 김대우 kdw@example.com 4 꼬북칩 1300
2 손석구 ssk@example.com 1 초코파이 1200
2 손석구 ssk@example.com 2 칸쵸 800
2 손석구 ssk@example.com 3 포테토칩 1800
2 손석구 ssk@example.com 4 꼬북칩 1300
3 박은빈 peb@example.com 1 초코파이 1200
3 박은빈 peb@example.com 2 칸쵸 800
3 박은빈 peb@example.com 3 포테토칩 1800
3 박은빈 peb@example.com 4 꼬북칩 1300


CROSS JOIN 되는 두 개의 테이블에 관계 조건은 필요 없습니다. 교차곱이 출력되기 때문에 모든 조합이 교차곱(Cartesian product)으로 출력됩니다.


CROSS JOIN을 사용할 경우는 많지 않습니다. 두 테이블의 가능한 모든 조합을 확인하고 싶을 때 사용합니다. 교차곱으로 나오기 때문에 크기가 큰 테이블들을 CROSS JOIN 하면 결과가 커서 문제가 될 수 있습니다. 주의해서 사용하시길 바랍니다.


☑️ 챗GPT 활용: 교차곱(Cartesian product)에 대해서 설명해줘

 

FULL OUTER JOIN

LEFT OUTER JOIN과 RIGHT OUTER JOIN을 합친 결과를 출력합니다. 거의 사용할 일이 없으니 이런 게 있구나 정도만 기억해 두세요. 테이블의 관계 설정이 대부분 1:다 관계이기 때문에 FULL OUTER 조인을 걸 경우가 많지 않습니다. 이런 예제로 수행됩니다.

SELECT 
  products.product_name, 
  products.product_id, 
  orders.order_id, 
  orders.order_date, 
  orders.total_amount 
FROM 
  products FULL OUTER JOIN orders 
    ON products.product_id = orders.product_id;
GO

 


SELF JOIN

SELF JOIN은 1개 테이블이 자기 자신과 JOIN 할 경우 사용합니다. 다음과 같은 경우에 유용합니다.


- 계층적인 구조를 테이블화 할 경우.
- 한 테이블에서 일치하는 값을 찾고자 하는 경우.


반드시 테이블마다 별명(Alias)을 사용해 쿼리해야 합니다.

USE AdventureWorks;
GO

-- 만약 테이블이 존재하면 삭제
IF OBJECT_ID(N'dbo.employees', N'U') IS NOT NULL  
   DROP TABLE dbo.employees;

--직원들 예제 테이블 생성
CREATE TABLE employees (
  employee_id INT, 
  employee_name NVARCHAR(10), 
  manager_id INT
);
GO

INSERT INTO employees (employee_id, employee_name, manager_id) 
VALUES 
  (1, N'구교환', 2), 
  (2, N'송중기', 3), 
  (3, N'이정재', NULL), 
  (4, N'박은빈', 3), 
  (5, N'김태리', 4);
GO

--테스트 조회
SELECT * FROM employees;
GO

--SELF JOIN으로 직원의 매니저를 확인
SELECT e.employee_name AS employee, m.employee_name AS manager
FROM employees e
INNER JOIN employees m ON e.manager_id = m.employee_id;
GO


결과

employee
manager
구교환 송중기
송중기 이정재
박은빈 이정재
김태리 박은빈


이렇게 테이블 데이터의 계층적인 구조를 파악할 때 사용할 수 있습니다.

 

 

물리적 JOIN 방식

SQL Server는 JOIN을 수행할 때 쿼리 최적화기(Query Optimizer)가 테이블의 데이터 수와 연결되는 컬럼의 통계 정보를 토대로 쿼리마다 다른 방식의 JOIN 전략을 취합니다. 대용량 데이터에서는 이러한 JOIN 방식이 성능에 지대한 영향을 주기 때문입니다.


물리적 JOIN 방식은 4가지로 나눠집니다.

1. Nested loop(중첩 루프) JOIN
2. Hash(해시) JOIN
3. Merge(병합) JOIN
4. Adaptive(적응) JOIN


☑️ 챗GPT 활용: 물리적 JOIN 방식 중, Nested loop 조인, Hash 조인, Merge 조인, Adaptive 조인에 대해서 알려줘 (정확한 정보는 아래 공식 가이드 문서를 참조. 챗GPT의 응답은 참조만 하세요.)

 

처음 SQL을 공부하는 단계에서는 이런 게 있다는 정도만 지금은 기억하셔도 좋습니다. 조금 더 SQL에 대해 깊이 공부하고 싶거나, 대용량 데이터를 다루면서 성능 저하 문제로 쿼리 튜닝이 필요할 때 좀 더 살펴보면 많은 도움이 될 거에요.

 

Nested loop(중첩 루프) 

여기에서는 간략히 Nested loop(중첩 루프) 구조만 확인하겠습니다.


Nested loop JOIN은 한쪽 테이블의 각 로우를 다른 테이블의 모든 로우와 비교해 JOIN 조건이 만족하면 결과셋에 추가합니다. 한쪽 테이블의 모든 로우를 다른 테이블의 모든 로우와 비교 완료하면 처리가 끝나고 결과를 리턴합니다.


한 테이블은 작고 다른 조인 테이블은 아주 크며 조인 컬럼에 인덱스가 지정된 경우 I/O와 비교 작업이 가장 적은 인덱스 중첩 루프 조인이 가장 빠른 조인 방식입니다. 


이런 물리적 JOIN 방식을 SQL 쿼리에 힌트(hint)로 제공할 수도 있습니다. 공식적인 권장사항은 SQL Server의 쿼리 최적화기가 최적의 쿼리 실행 계획을 선택해 수행하도록 자동화하는 것을 권장합니다.

 

SELECT p.Name, pr.ProductReviewID  
FROM Production.Product AS p  
INNER LOOP JOIN Production.ProductReview AS pr  
ON p.ProductID = pr.ProductID  
ORDER BY ProductReviewID DESC;
GO

 

나머지 JOIN 방식과 구조가 궁금하다면 아래 링크를 참조하세요.
Joins (SQL Server)

 

 

SQL 강좌 책 구매

강좌가 도움이 되셨다면, 책으로 구매 가능합니다. 책 판매 수익금은 전액 코딩 교육 사회공헌 활동에 기부되며, 아래 링크에서 구매하시면 더 많은 금액이 기부됩니다. 

 

책구매 링크: 챗GPT와 함께하는 마이크로소프트 SQL Server 2022 

책구매링크.png

No. Subject Author Date Views
Notice SQL강좌: 챗GPT와 함께 배우는 SQL Server 무료 강좌 목차와 소개 (2023년 9월 업데이트) 코난(김대우) 2023.08.18 39615
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2023년 6월 업데이트) 코난(김대우) 2021.01.01 21362
2234 SQL강좌: 2-12. SQL UNION 연산자 코난(김대우) 2023.08.18 103
2233 SQL강좌: 2-11. SELECT INTO - 쿼리 결과를 테이블로 복사 코난(김대우) 2023.08.18 145
2232 SQL강좌: 2-10. 하위 쿼리(Subquery-서브쿼리) 코난(김대우) 2023.08.18 128
» SQL강좌: 2-9. JOIN - 테이블 연결 file 코난(김대우) 2023.08.18 214
2230 SQL강좌: 2-8. GROUP BY, ROLLUP, CUBE 코난(김대우) 2023.08.18 183
2229 SQL강좌: 2-7. ORDER BY 결과 정렬 코난(김대우) 2023.08.18 154
2228 SQL강좌: 2-6. DISTINCT 문을 이용한 중복 제거 코난(김대우) 2023.08.18 150
2227 SQL강좌: 2-5. WHERE절의 조건에 의한 행의 검색 코난(김대우) 2023.08.18 146
2226 SQL강좌: 2-4. 데이터형(Data type)과 함수(Function) 코난(김대우) 2023.08.18 193
2225 SQL강좌: 2-3. SELECT - 컬럼선택 file 코난(김대우) 2023.08.18 239
2224 SQL강좌: 2-2. 데이터 검색 - SELECT 구문 file 코난(김대우) 2023.08.18 216
2223 SQL강좌: 2-1. T-SQL SQL Server 언어에 대한 간단한 소개 file 코난(김대우) 2023.08.18 201
2222 SQL강좌: 1-11. 예제 데이터베이스 설치 코난(김대우) 2023.08.18 263
2221 SQL강좌: 1-10. SQL Server 2022 관리 도구 소개 [2] file 코난(김대우) 2023.08.18 166
2220 SQL강좌: 1-9. 업그레이드와 설치 제거 file 코난(김대우) 2023.08.18 100
2219 SQL강좌: 1-8. SQL Server 2022 설치 - 컨테이너 file 코난(김대우) 2023.08.18 111
2218 SQL강좌: 1-7. SQL Server 2022 설치 - 리눅스 file 코난(김대우) 2023.08.18 144
2217 SQL강좌: 1-6. SQL Server 2022 설치 - 윈도 [2] file 코난(김대우) 2023.08.18 332
2216 SQL강좌: 1-5. SQL클라우드와 On-Premise file 코난(김대우) 2023.08.18 157
2215 SQL강좌: 1-4. SQL Server 설치 전 점검사항 file 코난(김대우) 2023.08.18 148





XE Login