[목차]
01. 데이터 타입 종류 💡
데이터 타입의 종류가 왜 이렇게 많을까요?
➡️ RDBMS는 테이블 구조이고, 데이터들이 DB서버의 공간을 계속 차지한다.
➡️ 저장 공간을 효율적으로 사용하는 것이 중요하다.
➡️ 데이터베이스도 낭비를 줄이기 위해 용량을 생각하여 데이터 타입을 지정해야 한다.
💡
데이터 형식이 다양한 이유
➡️ 크게 문자형, 숫자형, 날짜형으로 나누고 실제 저장되는 데이터 타입이 다양하다.
➡️ 각 데이터에 맞는 타입을 지정해서 호율적으로 저장할 수 있다.
➡️ 숫자형
👉🏻
SMALLINT, INT, BIGINT, FLOAT → 자주 사용
UNSIGNED(예약어)
예시) 사람 키 데이터를 삽입하는 컬럼
SMALLINT 사용 시 : 사람 키는 3만까지 필요 없으므로 비효율. TINYINT(-128 ~ + 127) 사용 시 : 키가 2미터가 넘으면 부족 UNSIGNED 작성으로 범위가 0 ~ 255로 변경 가능하다.
➡️ 문자형
👉🏻
CHAR, VARCHAR, LONGTEXT, LONGBLOB → 자주 사용
CHAR : CHARACTER의 줄임말, 고정되어 있는 고정 길이 문자형CHAR(5) : 공백 포함해서 5길이를 가진다. VARCHAR : 가변 길이 문자형VARCHER(5) : 공백 미포함. 공간을 더 효율적으로 사용할 수 있는 장점이 있지만, 불필요하게 많이 작성한 VARCHAR의 길이값도 성늘을 저하시킬 수 있다. ➡️ 글자 개수가 정해져 있는 CHAR를 사용하는게 좋다.
CHAR로 되어 있는 데이터가 조회할 때 내부적으로 더 좋은 성능을 가진다.
➡️ 날짜형
👉🏻
DATE, DATETIME
DATETIME과 TIMESTAMP 비교TIMESTAMP는 시간대에 영향을 받는다. DB서버에 저장되는 시간에 따라서 다르게 저장된다.
➡️ 기타
👉🏻
JSON : JSON문서를 저장
GEOMETRY : 공간 데이터 형식. 공간 데이터 개체를 저장하고 조작한다. GIS 프로젝트에서 사용.
02. 데이터 모델링 모델링 💡
현실에서 사용하는 복잡한 데이터를 어떻게 컴퓨터의 DBMS에 옮겨 놓을지 결정하는 과정이다.
➡️ 데이터 모델링 : 건축
현실 세계 → 개념 세계 → 컴퓨터 세계 ➡️ 네이버로그인 → 회원 정보 입력, IP 등 → 테이블 형태
특징
현실에서 쓰이는 것을 테이블로 변경하기 위한 작업이다.변환 대상 : 실체가 있는 대상 + 행동까지 변환 가능하다.
➡️ 프로세스를 생각했을 때 필요한 테이블
예시) 상품을 구매 → 상품, 직원, 고객, 구매, 배송 테이블
데이터 베이스 생명 주기 사용자 요구 사항에 의해 최초 구축, 필요에 따라 개선 또는 재구축 단계➡️ 요구 사항 수집 및 분석, 설계, 구현, 운영, 개선
모델링 3단계 개념적 모델링➡️ 업무 분석 단계에 포함
➡️ 사람이 이해할 수 있도록 현실 세계를 개념적인 형태의 모델링 진행
➡️ E-R 다이어그램 작성
➡️ 요구 사항 수집, 분석 → 결과 → 핵심 개념 즉, 개체라고 하는 것을 추출. 개체들의 관례를 정의해서 E-R 다이어그램을 만든다.
논리적 모델링➡️ 업무 분석 후반부와 시스템 설계
➡️ 개념적 구조를 논리적 형태로 모델링
➡️ 데이터베이스의 논리적인 구조로 표현
물리적 모델링➡️ 시스템 설계 후반부에 주로 진행
03. 데이터 모델의 구성 요소 1) 개체(Entity) - 직사각형 👉🏻
사람이 생각하는 개념, 정보와 같은 현실 세계의 대상입니다.
➡️ 개체와 개체 타입으로 분류할 수 있다.
개체 : 업무에 필요한 유용한 정보를 저장하고 관리하기 위해 영속적으로 존재하는 단위
2) 속성 - 타원 👉🏻
데이터의 가장 작은 단위
➡️ 개체에서 관리하고자 하는 더 이상 나눠지지 않는 최소 데이터 단위
➡️ 개체가 가지는 동일한 성격, 특징 파악.
➡️ 예시) 학생(개체) → 학번, 이름, 주소, 연락처, 전공, 학년
3) 관계 - 마름모 👉🏻
개체 간 관계 또는 속성 간 논리적 연결
➡️ 예시) 고객 - 상품 : 고객 개체와 상품 개체는 구매라는 관계가 있다.
➡️ 1:1, 1:n, n:m
04. MySQL 변수 💡
다른 프로그래밍 언어처럼 변수를 선언하고 사용할 수 있는데, 형태가 약간 다르다.
구문 ➡️ SET @변수이름 := 값;
SET @num1 := 10;
SET @num2 := 20;
SELECT
@num1 AS '변수1',
@num2 AS '변수2';
➡️ LIMIT의 경우 변수를 사용할 수 없으나, PREPARE문 EXCUTE문을 사용하여 변수를 사용할 수 있다.
👉🏻
PREPARE 쿼리_이름
FROM
‘쿼리문’;
➡️ 쿼리문을 준비하고, 실행은 하지 않는다.
➡️ EXECUTE 쿼리_이름을 만나는 순간 실행되며,
➡️ 쿼리문의 ? 자리에는 USING 변수명을 사용하면 값이 대입된다.
SET @cityName := '도시의 이름 :';
SET @num := 10;
PREPARE queryTest
FROM
'SELECT
@cityName,
c.Name,
c.CountryCode
FROM
city AS c
LIMIT ?';
EXECUTE queryTest USING @num;
05. 데이터 형 변환 종류 ➡️ 명시적인 변환
👉🏻
내가 직접 함수를 사용해서 변환
아래 두 함수는 형식만 다르고 기능은 동일하다.
➡️ 암시적인 변환
👉🏻
별도의 작업 없이 자연스럽게 변환
06. SQL 내장함수 👉🏻
SQL의 함수는 크게 두 종류이다.
사용자 정의 함수 : 사용자가 직접 만드는 함수
➡️ 내장 함수는 최초 선언 시, 유효한 값을 입력 받아야 한다.
선언에 위배되는 값을 입력하면, 실행이 중지되고 에러 메시지가 출력된다.
SELECT, UPDATE, DELETE에서 모두 사용 가능하다.
주요 내장 함수의 종류 ➡️ 제어 흐름 함수
👉🏻
프로그램의 흐름을 제어한다.
종류
IFNULL(수식1, 수식2)➡️ 수식1이 NULL이 아니면, 수식1 반환. NULL이면 수식2 반환
➡️ SELECT IFNULL(NULL, 'NULL입니까'), IFNULL(300, 'NULL입니까');
NULLIF(수식1, 수식2)➡️ 수식1과 수식2가 같으면 NULL 반환. 다르면 수식1 반환
➡️ SELECT NULLIF(200, 200), NULLIF(200, 500);
➡️ 숫자 함수
👉🏻
종류
CEIL OR CEILING(숫자)➡️ 숫자보다 크거나 같은 최솟값의 정수
➡️ SELECT CEIL(4.7)
FLOOR(숫자)➡️ 숫자보다 작거나 같은 최소의 정수
➡️ SELECT FLOOR(4.7);
➡️ 문자 함수(문자를 반환하는)
👉🏻
➡️ 문자 함수(숫자를 반환하는)
👉🏻
➡️ 날짜 및 시간 함수
👉🏻
종류
CURDATE(), CURTIME(), SYSDATE()➡️ 현재날짜, 현재시간, 둘다
➡️ SELECT CURDATE();
SELECT CURTIME();
SELECT SYSDATE();
➡️ 변환 함수
➡️ NULL 관련 함수
➡️ 기타 : 시스템 함수(시스템 정보 함수)
👉🏻
시스템의 정보를 출력하는 함수를 제공한다.
종류
DATABASE()➡️ SELECT DATABASE();
VERSION➡️ SELECT VERSION();
07. 윈도우 함수 💡
MySQL 8버전 이상에서 지원 (낮은 버전의 개발 환경에서는 사용할 수 없다.)
➡️ 윈도우 함수는 GROUP BY와 비슷한 역할
➡️ 집계 함수도 대부분 사용 가능하고, 추가적으로 윈도우 함수에서만 지원하는 기능을 사용할 수 있다.
➡️ 행과 행을 비교하고 연산한다.
➡️ GROUP BY를 사용하지 않고, 속성의 값을 집계할 수 있다.
➡️ GROUP BY는 내용을 축약해서 보여주지만, window function은 축약하지 않고 펼쳐서 보여준다.
구문 ➡️ OVER (PARTITION BY ORDER BY)
👉🏻
PARTITION BY가 ORDER BY 보다 앞에 나와야 한다.
PARTITION BY와 ORDER BY가 둘 다 있어야 하는 건 아니다.
함수(컬럼) OVER (PARTITION BY 컬럼명 ORDER BY 컬럼명)
PARTITION BY 컬럼명 : 어떤 컬럼을 그룹으로 만들지 기준이 되는 컬럼을 작성한다. SELECT
함수() OVER (PARTITION BY 컬럼명 ORDER BY 컬럼명(내림또는올림차순)
FROM
테이블명;
➡️ MAX
-- GROUP BY 사용
SELECT
c.Name,
c.CountryCode,
MAX(c.Population) AS 'max_popul'
FROM
city AS c
GROUP BY c.CountryCode;
-- PARTITION BY 사용
SELECT
c.Name,
c.CountryCode,
MAX(c.Population) OVER (PARTITION BY c.CountryCode) AS max_popul
FROM
city AS c;
➡️ SUM
SELECT
c.Name AS '이름',
c.CountryCode AS '코드',
c.Population,
SUM(c.Population) OVER (PARTITION BY c.CountryCode) AS sum_popul
FROM
city AS c;
SUM에 ORDER BY를 사용하면, 누적합을 구할 수 있다.
➡️ 순위 함수
👉🏻
종류
구문
순위_함수() OVER (ORDER BY 컬럼_명)
tag : #데이터베이스 #DB #데이터타입 #개체 #속성 #관계 #데이터모델링 #변수 #변환 #내장함수 #윈도우함수
Uploaded by N2T