[2주 동안 SQL 공부하기] 약간 심화 과정의 SELECT 문
새로운 학습 내용
SQL문 - 약간 심화 Select문
| Order By | Limit | Distinct | Group By | Having |
Order By
결과를 정렬하는데 사용되며 기본값은 오름차순(ASC)이다.
Where 절을 통해 조건식을 추가할 수 있다.
Select mem_name
From member
Order By mem_name;
Select mem_name
From member
Order By mem_name desc;
위는 오름차순(ㄱ~ㅎ), 아래는 내림차순(ㅎ~ㄱ)
SELECT mem_id, mem_name, debut_date,height
From member
Where height >= 164
Order By height DESC;
-- Where절이 Order By절 보다 먼저 나와야 한다.(중요)
이렇게 Where 조건식과 Order By 정렬식을 추가해서 출력할 수 있다.
근데 여기서 키(height)를 기준으로 내림차순을 적용했을 때
지금처럼 동일한 height 값을 가진 '잇지'와 '트와이스' 중
'트와이스'를 먼저 출력하고 싶다면 데뷔날짜(DEBUT_DATE)를
정렬식에 추가로 입력해 주면 된다.
SELECT mem_id, mem_name, debut_date,height
From member
Where height >= 164
Order By height DESC, debut_date ASC;
정렬식에는 여러 행을 추가로 입력할 수 있다.
테이블 복사
Create table… (select…)
전체 복사 혹은 특정 row 열을 복사할 수 있다.
하지만 PK나 FK 같은 제약 조건은 복사되지 않습니다.
Create Table 새로운 테이블 이름 (Select 복사할 열 From 기존 테이블) → 특정 열 복사
Create Table 새로운 테이블 이름 (Select *) → 전체 복사
Limit
결과 값의 개수를 제한하는 용도이다. (첫번째 값 = 0번째)
주로 Order By와 함께 사용한다.
Select mem_name, height
From member
Order By debut_date
Limit 3;
-- 0번째부터 3개 출력
Limit 3, 2;
-- 3번째부터 2개 출력
Select mem_id
From member
Limit 2 Offset 5;
-- "Offset"은 결과 집합에서 건너뛸 항목의 수를 나타냅니다.
-- 이 값은 음수가 될 수 없으며, 처음으로 반환할 항목의 초기 위치 값을 나타낸다.
*OFFSET 5:
- 건너뛴 항목 수 5 개
- 0번째부터 4번째까지 초 5개 항목을 건너뛰고 5번째 항목부터 출력
Distinct
중복된 데이터를 제거하는 용도이다. 단어 뜻 그대로 구별한다는 의미로 해석하면 될 듯.
열 이름 앞에 (Select과 열 이름 사이) 추가 입력하면 됩니다.
Select distinct addr
From member;
Group By
지정한 열의 데이터들을 같은 데이터끼리 묶어서 출력한다.
(아래 Having 절을 통해 조건식을 추가할 수 있다.)
※집계함수(Aggregate Function)와 함께 사용한다.
• 효율적인 데이터 그룹화(Grouping)
에이핑크(같은 데이터)가 구매한 물건의 총개수를 구해보자.
그럼 우선 buy 테이블에 있는 mem_id(+서브쿼리)와 amount를 출력합니다.
Select mem_id, amount
From buy
Where mem_id = (Select mem_id From member Where mem_name = '에이핑크');
그럼 이어서 집계함수를 사용해 보겠습니다. (Group By + 집계함수)
함수명 | 설명 |
SUM() | 합계를 구한다. |
AVG() | 평균 값을 구한다. |
MIN() | 최소값을 구한다. |
MAX() | 최대값을 구한다. |
COUNT() | 행의 개수를 출력한다. |
COUNT(DISTINCT) | (중복되지 않는) 행의 개수를 출력한다. |
STDEV() | 표준편차를 구한다. |
VAR_SAMP() | 분산을 구한다. |
Select mem_id, SUM(amount)
From buy
Where mem_id = 'APN'
Group By mem_id;
-- 역시나 Where이 Group By보다 먼저 나와야 한다.
이렇게 출력 값을 구하면 'APN'과 '5'만 나타납니다.
근데 여기서 보기 편하게 별칭(alias)으로 바꿔줍니다.(저는 개인적으로 엄청 중요할 것 같아요)
Select mem_id "회원 아이디", SUM(amount) "총 구매 수량"
From buy
Where mem_id = 'APN'
Group By mem_id;
기타 집계함수
Select mem_id "회원 아이디", SUM(amount*price) "총 구매 금액"
From buy
Where mem_id = 'APN'
Group By mem_id;
Select mem_id "회원 아이디", AVG(amount) "평균 구매 개수"
From buy
Group By mem_id;
-- 한 번 구매 시 평균 몇 개를 구매했는가를 출력한 것이다.
Select Count(*)
From member;
-- (*)을 사용하면 모든 행의 개수를 출력한다.
Select Count(Phone1)
From member;
-- (열 이름)을 사용하면 NULL 값을 제외한 행의 개수를 출력한다.
Havnig 절
Where 절과 비슷해 보이지만, Group By와 함께 사용되는 것이 차이점이다.
Having의 용도도 조건식을 만들기 위함이라는 얘기인가... 궁금하네요 :)
앞서 살펴봤던 SUM()으로 회원(mem_id) 별 총구매액을 출력합니다.
Select mem_id "회원 아이디", SUM(amount*price) "총 구매 금액"
From buy
Group By mem_id;
이때 총 구매 금액이 1000 이상인 회원에게 사은품을 제공하려고 합니다.
하지만 지금은 집계함수 SUM을 사용한 상태이기 때문에 조건식을 사용하기 위해서는 Where이 아닌 Having을 사용해야 합니다.(Where로는 출력 불가) 그리고 Having 절은 반드시 Group By 절 다음에 나와야 합니다!
Select mem_id "회원 아이디", SUM(amount*price) "총 구매 금액"
From buy
Group By mem_id
Having sum(amount*price) > 1000;
With Rollup
총합 또는 중간합계가 필요한 경우에 사용한다.
Group By 절과 함께 With Rollup문을 사용하면 부분 합계와 총합계를 같이 나타낼 수 있다.
Select mem_id "회원 아이디", SUM(amount) "총 구매 개수"
From buy
Group By mem_id
WITH ROLLUP;
-- 역시나 무조건 Group By 뒤에 입력해야 한다.