카테고리 없음

Spring#1_3_Database와 SQL

성-민 2023. 2. 5. 01:19

Database

데이터 집합 : 정보를 저장하고 관리

 

DBMS(Database Management System)

  - Database를 관리하고 운영하는 소프트웨어

 

RDBMS(Relational DBMS)

  - 관계형 데이터베이스

  - 테이블(table) 이라는 최소 단위로 구성되며, 이 테이블은 열(column)과 행(row)로 이루어져 있습니다.

 

RDBMS의 종류

  - MySQL

  - PostgreSQL

  - Oracle Database

각 제품간 차이가 크지 않아서 유료인 Oracle을 제외하고 MySQL, PostgreSQL 중에서 사용

H2

  - In-memory DB의 대표 주자

  - In-memory DB는 서버가 작동하는 동안에만 내용을 저장하고 서버가 작동을 멈추면 데이터가 모두 삭제됨

MySQL

  - MySQL은 서비스를 배포할 때 사용할 데이터베이스

  - AWS RDS라는 서비스를 사용해 붙일 예정

  - 스프링과 궁합이 좋아서 많은 회사에서 사용

 

SQL(Structured Query Language)

  - RDBMS에서 사용되는 언어로 수 많은 정보를 Database에서 조작하고 관리하기 위해 사용

        국제표준화기구에서 SQL에 대한 표준을 정해서 발표

        하지만 DBMS 만드는 회사가 여러 곳이기 때문에 DBMS마다 표준 SQL을 준수하되,

        각 제품의 특성을 반영하기 위해 약간의 차이가 존재한다.

 

DDL(Data Definition Language)

  - CREATE : 새로운 데이터베이스 및 테이블을 생성

CREATE DATABASE 데이터베이스이름;
CREATE TABLE 테이블이름
(
		필드이름1 필드타입1,
    필드이름2 필드타입2,
    ...
);

  - ALTER : 데이터베이스와 테이블의 내용을 수정할 수 있습니다.

ALTER TABLE 테이블이름 ADD 필드이름 필드타입;
ALTER TABLE 테이블이름 DROP 필드이름;
ALTER TABLE 테이블이름 MODIFY COLUMN 필드이름 필드타입;

 

- DROP : 데이터베이스와 테이블을 삭제할 수 있습니다. 데이터 및 테이블 전체를 삭제합니다.

DROP DATABASE 데이터베이스이름;
DROP TABLE 테이블이름;

  - TRUNCATE : 데이터베이스와 테이블을 삭제할 수 있습니다. 최초 테이블이 만들어졌던 상태 즉, 컬럼값만 남깁니다.

TRUNCATE DATABASE 데이터베이스이름;
TRUNCATE TABLE 테이블이름;

 

 

DCL(Data Control Language)

  - GRANT : 사용자 또는 ROLE에 대해 권한을 부여할 수 있습니다.

GRANT [객체권한명] (컬럼)
ON [객체명]
TO { 유저명 | 롤명 | PUBLC} [WITH GRANT OPTION];

//ex
GRANT SELECT ,INSERT 
ON mp
TO scott WITH GRANT OPTION;

  - REVOKE : 사용자 또는 ROLE에 대해 부여한 권한을 회수할 수 있습니다

REVOKE { 권한명 [, 권한명...] ALL}
ON 객체명
FROM {유저명 [, 유저명...] | 롤명(ROLE) | PUBLIC} 
[CASCADE CONSTRAINTS];

//ex
REVOKE SELECT , INSERT
ON emp
FROM scott
[CASCADE CONSTRAINTS];

 

 

DML(Data Manipulation Languge)

  - INSERT : 테이블에 새로운 row를 추가할 수 있습니다.

INSERT INTO 테이블이름(필드이름1, 필드이름2, 필드이름3, ...) VALUES(데이터값1, 데이터값2, 데이터값3, ...);
INSERT INTO 테이블이름 VALUES(데이터값1, 데이터값2, 데이터값3, ...);

  - SELECT : 테이블의 row를 선택할 수 있습니다.

SELECT 필드이름 FROM 테이블이름 [WHERE 조건];

  - UPDATE : 테이블의 row의 내용을 수정할 수 있습니다.

UPDATE 테이블이름 SET 필드이름1=데이터값1, 필드이름2=데이터값2, ... WHERE 필드이름=데이터값;

  - DELETE : 테이블의 row를 삭제할 수 있습니다.

DELETE FROM 테이블이름 WHERE 필드이름=데이터값;

===========================================================================================

CREATE

제약조건

  - AUTO_INCREMENT : 컬럼의 값이 중복되지 않게 1씩 자동으로 증가하게 해줘 고유번호를 생성해 줍니다.

CREATE TABLE 테이블이름
(
    필드이름 필드타입 AUTO_INCREMENT,
    // id bigint AUTO_INCREMENT,
    ...
);

  - NOT NULL : 해당 필드는 NULL 값을 저장할 수 없게 됩니다.

CREATE TABLE 테이블이름
(
    필드이름 필드타입 NOT NULL,
    ...
);

  - UNIQUE : 해당 필드는 서로 다른 값을 가져야만 합니다.

CREATE TABLE 테이블이름
(
    필드이름 필드타입 UNIQUE,
    ...
);

  - PRIMARY KEY : 해당필드가 NOT NULL과 UNIQUE 제약 조건의 특징을 모두 가지게 됩니다.

  - FOREIGN KEY : 하나의 테이블을 다른 테이블에 의존하게 만들며 데이터의 무결성을 보장해 줍니다.

        FK를 가지는 테이블이 참조하는 기준 테이블의 열은 반드시 PK, UNIQUE 제약 조건이 설정되어 있어야 합니다.

 

 = 중복된 데이터 삽입 방지, 데이터 새롭게 추가 시 외래키에 해당하는 값이 외래키가 참조하는 테이블에 존재하는지 확인

CREATE TABLE 테이블이름
(
    필드이름 필드타입,
    ...
		FOREIGN KEY(필드이름)
    REFERENCES 테이블이름(필드이름)
);

<예시>

<회원 테이블>

회원_id 회원_이름
u_i userA
u_2 userB

<주문 테이블>

주문_id 상품_이름 상품_수량 회원_id
o_1 item_1 5 u_1
o_2 item_2 3 u_1
o_3 item_3 10 u_1
o_4 item_4 7 u_2
o_5 item_5 3 u_2

  - CASCADE : FOREIGN KEY로 연관된 데이터를 삭제, 변경할 수 있습니다.

============================================================================================

 

JOIN

  - JOIN은 나누어진 테이블을 하나로 합치기 위해 데이터베이스가 제공하는 기능입니다.

  - JOIN은 ON이라는 키워드를 통해 기준이 되는 컬럼을 선택하여 2개의 테이블을 합쳐 줍니다.

  - JOIN을 할 때에는 적어도 하나의 컬럼을 서로 공유하고 있어야 하기 때문에 테이블에 외래키가 설정 되어 있다면 해당 컬럼을 통해 JOIN을 하면 해당 조건을 충족할 수 있습니다.

 

다만 JOIN을 하기 위해 외래키를 설정하는 것이 항상 좋은 선택이 아닐 수도 있습니다.

  - 외래키를 설정하면 데이터 무결성을 확인하는 추가 연산이 발생합니다.

  - 또한 무결성을 지켜야하기 때문에 상황에 따라 개발하는데 불편할 수 있습니다.

 

=> 항상 테이블에 모든 제약조건을 걸어야 하는 것은 아닙니다. 프로젝트의 상황에 따라 가장 효율적인 제약조건을 테이블에 적용해야 합니다.

 

SQL데이터 유형

데이터 유형 설명
CHAR(s) 고정 길이 문자열 정보
- s는 기본 길이 1byte, 최대 길이 Oracle 2000byte SQL Server 8000byte
- s만큼 최대 길이를 갖고 고정 길이를 가지고 있으므로 할당된 변수 값이 길이가 s보다 작을 경우에는
그 차이 길이만큼 공간으로 채워진다.
VARCHAR(2) - CHARACTER VARYING의 약자로 가변 길이 문자열 정보
(Oracle은 VARCHAR2로 표현, SQL Server는 VARCHAR로 표현)
- s는 최소 길이 1byte, 최대 길이 Oracle 4000byte, SQL Server 8000byte
- s만큼의 최대 길이를 갖지만 가변 길이로 조정이 되기 때문에 할당된 변수값의 byte만 적용된다.
NUMERIC - 정수, 실수 등 숫자 정보(Oracle은 NUMBER로, SQL Server는 다양한 숫자 타입 지원)
- Oracle은 처음에 전체 자리 수를 지정하고, 그 다음 소수 부분의 자리 수를 지정한다.
ex > 정수 부분이 6자리이고 소수점 부분이 2자리인 경우 NUMBER(8,2)
DATE - 날짜와 시각 정보
- Oracle은 1초 단위, SQL Server는 3.33ms(millisecond) 단위 관리