부속질의(subquery)
- 하나의 SQL 문 안에 다른 SQL 문이 중첩된 질의
- 다른 테이블에서 가져온 데이터로 현재 테이블에 있는 정보를 찾거나 가공할 때 사용
- 필요한 데이터만 찾아서 공급해주는 부속질의가 성능이 좋음
SELECT SUM(saleprice)
FROM Orders
WHERE custid = (SELECT custid FROM Customer WHERE name = '박지성')
부속질의의 종류
명칭 | 위치 | 영문 및 동의어 | 설명 |
스칼라 부속질의 | SELECT 절 | scalar subquery | SELECT 절에서 단일 값 반환 |
인라인 뷰 | FROM 절 | inline view table subquery |
FROM 절에서 결과를 view 형태로 반환 |
중첩질의 | WHERE 절 | nested subquery predicate subquery |
WHERE 절에 술어와 같이 사용되며 결과를 한정시키기 위해 사용 |
스칼라 부속질의(scalar subquery) - SELECT 부속질의
- SELECT 절에서 사용되는 부속질의로, 부속질의의 결과 값을 단일 행, 단일 열의 스칼라 값으로 반환
- 스칼라 값이 들어갈 수 있는 모든 곳에 사용 가능, SELECT 문과 UPDATE SET 절에 사용
- 주질의와 부속질의와의 관계는 상관/비상관 모두 가능
SELECT custid, (SELECT name FROM Customer cs WHERE cs.custid=od.custid), SUM(saleprice)
FROM Orders od GROUP BY custid;
인라인 뷰 - FROM 부속질의
- FROM 절에서 사용되는 부속질의
- 테이블 이름 대신 인라인 뷰 부속질의를 사용하면 보통의 테이블과 같은 형태로 사용 가능
- 부속질의 결과 반환되는 데이터는 다중 행, 다중 열이어도 상관없음
- 다만 가상의 테이블인 뷰 형태로 제공되어 상관 부속질의로 사용될 수는 없음
SELECT cs.name, SUM(od.saleprice) 'total'
FROM (SELECT custid, name FROM Customer WHERE custid <= 2) cs, Orders od
WHERE cs.custid = od.custid
GROUP BY cs.name
중첩질의 - WHERE 부속질의
- 중첩질의(nested subquery) : WHERE 절에서 사용되는 부속질의
- WHERE 절은 보통 데이터를 선택하는 조건 혹은 술어(predicate)와 같이 사용됨
- 중첩질의를 술어 부속질의(predicate subquery)라고도 함
중첩질의 연산자의 종류
술어 | 연산자 | 반환 행 | 반환 열 | 상관 |
비교 | =, >, <, >=, <=, < > | 단일 | 단일 | 가능 |
집합 | IN, NOT IN | 다중 | 단일 | 가능 |
한정 | ALL, SOME(ANY) | 다중 | 단일 | 가능 |
존재 | EXISTS, NOT EXISTS | 다중 | 다중 | 필수 |
SELECT SUM(saleprice) 'total'
FROM Orders
WHERE custid IN (SELECT custid FROM Customer WHERE address LIKE '%대한민국%');
SELECT SUM(saleprice) 'total'
FROM Orders od
WHERE EXISTS (SELECT * FROM Customer cs WHERE address LIKE '%대한민국%' AND cs.custid = od.custid);
참고 자료 : MySQL로 배우는 데이터베이스 개론과 실습
'CS > 데이터베이스' 카테고리의 다른 글
Mariadb / MySQL (0) | 2023.07.25 |
---|---|
[MYSQL] 날짜 관련 정리 (0) | 2023.04.05 |
[MySQL] REGEXP (0) | 2023.03.21 |
SQL 내장 함수 (1) | 2023.02.22 |
데이터 조작어(DML) (0) | 2023.02.17 |