중첩 집계 함수
중첩된 집계 함수 - 하나 이상의 집계 함수가 서로 중첩되어 사용되는 경우를 의미
SELECT 메뉴ID, 사용유형코드, AVG(COUNT(*)) AS AVGCNT
FROM 시스템사용이력
GROUP BY 메뉴ID, 사용유형코드;
- AVG(COUNT(*))와 같은 구문에서는 COUNT 함수가 먼저 실행되어 각 그룹에서 레코드 수를 계산하고, 이후 AVG 함수가 이 레코드 수의 평균을 계산하려고 시도하는데 이는 각 그룹에 대한 평균을 계산하기 위해 이미 계산된 값들에 대해 또 다른 집계 함수를 적용하려고 하기 때문에 문제가 발생
- 중첩된 집계 함수를 사용하려는 경우에는 서브쿼리를 활용하여 중첩된 집계 함수를 방지할 수 있음
SQL 실행순서
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> ORDER BY -> LIMIT/OFFSET
TOP()
SELECT TOP(3) WITH TIES 팀명, 승리건수
FROM 팀별성적
ORDER BY 승리건수 DESC;
- SQL Server의 TOP N 질의문에서 N에 해당하는 값이 동일한 경우 함께 출력되도록 하는 WITH TIES 옵션을 ORDER BY 절과 함께 사용해야 함
INNER JOIN, OUTER JOIN
INNER JOIN
- INNER JOIN은 두 테이블 간에 공통된 값을 기준으로 조인을 수행
- 이는 두 테이블에서 일치하는 값을 가지는 행만 반환하며, 일치하는 값이 없는 경우 해당 행은 결과에서 제외. 즉, INNER JOIN은 교집합에 해당하는 결과를 반환
OUTER JOIN
- OUTER JOIN은 왼쪽, 오른쪽, 또는 양쪽 테이블에서 일치하는 값이 없는 경우에도 모든 행을 반환
- LEFT JOIN과 RIGHT JOIN은 각각 왼쪽 또는 오른쪽 테이블의 모든 행을 유지하면서, 다른 테이블과 일치하는 값이 있는 경우 해당 행을 반환
- FULL JOIN은 두 테이블 모두에서 모든 행을 유지
- LEFT, RIGHT 일때 기준 테이블은 항상 표시
employees table
emp_id |
emp_name |
dept_id |
1 |
John |
101 |
2 |
Mike |
102 |
3 |
Sarah |
101 |
4 |
Emma |
103 |
departments table
dept_id |
dept_name |
101 |
IT |
102 |
HR |
SELECT employees.emp_name, departments.dept_name
FROM employees
INNER JOIN departments
ON employees.dept_id = departments.dept_id;
emp_name |
dept_name |
John |
IT |
Mike |
HR |
Sarah |
IT |
SELECT employees.emp_name, departments.dept_name
FROM employees
LEFT JOIN departments
ON employees.dept_id = departments.dept_id;
emp_name |
dept_name |
John |
IT |
Mike |
HR |
Sarah |
IT |
Emma |
(null) |