이 글은 혼자 공부하는 SQL(저자 : 우재남)의 책과 유튜브 영상을 참고하여 개인적으로 정리하는 글임을 알립니다.
- ORDER BY : 결과의 정렬을 위함
- LIMIT : 결과의 개수를 제한
- DISTINCT : 중복된 데이터를 제거
- GROUP BY : 지정한 열의 데이터들을 같은 데이터끼리 묶어서 결과를 추출, 주로 집계 함수와 함께 사용됨, HAVING 절을 통해 조건식을 추가할 수 있음
- HAVING : WHERE 절과 비슷해 보이지만, GROUP BY 절과 함께 사용됨
기본적인 SELECT 절의 형식은 아래와 같다.
이 중에서 몇 가지 생략은 가능하지만 순서는 무조건 지켜야 한다.
SELECT ~ FROM ~ ORDER BY ~ LIMIT는 가능하지만
SELECT ~ FROM ~ LIMIT ~ ORDER BY는 불가능하다.
member 테이블
buy 테이블
ORDER BY 절
결과가 출력되는 순서를 조절한다.
member 테이블에서 데뷔일자가 빠른 순서대로 출력하려면 아래처럼 작성한다.
SELECT mem_id, mem_name, debut_date FROM member ORDER BY debut_date;
내림차순으로 정렬하고 싶다면, 뒤에 DESC를 붙여준다. (오름차순은 ASC)
SELECT mem_id, mem_name, debut_date FROM member ORDER BY debut_date DESC;
ORDER BY 절은 WHERE절과 같이 사용할 수 있다.
아래의 코드는 키가 164 이상인 그룹을 내림차순으로 정렬하는 코드이다.
SELECT mem_id, mem_name, debut_date, height
FROM member
WHERE height >= 164
ORDER BY height DESC;
정렬 기준은 1개 열이 아니라 여러 개 열로 지정할 수 있다.
잇지와 트와이스의 키가 167로 동일한데 트와이스가 데뷔일자가 오래되었으니, 트와이스를 잇지보다 위로 정렬하고 싶다면 아래의 코드로 작성하면 된다.
SELECT mem_id, mem_name, debut_date, height
FROM member
WHERE height >= 164
ORDER BY height DESC, debut_date ASC;
정렬 기준이 여러개일 때
첫 번째 정렬 기준으로 정렬 된 후, 두 번째 정렬 기준으로 정렬된다.
위 예제에서 167로 동일한 결과가 있을 때 두 번째 정렬 기준으로 정렬되는 것이다.
LIMIT
LIMIT는 출력하는 개수를 제한한다.
아래의 코드는 member 테이블을 조회하는데 전체 중 앞에서 3건만 조회하는 코드이다.
SELECT * FROM member LIMIT 3;
LIMIT 형식은 LIMIT 시작, 개수이다. 지금과 같이 LIMIT 3만 쓰면 LIMIT 0, 3과 동일하다
즉, 0번째부터 3건이라는 의미이다.
필요하다면 중간부터 출력도 가능하다.
다음과 같이 평균 키가 큰 순으로 정렬하되, 3번째부터 2건만 조회할 수 있다.
SELECT mem_name, height
FROM member
ORDER BY height DESC
LIMIT 3,2;
DISTINCT
조회된 결과에서 중복된 데이터를 1개만 남기는 구문이다.
이렇게 여러 개 중복된 데이터를 한 개로 남기는 코드는 아래와 같다.
SELECT DISTINCT addr FROM member;
GROUP BY 절
GROUP BY 절은 말 그대로 그룹으로 묶어주는 역할을 한다.
위와 같이 그룹별로 합계나 평균 최소값등을 구하고 싶을 때는 집계 함수를 사용한다.
집계 함수
각 mem_id별로 구매한 개수를 합쳐서 출력하기 위해서는 SUM()과 GROUP BY 절을 사용하면 된다.
SELECT mem_id, SUM(amount) FROM buy GROUP BY mem_id;
별칭을 사용하여 결과를 보기 좋게 할 수 있다.
SELECT mem_id "회원 아이디", SUM(amount) "총 구매 개수"
FROM buy GROUP BY mem_id;
별칭
별칭에 작은따옴표를 사용해도 되지만, 작은따옴표는 INSERT 등에서 문자를 입력할 때 사용하므로 별칭에는 큰 따옴표를 사용하는 것이 좋다.
회원이 구매한 금액의 총합을 출력하려면 아래와 같이 코드를 입력하면 된다.
SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액"
FROM buy GROUP BY mem_id;
전체 회원이 구매한 물품 개수의 평균을 구하려면 아래와 같이 작성하면 된다.
SELECT AVG(amount) "평균 구매 개수" FROM buy;
회원이 한 번 구매 시 평균 몇 개를 구매했는지 구하려면 아래와 같이 작성하면 된다.
SELECT mem_id, AVG(amount) "평균 구매 개수"
FROM buy
GROUP BY mem_id;
전체 몇 명의 회원이 있는지 확인하려면 아래와 같이 작성하면 된다.
SELECT COUNT(*) FROM member;
연락처가 있는 회원만 카운트하려면 전화번호의 열 이름을 지정하면 된다. 그러면 NULL 값인 항목은 제외하고 카운트하여 결국 연락처가 있는 회원의 인원만 나온다.
SELECT COUNT(phone2) "연락처가 있는 회원" FROM member;
HAVING 절
SUM()으로 회원별 총구매액을 구하면 아래와 같다.
SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액"
FROM buy
GROUP BY mem_id;
총구매액이 1000 이상인 회원에게만 사은품을 증정한다고 하면 아래와 같이 작성하면 된다.
SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액"
FROM buy
GROUP BY mem_id
HAVING SUM(price*amount) > 1000 ;
WHERE과 HAVING
HAVING은 WHERE와 비슷한 개념으로 조건을 제한하는 것이지만, 집계 함수에 대해서 조건을 제한하는 것이라고 생각하면 된다.
HAVING절은 꼭 GROUP BY 절 다음에 나와야 한다.
만약 총구매액이 큰 사용자부터 나타내려면 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;
'데이터베이스 > MySQL' 카테고리의 다른 글
[MySQL] 데이터 형식, 변수, 형 변환 (1) | 2023.11.26 |
---|---|
[MySQL] 데이터 변경을 위한 SQL문(INSERT, UPDATE, DELETE) (1) | 2023.10.03 |
[MySQL] SELECT ~ FROM ~ WHERE (0) | 2023.03.08 |
[MySQL] 테이블 만들기, 행(데이터) 삽입하기 (0) | 2023.03.06 |
[MySQL] 테이블 보기, 기본적인 추출 (0) | 2023.03.06 |