Lsiron

집계함수와 제어키워드 본문

데이터베이스/MySQL

집계함수와 제어키워드

Lsiron 2024. 7. 10. 09:57

함수의 종류는 크게 3가지로 나뉜다.

1. 행 함수 : 데이터 값을 계산하거나 조작하는 것.

2. 그룹 함수 : 행의 그룹을 계산하거나 요약하는 것.

3. 열의 데이터타입을 변환

 

SQL에서 데이터를 다루는 다양한 함수와 키워드를 통틀어 "집계 함수"와 "제어 키워드"라고 부를 수 있다.

집계 함수 (Aggregate Functions)

집계 함수는 여러 행의 데이터를 하나의 값으로 요약하는 데 사용된다. 주요 집계 함수로는 다음과 같은 것들이 있다.

 

1.  COUNT() : 행의 개수를 셀 때 사용한다. 즉, 검색한 결과의 데이터의 개수를 가져오는 내장함수 이다. 

( NULL 인 데이터는 제외한다. )

사용 상황: 특정 조건을 만족하는 행의 수를 알고 싶을 때.

-- 예시: 전체 학생 수를 구할 때
SELECT COUNT(*) FROM students;

-- 예시: 성적이 'A'인 학생 수를 구할 때
SELECT COUNT(*) FROM students WHERE grade = 'A';

 

 

2. SUM() : 숫자 열의 합계를 계산할 때 사용한다.

사용 상황: 특정 열의 총합을 알고 싶을 때.

-- 예시: 전체 급여 합계를 구할 때
SELECT SUM(salary) FROM employees;

-- 예시: 특정 부서의 급여 합계를 구할 때
SELECT SUM(salary) FROM employees WHERE department = 'Sales';

 

3. AVG() : 숫자 열의 평균값을 계산할 때 사용한다.

사용 상황: 특정 열의 평균을 알고 싶을 때.

-- 예시: 전체 급여 평균을 구할 때
SELECT AVG(salary) FROM employees;

-- 예시: 특정 부서의 급여 평균을 구할 때
SELECT AVG(salary) FROM employees WHERE department = 'Sales';

 

4. MAX() : 숫자 열의 최대값을 찾을 때 사용한다.

사용 상황: 특정 열의 최대값을 알고 싶을 때.

-- 예시: 최고 급여를 받는 직원의 급여를 구할 때
SELECT MAX(salary) FROM employees;

-- 예시: 특정 부서에서 최고 급여를 받는 직원의 급여를 구할 때
SELECT MAX(salary) FROM employees WHERE department = 'Sales';

 

5. MIN() : 숫자 열의 최소값을 찾을 때 사용한다.

사용 상황: 특정 열의 최소값을 알고 싶을 때.

-- 예시: 최저 급여를 받는 직원의 급여를 구할 때
SELECT MIN(salary) FROM employees;

-- 예시: 특정 부서에서 최저 급여를 받는 직원의 급여를 구할 때
SELECT MIN(salary) FROM employees WHERE department = 'Sales';

 

제어 키워드 (Control Keywords)

제어 키워드는 쿼리의 결과를 제한하거나 정렬하는 등의 작업을 수행하는 데 사용된다. 주요 제어 키워드로는 다음과 같은 것들이 있다.

 

1. LIMIT : 결과 행 수를 제한할 때 사용한다. 즉, 테이블에서 출력하고자 하는 데이터의 개수를 제한하는 명령어 이다.

사용 상황: 큰 데이터셋에서 상위 N개의 행만 조회할 때.

-- 예시: 처음 두 명의 직원 정보를 가져올 때
SELECT * FROM employees LIMIT 2;

-- 예시: 두 번째 데이터부터 다섯 명의 직원 정보를 가져올 때 (첫 번째 컬럼의 시작은 0 이기 때문에 1은 두 번째이다.)
SELECT * FROM employees LIMIT 1, 5;

 

2. OFFSET : 결과의 시작 위치를 지정할 때 사용한다.

사용 상황: 특정 위치부터 데이터를 조회할 때 LIMIT와 함께 사용한다.

-- 예시: 두 번째 위치부터 두 명의 직원 정보를 가져올 때
SELECT * FROM employees LIMIT 2 OFFSET 1;

 

3. ORDER BY : 결과를 정렬할 때 사용한다.

사용 상황: 특정 열을 기준으로 정렬할 때.

-- 예시: 직원 정보를 급여 기준으로 오름차순 정렬할 때
SELECT * FROM employees ORDER BY salary ASC;

-- 예시: 직원 정보를 급여 기준으로 내림차순 정렬할 때
SELECT * FROM employees ORDER BY salary DESC;

 

4. GROUP BY : 결과를 그룹화할 때 사용한다.

사용 상황: 그룹별로 집계 함수를 적용할 때.

-- 예시: 부서별 급여 합계를 구할 때
SELECT department, SUM(salary) FROM employees GROUP BY department;

-- 예시: 부서별 직원 수를 구할 때
SELECT department, COUNT(*) FROM employees GROUP BY department;

 

5. HAVING : 그룹화된 결과에 조건을 적용할 때 사용한다.

사용 상황: 그룹화된 결과에 조건을 추가할 때 GROUP BY와 함께 사용.

-- 예시: 직원 수가 5명 이상인 부서의 부서명과 직원 수를 구할 때
SELECT department, COUNT(*) FROM employees GROUP BY department HAVING COUNT(*) >= 5;

-- 예시: 급여 합계가 100,000 이상인 부서의 부서명과 급여 합계를 구할 때
SELECT department, SUM(salary) FROM employees GROUP BY department HAVING SUM(salary) >= 100000;

 

6. JOIN : 여러 테이블에서 데이터를 결합하기 위해 사용된다.

MySQL에서 지원하는 주요 JOIN 유형에는 INNER JOIN, LEFT JOIN (또는 LEFT OUTER JOIN), RIGHT JOIN (또는 RIGHT OUTER JOIN)이 있다. 

사용 상황: 서로 다른 테이블 간의 관련 데이터를 결합하여 의미 있는 정보를 추출할 수 있다.

 

예시를 통해 알아보자.

 

customers 테이블

customer_id name
1 Alice
2 Bob
3 Charlie

 

orders 테이블

order_id customer_id
101 1
102 2
103 4

 

1) INNER JOIN : INNER JOIN은 두 테이블 간의 일치하는 레코드만 반환한다.

-- 별칭 없음
SELECT customers.name, orders.order_id
FROM customers
JOIN orders
ON customers.customer_id = orders.customer_id;

-- 별칭 사용(A, B)
SELECT A.name, B.order_id
FROM customers A
INNER JOIN orders B
ON A.customer_id = B.customer_id;

 

이 쿼리는 customers 테이블과 orders 테이블에서 customer_id가 일치하는 모든 고객 이름과 주문 ID를 반환한다.

 
name order_id
Alice 101
Bob 102

 

2) LEFT JOIN (LEFT OUTER JOIN) : LEFT JOIN은 왼쪽 테이블의 모든 레코드를 반환하고, 오른쪽 테이블에서 일치하는 레코드가 없는 경우 NULL을 반환한다.

-- 별칭 없음
SELECT customers.name, orders.order_id
FROM customers 
LEFT JOIN orders 
ON customers.customer_id = orders.customer_id;

-- 별칭 사용(A, B)
SELECT A.name, B.order_id
FROM customers A
LEFT JOIN orders B
ON A.customer_id = B.customer_id;

 

이 쿼리는 모든 고객의 이름과, 주문이 있는 경우 해당 주문 ID를 반환한다. 주문이 없는 고객의 경우 주문 ID는 NULL이 된다.

name order_id
Alice 101
Bob 102
Charlie NULL

 

3) RIGHT JOIN (RIGHT OUTER JOIN) : RIGHT JOIN은 오른쪽 테이블의 모든 레코드를 반환하고, 왼쪽 테이블에서 일치하는 레코드가 없는 경우 NULL을 반환한다.

-- 별칭 없음
SELECT customers.name, orders.order_id
FROM customers
RIGHT JOIN orders
ON customers.customer_id = orders.customer_id;

-- 별칭 사용(A, B)
SELECT A.name, B.order_id
FROM customers A
RIGHT JOIN orders B
ON A.customer_id = B.customer_id;

 

이 쿼리는 모든 주문 ID와, 해당 주문을 한 고객의 이름을 반환한다. 고객이 없는 주문의 경우 고객 이름은 NULL이 된다.

name order_id
Alice 101
Bob 102
NULL 103