이 내용은 2011년 6월 현재 SQL2011(코드명 Denali) Beta를 기준으로 작성 되었으며 SQL2011(코드명 Denali) 공식버전(RTM) 발표까지 꾸준히 업데이트 예정입니다.
아울러, 현재 Beta버전이지만 강좌를 따라해 보시는데 아무 문제 없으실거에요. 도움 되시길 바랍니다.
==================================================================================================


안녕하세요이스트럭 강동운입니다.

 

 

이번에는 ORDER BY, GROUP BY 그리고 HAVING 대해서 살펴보도록 하겠습니다.

 

1. ORDER BY

 

ORDER BY  데이터를 정렬해서 출력하기 위해 사용됩니다정렬을 하기 때문에 내림차순과 오름차순으로 정렬할  있습니다.

오름차순과 내림차순을 헷갈려 하시는 분이 있을  같아서 설명 드리도록 하겠습니다.

오름차순은 낮은 값부터 높은 값으로 나열하는 것을 말합니다.

예를 들면 1,2,3,4,5  이런 방식이 오름차순으로 보시면 됩니다.

 

내림차순은 오름차순의 반대라고 보시면 됩니다높은 값부터 낮은 값으로 나열하는 것을 말합니다.

예를 들면 ,,,  이런 방식이 내림차순으로 보시면 됩니다.

 

SQL Server 에서는 기본적으로 오름 차순이 기본 값으로 되어있습니다. ASC 라는 단어로 사용합니다.

내림 차순은 DESC라는 단어를 사용합니다.

 

예1)       MemberAge 오름차순으로 정렬하는 방법

 

 

SELECT * FROM Member ORDER BY MemberAge

SELECT * FROM Member ORDER BY MemberAge ASC

 

 

기본 값이기 때문에 명시하지 않아도 오름차순으로 정렬 하도록 되어있습니다.

 

예2)       MemberName으로 내림차순으로 정렬하는 방법

 

 

SELECT * FROM Member ORDER BY MemberName DESC

 

 

 

이제 예제를 통해 살펴보도록 하겠습니다.

예제를 사용하기 위해 데이터를 넣도록 하겠습니다.

 

 

USE tempdb

GO

IF OBJECT_ID('test','U') IS NOT NULL

                  DROP TABLE test

GO

 

CREATE TABLE test(number INT NOT NULL, name VARCHAR(10))

GO

 

INSERT INTO test(number, name) VALUES(1, '')

INSERT INTO test(number, name) VALUES(1, '')

INSERT INTO test(number, name) VALUES(1, '')

INSERT INTO test(number, name) VALUES(2, '')

INSERT INTO test(number, name) VALUES(2, '')

INSERT INTO test(number, name) VALUES(2, '')

INSERT INTO test(number, name) VALUES(3, '')

INSERT INTO test(number, name) VALUES(4, '')

INSERT INTO test(number, name) VALUES(5, '')

INSERT INTO test(number, name) VALUES(6, '')

 

 

 

간단한 예제로 한번 살펴보도록 하겠습니다.

 

1) number 내림 차순 하는 방법

 

 

SELECT * FROM test ORDER BY number DESC

 1.png

 

 

 

ORDER BY  두개 이상의 컬럼도 가능합니다.

 

2) number 내림차순, name 내림차순

      Number 같은 값이면 name 내림 차순이   입니다.

 

SELECT * FROM test ORDER BY number DESC, name DESC

 2.png

 

 

(참고문자열을 조회하기 위해서는 '문자형태로 묶어야 합니다.)

 

 

조금  응용해보도록 하겠습니다.

 

3) number 오름 차순으로 하되, 1 값을 가장 아래로 보내려면? Case 문을 활용하면 가능합니다!

 

 

SELECT * FROM test

ORDER BY (CASE number WHEN 1 THEN 99 ELSE number END) DESC

 3.png

 

 

 

 

 

2. GROUP BY 그리고 HAVING…

 

  GROUP BY 데이터를 그룹화 시킬  주로 사용합니다저도 SQL 처음 다뤘을  GROUP BY 부분이 엄청 헷갈려 고생한적이 있습니다 말고도 분명 그런 분들이 있을  같습니다 ^^.. 많은 예제로 쉽게 이해할  있도록 설명드리겠습니다.

  HAVING .. GROUP BY 그룹화에 대한 WHERE 절이라고 보시면 됩니다.

 

말이 너무 어렵죠예제를 바로 보면서 설명 드리겠습니다.

 

1)  number 있는  수를 가져오는 방법

 

 

 

SELECT

  Number

, COUNT(*) AS TotalCount

FROM test

GROUP BY number

 

 4.png

중복되지 않게 NUMBER 그룹화가 되었고, TotalCount  수를 출력할  있었습니다.

 

 

COUNT 함수에 대해서 따로 설명을 드리진 않았지만행의  갯수를 가져옵니다.

 COUNT(Transact-SQL): http://msdn.microsoft.com/ko-kr/library/ms175997(v=SQL.100).aspx

 

 

name으로도 그룹화를 시켜보도록 하겠습니다.

 

 

SELECT

  name

, COUNT(*) AS TotalCount

FROM test

GROUP BY name

 

 5.png

 

 

 

Number name 그룹으로 묶는 다면??..

 

 

 

SELECT

  number

, name

, COUNT(*) AS TotalCount

FROM test

GROUP BY number, name

 

 

 6.png

 

중복된 number, name 조합은 없기 때문에 모든 열이 출력됩니다.

 

 

 

이제 HAVING  이용해서 조건을 주도록 해봅시다!

) number 그룹화를 시킨 상태에서 number 2~4 데이터를 출력하고자 한다면?

 

SELECT

  number

, COUNT(*) AS TotalCount

FROM test

GROUP BY number

HAVING number BETWEEN 2 AND 4

 

 

 7.png

 

 

 

HAVING 반드시 GROUP BY 명시된 열에 대해서만 조건을   있습니다물론 당연한 이야기 입니다.

 

이제 GROUP BY, HAVING 그리고 WHERE 까지 결합해 볼까요?

 

그룹으로 묶인 number row count 출력하되, number 2~4이며, name '바' 것만 출력하시오.

 

 

SELECT

  number

, COUNT(*) AS TotalCount

FROM test

WHERE name =''

GROUP BY number

HAVING number BETWEEN 2 AND 4


 

 

 

아래 같은 쿼리는 어떨까요?

 

SELECT

number

,  name

, COUNT(*) AS TotalCount

FROM test

WHERE name =''

GROUP BY number

HAVING number BETWEEN 2 AND 4


에러!!

 

 

Name 추가되었습니다이는 에러 입니다. Name group by 지정이 되어있지 않았기 때문에 에러가 나게 되어있습니다~!

 

마지막으로 GROUP BY.. 대부분의 경우 정렬 순서를 보장하지 않습니다.

 

따라서 그룹으로 묶인 열에 대해서 정렬이 필요하다면반드시 ORDER BY  명시해주는 것이 좋습니다.

만약 ORDER BY 명시한 컬럼이 GROUP BY 없다면  또한 에러가 되겠죠? ^^;

 

 

SELECT

                  number

FROM test

GROUP BY number

ORDER BY number, name desc

 

에러!!

 

 

지금까지 ORDER BY, GROUP BY 그리고 HAVING  대해서 간단한 예제로 살펴보았습니다.

 

ORDER BY(Transact-SQL): http://msdn.microsoft.com/ko-kr/library/ms188385.aspx

GROUP BY(Transact-SQL): http://msdn.microsoft.com/ko-kr/library/ms177673.aspx

 

감사합니다.


[출처] SQLER.COM http://www.sqler.com/390143


SQL2011(코드명 Denali) 시리즈 강좌 리스트
[SQL2011강좌] 1. 코드명 Denali 설치 방법
[SQL2011강좌] 2. SSMS 접속 및 간단한 쿼리 실행
[SQL2011강좌] 3. SQL Server 의 MDF, LDF 그리고 데이터베이스 생성하기
[SQL2011강좌] 4. DDL 1탄: 테이블 생성
[SQL2011강좌] 5. DDL 2탄: 쿼리를 이용한 테이블 컬럼 추가 및 삭제
[SQL2011강좌] 6. Primary key와 Unique 제약조건
[SQL2011강좌] 7. DML 1탄 INSERT
[SQL2011강좌] 8. DML 1탄 INSERT(identity 속성)
[SQL2011강좌] 9. Sequence
[SQL2011강좌] 10. pubs, northwind Database 예제 설치
[SQL2011강좌] 11. SELECT(단일 테이블)
[SQL2011강좌] 12. SELECT(JOIN)
[SQL2011강좌] 13. UPDATE, DELETE 절
[SQL2011강좌] 14. DISTINCT, UNION, UNION ALL 키워드
[SQL2011강좌] 15. ORDER BY, GROUP BY, HAVING
[SQL2011강좌] 16. SubQuery(서브쿼리)
[SQL2011강좌] 17. 뷰에 대한 이해 및 생성, 수정, 삭제
[SQL2011강좌] 18. 저장 프로시저에 대한 이해, 생성, 수정, 삭제
[SQL2011강좌] 19. 인덱스에 대한 이해
[SQL2011강좌] 20. 클러스터드 인덱스와 넌 클러스터드 인덱스
[SQL2011강좌] 21. 트랜잭션에 대한이해
[SQL2011강좌] 22. 트랜잭션의 격리수준 4가지
[SQL2011강좌] 23. 잠금에 대한 이해
[SQL2011강좌] 24. 백업과 복구에 대한 이해(풀백업, 차등백업, 트랜잭션 로그 백업)
[SQL2011강좌] 25. 백업과 복구 전략
[SQL2011강좌] 26. 커서란?



SQL2011(코드명 Denali) 시리즈 동영상 강좌 리스트
[SQL2011 동영상 강좌] 1. 코드명 Denali 설치 방법
[SQL2011 동영상 강좌] 2. SSMS 접속 및 간단한 쿼리 실행
[SQL2011 동영상 강좌] 3. SQL Server 의 MDF, LDF 그리고 데이터베이스 생성하기
[SQL2011 동영상 강좌] 4. DDL 1탄: 테이블 생성
[SQL2011 동영상 강좌] 5. DDL 2탄: 쿼리를 이용한 테이블 컬럼 추가 및 삭제
[SQL2011 동영상 강좌] 6. Primary key와 Unique 제약조건
[SQL2011 동영상 강좌] 7. DML 1탄 INSERT
[SQL2011 동영상 강좌] 8. DML 1탄 INSERT(identity 속성)
[SQL2011 동영상 강좌] 9. Sequence
[SQL2011 동영상 강좌] 10. pubs, northwind Database 예제 설치
[SQL2011 동영상 강좌] 11. SELECT(단일 테이블)
[SQL2011 동영상 강좌] 12. SELECT(JOIN)
[SQL2011 동영상 강좌] 13. UPDATE, DELETE 절
[SQL2011 동영상 강좌] 14. DISTINCT, UNION, UNION ALL 키워드
[SQL2011 동영상 강좌] 15. ORDER BY, GROUP BY, HAVING
[SQL2011 동영상 강좌] 16. SubQuery(서브쿼리)
[SQL2011 동영상 강좌] 17. 뷰에 대한 이해 및 생성, 수정, 삭제
[SQL2011 동영상 강좌] 18. 저장 프로시저에 대한 이해, 생성, 수정, 삭제
[SQL2011 동영상 강좌] 19. 인덱스에 대한 이해
[SQL2011 동영상 강좌] 20. 클러스터드 인덱스와 넌 클러스터드 인덱스
[SQL2011 동영상 강좌] 21. 트랜잭션에 대한이해
[SQL2011 동영상 강좌] 22. 트랜잭션의 격리수준 4가지
[SQL2011 동영상 강좌] 23. 잠금에 대한 이해
[SQL2011 동영상 강좌] 24. 백업과 복구에 대한 이해(풀백업, 차등백업, 트랜잭션 로그 백업)
[SQL2011 동영상 강좌] 25. 백업과 복구 전략
[SQL2011 동영상 강좌] 26. 커서란?