SQL 첫걸음 - 3

연꽃·2021년 12월 23일
0

컴퓨터 서적

목록 보기
8/14
post-thumbnail

5장 집계와 서브쿼리

🏀 행 개수 구하기 - COUNT

SQL은 데이터베이스라 불리는 '데이터 집합'을 다루는 언어이다. 이 같은 집합의 개수나 합계가 궁금하다면 SQL이 제공하는 집계함수를 사용하여 간단하게 구할 수 있다. 집계합수는 일반적인 함수에서 인수로 하나의 값을 지정하는 것과 달리 집계함수는 인수로 집합을 지정한다.

nonamequantity
1A1
2A2
3B10
4C3
5NULLNULL

COUNT는 말그대로 행의 개수를 세는 함수이다. 위 테이블의 이름을 toys라고 가정하고 행의 개수를 구하기 위해서는 다음과 같은 쿼리문을 작성해 주면 된다.

SELECT COUNT(*) FROM toys;

그렇다면 다음과 같은 결과가 출력될 것이다.

COUNT(*)
5

여기에 WHERE구를 추가하여 조건을 지정해 줄 수 있다. 위 예시에서 name이 A인 행이 몇개인지 구하기 위해서는 다음과 같은 쿼리문으로 가능할 것이다.

SELECT COUNT(*) FROM toys WHERE name = 'A';

🏀 중복 제거하기 - DISTINCT

집합을 다룰 때, 집합 안에 중복된 값을 제거해주고 싶은 경우가 많이 있을 수 있다. 이를 해결하기 위하여 DISTINCT 키워드를 사용할 수 있다.

위의 toys라는 테이블에서 모든 이름의 개수를 구하고 싶다고 가정해보자. 그렇다면 중복되는 이름을 제거해야만이 이름의 정확한 개수를 구할 수 있을 것이다. 왜냐하면 A라는 이름의 행이 두개가 있다고 하더라도 A라는 이름의 개수는 하나이기 때문이다. 이는 다음과 같은 쿼리문을 통해 가능할 것이다. 비교를 위해 모든 이름의 행의 개수를 구하는 것도 함께 알아보겠다.

SELECT COUNT(ALL name),COUNT(DISTINCT name) FROM toys;

위 쿼리문을 작성하면 다음과 같은 결과가 출력될 것이다.

COUNT(ALL name)COUNT(DISTINCT name)
43

행이 5개인데 4가 출력된 이유는 5번째에 NULL 값의 경우에는 COUNT에서 세지 않기 때문이다. 그리고 중복을 제거했을 경우에는 3이라는 값이 잘 출력이 된 것을 알 수 있다.

🏀 그룹화 - GROUP BY

GROUP BY를 활용하면 집합을 그룹으로 나누어 집계함수의 범위를 넓혀줄 수 있다. 그렇다면 toys 테이블을 name으로 그룹화를 하려면 다음과 같은 쿼리문을 작성해주면 된다.

SELECT name FROM toys GROUP BY name;

그렇다면 다음과 같은 결과가 출력될 것이다.

name
A
B
C
NULL

이는 단순히 중복이 제거된 결과처럼 보여서 DISTINCT와 어떤 차이가 있나 생각이 들기도 한다. 결국 A라는 이름의 중복을 제거한 결과가 출력되었기 때문이다.

그렇기기 때문에 GROUP BY는 집계함수와 활용했을 때, 힘을 발휘한다. 각 장난감의 개수의 합계를 구하고 싶다고 가정해보자. 이는 GROUP BY와 SUM의 조합을 통해서 가능하다. 다음과 같은 쿼리문을 보자

SELECT name, COUNT(name), SUM(quauntity) 
FROM TOYS GROUP BY name;

위 쿼리문을 작성하면 다음과 같은 결과가 출력될 것이다.

nameCOUNT(name)COUNT(quantity)
NULL00
A23
B110
C13

GROUP BY name에 의해 name 열 값이 A,B,C,NULL의 4개의 그룹으로 나뉜다. A그룹은 두 개의 행이 있기 때문에 COUNT(name)으로 2개가 집계가 될 것이다. 또한 이 두 개의 행의 quantity를 합했기 때문에 3이라는 결과가 출력된다.

🏀 서브쿼리 활용하기

서브쿼리는 SELECT 명령에 의한 데이터 질의로, 상부가 아닌 하부의 부수적인 질의를 의미한다. 서브쿼리는 명령문 안에 지정하는 하부 SELECT 명령으로 괄호를 묶어 지정한다. 물론 SELECT구 이외에도 WHERE, FROM 등에서 활용될 수 있고 특히 WHERE구에서 주로 사용된다.

다음과 같은 cakes라는 테이블이 있다고 가정해보자

nonamequantity
1초코케익10
2생크림케익5
3요커트케익9

먼저 이 테이블에서 quantity의 최소값을 구하는 쿼리문은 다음과 같다.

SELECT MIN(quantity) FROM cakes;

그리고 우리는 케익의 개수가 가장 작은 행을 삭제하고 싶다고 가정해보자. 이를 위해서는 서브쿼리를 활용해야한다.

DELETE FROM cakses WHERE quantity = (SELECT MIN(quantity) FROM cakes);

이러면 생크림케익의 행이 제거되었을 것이고, 다시 cakes 테이블을 확인한다면 다음과 같은 모습을 가지고 있을 것이다.

nonamequantity
1초코케익10
3요커트케익9

참고 : SQL 첫걸음

profile
우물에서 자라나는 중

0개의 댓글