서브쿼리
서브쿼리는 쿼리문 안에 또 다른 쿼리문이 포함된 구문
-- 리턴하는 행과 열의 개수에 따라 분류할 수 있다.
-> 단일행 서브쿼리 : 하나의 스칼라 값을 반환
-> 다중행 서브쿼리 : 여러 개의 row을 반환
-> 다중행 열 서브쿼리 : 여러 개의 column로 구성된 여러 가의 row 테이블을 반환
서브쿼리의 확장성
- select 기본 질의는 아주 짧은 단문만 가능하지만 여러 단계 질문을 한꺼번에 하는 경우가 많다.
SQL 복잡 질의를 수행하는 방법이 바로 서브쿼리이다.
서브쿼리는 WHERE절 안에서도 사용할 수 있다.
예시)
- 제품이름이 'A' 인 제품의 최대 판매가는?
SELECT MAX(price) AS 최대판매가
FROM products
WHERE product_name = 'A';
서브쿼리를 실행, 평균 가격을 산출
메인 쿼리를 실행, 평균 가격 이상인 데이터만 가져와서 표시
select *
from product_info
where price >= (select avg(price) from product_info);
상관 부속질의
-- 상위 부속질의의 투플을 이용해 하위 부속질의 계산 즉, 상휘 부속질의와 하위 부속질의가 독립적이지 않고 서로 관련을 맺음
INLINE VIEW
-- FROM 절에서 서브쿼리 사용하기
FROM절 안에 쓴 서브 쿼리의 결과는 뷰처럼 취급
인라인 뷰(inline view) 라고도 한다
단계
-- 서브 쿼리 실행
--
GROUP BY
집계 함수 | 내용 | 사용 예 |
SUM([ALL | DISTINCT ] expr) | expr의 합계를 반환 | SUM(price) |
AVG([ALL|DISTINCT]expr) | expr의 평균을 반환 | AVG(price) |
COUNT({[[ALL|DISTINCT|]expr)|*}) | expr의 row 개수 반환 | COUNT(*) |
MAX([ALL|DISTINCT]expr) | expr의 최대값을 반환 | MAX(price) |
MIN([ALL|DISTINCT]expr) | expr의 최소값을 반환 | MIN(price) |
AVG(expr) | expr의 평균값을 반환 | |
STDEV(expr) | expr의 표준편차를 구함 | |
VAR_SAMP(expr) | expr의 분산을 구함 |
집계 함수 COUNT()
-- *를 사용하면 null을 포함한 총 Row 개수를 구하며, 필드를 명시한 경우, null 값을 제외함
SELECT COUNT(*), COUNT(price)
FROM Orders;
집계 함수 AVG()
-- 평균 구매 가격조회
SELECT AVG(saleprice)
FROM Orders;
-- null 값이 있는 경우 IFNULL, COALEACE 함수와 조합
SELECT COUNT(*), SUM(salary), AVG(IFNULL(salary,0))
FROM Orders;
집계함수 sum()
-- AS 키워드로 열 이름을 지시
SELECT SUM(saleprice) AS 총매출
FROM Orders;
복합 집계 함수 sum, avg, min, max
-- 고객이 주문한 도서의 총 판매액을 구하시오
SELECT SUM(saleprice) AS 총매출
FROM Orders
WHERE custid=102;
GROUP BY 절 사용
-- 지정한 열의 같은 데이터 행을 하나로 묶음
SELECT custid COUNT(*) AS '도서수'.
SUM(saleprice) AS '판매금액'
FROM Orders
GROUP BY custid;
HAVING 절
-- GROUP BY에 선택한 컬럼의 조건을 HAVING 절에 지시함
-- 서브쿼리 실행, 열의 평균 값을 산출함
-- 메인쿼리를 실행
code 열을 기준으로 그룹화하고, price 열의 그룹 최저값이 서브 쿼리의 결과보다 작은 데이터만 가져와 표시
사용시 주의 사항
-- GROUP BY로 컬럼을 그룹으로 묶은 후 SELECT 절엔 반드시 GROUP BY에서 사용한 컬럼과 집계함수만 나올 수 있음
1) 절은 반드시 GROUP BY 절과 같이 작성해야하고
2) WHERE 절보다 뒤에 나와야 함
3) 검색조건에는 SUM, AVG, MAX, MIN, COUNT와 같은 집계함수가 와야함
배우는 중인데 아직 잘 모르겠다