데이터베이스/MySQL

[MySQL] 정렬, Limit, group함수

caramel-bottle 2023. 9. 19.

select 정렬

/*
	정렬
    select 필드명1, 필드명2, ... from 테이블명 [where 조건절] order by 정렬할 필드명 [asc, desc];
    where 조건절의 위치가 중요함. order by 앞에 있어야함.
    
*/

 

오름차순

select * from MK_member order by userid asc; -- 아이디로 오름차순
select * from MK_member order by userid; -- 오름차순

 

userid를 알파벳 순으로 오름차순 정렬

 


내림차순

select * from MK_member order by userid desc;

 

userid를 알파벳 순으로 내림차순 정렬


두 가지 정렬

select * from MK_member order by point asc, userid desc;

 

point를 기준으로 오름차순, userid를 기준으로 내림차순. 먼저 나온 순서대로 정렬을 하고 만약! 두 개 이상 같은 값이 있다면 ( 이 경우 point ) 같은 값 끼리 그 다음 정렬 기준으로 정렬한다.


응용

-- 남자인 회원중에서 아이디를 내림차순을 정렬하여 출력
select * from MK_member where gender='남' order by userid desc;

select, limit

/*
	limit
	select 필드명1, 필드명2, .. from 테이블명 limit 가져올 로우의 개수 
	select 필드명1, 필드명2, .. from 테이블명 limit 시작로우(인덱스), 가져올 로우의 개수
    
	select 필드명1, 필드명2, .. from 테이블명 order by 정렬할 필드명 [ase, desc] limit 가져올 로우의 개수
*/

 

limit의 사용

select * from MK_member;
select * from MK_member limit 3;
select * from MK_member limit 2, 2; -- 시작로우가 인덱스임 
select * from MK_member order by point desc limit 3;

 

limit 3
limit 2, 2

집계(그룹) 함수

count(): 행의 개수를 세는 함수

select * from MK_member;
select count(*) from MK_member;
select count(*) as 전체인원 from MK_member;
select count(userid) from MK_member; -- primary key를 선택하는 것을 추천
select count(zipcode) from MK_member; -- null은 포함하지 않음

 

별명을 정해주지 않으면 위와 같이 함수가 적힌다.

null값은 행의 개수에 포함되지 않는다.


sum(): 행의 값을 더함

select sum(point) as 포인트합 from MK_member;

-- select userid, sum(point) as 포인트합 from MK_member; -- Error Code: 1140. In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'kdt.member.userid'; this is incompatible with sql_mode=only_full_group_by
-- select 절에 일반 컬럼은 못나온다.

각 행의 point값을 더한다.

sum() 함수는 숫자형 값만 더한다.

 

각 행별 userid를 포함하겠다는 의미로 추가하였지만 각 행의 userid는 행의 개수만큼 존재하고 sum(point)는 각 행의 point 값의 합이기 때문에 애초에 성립하지 않는다.


avg(): 행의 평균을 구함

select avg(point) as 포인트평균 from MK_member;
select avg(point) as '여성 평균' from MK_member where gender='여';

각 행의 point값의 평균을 구한다. 조건절을 통해 성별이 '여'인 항목들만 평균을 구할 수도 있다.

 


min(): 행의 최소값을 구함

select min(point) as 최소값 from MK_member;
select min(point) as 최소값 from MK_member where gender='남';

마찬가지로 각 행의 point의 최소값을 구한다.

 


max(): 행의 최대값을 구함

select max(point) as 최대값 from MK_member;

그룹

/*
	그룹
	select 그룹을 맺을 컬럼 또는 집계함수 from 테이블명 group by 그룹을 맺을 필드명;
	
	where -> having 
	그룹에 대한 조건
    
	select 그룹을 맺을 컬럼 또는 집계함수 from 테이블명 group by 그룹을 맺을 필드명 having 조건절;
*/

그룹을 맺을 때는 where 조건절 대신 having 조건절을 사용한다.

 

select gender from MK_member group by gender;

 

select gender, sum(point) as '합계' from MK_member group by gender;

select gender, count(userid) as '인원수' from MK_member group by gender;

select sum(point) as '합계', gender as '성별' from MK_member group by gender;


having

select gender from MK_member group by gender having gender='여';

조건 having은 맨 뒤에 작성한다.


응용

-- 포인트가 0을 초과하는 회원들 중에서 남자, 여자로 그룹을 나눠 포인트의 평균을 구하고
-- 평균 포인트가 150이상인 성별에 대해 출력
-- 단, 포인트가 많은 성별을 우선으로 출력

select gender as '성별', avg(point) as 'avg' from MK_member where point > 0 group by gender having avg >= 150 order by avg desc;

 

 

 

 

댓글