데이터베이스/MySQL

[MySQL] SELECT 문

ReBugs 2023. 3. 10.

이 글은 혼자 공부하는 SQL(저자 : 우재남)의 책과 유튜브 영상을 참고하여 개인적으로 정리하는 글임을 알립니다.


  1. ORDER BY : 결과의 정렬을 위함
  2. LIMIT : 결과의 개수를 제한
  3. DISTINCT : 중복된 데이터를 제거
  4. GROUP BY : 지정한 열의 데이터들을 같은 데이터끼리 묶어서 결과를 추출, 주로 집계 함수와 함께 사용됨, HAVING 절을 통해 조건식을 추가할 수 있음
  5. 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;

댓글