한 걸음씩

[SQL] MySQL - Multi Table Queries 본문

SQL

[SQL] MySQL - Multi Table Queries

winter17 2023. 2. 15. 11:48

수정 필요함 !!

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