이 내용은 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
|
ORDER
BY 는 두개 이상의 컬럼도 가능합니다.
예2) number로 내림차순,
name 내림차순
Number가 같은 값이면 name은 내림 차순이 될 것 입니다.
SELECT * FROM test ORDER BY number DESC, name DESC
|
(참고: 문자열을 조회하기 위해서는 '문자' 형태로 묶어야 합니다.)
조금 더 응용해보도록 하겠습니다.
예3) number로 오름 차순으로 하되,
1인 값을 가장 아래로 보내려면?
Case 문을 활용하면 가능합니다!
SELECT * FROM test ORDER BY (CASE number WHEN 1 THEN 99 ELSE number END) DESC
|
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
중복되지 않게 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
|
Number와 name을 그룹으로 묶는 다면??..
SELECT number , name , COUNT(*) AS TotalCount FROM test GROUP BY number, name
중복된 number, name 조합은 없기 때문에 모든 열이 출력됩니다. |
이제 HAVING 을 이용해서 조건을 주도록 해봅시다!
예) number로 그룹화를 시킨 상태에서 number가 2~4인 데이터를 출력하고자 한다면?
SELECT number , COUNT(*) AS TotalCount FROM test GROUP BY number HAVING number BETWEEN 2 AND 4
|
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. 커서란?
'프로그램&DB > MS-SQL' 카테고리의 다른 글
[MS-SQL2011강좌] 17. 뷰에 대한 이해 및 생성, 수정, 삭제 by 강동운님 (0) | 2011.08.23 |
---|---|
[MS-SQL2011강좌] 16. SubQuery(서브쿼리) by 강동운님 (0) | 2011.08.23 |
[MS-SQL2011강좌] 14. DISTINCT, UNION, UNION ALL 키워드 by 강동운님 (0) | 2011.08.23 |
[MS-SQL2011강좌] 13. UPDATE, DELETE 절 by 강동운님 (0) | 2011.08.23 |
[MS-SQL2011강좌] 12. SELECT(JOIN) by 강동운님 (0) | 2011.08.23 |