[데이터베이스] 관계형 데이터베이스 - 관련 명령어

윤후·2022년 3월 6일
0

Section 3

목록 보기
21/41

SQL 관련 명령어


JOIN

서로 관련이 있는 둘 이상의 테이블을 서로 공통된 부분을 기준으로 연결한다.

SELECT *
FROM 테이블_1
JOIN 테이블_2 ON 테이블_1.특성_A = 테이블_2.특성_B

해석 : FROM뒤에 오는 테이블_1을 JOIN한다 테이블_2와. JOIN하는 조건은 ON 뒤에 있는 공통된 테이블인 테이블_1.특성_A = 테이블_2.특성_B을 기준으로 한다.

GROUP BY

SQL을 통해 데이터를 그룹화할 수 있다. GROUP BY는 주로 집계함수와 같이 사용되곤한다. 집계 함수는 여러 행의 값을 더하거나 평균값을 내거나, 개수를 세는 등 여러개의 데이터에 대한 계산을 한다.

  1. COUNT() : 행의 개수를 세어줌
  2. AVG() : 행 안에 있는 평균값을 내어줌
  3. MIN() : 행 안에 있는 값의 최솟값을 반환해줌
  4. MAX() : 행 안에 있는 값의 최댓값을 반환해줌
  5. SUM() : 행 안에 있는 값의 합을 내어줌

GROUP BY는 같은 값을 가진 행끼리 하나의 그룹으로 뭉쳐준다. 예시를 보면 좀 더 이해하기가 쉽다. 내가 서점을 운영하는 매니저라고 하자. 서점에 몇가지의 장르의 책을 가지고 있는데 각 장르마다 몇개의 책을 보유하고 있는지 알고 싶다. 데이터베이스에는 1개의 테이블로 구성이 되어있는데, 해당 테이블은 책 이름과 장르 그리고 재고의 숫자를 저장하고 있다.

위의 그림은 GROUP BY가 데이터를 그룹핑하는 것을 시각적으로 보여준다. 각 장르마다 책 재고 개수를 알고 싶은 것이기 때문에 GROUP BY가 장르를 기준으로 나누고 그룹에 해당하는 값을 계산한다.

예시

  • 첫 번째 : GROUP BY + 1개의 열

visit테이블을 이용해 날짜별로 얼마나 많은 사람들이 방문했는지 살펴보고 싶다. 즉 우리가 구해야 할 것은 날짜와 그 날짜에 해당하는 방문객의 숫자인 것이다. 코드는 아래와 같이 쓸 수 있겠다.

SELECT
 date,
 COUNT(*)
FROM visit
GROUP BY date;

위의 코드에서는 2개의 데이터 열 만 추출하려고 하는 것이다. COUNT(*)는 모든 행의 갯수를 센다는 것이다. 날짜를 기준으로 해당 날짜에 방문한 고객의 총 인원수를 확인하고 싶은 것이기 때문에 GROUP BY뒤에 date를 넣었다. 이를 실행하면 아래와 같은 결과를 알 수 있다.

  • 두 번째 : GROUP BY + 여러개의 열

이번에 알고 싶은 건 월별 티켓의 평균 금액이다. 이를 구하려면 아까보다는 조금 복잡한 방법으로 쿼리를 작성해야 한다.

SELECT
 EXTRACT(year FROM date) AS year,
 EXTRACT(month FROM date) AS month,
 ROUND(AVG(price), 2) AS avg_price
FROM visit
GROUP BY 
 EXTRACT(year FROM date),
 EXTRACT(month FROM date);

날짜 데이터로부터 연도와 월만 추출하고자 EXTRACT함수를 하용하였다. SELECT를 보면 총 3개의 열을 가져오게 된다. 그중 2개는 EXTRACT로 가져오는 연, 월이고 마지막열은 평균값을 구하는 함수가 적혀 있다. ROUND함수를 이용해 소수점 둘째 자리까지 반올림을 해주는 것이다.

쿼리를 실행하면 위와 같은 결과를 얻게 된다. 참고로 GROUP BY 뒤에 열 이름을 직접 다 적는 대신 열의 위치로 대신하여 적을 수도 있다. SELECT문에 EXTRACT함수를 사용할 열이 있기 때문에 GROUP BY에 이를 다시 적을 때고 상당히 내용이 길어지게 된다. 이럴 땐 아래와 같은 쿼리문을 작성해줘도 위와 같은 쿼리문을 얻을 수 있다.

SELECT
 EXTRACT(year FROM date) AS year,
 EXTRACT(month FROM date) AS month,
 ROUND(AVG(price), 2) AS avg_price
FROM visit
GROUP BY 1, 2;

SELECT 문에 있는 모든 열을 집계함수가 되거나 GROUP BY정에 나타나야 한다. 위의 예제로 살펴보자면, SELECT문 중에서 EXTACT함수를 활용한 2개의 열은 GROUP BY절에 사용이 되었고 마지막열은 집계함수를 사용했다. GROUP BY절을 사용하는데 만약 SELECT문에 집계함수를 사용하지 않거나 GROUP BY절에 언급되지 않는 열이 존재한다면 오류가 발생한다.

  • 세 번째 : GROUP BY와 ORDER BY와 같이 사용

이번에는 월별 평균 머무른 시간을 알아보자. 그리고 각 행의 시간 순서대로 정렬이 되어있으면 한다.

SELECT
 EXTRACT(year FROM date) AS year,
 EXTRACT(month FROM date) AS month,
 ROUND(AVG(duration), 2) AS avg_duration
FROM visit
GROUP BY 1, 2
ORDER BY 1, 2;

ORDER BY는 내가 보고싶은 행의 순서를 정해주는 역할을 한다. 위 쿼리문을 보면 첫 번째 열인 연도를 첫 번째 정렬기준으로 삼았고, 그 다음 정렬 기준으로 월로 하였다.

참조
GROUP BY 개념과 실제 사용방법
GROUP BY 기본 및 예제

profile
궁금한걸 찾아보고 공부해 정리해두는 블로그입니다.

0개의 댓글

관련 채용 정보