[SQL] 03-2 SELECT 문
SQL 기본 문법
SELECT 문
SELECT 문에서는 결과의 정렬응 위한 ORDER BY, 결과의 개수를 제한하는 LIMIT, 중복된 데이터를 제거하는 DISTINCT 등을 사용할 수 있다.
그리고 GROUP BY 절은 지정한 열의 데이터들을 같은 데이턲리는 묶어서 결과를 추출한다.
주로 그룹을 묶는 경우는 합계, 평균, 개수 등을 처리할 때 사용하므로 집계 함수와 함께 사용된다.
GROUP BY 절에서도 HAVING 절을 통해 조건식을 추가할 수 있다.
HAVING 절은 WHERE 절과 비슷해 보이지만, GROUP BY 절과 함께 사용되는 것이 차이점이다.
SELECT 열_이름
FROM 테이블_이름
WHERE 조건식
GROUP BY 열_이름
HAVING 조건식
ORDER BY 열_이름
LIMIT 숫자
ORDER BY 절
ORDER BY 절은 결과의 값이나 개수에 대해서는 영향을 미치지 않지만, 결과가 출력되는 순서를 조절한다.
SELECT mem_id, mem_NAME, debut_date
FROM member
ORDER BY debut_date;
기본값은 ASC인데 Ascending의 약자로 오름차순을 의미하고, DESC는 Descending의 약자로 내림차순을 의미한다.
SELECT mem_id, mem_name, debut_date
FROM member
ORDER BY debut_date DESC;
ORDER BY 절과 WHERE 절은 함께 사용할 수 있고, ORDER BY 절이 WHERE 절 다음에 나와야 한다.
평균 키(height)가 164 이상인 회원들을 키가 큰 순서대로 조회해보겠다.
SELECT mem_id, mem_name, debut_date, height
FROM member
WHERE height >= 164
ORDER BY height DESC
정렬 기준은 1개 열이 아니라 여러 개 열로 지정할 수 있다.
우선 첫 번째 지정 열로 정렬한 후에 동일할 경우에는 다음 지정 열로 정렬할 수 있다.
즉, 평균 키가 큰 순서대로 정렬하되, 키가 같으면 데뷔일자(debut_date)가 빠른 순서로 정렬한다.
SELECT mem_id, mem_name, debut_date, height
FROM member
WHERE height >=164
ORDER BY height DESC, debut_date ASC;
출력의 개수를 제한: LIMIT
LIMIT는 출력하는 개수를 제한한다.
예를 들어, 회원 테이블(member)을 조회하는데 전체 중 앞에서 3건만 조회할 수 있다.
SELECT *
FROM member
LIMIT 3;
데뷔 일자(debut_date)가 빠른 회원 3건만 추출하려면 다음과 같이 ORDER BY와 함께 사용할 수 있다.
SELECT mem_name, debut_date
FROM member
ORDER BY debut_date
LIMIT 3;
LIMIT 형식은 LIMIT 시작, 개수이다.
LIMIT 3만 쓰면 LIMIT 0, 3과 동일하다.
즉, 0번째부터 3건이라는 의미이다.
필요하다면 중간부터 출력도 가능하다.
다음과 같이 평균 키(height)가 큰 순으로 정렬하되, 3번째부터 2건만 조회할 수 있다.
SELECT mem_name, height
FROM member
ORDER BY height DESC
LIMIT 3, 2;
중복된 결과를 제거: DISTINCT
DISTINCT는 조회된 결과에서 중복된 데이터를 1개만 남긴다.
열 이름 앞에 DISTINCT를 써주기만 하면 중복된 데이터를 1개만 남기고 제거한다.
SELECT DIESTINCT addr
FROM member;
GROUP BY 절
GROUP BY 절은 말 그대로 그룹으로 묶어주는 역할 을 한다.
집계 함수는 주로 GROUP BY 절과 함께 쓰이며 데이터를 그룹화(grouping)해주는 기능을 한다.
집계 함수
| 함수명 | 설명 |
|---|---|
| SUM( ) | 합계 |
| AVG( ) | 평균 |
| MIN( ) | 최솟값 |
| MAX( ) | 최댓값 |
| COUNT( ) | 행의 개수 |
| COUNT(DISTINCT) | 행의 개수(중복은 1개만 인정) |
각 회원(mem_id)별로 구매한 개수(amount)를 합쳐서 출력하기 위해서는 집계 함수인 SUM( )과 GROUP BY 절을 사용하면 된다.
즉 GROUP BY로 회원별로 묶어준 후에 SUM( ) 함수로 구매한 개수를 합치면 된다.
SELECT mem_id, SUM(amount)
FROM buy
GROUP BY mem_id;
-> 결과 열의 이름 부분에 함수 이름이 그대로 나온다.
별칭(alias)을 사용해서 다음과 같이 결과를 보기 좋게 만들 수 있다.
SELECT mem_id, SUM(amount) "총 구매 개수"
FROM buy
GROUP BY mem_id;
회원이 구매한 금액의 총합을 출력해보겠다.
구매한 금액은 가격(price) * 수량(amount)이다.
SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액"
FROM buy
GROUP BY mem_id;
전체 회원이 구매한 물품 개수(amount)의 평균을 구해보겠다.
SELECT AVG(amount) "평균 구매 개수"
FROM buy;
각 회원이 한 번 구매 시 평균 몇 개를 구매했는지 알아보겠다.
회원(mem_id)별로 구해야 하므로 GROUP BY 절을 사용하면 된다.
SELECT mem_id, AVG(amount) "평균 구매 개수"
FROM buy
GROUP BY mem_id;
회원 테이블(member)에서 연락처가 있는 회원의 수를 카운트해보겠다.
연락처가 있는 회원만 카운트하려면 국번(phone1) 또는 전화번호(phone2)의 열 이름을 지정해야 한다.
그러면 NULL 값인 항목은 제회하고 카운트하여 결국 연락처가 있는 회원의 인원만 나온다.
SELECT COUNT(phone1) "연락처가 있는 회원"
FROM member;
HAVING 절
집계 함수는 WHERE 절에 나타날 수 없다.
이럴 때 WHERE 대시엔 사용되는 것이 HAVING 절이다.
HAVING은 WHERE와 비슷한 개념으로 조건을 제한하는 것이지만, 집계 함수에 대해서 조건을 제한하는 것이라고 생각하면 된다.
그리고 HAVING 절은 꼭 GROUP BY 절 다음에 나와야 한다.
SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액"
FROM buy
GROUP BY mem_id
HAVING SUM(price*amount) > 1000;
만약 총 구매액이 큰 사용자부터 나타내려면 ORDER BY를 사용하면 된다.
SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액"
FROM buy
GROUP BY mem_id
HAVING SUM(price*amount) > 1000
ORDER BY SUM(price*amount) DESC;