멋쟁이v의 개발일지

[DB] 데이터 모델링/타입, SQL 변수/형 변환/함수 본문

0년차/DB

[DB] 데이터 모델링/타입, SQL 변수/형 변환/함수

멋쟁이v 2023. 5. 20. 21:18
728x90
320x100

[목차]


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로 되어 있는 데이터가 조회할 때 내부적으로 더 좋은 성능을 가진다.

    • BLOB(Binary Large Object) : 사진 파일, 동영상 파일, 문서 파일과 같은 데이터를 저장하는데 사용한다.

      MySQL에서는 대량의 데이터를 저장하기 위해 LONGTEXT, LONGBLOB 타입을 지원. 약 4GB 크기의 파일을 하나의 데이터로 저장할 수 있다.

    ➡️ 날짜형

    👉🏻
    DATE, DATETIME

    • DATE : 날짜만 저장
    • TIME : 시간만 저장
    • DATETIME : 둘 다 저장
    • DATETIME과 TIMESTAMP 비교
      • TIMESTAMP는 시간대에 영향을 받는다. DB서버에 저장되는 시간에 따라서 다르게 저장된다.

    ➡️ 기타

    👉🏻
    JSON : JSON문서를 저장

    GEOMETRY : 공간 데이터 형식. 공간 데이터 개체를 저장하고 조작한다. GIS 프로젝트에서 사용.

02. 데이터 모델링

  • 모델링
    💡
    현실에서 사용하는 복잡한 데이터를 어떻게 컴퓨터의 DBMS에 옮겨 놓을지 결정하는 과정이다.

    ➡️ 데이터 모델링 : 건축

    1. 현실 세계 → 개념 세계 → 컴퓨터 세계

    ➡️ 네이버로그인 → 회원 정보 입력, IP 등 → 테이블 형태

    1. 특징
    • 추상화

      ➡️ 현실 세계를 간략히 표현

    • 단순화

      ➡️ 누구나 쉽게 이해할 수 있도록 표시한다.

    • 명확성

      ➡️ 명확하게 의미가 해석되고, 한 가지 의미만 가져야 한다.

    1. 현실에서 쓰이는 것을 테이블로 변경하기 위한 작업이다.

      변환 대상 : 실체가 있는 대상 + 행동까지 변환 가능하다.

      ➡️ 프로세스를 생각했을 때 필요한 테이블

      예시) 상품을 구매 → 상품, 직원, 고객, 구매, 배송 테이블

    1. 데이터 베이스 생명 주기
    • 사용자 요구 사항에 의해 최초 구축, 필요에 따라 개선 또는 재구축
    • 단계

      ➡️ 요구 사항 수집 및 분석, 설계, 구현, 운영, 개선

    1. 모델링 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. 데이터 형 변환

  • 종류

    ➡️ 명시적인 변환

    👉🏻
    내가 직접 함수를 사용해서 변환

    아래 두 함수는 형식만 다르고 기능은 동일하다.

    • CAST(값 AS 데이터_형식[(길이)])
    • CONVERT(값, 데이터_형식[(길이)])
    • SELECT CAST(’2023%01%15’ AS DATE);

      SELECT CAST('2023@01@15' AS DATE);

      SELECT CAST('2023/01/15' AS DATE);

    ➡️ 암시적인 변환

    👉🏻
    별도의 작업 없이 자연스럽게 변환

06. SQL 내장함수

👉🏻
SQL의 함수는 크게 두 종류이다.
  • 내장 함수 : DBMS가 제공하는 함수
  • 사용자 정의 함수 : 사용자가 직접 만드는 함수

➡️ 내장 함수는 최초 선언 시, 유효한 값을 입력 받아야 한다.

선언에 위배되는 값을 입력하면, 실행이 중지되고 에러 메시지가 출력된다.

SELECT, UPDATE, DELETE에서 모두 사용 가능하다.

  • 주요 내장 함수의 종류

    ➡️ 제어 흐름 함수

    👉🏻
    프로그램의 흐름을 제어한다.

    종류

    • IF(수식, 참, 거짓)

      ➡️ SELECT if(100 > 300, 'T', 'F');

    • 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);

    ➡️ 숫자 함수

    👉🏻
    종류
    • ABS(숫자)

      ➡️ 숫자의 절대값 계산

      ➡️ SELECT ABS(-27), ABS(27);

    • CEIL OR CEILING(숫자)

      ➡️ 숫자보다 크거나 같은 최솟값의 정수

      ➡️ SELECT CEIL(4.7)

    • FLOOR(숫자)

      ➡️ 숫자보다 작거나 같은 최소의 정수

      ➡️ SELECT FLOOR(4.7);

    • ROUND(숫자, n)

      ➡️ 숫자의 반올림. n 반올림 자릿수

      ➡️ SELECT ROUND(3.14159, 2);

    ➡️ 문자 함수(문자를 반환하는)

    👉🏻
    종류
    • CONCAT(str1, str2)

      ➡️ 문자열 연결

      ➡️ SELECT CONCAT_WS('-', '010','1234','5678'); : 구분자와 함께 문자열 연결 : 010-1234-5678

    • REPLACE(str1, str2, str3)

      ➡️ 원하는 문자열로 변경

      ➡️ SELECT REPLACE('마시는 비타민 비타500', '비타민', '비타민C'); : 비타민을 비타민C로 변경

    • SUBSTR(str1, num1, num2)

      ➡️ 시작 위치부터 길이만큼 문자를 반환.

      SUBSTR = SUBSTRING = MID

      ➡️ SELECT SUBSTR('안녕하세요', 1, 2);

      SELECT SUBSTRING('안녕하세요', 1, 2);

      SELECT MID('안녕하세요', 1, 2);

    • TRIM

      ➡️ 문자열 앞 뒤 공백 제거

      ➡️ SELECT TRIM(' 안녕하세요 ');

    ➡️ 문자 함수(숫자를 반환하는)

    👉🏻
    종류
    • ASCII(char)

      ➡️ SELECT ASCII('A'), CHAR(65);

    • LENGTH(str)

      ➡️ 할당된 byte 수를 반환

      ➡️ SELECT LENGTH('가나다'), LENGTH('abc');

      ➡️ SELECT CHAR_LENGTH('가나다') : 문자의 개수를 반환

    ➡️ 날짜 및 시간 함수

    👉🏻
    종류
    • ADDDATE()

      ➡️ 날짜에서 더한 날짜

      ➡️ SELECT ADDDATE('2023-01-01', INTERVAL 31 DAY), ADDDATE('2023-01-01', INTERVAL 1 MONTH);

    • SUBDATE()

      ➡️ 날짜에서 뺀 날짜

      ➡️ SELECT SUBDATE('2023-05-15', INTERVAL 10 DAY);

    • ADDTIME()

      ➡️ 시간에서 더한 시간

    • SUBTIME()

      ➡️ 시간에서 뺀 시간

    • CURDATE(), CURTIME(), SYSDATE()

      ➡️ 현재날짜, 현재시간, 둘다

      ➡️ SELECT CURDATE();

      SELECT CURTIME();

      SELECT SYSDATE();

    • DATE(), TIME()

    • DATEDIFF()

      ➡️ 날짜 차이를 계산

      ➡️ SELECT DATEDIFF('2023-12-31', NOW());

    ➡️ 변환 함수

    ➡️ NULL 관련 함수

    ➡️ 기타 : 시스템 함수(시스템 정보 함수)

    👉🏻
    시스템의 정보를 출력하는 함수를 제공한다.

    종류

    • USER()

      ➡️ SELECT USER();

    • DATABASE()

      ➡️ SELECT DATABASE();

    • VERSION

      ➡️ SELECT VERSION();

    • SLEEP(초)

      ➡️ 의도적으로 쿼리 실행을 멈춘다.

      ➡️ SELECT SLEEP(3); // 3초 뒤 다음 쿼리 실행

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 컬럼명 : 어떤 컬럼을 그룹으로 만들지 기준이 되는 컬럼을 작성한다.
    • ORDER 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를 사용하면, 누적합을 구할 수 있다.

    ➡️ 순위 함수

    👉🏻
    종류
    • RANK()

      ➡️ 값이 동일하다면, 같은 순위를 부여하고, 1이 3개 있었다면 2와 3없이 4로 넘어간다.

    • ROW_NUMBER()

      ➡️ 작은 순서부터 출력. 값이 커지는 순서에 따라 순위도 높아진다. 어떻게든 순서를 정해서 중복되는 순서가 없어요.

    • DENSE RANK()

      ➡️ 값이 동일하다면, 같은 순위를 부여하고, RANK와 다르게 순차적으로 부여한다.

    구문

    • 순위_함수() OVER (ORDER BY 컬럼_명)
    • 인자에 아무 값도 작성하지 않는다.


tag : #데이터베이스 #DB #데이터타입 #개체 #속성 #관계 #데이터모델링 #변수 #변환 #내장함수 #윈도우함수


Uploaded by N2T

728x90
320x100
Comments