2개 이상의 테이블에서 쿼리를 작성하는 방법으로,
데이터 중복 저장 문제를 해소하고 테이블 수정을 간편히 하기 위해 사용한다.
→ 데이터 중복 없이 구성한 데이터 구조를 데이터 모델링에서 '정규화 2단계'라고 한다.
내부 조인
조인키에 해당하는 각 테이블의 열값을 비교해 조건에 맞는 값을 검색한다.
내부 조인의 기본 형식
SELECT [열 이름]
FROM [테이블 1]
INNER JOIN [테이블2] ON [테이블1.열] = [테이블2.열]
WHERE [검색 조건]
예1) 만약 고객의 주문 내역을 모두 확인하려면 어떻게 할까?
→ 고객 테이블과 주문 테이블을 조인하되 고객번호를 조인 조건으로 삼으면 된다
create table customer(
C_no int,
C_name NVARCHAR(50))
create table Place_order(
Order_no int,
C_no int,
Order_date DATE)
insert into customer VALUES (1, N'박현규'), (2, N'김은숙'), (3, N'한승우')
insert into Place_order values (100, 1, '2021-11-16'),(101, 2, '2021-11-17'), (102, 4, '2021-11-18')
select * from customer
C_no C_name
1 박현규
2 김은숙
3 한승우
select * from Place_order
Order_no C_no Order_date
100 1 2021-11-16
101 2 2021-11-17
102 4 2021-11-18
select customer.C_no, customer.C_name, Place_order.Order_no, Place_order.C_no, Place_order.Order_date
from customer inner join Place_order on customer.C_no = Place_order.C_no
Select 문에 모든 열들을 나열하고,
From문에 조인할 테이블1을 적고
Inner join 문에 테이블2 를 적은 다음,
ON 문에 조인 조건으로 사용할 열을 지정한다.
결과
C_no C_name Order_no C_no Order_date
1 박현규 100 1 2021-11-16
2 김은숙 101 2 2021-11-17
예2) nasdaq_company 테이블과 stock 테이블을 inner join 문으로 조인해 symbol ='MSFT'인 기업 정보와 해당 기업의 2021년10월 일별 주가 데이터를 검색하라.
Select
a.symbol,
a.company_name,
a.ipo_year,
a.sector,
a.industry,
b.[date],
b.[open],
b.[high],
b.[low],
b.[close],
b.adj_close,
b.volume
From nasdaq_company as a
Inner join stock as b
On a.symbol = b.symbol
Where a.symbol = 'MSFT'
and b.date >= '2021-10-01'
and b.date < '2021-11-01'
order by date
※ ON과 Where 문의 차이
ON은 조인할 때 조인 조건을 위해 사용되며,
Where는 조인을 완료한 상태에서 조건에 맞는 값을 가져올 때 사용한다.
물론, ON 문에 조건을 다양하게 부여해 Where 문과 같은 효과를 낼 수도 있지만 조인 조건을 만족하는 데이터 매칭 과정에서 에러를 발생하므로 그렇게 해서는 안된다. 반드시 ON과 Where 문의 성격을 분리해서 사용하자.
Inner join 문 사용하기(2개 이상의 조건 적용)→ AND, OR 등을 사용해 여러 조건을 조합할 수 있다
SELECTa.symbol,a.last_crawel_date,b.dateFrom nasdaq_company as aInner join stock as b ON a.symbol = b.symbol AND a.last_crawel_date = b.datewhere a.symbol = 'MSFT'
Inner join 문 사용하기(3개 이상의 테이블 조인)
SELECT [열 이름]
FROM [테이블 1]
INNER JOIN [테이블2] ON [테이블1.열] = [테이블2.열]
INNER JOIN [테이블3] ON [테이블2.열] = [테이블3.열]
WHERE [검색 조건]
nasdaq_company 테이블의 다양한 symbol 정보를 본인의 관심 분야에 따라 편리하게 검색하려고
industry_group 테이블과 industry_group_symbol 테이블의 정보를 별도 테이블에 저장했다.
industry_group 테이블은 관심 분야에 따른 industry 정보를 저장하며
industry_group_symbol 테이블은 관심 종목의 symbol을 저장한다.
industry_group 테이블에서 industry가 '자동차'인 그룹에 어떠한 symbol이 포함되며 해당 symbol의 company_name과
ipo_year, 및 sector는 무엇인지 검색하는 쿼리를 작성하라.
SELECT
a.industry,
c.symbol,
c.company_name,
c.ipo_year,
c.sector
From industry_group As a
Inner join industry_group_symbol as b On a.num = b.num
Inner join nasdaq_company as c On b.symbol = c.symbol
where a.industry = N'자동차'
Order by symbol
SELECT 문의 industry 열은 industry_group 테이블과 nasdaq_company 테이블에 공통으로 있으며,symbol 열은 industry_group_symbol 테이블과 nasdaq_company 테이블에 공통으로 있다.즉, 3개의 테이블이 조인할 때 서로 열이 중복된다.우선, Inner join 조건에 맞는 테이터만 검색하므로 NULL이 발생하지 않는다. 따라서 열이 중복된 상태에서 고려할 부분은 '성능'이다. 성능을 높이려면 인덱스가 형성된 열을 우선 사용하는 것이 좋다. 예를 들어, industry 열이 인덱스가 형성되어 있다면 이 열로 우선 Inner join 을 하고 이후 symbol 열로 Inner join 을 한다. 실제로 쿼리를 실행했을 때 데이터가 처리되는 순서는 쿼리에 작성된 순서가 아닌, 데이터베이스 엔진에서 판단하는 순서다.
결과
industry symbol company_name ipo_year sector
자동차 ACTC ArcLight Clean Transition Corp. Class A Ordinary Shares 2020 Capital Goods
자동차 ACTCU ArcLight Clean Transition Corp. Unit 2020 Capital Goods
자동차 ACTCW ArcLight Clean Transition Corp. Warrant 2020 Capital Goods
자동차 F Ford Motor Company Common Stock 1972 Capital Goods
자동차 FSR Fisker Inc. Class A Common Stock 2018
자동차 FSS Federal Signal Corporation Common Stock 1980 Technology
자동차 GIK GigCapital3 Inc. Common Stock 2020 Capital Goods
자동차 GM General Motors Company Common Stock 2010 Capital Goods
자동차 HMC Honda Motor Company Ltd. Common Stock 1980 Capital Goods
자동차 IDEX Ideanomics Inc. Common Stock 2007 Technology
자동차 KNDI Kandi Technologies Group Inc Common Stock 2007 Capital Goods
자동차 LI Li Auto Inc. American Depositary Shares 2020 Capital Goods
자동차 NAV Navistar International Corporation Common Stock 1970 Capital Goods
자동차 NIO NIO Inc. American depositary shares each representing one Class A ordinary share 2018 Finance
자동차 NIU Niu Technologies American Depositary Shares 2018 Capital Goods
자동차 NKLA Nikola Corporation Common Stock 2018 Capital Goods
자동차 OSK Oshkosh Corporation (Holding Company)Common Stock 1985 Capital Goods
자동차 PCAR PACCAR Inc. Common Stock 1980 Capital Goods
자동차 PSAC Property Solutions Acquisition Corp. Common Stock 2020
자동차 PSACU Property Solutions Acquisition Corp. Unit 2020
자동차 PSACW Property Solutions Acquisition Corp. Warrant 2021
자동차 RACE Ferrari N.V. Common Shares 2015 Capital Goods
자동차 REVG REV Group Inc. Common Stock 2017 Capital Goods
자동차 RIDE Lordstown Motors Corp. Class A Common Stock 2019 Capital Goods
자동차 SHYF The Shyft Group Inc. Common Stock 1984 Capital Goods
자동차 SOLO Electrameccanica Vehicles Corp. Ltd. Common Stock 2018 Capital Goods
자동차 SOLOW Electrameccanica Vehicles Corp. Ltd. Warrants 2021 Capital Goods
자동차 TM Toyota Motor Corporation Common Stock 1976 Capital Goods
자동차 TSLA Tesla Inc. Common Stock 2010 Capital Goods
자동차 TTM Tata Motors Ltd Tata Motors Limited 2004 Capital Goods
자동차 WKHS Workhorse Group Inc. Common Stock 2010 Capital Goods
자동차 XPEV XPeng Inc. American depositary shares each representing two Class A ordinary shares 2020 Capital Goods
'IT Story > SQL Story' 카테고리의 다른 글
서브 쿼리 (0) | 2022.11.30 |
---|---|
조인(Join): 외부 조인 (0) | 2022.11.29 |
SQL 시작하기: CREATE 문 (0) | 2022.11.24 |
SQL 시작하기: GROUP BY 문과 HAVING 문 (0) | 2022.11.24 |
SQL 시작하기: ORDER BY 문 (0) | 2022.11.24 |