본문 바로가기
데이터베이스

MySQL 조건절과 그룹함수

by 코낄2 2023. 9. 20.

1. 조건절

MySQL에서 조건절(Condition Clause)은 데이터베이스에서 원하는 데이터를 검색하거나 조작하기 위해 사용되는 중요한 구문입니다. 조건절은 주로 SELECT, UPDATE, DELETE와 같은 쿼리문에서 사용되며, 특정 조건을 만족하는 행을 선택하거나 조작하는 데 도움이 됩니다.

    조건절
    select 필드명1, 필드명2, ... from 테이블명 where 조건절;
select * from member where userid = 'apple';
select * from member where gender ='M';
-- 특정 포인트 유저만 출력하기
select * from member where point >= 200;
select * from member where point between 300 and 500; -- 300이상 500이하
select * from member where point >= 300 and point <= 500;
-- 리스트 안에 있는 name 만 출력
select * from member where name in ('김사과', '반하나', '오렌지');
-- 로그인
select * from member where userid = 'apple' and userpw = '1111';
select * from member where userid like 'a%'; -- a로 시작하는 문자열
select * from member where userid like '%a'; -- a로 끝나는 문자열
select * from member where userid like '%a%'; -- a를 포함하는 문자열
select * from member where userid like 'ap%'; -- ap로 시작하는 문자열

2. 정렬

select 필드명1, 필드명2, ... from 테이블명 [where 조건절] order by 정렬할 필드명 [asc, desc];  -[]는 생략가능
select * from member order by userid asc; -- 아이디로 오름차순
select * from member order by userid; -- 오름차순은 생략가능
select * from member order by userid desc; -- 아이디로 내림차순
-- 포인트순으로 오름차순을 하고, 포인트가 같다면 userid로 내림차순
select * from member order by point asc, userid desc;
-- 남자인 회원 중에서 아이디를 내림차순으로 정렬하여 출력
select * from member where gender = 'M' order by userid desc;

*** Limit (MySQL에만 있는 문법)

    select 필드명1, 필드명2,... from 테이블명 limit 가져올 로우의 갯수
    select 필드명1, 필드명2,... from 테이블명 limit 시작로우(인덱스로 0부터 셈), 가져올 로우의 갯수
    select 필드명1, 필드명2,... from 테이블명 order by 정렬할 필드명 [asc, desc] limit 가져올 로우의 갯수
select * from member;
select * from member limit 3;
select * from member limit 2, 2; -- 인덱스 번호라서 세번째 로우부터 가져옴
select * from member order by point desc limit 3; -- 제일 높은 포인트 3사람 출력

3. 그룹함수(집계함수)

SQL에서 그룹 함수(Group Functions)는 데이터베이스 테이블에서 여러 행을 하나로 그룹화하고, 그룹 내에서 계산을 수행하여 결과를 반환하는 함수입니다. 이러한 그룹 함수는 데이터베이스에서 데이터를 집계하고 요약하는 데 도움을 주며, 데이터 분석과 보고서 작성에 유용합니다.

  • count : 행의 갯수를 세는 함수
select count(*) as 전체인원 from member;
select count(userid) from member; -- primary key를 선택하는 것을 추천
select count(zipcode) from member; -- null을 포함하지 않음
  • sum : 행들의 값을 더함
select sum(point) as 포인트합 from member;
-- select userid, sum(point) as 포인트합 from member; 
-- select 절에 집계함수를 사용할 때 group by 가 없으면 일반 컬럼은 함께 쓰지 못함.
  • avg : 행들의 평균을 구함
select avg(point) as 평균 from member;
select avg(point) as '여성평균' from member where gender = 'F';
  • min : 행의 최소값을 구함
select min(point) as 최소값 from member;
  • max : 행의 최대값을 구함
select max(point) as 최대값 from member;

그룹

    select 그룹을 맺을 컬럼 또는 집계함수 from 테이블명 group by 그룹을 맺을 필드명;
    select 그룹을 맺을 컬럼 또는 집계함수 from 테이블명 group by 그룹을 맺을 필드명 having 조건절;
    (where은 모든 행에 대한 조건을 걸고, having은 그룹에 대한 조건을 건다.)
select * from member;
select gender from member group by gender;
select gender, sum(point) as '합계' from member group by gender;
select gender, count(userid) as '인원수' from member group by gender;
select gender from member group by gender having gender = 'F';
SELECT 고객ID, COUNT(*) AS 주문수 FROM 주문 GROUP BY 고객ID;
SELECT 고객ID, SUM(주문금액) AS 주문총액 FROM 주문 GROUP BY 고객ID;
SELECT 과목, AVG(점수) AS 평균점수 FROM 성적표 GROUP BY 과목;
SELECT 부서, MAX(연봉) AS 최대연봉 FROM 부서정보 GROUP BY 부서;
SELECT 카테고리, MIN(가격) AS 최소가격 FROM 제품정보 GROUP BY 카테고리;
-- 포인트가 0을 초과하는 회원들 중에서 남자, 여자로 그룹을 나눠 포인트의 평균을 구하고
-- 평균 포인트가 150 이상인 성별을 출력
-- (단, 포인트가 많은 성별을 우선으로 출력)
select gender, avg(point) as 포인트_평균 from member where point > 0
group by gender having 포인트_평균 >= 150 order by 포인트_평균 desc;
-- order by는 출력 조건이라 마지막에 붙음