[MSSQL 강좌 7강] SELECT문 - 3

공부/MSSQL  2012.10.07 09:31



안녕하세요. 개발자 명월입니다.

이번 포스팅에서는 group by 부터 자주 사용되는 함수까지 알아보도록 하겠습니다.

group by는 말 그대로 그룹을 묶어준다라는 뜻을 가지고 있습니다. 먼저 데이터 부터 확인해 보도록하겠습니다.

 

select * fro Test_table; 

 

 

그럼 group by 예제로 학교 별로 몇명인지 확인 해 보도록 하겠습니다.

 

select 학교,count(*) from Test_table group by 학교

 

 

여기서 학교별로 몇명인지 그룹을 지을 때 group by를 쓰였습니다. group by는 다중그룹도 가능합니다. 예를 들면 학교별, 학년별로 그룹을 지을 수 도 있습니다.

 

 

이중 having은 group by가 된 항목중에 조건을 거는 구문으로써 예를 들면 학교별 학년별로 몇명인지 검색을 하였으나 이중 전체 2학년 학생만 볼때는 having 절을 넣어서 확인 하면 되겠습니다.

 

 

여기서 조금은 의문점이 생기는데 굳히 group by를 사용하지 않고도 where 절을 사용하고도 가증할꺼 같다고 생각하실 수 있습니다.

 

 

역시 같은 결과를 나타냅니다. 제가 여기서 having과 where 절의 차이를 이야기 하자면 거의 없습니다.많은 데이터를 가지고 있을때 로직 상으로는 having 이 좀더 빠른 결과를 내보내겠으나 거의 차이가 없다고 보면 되겠습니다.

그럼 귀찮게 where 로 통일하지 왜 having으로 나눌까라는 생각이 들게 되겠는데 제가 말할 수 있는 부분은 가독성때문이라고 말하고 싶습니다. 실제 디비 개발을 하다 보면 where 절을 정말 빈번히 사용하게 됩니다.

즉 where 절의 구문이 너무 많아 지기 때문에 가독성은 당연히 떨어지게 되어있습니다. 이 가독성을 조금이라도 높이기 위해선 where 에 들어가지 않고 다른 형태로 빼낼 수 있는 것은 최대한 빼내는 것이 후의 가독성을 위해서 필요하다고 생각하는 부분입니다.

 

select 와 자주 사용하는 구문은 대부분 알아보았습니다. 이제부터는 자주 사용하는 함수에 대해 알아보겠습니다.

그러기 위해서 새로운 데이터를 넣어보겠습니다.

 

  1
  2 create table 성적(
  3 idx bigint primary key identity(1,1),
  4 Name varchar(100),
  5 국어 decimal(18,0),
  6 영어 decimal(18,0),
  7 수학 decimal(18,0)
  8 )
  9
10 insert into 성적 (Name,국어,영어,수학) values('홍길동',80,78,89);
11 insert into 성적 (Name,국어,영어,수학) values('명월',65,65,21);
12 insert into 성적 (Name,국어,영어,수학) values('호동이',98,67,97);
13 insert into 성적 (Name,국어,영어,수학) values('메뚜기',65,48,37);
14 insert into 성적 (Name,국어,영어,수학) values('기린',91,64,78);
15 insert into 성적 (Name,국어,영어,수학) values('배신자',19,54,76);
16 insert into 성적 (Name,국어,영어,수학) values('도둑놈',98,65,78)
17 insert into 성적 (Name,국어,영어,수학) values('스파르타',64,18,59);
18 insert into 성적 (Name,국어,영어,수학) values('멍지',98,79,98);
19 insert into 성적 (Name,국어,영어,수학) values('야기',88,67,49);
20

 

 

먼저 count는 전에도 사용해 보았지만 레코드의 개수를 나타내는 함수입니다.

select count(*) from 성적

 

 

결과를 보듯이 10개의 레코드가 있다는 결과를 내보냅니다.

그다음 많이 사용하는 함수는 sum 입니다. 이 테이블의 국어,영어,수학의 합계를 알아보도록 하겠습니다.

 

 

집계합수들은 전부 group by와 같이 엮어서 사용하는 경우가 많습니다.

예를 들면 70점 이상 학생들의 분포를 나타낼 수도 있습니다.

 

 

(※ convert 는 형 변환 입니다.)

위 결과를 보시면 80점대는 2명이고 합계는 168이라는 결과가 나왔습니다.

 

그와 다른 함수를 소개 하겠습니다.

AVG() - 평균을 구하는 합수

MIN() - 최소값을 구하는 함수

MAX() - 최대값을 구하는 함수

STDEV() - 표준 편차를 구하는 함수

 

 

(※ DBMS는 일반 프로그래밍언어와 다르게 형변환이 자동으로 이루어 집니다. 자동이라 편한점도 있지만 불편한 점도 있습니다. 위에 int 형에 / 10을 했는데 실수형으로 자동으로 변한 되어 제가 다시 int 형으로 convert 한 것이 보입니다. 이처럼 프로그래밍 언어와 성질이 약간 약간 다르니 주의하시기 바랍니다.)

 

참고 소스 :  20121007.sql

 


댓글 5개가 달렸습니다.
댓글쓰기
  1. 강주훈
    2013.10.29 18:05 신고 |  수정/삭제  댓글쓰기

    한녕하세요
    SQL 강좌 잘 보고 있습니다. 다름이아니라 제가 작업을 하는도중
    궁금한 사항이 생겨서 이렇게 글을 올립니다.
    혹시 avg 함수를 써서 결과값을 얻은 뒤 그 결과값을 DB에 저장할 수 있는 방법이 있나요?
    다른 table을 만들어서 저장을 해도 상관은 없습니다.
    이글을 보시면 꼭좀 답변 부탁드립니다
    감사합니다

    • 明月 v명월v
      2013.10.30 01:18 신고 |  수정/삭제

      안녕하세요. 블로그 방문 감사드립니다.
      어떤 형태인지는 잘 모르겠으나
      insert into 테이블명1 select avg(컬럼) from 테이블명2 는 어떤지요..
      여기서 테이블명1은 컬럼이 int형 하나가 되어야 겠네요.
      감사합니다.

    • 강주훈
      2013.10.30 10:14 신고 |  수정/삭제

      일단 리플 감사 드립니다

      뎃글처럼 하니깐 참 간단한 방법이였군요

      감사합니다

      앞으로도 종종들려서 많은것을 배워가겠습니다.

    • 明月 v명월v
      2013.11.10 23:56 신고 |  수정/삭제

      도움이 되셨다니 다행입니다.

  2. 11
    2018.01.08 19:51 신고 |  수정/삭제  댓글쓰기

    SQL 강좌 진짜 잘 보고 있습니다. 감사합니다.