5장 집계와 서브쿼리
20강. 행 개수 구하기 - COUNT
집계함수
- 집합을 다루는 함수
- COUNT(집합)
- SUM(집합)
- AVG(집합)
- MIN(집합)
- MAX(집합)
COUNT 사용
SELECT COUNT(*) FROM 테이블명;

- COUNT는 *를 유일하게 인수로 사용 가능
- WHERE 구의 유무와 관계없이 결과는 하나의 행 반환
- 조건에 따라 행 개수 카운트 가능
- NULL은 무시됨

중복 제거: DISTINCT
SELECT COUNT(DISTINCT 열명) FROM 테이블명;
21강. COUNT 이외의 집계함수
SUM
- 수치형 집합의 합계 계산
- NULL 무시됨

AVG
- 수치형 집합의 평균 계산
- NULL 무시됨
- NULL을 0으로 간주하고 싶다면 CASE 사용

MIN, MAX
- 최솟값과 최댓값 계산
- 문자열, 날짜/시간형 데이터에도 사용 가능
- NULL 무시됨
22강. 그룹화 - GROUP BY
SELECT * FROM 테이블명 GROUP BY 열1, 열2, ...;
- 지정한 열 값이 같은 행을 하나의 그룹으로 묶음
- GROUP BY는 DISTINCT와 같은 중복 제거 효과 있음
- 집계함수와 함께 그룹별로 집계 가능

처리 순서
WHERE → GROUP BY → HAVING → SELECT → ORDER BY
주의사항
- WHERE에서는 집계함수 사용 불가
- GROUP BY에 지정하지 않은 열은 집계함수 없이 SELECT에 사용할 수 없음
- GROUP BY만으로는 정렬 불가
23강. 서브쿼리
- SELECT 안에 또 다른 SELECT 사용 (하위 질의)
- 괄호로 서브쿼리 구분
WHERE 구에서 서브쿼리
SELECT * FROM 테이블명
WHERE 열명 = (SELECT ...);
서브쿼리 반환 유형
- 하나의 값 (스칼라 값)
- 여러 행, 하나의 열
- 하나의 행, 여러 열
- 여러 행, 여러 열
SELECT 구에서 서브쿼리
- SELECT 안의 하나의 항목처럼 취급
- 실행 시 오류가 날 수 있으므로 스칼라 값 반환 확인
FROM 구에서 서브쿼리
SELECT * FROM (
SELECT ...
) AS 별명;
- 서브쿼리에 별명 필수
- 상위 몇 개 행 추출 등 가공된 테이블처럼 사용 가능
INSERT와 서브쿼리
INSERT INTO 테이블명 VALUES (
(SELECT COUNT(*) FROM 테이블1),
(SELECT COUNT(*) FROM 테이블2)
);
INSERT INTO 테이블명 SELECT 1, 2;
24강. 상관 서브쿼리
EXISTS

UPDATE sample551 SET a='있음' WHERE
EXISTS (SELECT * FROM sample 552 WHERE no2 = no);
SELECT*FROM sample551;
- 서브쿼리의 반환값 존재 여부만 확인
- 반환된 행이 있으면 TRUE, 없으면 FALSE
NOT EXISTS
상관 서브쿼리
- 서브쿼리가 외부 쿼리의 값을 참조
- 서브쿼리만 따로 실행 불가능
테이블명 붙이기
테이블명.열명
IN
열명 IN (집합)
- 집합 내 존재 여부 확인 (OR 조건)
- NULL은 무시되지 않음, 하지만 NULL = NULL은 FALSE
- NULL 비교는 IS NULL 사용
NOT IN 주의사항
- 집합에 NULL이 하나라도 있으면 전체 결과가 불명확해짐 (결과는 NULL)
--- 연습문제 ---
1.1
2.2
3.1