Notice
Recent Comments
Recent Posts
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Today
Total
관리 메뉴

기록 > 기억

[MySQL] JOIN 절 예제 ② 본문

IT국비지원

[MySQL] JOIN 절 예제 ②

BY SON 2021. 10. 11. 23:30

JOIN 절 예제 ②

 

① INNER JOIN

한 테이블의 각 행과 다른 테이블의 모든 행을 일치시키며 두 테이블의 열이 포함된 행을 조회

 

예제 1)

# 제품코드, 제품명, 제품라인설명 조회
SELECT
	p.productCode
	, p.productName
	, pl.textDescription
FROM 
	products p 
JOIN 
	productlines pl USING (productLine); 
	# ON p.productLine = pl.productLine 과 같음

 

예제 2)

# 주문번호, 주문상태, 주문번호별 총매출액 조회
SELECT
	o.orderNumber
	, o.status
	, sum(od.quantityOrdered * od.priceEach) "총매출액"
FROM
	orders o 
JOIN 
	orderdetails od USING (orderNumber)
GROUP BY
	orderNumber;

 

예제 3)

# 주문번호, 주문일, 주문라인번호, 제품명, 주문개수, 개당가격 조회
SELECT
	o.orderNumber
	, o.orderDate
	, od.orderLineNumber
	, p.productName
	, od.quantityOrdered
	, od.priceEach
FROM 
	orders o 
JOIN 
	orderdetails od USING (orderNumber)
JOIN
	products p USING (productCode)
ORDER BY
	o.orderNumber, od.orderLineNumber;

 

예제 4)

# 주문번호, 주문일, 고객명, 주문라인번호, 제품명, 주문개수, 개당가격 조회
SELECT
	o.orderNumber
	, o.orderDate
	, c.customerName
	, od.orderLineNumber
	, p.productName
	, od.quantityOrdered
	, od.priceEach
FROM 
	orders o
JOIN
	orderdetails od USING (orderNumber)
JOIN
	products p USING (productCode)
JOIN
	customers c USING (customerNumber)
ORDER BY
	o.orderNumber, od.orderLineNumber;

 

예제 5)

# 코드가 'S10_1678'인 제품의 판매가격이 권장소비자가보다 낮은 행들 조인
SELECT
	od.orderNumber
	, p.productName
	, p.msrp 
	, od.priceEach
FROM
	products p
JOIN
	orderdetails od
	ON p.productCode = od.productCode
	AND p.msrp > od.priceEach
WHERE
	p.productCode = 'S10_1678';

 

② LEFT JOIN

예제 1)

# 주문이 없는 고객을 포함하여 모든 고객 반환
SELECT
	c.customerNumber
	, c.customerName
	, o.orderNumber
	, o.orderDate
	, o.status
FROM
	customers c
LEFT JOIN
	orders o USING (customerNumber);
    
# 고객이 주문이 없는 경우 orderNumber, orderDate, status 열의 값은 NULL로 채움!
customerNumber|customerName                      |orderNumber|orderDate |status    |
--------------+----------------------------------+-----------+----------+----------+
           167|Herkku Gifts                      |      10188|2003-11-18|Shipped   |
           167|Herkku Gifts                      |      10289|2004-09-03|Shipped   |
           168|American Souvenirs Inc            |       NULL|NULL      |NULL      |
           169|Porto Imports Co.                 |       NULL|NULL      |NULL      |
           171|Daedalus Designs Imports          |      10180|2003-11-11|Shipped   |
           171|Daedalus Designs Imports          |      10224|2004-02-21|Shipped   |
           172|La Corne D'abondance, Co.         |      10114|2003-04-01|Shipped   |

 

예제 2)

# 주문이 없는 고객 조회
SELECT
	c.customerNumber
	, c.customerName
	, o.orderNumber
	, o.orderDate
	, o.status
FROM
	customers c
LEFT JOIN
	orders o USING (customerNumber)
WHERE
	o.orderNumber IS NULL;	

# 주문이 없으면 NULL 값을 채우기 때문!

 

예제 3)

SELECT
	e.lastName
	, e.firstName
	, c.customerName
	, p.checkNumber
	, p.amount
FROM 
	employees e	
LEFT JOIN
	customers c 
	ON e.employeeNumber = c.salesRepEmployeeNumber	# 1
LEFT JOIN
	payments p 
	ON p.customerNumber = c.customerNumber	# 2
ORDER BY
	c.customerName, p.checkNumber;
    
# 1 → 모든 직원 정보와 직원이 담당하는 고객 정보를 가져옴 (직원이 고객을 담당하지 않으면 NULL 반환)
# 2 → 고객의 지불액을 가져옴 (고객이 지불금을 내지 않았으면 NULL 반환)
lastName |firstName|customerName                      |checkNumber|amount   |
---------+---------+----------------------------------+-----------+---------+
Murphy   |Diane    |NULL                              |NULL       |     NULL|
Patterson|Mary     |NULL                              |NULL       |     NULL|
Firrelli |Jeff     |NULL                              |NULL       |     NULL|
Patterson|William  |NULL                              |NULL       |     NULL|
Bondur   |Gerard   |NULL                              |NULL       |     NULL|
Bow      |Anthony  |NULL                              |NULL       |     NULL|
King     |Tom      |NULL                              |NULL       |     NULL|
Kato     |Yoshimi  |NULL                              |NULL       |     NULL|
Hernandez|Gerard   |Alpha Cognac                      |AF40894    | 33818.34|
Hernandez|Gerard   |Alpha Cognac                      |HR224331   | 12432.32|
Hernandez|Gerard   |Alpha Cognac                      |KI744716   | 14232.70|
Tseng    |Foon Yue |American Souvenirs Inc            |NULL       |     NULL|
Castillo |Pamela   |Amica Models & Co.                |IJ399820   | 33924.24|
Castillo |Pamela   |Amica Models & Co.                |NE404084   | 48298.99|

 

예제 4)

# 주문 번호 10123의 주문 및 주문상세 정보만 반환
SELECT 
	o.orderNumber
	, o.customerNumber
	, od.productCode
FROM 
	orders o 
LEFT JOIN 
	orderdetails od USING (orderNumber)
WHERE
	orderNumber = 10123;
orderNumber|customerNumber|productCode|
-----------+--------------+-----------+
      10123|           103|S18_1589   |
      10123|           103|S18_2870   |
      10123|           103|S18_3685   |
      10123|           103|S24_1628   |

 

# 모든 주문을 반환하지만 10123 주문에만 주문상세 정보 연결
SELECT 
	o.orderNumber
	, o.customerNumber
	, od.productCode
FROM 
	orders o 
LEFT JOIN 
	orderdetails od 
	ON o.orderNumber = od.orderNumber
	AND o.orderNumber = 10123;
orderNumber|customerNumber|productCode|
-----------+--------------+-----------+
      10123|           103|S18_1589   |
      10123|           103|S18_2870   |
      10123|           103|S18_3685   |
      10123|           103|S24_1628   |
      10298|           103|NULL       |
      10345|           103|NULL       |
      10124|           112|NULL       |
      10278|           112|NULL       |

 

③ RIGHT JOIN

예제 1)

SELECT
	e.employeeNumber
	, c.customerNumber
FROM 
	customers c
RIGHT JOIN 
	employees e
	ON c.salesRepEmployeeNumber = e.employeeNumber
ORDER BY	
	e.employeeNumber;
    
# 고객 테이블의 salesRepEmployeeNumber 컬럼과 일치 여부 상관없이 '직원 테이블의 모든 행을 반환'
# 고객 테이블의 salesRepEmployeeNumber 컬럼과 일치하는 행이 없으면 '고객 테이블의 모든 컬럼은 NULL 반환'
employeeNumber|customerNumber|
--------------+--------------+
          1002|          NULL|
          1056|          NULL|
          1076|          NULL|
          1088|          NULL|
          1102|          NULL|
          1143|          NULL|
          1165|           124|
          1165|           129|
          1165|           161|

 

예제 2)

# 고객을 담당하지 않는 직원들 조회
SELECT
	e.employeeNumber
	, c.customerNumber
FROM 
	customers c
RIGHT JOIN 
	employees e
	ON c.salesRepEmployeeNumber = e.employeeNumber
WHERE
	c.customerNumber IS NULL
ORDER BY	
	e.employeeNumber;
    
# 고객테이블의 담당자 컬럼과 일치하지 않으면 고객 테이블의 값들을 NULL로 채우기 때문!
employeeNumber|customerNumber|
--------------+--------------+
          1002|          NULL|
          1056|          NULL|
          1076|          NULL|
          1088|          NULL|
          1102|          NULL|
          1143|          NULL|
          1619|          NULL|
          1625|          NULL|

 

④ SELF JOIN

예제 1)

SELECT
	e.employeeNumber
	, concat(e.lastName, ' ', e.firstName) "manager"
	, e2.employeeNumber
	, concat(e2.lastName, ' ', e2.firstName) "reporter"
FROM
	employees e
JOIN 
	employees e2
	ON e.employeeNumber = e2.reportsTo
ORDER BY 
	e.employeeNumber;

# 직원 테이블은 직원 정보와 조직구조 정보도 가지고 있음
# reportsTo 컬럼은 직원의 관리자를 의미함
employeeNumber|manager          |employeeNumber|reporter         |
--------------+-----------------+--------------+-----------------+
          1002|Murphy Diane     |          1056|Patterson Mary   |
          1002|Murphy Diane     |          1076|Firrelli Jeff    |
          1056|Patterson Mary   |          1088|Patterson William|
          1056|Patterson Mary   |          1102|Bondur Gerard    |
          1056|Patterson Mary   |          1143|Bow Anthony      |
          1056|Patterson Mary   |          1621|Nishi Mami       |
          1088|Patterson William|          1611|Fixter Andy      |
          1088|Patterson William|          1612|Marsh Peter      |
          1088|Patterson William|          1619|King Tom         |
          1102|Bondur Gerard    |          1337|Bondur Loui      |
          1102|Bondur Gerard    |          1370|Hernandez Gerard |
          1102|Bondur Gerard    |          1401|Castillo Pamela  |

 

'IT국비지원' 카테고리의 다른 글

[MySQL] EXISTS  (0) 2021.10.18
[MySQL] GROUP BY / HAVING  (0) 2021.10.18
[MySQL] 서브쿼리 (Subquery)  (0) 2021.10.18
[MySQL] JOIN 절 예제 ①  (0) 2021.10.11
[MySQL] SELECT 문  (0) 2021.10.10
[MySQL] Sample Data 다운로드  (0) 2021.10.08
[MySQL] 사용자 등록 / DB 생성 / 권한 부여  (0) 2021.10.07
Comments