SQL

[SQL] MySQL - Nested Queries

winter17 2023. 2. 16. 12:04

1. Subquery

  • A query inside a query
  • 단일 쿼리문에 여러 테이블의 데이터를 결합하는 방법
  • 조건에 따라 하나 이상의 테이블에서 데이터를 검색하는 데 사용
  • SELECT, FROM, WHERE, HAVING 절 등에서 다양한 맥락에서 사용
# table 1에서 가장 나이가 어린 사람을 삭제해야 한다면?

DELETE FROM table1
WHERE age = (
	SELECT MIN(age) FROM table1 # 괄호 안이 subquery
);

① 가장 많은 돈을 소비한 고객 번호 조회 (payments 테이블 활용)

 

 

② 미국에 있는 사무실에서 근무하는 직원의 이름과 성 조회 (직원 정보는 employees, 사무실 정보는 offices 테이블에 존재)

 

 

③ 주문한 적이 없는 고객 목록 조회(고객 정보는 customers, 주문 정보는 orders 테이블에 존재)

[왼쪽] 중복 제거 X [오른쪽] 중복 제거 O >> 중복 제거하는게 더 깔끔한 결과를 불러옴!

 

④ 소비를 한 고객들 중 지불한 금액이 가장 높은 고객의 customerNumber, amount, contactFirstName을 조회

(고객 테이블은 customers, 지불 테이블은 payments를 활용)

 >> ①번 심화 문제

[왼쪽] INNER JOIN에 포커스해서 문제 풀이 / [오른쪽] 중첩문 : 주문 고객과 주문 정보가 모두 들어있는 테이블에서 SELECT


2. EXISTS operator

  • 쿼리 문에서 반환된 레코드의 존재 여부를 확인
SELECT
	select_list
FROM
	table
WHERE
	[NOT] EXISTS (subquery);
  • subquery가 하나 이상의 행을 반환하면 EXISTS 연산자는 true를 반환하고 그렇지 않으면 false를 반환
  • 주로 WHERE 절에서 subquery의 반환 값 존재 여부를 확인하는 데 사용

① 적어도 한번 이상 주문을 한 고객들의 번호와 이름 조회 (고객 테이블은 customers, 주문 테이블은 orders이며 두 테이블의 customerNumber 필드를 기준으로 비교)

 

② Paris에 있는 사무실에서 일하는 모든 직원의 번호, 이름, 성을 조회(직원 테이블은 employees, 사무실 테이블은 offices이며 두 테이블의 officeCode 필드를 기준으로 비교)


3. CASE  statement

  • SQL 문에서 조건문을 구성
CASE case_value
	WHEN when_value1 THEN statements
    WHEN when_value2 THEN statements
    ...
    [ELSE else_statements]
END CASE;
  • case_value가 when_value와 동일한 것을 찾을 때까지 순차적으로 비교
  • when_value와 동일한 case_value를 찾으면 해당 THEN 절의 코드를 실행
  • 동일한 값을 찾지 못하면 ELSE 절의 코드를 실행
    • ELSE 절이 없을 때 동일한 값을 찾지 못하면 오류 발생

고객들의 creditLimit에 따라 VIP, Platinum, Bronze 등급을 매겨 조회(VIP는 100000초과, Platinum은 70000 초과 그 외는 Bronze로 지정)

%

 

orders 테이블의 status에 따라 상세 정보를 매겨 조회('In Process'는 '주문중', 'Shipped'는 '발주완료', 'Cancelled'는 '주문취소' 그 외는 '기타 사유'로 지정)