T_era

SQL 자료형 본문

Programing/Datababse

SQL 자료형

블스뜸 2025. 5. 8. 14:03
  1. 자료형
    • MySQL Database에 사용할 수 있는 데이터 타입
    • 숫자형
      • 정수타입 Byte 범위 설명
        TINYINT 1 signed : - 128 ~ 127  
        unsigned : 0 ~ 256 정수    
        SMALLINT 2 signed : -32,768 ~ 32,767  
        unsigned : 0 ~ 65535 정수    
        MEDIUMINT 3 signed : -8388608 ~ 8388607  
        unsigned : 0 ~ 16777215 정수    
        INT 4 signed : -2147483648 ~ 2147483647  
        unsigned : 0 ~ 4294967295 정수    
        BIGINT 8 signed : 약 -900경 ~ + 900경  
        unsigned : 0 ~ 약 1800경 정수    
        • SIGNED, UNSIGNED 예약어
          • 정수형 자료형에만 사용할 수 있다.
          • 양수만 사용될 경우 UNSIGNED
          • 음수도 사용될 경우 SIGNED
          • 적절한 경우에 사용하면 용량을 절약할 수 있다.
      • 실수(고정 소수점)
        • 실수를 정확하게 표현하기 위해 사용된다.
        • 정확한 소수점 계산이 가능하다.
        타입 byte 범위 설명
        DECIMAL(M,D) 5~17 -1038+1 ~ +1038-1 전체 자릿수(M)와 소수점 이하 자리수(D)
        DECIMAL(3, 2)는 전체 자릿수 3자리, 소숫점 이하 2자리 설정 → 1.11      
        NUMERIC(M,D) 동일 동일 동일
      • 실수(부동 소수점)
        • 고정 소수점과 달리 고정되지 않는 소수를 가진다.
        • 더 넓은 범위의 숫자를 표현하기 위해 사용된다.
        타입 byte 범위 설명
        FLOAT 4 -3.40E+38 ~ -1.17E-38 소수점 아래 7자리까지 표현
        DOUBLE      
        REAL 8 1.22E-308 ~ 1.79E+308 소수점 아래 15자리까지 표현
    • 날짜형타입 Byte 범위 설명
      DATE 3 1001-01-01 ~  
      9999-12-31 YYYY-MM-DD 형식(연-월-일)    
      TIME 3 -838:59:59.000000 ~  
      838:59:59.000000 HH:MM:SS 형식(시:분:초)    
      DATETIME 8 1001-01-01 00:00:00 ~  
      9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS    
      (연-월-일 시:분:초)      
      TIMESTAMP 4 1970-01-01 00:00:00 ~  
      2038-01-19 03:14:07 1970-01-01 00:00:00 이후로 지난 시간을 밀리세컨드 단위로 저장한다.    
      TIME_ZONE 시스템 변수와 관려이 있다.      
      YEAR 1 1901 ~ 2155 연도
      • DATETIME
        • 날짜와 시간의 절대적인 값이다.
        • 날짜와 시간을 글자 그대로 저장한다.
        • 어느 누가 데이터를 읽어도 항상 같은 값으로 조회된다.(국가별 시차와 관계없음)
      • TIMESTAMP
        • 시간대에 영향을 받는 상대적인 시간이다.
        • 날짜와 시간을 숫자값(밀리세컨드)으로 저장한다.
          • DB에 세팅된 시간에 따라 다르게 조회될 수 있다.
        • TIME_ZONE은 국가별 시차에 따라 값이 다르다.
          • 국제표준 TIMEZONE은 UTC(한국 시간 -9) 이다.
    • 문자형타입 Byte 설명
      CHAR(M) 1 ~ 255 고정길이 문자형. (M : 0 ~ 255)
      VARCHAR(M) 1 ~ 65535 가변길이 문자형. (M : 0 ~ 65,535)
      BINARY(M) 1 ~ 255 고정길이 이진 데이터 값
      VARBINARY(M) 1 ~ 255 가변길이 이진 데이터 값
      TINYBLOB    
      TINYTEXT 1 ~ 255 텍스트 데이터
      BLOB    
      TEXT 1 ~ 65535 텍스트 데이터
      MEDIUMBLOB    
      MEDIUMTEXT 1 ~ 16777215 텍스트 데이터
      LONGBLOB    
      LONGTEXT 1 ~ 4294967295 텍스트 데이터
      ENUM 1 또는 2 문자 형태인 value를 숫자로 저장하여 최대 65535개의 문자열 중 한가지를 반환한다.
      255이하 = 1byte, 65535 이하 = 2byte    
      SET 1, 2, 3, 4, 8 최대 64개의 중복되지 않는 데이터 값, ENUM형과 동일하게 문자열 값을 정수값으로 매핑하여 저장한다.
      • CHAR
        • 고정된 공간을 차지하여 사용시 주의해야 한다.
        • 성능은 VARCHAR보다 더 좋다.
        ex) CHAR(10) 설정 후 3글자 문자열을 넣으면 나머지 7은 스페이스로 채워진다.
      • VARCHAR
        • 가변적인 공간을 차지한다.
        ex) 입력되는 글자의 길이에 따라 그에 맞게 공간을 할당한다.
      <aside> ❓ VARCHAR가 효율적으로 메모리 공간을 사용하는데 왜 CHAR가 존재하나요?<aside> ❗ VARCHAR는 글자 + 길이까지 저장하기 때문에 1, 2byte정도 char보다 많은 공간을 차지하게 됩니다. 연산시 글자 길이도 계산하여 CHAR보다 조금 더 시간을 소모하게 됩니다. 따라서 CHAR를 적절하게 사용한다면 더욱 효율적으로 사용할 수 있습니다.<aside> ❗ VARCHAR 뒤의 숫자는 실수 또는 악의적으로 매우 긴 문자열을 입력하는 것을 방지하기 위해 사용됩니다. 또한, 불필요하게 많은 값이 할당되면 성능을 저하시킬 수 있어 적당한 값을 선택하는것이 좋습니다.
      • TEXT
        • 게시글의 내용처럼 긴 문자열을 저장할 때 사용된다.
        • 데이터의 총량이 VARCHAR 최대인 65535를 넘어가려하면 사용한다.
      • BLOB
        • 이미지, 파일 등을 파일이 아닌 바이너리 데이터로 저장할 때 사용한다.
      • ENUM은 반드시 하나의 값만 저장된다.
      • SET은 다중 선택이 가능하다.
    • </aside>
    • </aside>
    • </aside>
    • 기타
      • BOOLEAN을 제외하고 이런것도 있구나! 참고하면 됩니다.
      타입 범위 설명
      BIT(M) 1 ~ 64 bit, 0과 1로 표현되는 binary 1 ~ 64 bit를 표현한다.
      BOOLEAN TINYINT(1)로 설정된다. 0은 false, 이외에는 true
      JSON 8byte JSON 문서를 저장
      GEOMETRY   공간 데이터 형식으로 선, 점, 다각형 같은 공간 데이터 개체를 저장한다.
      • JSON
        • 단순 저장에 중점을 두는 데이터의 경우 JSON 형태로 저장하기도 한다.
  2. 제약조건(Constraint)
    • 데이터의 무결성을 지키기 위해 데이터를 입력받을 때 실행되는 검사 규칙
    • 데이터 무결성
      • 데이터의 정확성, 일관성, 완전성을 유지하는 것
        1. 정확성: 데이터가 올바르고 오류 없이 저장되는 것을 의미한다.
        ex) 숫자로 저장되어야 하는 값이 문자로 저장되지 않도록 하는 것.
        1. 일관성: 데이터가 서로 모순되지 않고 조화를 이루는 상태를 유지하는 것을 의미한다.
        ex) 외래 키 제약 조건을 통해 두 테이블 간의 관계가 일치하는 것을 보장하는 것.
        1. 완전성: 필요한 모든 데이터가 빠짐없이 저장되고 관리되는 것을 의미한다.
        ex) 필수 입력 항목이 비어 있지 않도록 하는 것.
      • 즉, 데이터가 입력, 저장, 전송, 처리되는 동안 변경되거나 손상되지 않도록 보장하는 개념
    • AUTO_INCREMENT
      • 고유번호 자동생성(컬럼의 값이 중복되지 않게 1씩 자동으로 증가)
      CREATE TABLE 테이블이름
      (
          필드이름 필드타입 AUTO_INCREMENT,
          // id bigint AUTO_INCREMENT,
          ...
      );
      
    • NOT NULL
      • 해당 필드는 NULL 값을 저장할 수 없게 된다.
      CREATE TABLE 테이블이름
      (
          필드이름 필드타입 NOT NULL,
          ...
      );
      
    • UNIQUE
      • 해당 필드는 서로 다른 값을 가져야만 한다. (동일한 값은 존재할 수 없다.)
      CREATE TABLE 테이블이름
      (
          필드이름 필드타입 UNIQUE,
          ...
      );
      
    • PRIMARY KEY(기본 키)
      • 테이블에서 각 행(row)을 고유하게 식별하는 하나 이상의 열(column)에 설정되는 제약조건
        • 중복된 데이터가 테이블에 삽입되는 것을 방지한다.
      • NOT NULL과 UNIQUE 제약 조건의 특징을 모두 가진다.
      CREATE TABLE students (
          id BIGINT PRIMARY KEY,               -- 학생 고유 번호 (자동 증가)
          name VARCHAR(50) NOT NULL,           -- 이름
          email VARCHAR(100) NOT NULL UNIQUE,  -- 이메일
          PRIMARY KEY (id)                     -- PRIMARY KEY 설정
      );
      
      • INDEX로 설정되어 테이블의 데이터를 쉽고 빠르게 찾도록 도와주는 역할을 한다.
        • 추가적인 쓰기 작업과 저장 공간을 활용하여 검색 속도를 향상시키기 위한 자료구조
    • FOREIGN KEY(외래 키)
      • 한 테이블의 열이 다른 테이블의 PRIMARY KEY(또는 UNIQUE 제약 조건이 적용된 열)를 참조하도록 설정한다.
        • 참조된 테이블의 데이터가 변경되거나 삭제될 때 참조 무결성을 강제할 수 있다.
          • 외래 키 값은 반드시 참조하는 테이블의 기본 키로 존재해야 한다.
          • 부모 테이블의 데이터가 변경되거나 삭제될 때 자식 테이블에 있는 데이터도 자동으로 업데이트되거나 삭제되도록 보장한다.(CASCADE)
      CREATE TABLE 테이블이름
      (
          필드이름 필드타입,
          ...
      		FOREIGN KEY(필드이름)
          REFERENCES 테이블이름(필드이름)
      );
      
      • 외래키 이해하기
        1. customers 테이블
        • 고객 정보를 저장하는 테이블
        CREATE TABLE customers (
            customer_id INT PRIMARY KEY,  -- 고객 고유 번호
            name VARCHAR(50) NOT NULL     -- 고객 이름
        );
        
        
        • customer_id: 각 고객을 고유하게 식별하는 PRIMARY KEY
        • name: 고객의 이름을 저장하는 열
        1. orders 테이블
        • 주문 정보를 저장하는 테이블
        CREATE TABLE orders (
            order_id INT PRIMARY KEY,     -- 주문 고유 번호
            order_date DATE NOT NULL,     -- 주문 날짜
            customer_id INT,              -- 고객 고유 번호 (외래 키로 설정됨)
            FOREIGN KEY (customer_id) 
            REFERENCES customers(customer_id)  -- 고객 ID를 참조하는 외래 키
        );
        
        
        • order_id: 각 주문을 고유하게 식별하는 PRIMARY KEY
        • order_date: 주문 날짜를 저장하는 열
        • customer_id: customers 테이블의 customer_id를 참조하는 FOREIGN KEY
        • FOREIGN KEY 동작 예시
          1. 데이터 추가:
            • 고객 Alice와 Bob을 customers 테이블에 추가
          2. INSERT INTO customers (customer_id, name) VALUES (1, 'Alice'); INSERT INTO customers (customer_id, name) VALUES (2, 'Bob');
          3. 주문 추가:
            • Alice(고객 ID 1)와 Bob(고객 ID 2)의 주문을 orders 테이블에 추가
            • orders 테이블의 customer_id 열은 FOREIGN KEY로서, 반드시 customers 테이블의 customer_id와 일치해야 한다. 그렇지 않으면 참조 무결성 위반 오류가 발생한다.
          4. INSERT INTO orders (order_id, order_date, customer_id) VALUES (1, '2024-08-25', 1); INSERT INTO orders (order_id, order_date, customer_id) VALUES (2, '2024-08-26', 2);
          • 존재하지 않는 customer_id를 가진 주문을 추가하려고 하면 오류가 발생하여, 잘못된 데이터가 저장되지 않도록 방지할 수 있다.
          • 주문 테이블에서 참조하고 있는 customer_id가 있다면 해당하는 customers 의 row를 삭제할 수 없다.
    • CASCADE
      • 참조 무결성을 유지하기 위한 동작을 정의하는 규칙
      • 외래 키(Foreign Key) 제약 조건과 관련된 변경 사항이 발생할 때 참조하는 레코드에 대한 동작을 자동으로 처리하는 기능
        • FOREIGN KEY 로 연관된 데이터를 삭제,변경할 수 있다.
      CREATE TABLE 테이블이름
      (
          필드이름 필드타입,
          ...
      		FOREIGN KEY(필드이름)
          REFERENCES 테이블이름(필드이름) ON DELETE CASCADE 
      														 //ON UPDATE CASCADE
      );
      
      1. ON DELETE CASCADE
        • 부모 테이블의 행이 삭제되면, 참조하는 자식 테이블의 관련 행들도 자동으로 삭제한다.
      2. ON UPDATE CASCADE
        • 부모 테이블의 기본 키가 업데이트되면, 참조하는 자식 테이블의 외래 키 값도 자동으로 수정된다.
    • DEFAULT
      • 해당 필드의 기본 값을 설정한다.
      • 필드 값이 전달되지 않으면, 자동으로 기본 값을 저장한다.
      CREATE TABLE 테이블이름
      (
          필드이름 필드타입 DEFAULT 값
      );
      
  3. JOIN
    • 두개 이상의 테이블을 연결하여 데이터를 검색하는 방법
    • 테이블을 분리하여 데이터 중복을 최소화하고 데이터의 일관성을 유지하기 위해 사용된다.
    • JOIN 종류출처 : https://medium.com/@aakriti.sharma18/joins-in-sql-4e2933cedde6
      1. INNER JOIN
        • 두 테이블에서 공통된 값을 가지고 있는 행만 반환한다.
          • ON 절의 조건이 일치하는 결과
        • MySQL에서는 JOIN, INNER JOIN, CROSS JOIN이 모두 같은 의미이다.
        • 교집합
      2. LEFT JOIN
        • 왼쪽 테이블의 모든 행과 오른쪽 테이블의 일치하는 행을 반환한다.
          • ON 절의 조건 중 첫번째 테이블인 왼쪽(기준)의 데이터를 모두 가져온다.
        • 오른쪽 테이블에 일치하는 데이터가 없으면 NULL로 반환한다.
        • JOIN을 여러번 사용하는 경우 LEFT JOIN으로 시작했다면 이후 JOIN도 LEFT JOIN으로 해야한다.
        • 부분 집합(왼쪽 테이블)
      3. RIGHT JOIN
        • 오른쪽 테이블의 모든 행과 왼쪽 테이블의 일치하는 행을 반환한다.
          • ON 절의 조건 중 두번째 테이블인 오른쪽(기준)의 데이터를 모두 가져온다.
        • 왼쪽 테이블에 일치하는 데이터가 없으면 NULL로 반환한다.
        • 부분 집합(오른쪽 테이블)
      4. OUTER JOIN
        • 두 테이블에서 공통된 값을 가지지 않는 행도 포함해서 반환한다.
        • 합집합
        • LEFT OUTTER JOIN, RIGHT OUTTER JOIN, FULL OUTTER JOIN(잘 사용하지 않음) 이 있다.
        • 대부분의 DB는 FULL OUTTER JOIN을 지원하지 않고 UNION을 사용하도록 한다.
          • UNION을 사용하면 자동으로 중복을 제거(DISTICT)해준다.