[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