[DB] 4. SELECT 복수행 함수

편준민's avatar
Feb 25, 2025
[DB] 4. SELECT 복수행 함수

세로 연산 원리

그룹함수를 쓰면 세로 연산이 된다. 세로연산이 되면, 풀스캔을 하여 함수에 맞는 연산 후에 새로운 줄에 연산 후 데이터가 표현된다. 그 뒤에 다른 칼럼이 표현되고 싶고, 모든 값이 동일하면 스쿼시(똑같은 값을 찌그러뜨려 새로운 줄에 나타냄) 된다

그룹핑 방법 예시

1. 전체 출력
notion image
2. DEPTNO로 정렬
네모 박스에 똑같은 DEPTNO순으로 정렬 된 모습
네모 박스에 똑같은 DEPTNO순으로 정렬 된 모습
3. SAL의 평균을 새로운 행에 출력
notion image

1. Group by 해서 연산하기

  • 전체 행을 세로연산 하려면 무엇을 써? - sum, max, min, count, avg(그룹함수)
  • 특정 행들을 세로연산 하려면 무엇을 써? - where과 그룹함수
  • 특정 그룹만 세로연산 하려면 무엇을 써? - where과 그룹함수
  • 그룹별로 세로연산 하려면 무엇을 써? - group by 와 그룹함수
 

2. 그룹 함수

-- 세로 연산 select * from student; -- 1. 그룹 함수 select avg(height) -- 평균 from student; select count(height) -- row 갯수 from student; select sum(height) -- 더하기 from student; select min(height) -- 가장 작은 값 from student; select max(height) -- 가장 큰 값 from student;

3. 원하는 행만 세로 연산

-- 2. 원하는 행만 세로 연산하기 select avg(weight) from student where year(birthday) = 1975; -- 1975년생의 몸무게 평균 -- 정교수들의 연봉 평균 select floor(avg(pay)) "정교수들의 연봉" -- floor = 소수점 제가 from professor where position = "정교수"; -- 학생들의 키의 평균 select avg(height) from student;

3. 그룹핑하기 (Group by)

Union ALL 과 Group by (결과가 같다)
-- 3. 그룹핑하기 select avg(sal), deptno from emp where deptno = 10 union all select avg(sal), deptno from emp where deptno = 20 union all select avg(sal), deptno from emp where deptno = 30; select avg(sal), deptno from emp group by deptno;

4. 그룹핑 원리 실습

-- 4. 그룹핑 원리 실습 select * from student; select avg(height), grade -- grade 학년으로 그룹핑 from student group by grade; --그룹핑 순서에 유의하기 select job, deptno, avg(sal) -- job을 먼저 그룹핑 한 후에, deptno 그룹핑 from emp group by job, deptno;

5. 특정 그룹 없애기

특정한 그룹을 없애기 위해서 having을 사용해야한다. 하지만 where을 사용하여도 지금은 똑같은 결과 값이 나오지만 연산 순서가 다르기 때문에 상황에 따라 다르게 사용한다. 그룹핑 후에 where문을 사용하고 싶으면 having을 사용하면 된다.
-- group을 만든 후에 where을 사용하려면 having을 써야한다. select job, deptno, avg(sal) from emp group by job, deptno having deptno != 10; -- 10번 그룹만 지우기 select job, deptno, avg(sal) from emp where deptno != 10 -- 10번 그룹만 지우기 group by job, deptno;
notion image

-- 평균 연봉이 2000 이상인 부서는? select avg(sal), deptno from emp group by deptno having avg(sal) > 2000;
평균을 구한 후에 평균 값과 비교 해야하기 때문에 having을 사용
평균을 구한 후에 평균 값과 비교 해야하기 때문에 having을 사용
 
Share article

YunSeolAn