한 걸음씩
[SQL] MySQL - Multi Table Queries 본문
수정 필요함 !!
1. Joining tables
- JOIN clause 둘 이상의 테이블에서 데이터를 검색하는 방법
- INNER JOIN 두 테이블에서 값이 일치하는 레코드에 대해서만 결과를 반환 (교집합)
- OUTER JOIN
- LEFT JOIN 오른쪽 테이블의 일치하는 레코드와 함께 왼쪽 테이블의 모든 레코드 반환 (왼쪽 테이블 전체)
- RIGHT JOIN 왼쪽 테이블의 일치하는 레코드와 함께 오른쪽 테이블의 모든 레코드 반환 (오른쪽 테이블 전체)
- CROSS JOIN
▶ INNER JOIN clause
SELECT
select_list
FROM
table1 # 왼쪽 테이블 (무조건!)
INNER JOIN table2 # 오른쪽 테이블 (무조건!)
ON table.fk = table2.pk;
# fk : 외래키, pk : 기본키
- FROM 절 이후 메인테이블 지정 (table1)
- INNER JOIN 절 이후 메인테이블과 조인할 테이블을 지정 (table2)
- ON 키워드 이후 조인 조건을 작성
- 조인 조건은 table1 과 table2 간의 레코드를 일치시키는 규칙을 지정
Ⅰ CREATE TABLE

Ⅱ INSERT INTO


Ⅲ INNER JOIN


⎣ SELECT id 를 하면 오류 발생 => 외래키와 기본키의 id가 겹치기 때문
⎣ SELECT articles.id를 하거나 SELECT users.id 와 같이 테이블을 명시해줘야 함
➀ 제시된 두 테이블을 참고하여 productLine 값이 같은 레코드의 productCode, productName 필드를 조회


⎣ productCode, porductName은 왼쪽 products 테이블에서 가져오고
⎣ textDexcription은 오른쪽 products 테이블에서 가져옴
➁ 제시된 두 테이블을 참고하여 orderNumber 값이 같은 레코드의 orders 테이블 orderNumber, status 필드를 조회


➂ 직전 조회 결과를 바탕으로 각 주문번호 별 주문상태와 총판매액을 요약(주문번호는 orderNumber 필드, 총판매액은 quantityOrdered와 priceEach필드의 곱셈 결과)

⎣ SQL문이 복잡해지기때문에 AS를 통해서 간소화하기
▶ LEFT JOIN clause
- 왼쪽은 무조건 표시하고, 매치되는 레코드가 없으면 NULL 표시
- 왼쪽 테이블 한 개의 레코드에 여러 개의 오른쪽 테이블 레코드가 일치할 경우, 해당 왼쪽 레코드를 여러 번 표시
SELECT
select_list
FROM
table1
LEFT [OUTER] JOIN table2
ON table1.fk = table2.pk
- FROM 절 이후 왼쪽 테이블 지정 (table1)
- LEFT JOIN 절 이후 오른쪽 테이블 지정 (table2)
- ON 키워드 이후 조인 조건을 작성
- 왼쪽 테이블의 각 레코드를 오른쪽 테이블의 모든 레코드와 일치시킴
Ⅰ CREATE TABLE

Ⅱ INSERT INTO


Ⅲ LEFT JOIN

⎣ 왼쪽 부분 전부 출력하고 오른쪽 매칭되는 거는 출력하고 매칭되지 않는 부분은 NULL로 출력
➀ 제시된 두 테이블을 참고하여 customers를 기준으로 customerNumber 필드가 일치하는 레코드와 함께 customers 테이블 contactFirstName와 orders 테이블의 orderNumber, status 필드 조회 (왼쪽 테이블은 customers, 오른쪽 테이블은 orders, 일치하지 않는 경우 NULL)

⎣ INNER JOIN 이라면 주문이 없는 고객은 빠져버림(NULL)
➁ 직전 조회 결과를 바탕으로 주문내역이 없는 고객의 이름과 주문번호 및 배송상태 조회(고객의 이름은 contactFirstName 필드, 주문번호는 orderNumber, 배송상태는 status 필드)

⎣ NULL 상태인 고객 정보 출력하라 (오른쪽과 겹치지 않는 왼쪽 부분만 출력)
▶ RIGHT JOIN clause
- LEFT JOIN과 동일
SELECT
select_list
FROM
table1
LEFT [OUTER] JOIN table2
ON table1.fk = table2.pk
Ⅰ CREATE TABLE

Ⅱ INSERT INTO


Ⅲ RIGHT JOIN

⎣ 게시글을 작성하지 않은 user 정보 출력
⎣ LEFT JOIN을 하면 게시글을 작성하지 않은 user 정보 출력 못함
⎣ 왜? NULL 값으로 출력되니까
➀ 제시된 두 테이블을 참고하여 employees를 기준으로 employeeNumber 필드와 salesRepEmployeeNumber 필드가 일치하는 레코드와 함께 employeeNumber, firstName, customerNumber, contactFirstName 필드 조회(왼쪽 테이블은 customers, 오른쪽 테이블은 employees, 일치하는 않는 경우 NULL)


➁ 직전 조회 결과를 바탕으로 고객에게 판매한 내역이 없는 직원 목록 조회(직원 번호와 이름은 employeeNumber, contactFristName 필드이며 고객 번호와 이름은 customerNumber, contactFristName 필드)


▶ JOIN 정리


https://sql-joins.leopard.in.ua/
SQL Joins Visualizer
Please select how do you want to do SQL JOIN between two table Copy SQL
sql-joins.leopard.in.ua
'SQL' 카테고리의 다른 글
| [SQL] MySQL - Advanced 01 (0) | 2023.02.20 |
|---|---|
| [SQL] MySQL - Nested Queries (0) | 2023.02.16 |
| [SQL] MySQL - Modifying Data (0) | 2023.02.14 |
| [SQL] MySQL - Managing Tables (0) | 2023.02.14 |
| [SQL] MySQL - Single Table Queries 2 (0) | 2023.02.13 |