SQL

[혼자 공부하는 SQL] chapter 3. SQL 기본 문법(3-2)

brux 2023. 5. 3. 20:59

https://www.hanbit.co.kr/store/books/look.php?p_code=B6846155853

 

혼자 공부하는 SQL

데이터베이스 개념부터 SQL 문법까지 입문자의 눈높이에 맞춰 구성했습니다. 지루한 설명 대신 도식화된 이미지와 예제를 통한 실습으로 책의 마지막까지 흥미롭게 학습할 수 있습니다. 프로그

www.hanbit.co.kr

위 내용은 <혼자 공부하는 SQL>을 기반으로 공부하여 작성 내용입니다.

3-2 좀 더 깊게 알아보는 SELECT 문

  • ORDER BY : 결과의 정렬
  • LIMIT : 결과의 개수 제한
  • DISTINCT : 중복된 데이터제거
  • GROUP BY : 지정한 열의 데이터들을 같은 데이터끼리 묶어서 결과 추출. 합계, 평균, 개수 등을 처리할 때 사용
  • HAVING : WHERE절과 비슷하지만, GROUP BY 절과 함께 사용해야 함

ORDER BY 절

  • 결과의 값이나 개수에 대해서 영향 X
  • 결과가 출력되는 순서 조절
  • 오름차순 -> ASC(숫자가 작은 것이 먼저), 내림차순 -> DESC(숫자가 큰 것이 먼저) 
  • WHERE 절과 함께 사용가
-- 데뷔 일자(debut_date)가 빠른 순서대로 출력
SELECT mem_id, mem_name, debut_date
	FROM member
    ORDER BY debut_date;

-- 데뷔 일자(debut_date)가 느린 순서대로 출력
SELECT mem_id, mem_name, debut_date
	FROM member
    ORDER BY debut_date DESC;

-- 평균 키가 164 이상이고 내림차순으로 정렬 
SELECT mem_id, mem_name, debut_date, height
	FROM member
    WHERE height >= 164
    ORDER BY height DESC;

-- 평균 키가 164 이상이고 내림차순으로 정렬
-- 평균 키가 같을 경우 데뷔일로 오름차순 정렬
SELECT mem_id, mem_name, debut_date, height
	FROM member
    WHERE height >= 164
    ORDER BY height DESC, debut_date ASC;

LIMIT

  • 출력의 개수를 제한
  • 형식 -> LIMIT 시작, 개수 = LIMIT 개수 OFFSET 시작 -> ex) LIMIT 3 = LIMIT 0, 3
  • 주로 ORDER BY와 함께 사용
-- LIMIT 예시
SELECT *
	FROM member
    LIMIT 3;
    
-- 위와 같이 아무런 기준 없이 앞에서 3건만 뽑는 경우 별로 없음

-- 데뷔일이 빠른 회원 3건 추출
SELECT mem_name, debut_date
	FROM member
    ORDER BY debut_date
    LIMIT 3;

-- 평균 키가 큰 순으로 정렬하되, 3번째부터 2건만 조회
SELECT mem_name, height
	FROM member
    ORDER BY height DESC
    LIMIT 3, 2;

DISTINCT

  • 중복된 결과를 제거
-- member 테이블에서 addr 조회
SELECT addr FROM member;

-- 중복된 것을 눈으로 골라내기 어려움

-- ORDER BY를 사용하여 정렬
SELECT addr FROM member ORDER BY addr;

-- 데이터 건수가 수만 개라면 현실적으로 종류를 세는 것은 어려움

-- DISTINCT를 사용하여 중복된 데이터 1개만 남기고 제거
SELECT DISTINCT addr FROM member;

GROUP BY 절

  • 그룹으로 묶어주는 역할
함수명 설명
SUM() 합계를 구함
AVG() 평균을 구함
MIN() 최소값을 구함
MAX() 최대값을 구함
COUNT() 행의 개수를 셈
COUNT(DISTINCT) 행의 개수를 셈(중복은 1개만 인정)
SELECT mem_id, amount FROM buy ORDER BY mem_id;

-- 각 회원(mem_id)별로 구매한 개수(amount)를 합쳐서 출력
SELECT mem_id, SUM(amount) FROM buy GROUP BY mem_id;

-- 별칭 사용
SELECT mem_id "회원 아이디", SUM(amount) "총 구매 개수"
	FROM buy GROUP BY mem_id;

-- 회원이 구매한 금액의 총합
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;

-- 회원 테이블(member)에서 연락처가 있는 회원의 수 카운트
SELECT COUNT(*) FROM member;

-- 전체 회원 수인 10명 나옴

-- 연락처가 있는 회원만 카운트하려면 국번(phone1) 또는 전화번호(phone2)의 열 이름을 지정해야 함
-- NULL 값인 항목은 제외하고 카운트해야 됨
SELECT COUNT(phone1) "연락처가 있는 회원" FROM member;

Having 절

  • WHERE절 대신에 사용하는 것
  • WHERE와 비슷한 개념으로 조건을 제한하는 것이지만, 집계 함수에 대해서 조건을 제한하는 것
  • 꼭 GROUP BY절 다음에 나와야 함
-- 총 구매액이 1000 이상인 회원 조회
SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액"
	FROM buy 
    WHERE SUM(price*amount) > 1000;
    GROUP BY mem_id;
    
 -- 에러 발생
-- 총 구매액이 1000이상인 회원 조회
SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액"
	FROM buy 
    GROUP BY mem_id
    HAVING SUM(price*amount) > 1000;

-- 총 구매액이 1000이상인 회원 조회 및 내림차순 정렬
-- (구매액이 큰 사용자부터 나타냄)
SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액"
	FROM buy 
    GROUP BY mem_id
    HAVING SUM(price*amount) > 1000;
    ORDER BY SUM(price*amount) DESC;