집계 함수
~ 컬럼의 여러 row들을 대상으로 원하는 특징 값을 구해준다 (동시에 실행)
COUNT( ) -> row의 개수 구하기
SELECT COUNT(*) FROM copang_main.member;
~ 모든 row의 개수를 구함
SELECT COUNT(email) FROM copang_main.member;
~ null을 제외하고 해당 특성을 가진 row의 개수를 구함
MAX( ) -> 해당 속성 중 가장 큰 값 찾기
SELECT MAX(height) FROM copang_main.member;
MIN( ) -> 해당 속성 중 가장 작은 값 찾기
SELECT MIN(weight) FROM copang_main.member;
AVG( ) -> 해당 속성값의 평균 구하기
SELECT AVG(weight) FROM copang_main.member;
*null 값은 자동으로 제외된다
SUM( ) -> 해당 속성값들의 합계 구하기
SELECT SUM(age) FROM copang_main.member;
STD( ) -> 해당 속성값들의 표준편차 구하기
SELECT STD(age) FROM copang_main.member;
산술 함수
~ 컬럼의 각 row마다 단순한 산술 연산을 해준다 (각각 실행)
ABS( ) -> 절대값을 구한다
SQRT( ) -> 제곱근을 구한다
CEIL( ) -> 소수점에서 올린다
FLOOR( ) -> 소수점에서 내린다
ROUND( ) -> 반올림 한다
SELECT ROUND(height) FROM copang_main.member;
NULL을 다루는 방법
NULL: 값이 없음, 0이나 공백(‘ ‘)도 아님
선택 입력사항인 경우 null값이 많아진다
IS NULL -> ‘특정’ 컬럼에 null이 들어있는 row 조회하기
SELECT * FROM copang_main.member WHERE address IS NULL;
IS NOT NULL -> ‘특정’ 컬럼에 null이 들어있는 row를 제외하고 조회하기
SELECT * FROM copang_main.member WHERE address IS NOT NULL;
OR을 활용해서 ‘하나의 컬럼이라도’ null이 들어있는 row 조회하기
SELECT * FROM copang_main.member
WHERE height IS NULL
OR weight IS NULL
OR address IS NULL;
* COALESCE(A, ‘B’) -> A컬럼의 NULL을 B로 치환해서 띄울 수 있다
이상한 값을 제외하고 싶다면?
age컬럼에 음수가 있거나 지나치게 큰 값이 있는 경우..
SELECT AVG(age) FROM copang_main.member WHERE age BETWEEN 5 AND 100;
~이런 식으로 row를 추리고 평균을 구할 수 있다
address컬럼에 말도 안되는 주소들만 조회해보자
SELECT * FROM copang_main.member WHERE address NOT LIKE '%호';
이런 식으로 배운 조건을 다양하게 활용해서 이상한 값들을 제외하거나 조회하자!
..보통 회원가입 과정에서 이상한 데이터가 차단되긴 한다
컬럼끼리 계산하기
키와 몸무게를 사용해서 BMI를 구해보자 (BMI: 몸무게(kg) 나누기 키(m)의 제곱)
SELECT email, height, weight, weight / ((height/100) * (height/100)) FROM copang_main.member;
~ 컬럼끼리 산술 계산이 가능하다! 사칙연산, 나머지 연산(+ - * / %)
컬럼에 alias 붙이기, 결합하기
AS -> 컬럼의 별명(alias)을 붙인다
SELECT email,
weight / ((height/100) * (height/100)) AS BMI
FROM copang_main.member;
*물론 추가된 컬럼이 아닌 기존 컬럼에도 별명을 붙일 수 있다
*alias에 띄어쓰기가 포함되어 있다면 작은따옴표(‘ ‘)로 묶어줘야 한다
AS 없이 스페이스를 하나 띄우고 써도 적용된다 (그래도 쓰는게 좋다)
SELECT email,
weight / ((height/100) * (height/100)) BMI
FROM copang_main.member;
CONCAT -> 컬럼들을 묶을 수 있다
SELECT email,
CONCAT (height, 'cm', ', ', weight, 'kg') AS '키와 몸무게',
weight / ((height/100) * (height/100)) AS BMI
FROM copang_main.member;
컬럼의 값 변환해서 보기
CASE문에 익숙해져야 한다~
1. 일반 case문 -> 단순히 1대1 대응한다
2. 검색 case문 -> 조건에 따른 범위로 대응되어 활용성이 높다
만들어진 BMI 수치에 따라 case를 나누는 속성을 만들고 alias를 붙이고 정렬하자
SELECT
email,
CONCAT (height, 'cm', ', ', weight, 'kg') AS '키와 몸무게',
weight / ((height/100) * (height/100)) AS BMI,
(CASE
WHEN weight IS NULL OR height is NULL THEN '비만 여부 알 수 없음'
WHEN weight / ((height/100) * (height/100)) >= 25 THEN '과체중 또는 비만'
WHEN weight / ((height/100) * (height/100)) >= 18.5
AND weight / ((height/100) * (height/100)) < 25
THEN '정상'
ELSE '저체중'
END) AS obesity_check
FROM copang_main.member
ORDER BY obesity_check ASC;
고유값만 보기
DISTINCT -> 중복되는 값을 제외하고 속성의 고유값만 보여준다
SELECT DISTINCT(gender) FROM copang_main.member;
SUBSTRING( )을 활용하면 문자열의 특정 부분만 뽑아서 고유값으로 처리할 수 있다
SELECT DISTINCT(SUBSTRING(address, 1, 2)) FROM copang_main.member;
~ 문자열의 1, 2번째 글자로 고유값을 뽑아낸다, 매우 유용하다!
COUNT(DISTINCT(gender)) 이런 식으로 고유값의 개수도 구할 수 있다
문자열 관련 함수들
LENGTH -> 문자열의 길이를 구해준다
SELECT LENGTH(address) FROM copang_main.member;
UPPER/LOWER -> 문자열의 대문자를 소문자로/소문자를 대문자로 바꾼다
LPAD/RPAD -> 문자열의 왼쪽/오른쪽을 특정 문자열로 채운다
SELECT email, LPAD(age, 10, '0') FROM copang_main.member;
~ age컬럼의 값을 왼쪽에 문자’0’을 붙여서 10자리로 만든다
LTRIM/RTRIM -> 문자열의 왼쪽/오른쪽 공백 삭제
TRIM -> 문자열의 왼쪽, 오른쪽 양쪽 다 공백 삭제
그루핑해서 보기
그루핑: row들을 그룹으로 나누는 것
GROUP BY -> 동일한 속성값을 기준으로 row들이 그룹화된다
SELECT gender FROM copang_main.member GROUP BY gender;
각 그룹의 개수와 평균 키를 구해보자!
SELECT gender, COUNT(*), AVG(height) FROM copang_main.member GROUP BY gender;
여러 개의 컬럼을 한 번에 그루핑 할 수 있다!
SELECT
SUBSTRING(address, 1, 2) AS region,
gender,
COUNT(*)
FROM copang_main.member
GROUP BY
SUBSTRING(address, 1, 2),
gender;
*이 경우 SELECT문에는 집계함수와 GROUP BY에 사용할 속성만 쓸 수 있다!!
HAVING을 통해 여기서 원하는 그룹만 또 추출할 수 있다 (활용성 높다!)
SELECT
SUBSTRING(address, 1, 2) AS region,
gender,
COUNT(*)
FROM copang_main.member
GROUP BY
SUBSTRING(address, 1, 2),
gender
HAVING region = '서울';
HAVING region IS NOT NULL;
~ 이런 식으로 NULL 그룹을 제거 / ‘!=’로 특정한 값 제거도 가능
ORDER BY region ASC, gender DESC;
추가로 ORDER BY를 통해 정렬도 해주자!
심화) WITH ROLLUP 을 넣으면 하위 구분의 부분총계row도 추가된다
*현재까지 SELECT문의 작성 순서는 다음과 같다*
SELECT>FROM>WHERE>GROUP BY>HAVING>ORDER BY>LIMIT
실제 실행 순서는 다음과 같다
본 내용은 Codeit의 '개발자를 위한 SQL 데이터베이스'를 바탕으로 작성되었습니다.
'Computer Science > Database, SQL' 카테고리의 다른 글
[Codeit/MySQL] #6 서브쿼리와 뷰를 활용한 데이터 분석 (11) | 2021.04.16 |
---|---|
[Codeit/MySQL] #5 테이블 조인을 통한 데이터 분석 (4) | 2021.04.16 |
[Codeit/MySQL] #3 데이터 조회 (4) | 2021.04.15 |
[Codeit/MySQL] #2 테이블 생성 (4) | 2021.04.15 |
[Codeit/MySQL] #1 데이터베이스 기본 개념 (0) | 2021.04.15 |