SQL에서 null 비교 연산

 


select id from employee where birth_date is null;

 

  • null 비교 연산시에는 =, != 연산자가 아닌 is, is not 연산자를 사용해야 합니다.




Three-valued Logic

 

유튜버 "쉬운 코드"님의 자료를 참조하였습니다.

 

유튜버 "쉬운 코드"님의 자료를 참조하였습니다.

 

  • three-valued login이란 비교/논리 연산의 결과로 true, false, unknown을 가진다는 의미입니다.

 

  • SQL에서 null과 비교 연산을 하게 되면 그 결과는 unknown입니다.

 

  • unknown은 true일 수도 있고 false일 수도 있다 라는 의미입니다.

 

  • 위와 같은 unknown의 결과가 중요한 이유는 where절의 condition의 결과가 true일 경우에만 튜플이 선택되는데 즉, false나 unknown일 경우 선택되지 않습니다.




not in 주의사항

 

유튜버 "쉬운 코드"님의 자료를 참조하였습니다.

 

  • 위와같이 null에 의한 unknown으로 인해서 예상치 못한 결과가 return 될 수 있습니다. 즉, not in 안에서 사용될 결과에서 null이 포함될 경우 false 또는 unknown만 return 할 수 있습니다.




subquery란?


  • select, insert, update, delete에 포함된 쿼리를 말합니다.

  • subquery는 반드시 () 안에 기술됩니다.




outerquery란?


  • subquery를 포함하는 query를 말합니다.




id가 14인 임직원보다 생일이 빠른 직원 출력



select id, name, birth_date
from employee
where birth_date < (
    select birth_date
    from employee
    where id = 14
);




id가 1인 임직원과 같은 부서, 성별인 임직원들의 id, 이름, 직군을 출력



select id, name, position
from employee
where (dept_id, sex) = (
    select dept_id, sex
    from employee
    where id = 1
);

  • subquery의 결과가 하나 이상이고 하나 이상의 결과를 return하는 subquery를 비교할 때는 ()를 이용해서 비교할 attribute를 지정할 수 있습니다.




id가 5인 임직원이 참여한 프로젝트에 참여한 임직원 출력



select distinct empl_id
from works_on
where empl_id != 5 and proj_id in (
    select proj_id
    from works_on
    where empl_id = 5
);

  • works_on 테이블에서 해당 임직원이 참여한 프로젝트 id를 찾는 subquery를 통해서 proj_id를 찾아내고 이와 동일환 proj_id를 가진 임직원의 id를 출력하였습니다.

  • in은 여러개의 조건들중 하나라도 같다면 true를 return 합니다. 반대로 not in은 모든 값과 값이 다르면 true를 return 합니다.




subquery를 통한 가상의 테이블



select id, name
from employee as a,
    (
        select distinct empl_id
        from works_on
        where empl_id != 5 and proj_id in (
            select proj_id
            from works_on
            where empl_id = 5
        )
    ) as b
where a.id = b.empl_id;

  • from 절에 subquery를 이용해서 임시 테이블을 만들어서 query문에 사용할 수 있습니다. 즉, subquery는 where절이 아닌 부분에서 사용될 수 있습니다.




exists



select p.id, p.name
from project as p
where exists (
    select *
    from works_on as w
    where w.proj_id = p.id and w.empl_id in (7, 12)
);

  • id가 7 또는 12인 임직원이 참여한 프로젝트의 id와 name을 출력하는 쿼리입니다. 여기서 exists는 ()안에 subquery가 하나의 row라도 return한다면 true를 return 하는 조건절입니다. 그의 반대로는 not exists가 있습니다.




리더보다 높은 연봉을 받는 부서원을 가진 리더의 id, name, salary, 그리고 해당 부서의 가장 높은 연봉을 출력



select e.id, e.name, e.salary,
    (
        select max(salary)
        from employee
        where dept_id = e.dept_id
    ) as dept_max_salary
from department as d, employee as e
where d.leader_id = e.id and e.salary < any (
    select salary
    from employee
    where id != d.leader_id and dept_id = e.dept_id
);

  • any는 subquery가 반환한 결과들 중에 단 하나라도 v와의 비교 연산이 true라면 true를 반환합니다. ( some을 사용할 수도 있는데 some과 any는 같은 역할을 합니다. )

  • attribute 절에 subquery를 사용할 수 있습니다.




id가 13인 임직원과 한 번도 같은 프로젝트에 참여하지 못한 임직원들의 id, name, dept_id를 출력



select distinct e.id, e.name, e.dept_id
from employee as e, works_on as w
where e.id = w.empl_id
and w.proj_id != all(
    select proj_id
    from works_on
    where empl_id = 13
);

  • all은 subquery가 반환환 결과들을 비교 연산하여 모두 true 라면 true를 반환합니다. ( all 대신 not in을 사용할 수도 있습니다. )




select 기본



select * from employee where id = 9;

select name, position from employee where id = 9;

  • *을 사용하면 모듣 attribute를 출력하거나 출력하고 싶은 attribute를 select 절 다음에 지정할 수 있습니다.




두 개의 테이블을 연관지어 select



select employee.id, employee.name, position
from project, employee
where project.id = 2002 and project.leader_id = employee.id;

  • 위 select 문은 project에서 id가 2002인 leader의 id, name, position을 출력할 때 사용하는 select 문입니다.




as문 사용법



select b.id as 'leader_id', b.name as 'leader_name', b.position
from project as 'a', employee as 'b'
where a.id = 2002 and a.leader_id = b.id;

  • 테이블 명이 너무 길어서 selec문의 작성하거나 가시성이 떨어진다면 as문을 사용해서 위의 select문에서만 사용할 테이블명의 별칭을 정의할 수 있습니다.

  • as를 이용해서 출력할 때 attribute 이름의 별칭을 지정할 수 있습니다.




distinct 사용법



-- employee 직원
-- project 프로젝트
-- works_on는 employee와 project를 연관짓는 테이블

select p.id, p.name
from employee as e, project as p, works_on as w
where e.position = 'DSGN' and e.id = w.empl_id and p.id = w.proj_id;

-- 중복 tuple을 생략하여 출력
select distinct p.id, p.name
from employee as e, project as p, works_on as w
where e.position = 'DSGN' and e.id = w.empl_id and p.id = w.proj_id;

  • 위의 쿼리는 'DSGN' position을 가진 직원들이 어떤 프로젝트에 참여중인지를 확인하기 위한 쿼리입니다. 하지만, 이럴 경우 동일한 프로젝트에서 일하는 'DSGN'들이 있기 때문에 겹치는 프로젝트가 출력됩니다. 이를 위해서 distinct를 사용하여 중복된 tuple을 생략하여 출력할 수 있습니다.




like



select * from employee where position like 'DEV_%' or position like '%SG%';

-- 언더바 3개
select name from employee where name like 'J___';

  • like는 찾고자 하는 키워드가 포함된 튜플을 출력할 때 사용합니다. like 와 찾고자하는 키워드 뒤에 %를 붙일경우 찾고자 하는 키워드로 시작하는 튜플을 찾을 수 있습니다.

  • %를 사용하지 않고 _ 개수만큼 찾고자하는 키워드 뒤에 글자 수를 제한하여 조건을 지정할 수 있습니다.




NoSQL이란?


  • NotOnly SQL의 약자로서 SQL을 사용하는 RDBMS 형태의 관계형 데이터 베이스가 아닌 다른 형태의 모든 데이터 베이스를 의미힙니다.

  • NoSQL은 제품마다 특성이 매우 달라서 NoSQL을 하나의 틀로 정의할 수 없습니다.

  • RDBMS의 한계를 극복하기 위한 데이터 저장소의 새로운 형태로로서 수평적 확장성을 가지고 있으며 각 제품마다 문서, 그래프, 키/값, 인메모리 등의 다양한 데이터 모델을 사용합니다.

  • NoSQL은 기존의 RDBMS 처럼 하나의 고성능 머신에 데이터를 집중해서 저장하는 것이 아니라 DB 서버를 수십대 또는 수백 대 연결하여 데이터를 분산해서 저장 및 처리하는 구조를 가지고 있습니다.

  • 분산형 구조를 통해서 데이터를 여러 대의 서버에 분산 해서 저장을 하고 분산한 데이터를 상호 복제해서 특정 서버에 장애가 발생했을 때에도 데이터 유실이나 서비스 중지가 없도록 만들어진 솔루션이라고 할 수 있습니다.

  • RDBMS는 정형화된 데이터를 일관성있게 저장하는 것에 포커스를 맞춘 반면 NoSQL은 분산해서 저장하는 것에 초점이 맞추어져 있어 스키마가 없으며 저장하는 데이터의 형태가 유동적입니다.

  • NoSQL은 key/value 형태로 데이터를 저장하는데 value는 NoSQL 종류에 따라서 타입이 달라집니다.




NoSQL 종류


key/value store 방식



  • unique key에 하나의 value를 가지고 있는 형태입니다.

  • 대표적으로 redis가 있습니다.




ordered key/value store 방식



  • key/value store의 확장된 형태로 데이터 저장 방식은 동일하지만 데이터가 내부적으로 key를 순서로 sorting되어서 저장됩니다.

  • value안에 column과 value 조합으로 된 여러 개의 필드를 가지고 있습니다.

  • 대표적으로 HBASE, CASSANDRA가 있습니다.




document key/value store 방식



  • key/value store의 확장된 형태로 기본적으로는 key/value store 입니다.

  • 저장되는 value의 데이터 타입이 document 타입으로 mongoDB는 JSON을 타입으로 저장합니다.

  • 구조화된 데이터 타입으로서 복잡한 계층 구조를 표현할 수 있습니다.

  • 대표적으로 mongoDB가 있습니다.




'데이터 베이스 > NoSQL' 카테고리의 다른 글

MongoDB의 특징  (0) 2023.03.29
MongoDB index 종류  (0) 2023.03.22
mongoDB 기본 개념 및 용어 설명  (0) 2023.01.13
MongoDB transaction 사용법  (0) 2023.01.08

MySQL과 mongoDB의 기본적 차이

 

  • MySQL은 관계지향형 Database System인 RDBMS이며, mongoDB는 Not Only SQL인 NoSQL입니다.




MySQL의 특징

 

  • 데이터는 정해진 스키마에 따라서 데이터 베이스 테이블에 저장됩니다. 스키마를 지키지 않으며 데이터를 저장할 수 없습니다.

 

  • 2차원 테이블 형식으로 데이터를 저장합니다.

 

  • SQL을 사용해서 데이터 조회, 삽입, 삭제, 업데이트를 수행합니다.




mongoDB 특징

 

  • Schema less 구조로서 정해진 스키마에 따르지 않고 원하는 데이터를 저장할 수 있기 때문에 각각의 document가 서로 다른 field를 가질 수 있습니다.

 

  • 데이터를 저장하는 형식이 자유롭기 때문에 field에 배열이라던지 sub document를 저장할 수 있습니다.




MySQL과 mongoDB 수직, 수평 확장성

 

 

  • MySQL과 mongoDB의 또 다른 차이점으로는 확장성에 있습니다. MySQL도 샤딩을 통해 수평적 확장이 가능하지만 특정 제한이 있으며 대체적으로 구현하기가 어렵습니다. mongoDB는 자체적으로 수평적 확장을 지원하여 MySQL에 비해 조금 더 수월하게 수평 확장을 구현할 수 있습니다.




MySQL과 mongoDB의 장.단점

 

MySQL 장점

 

  • 스키마를 정의함으로서 저장할 데이터들의 형태를 미리 정의할 수 있습니다.

 

  • 각각의 정규화된 테이블들의 관계를 통헤 데이터의 중복이나 삽입, 업데이트, 삭제시에 데이터 이상 현상을 방지할 수 있습니다.

 

  • join을 통해서 관련있는 column을 기준으로 행을 합쳐 한 번에 조회할 수 있습니다.

 

  • 데이터 정규화를 통해 불필요한 데이터의 중복을 방지할 수 있습니다.




MySQL 단점

 

  • NoSQL에 비해 상대적으로 유연하지 않으며 데이터를 삽입하기 전에 반드시 스키마를 정의해야 합니다. 그리고 대용량의 데이터가 저장되어 있는 상태에서 column을 추가할 경우 모든 row에 이를 만영해야 되기 때문에 시간이 많이 소요되며 번거롭습니다.

 

  • 테이블간의 관계를 통해서 join을 사용할 수 있지만, join은 상대적으로 복잡하고 DB의 부하를 줄 수 있습니다.

 

  • NoSQL에 비해 상대적으로 수평적 확장이 어렵습니다. MySQL은 정규화로인해 테이블을 나누게 되는데, join에 필요한 테이블들이 서로 다른 shard에 있을 경우 그만큼 오버헤드가 증가합니다.




mongoDB 장점

 

  • 스키마가 없기 때문에, RDBMS보다 상대적으로 유연하게 데이터를 저장할 수 있습니다.

 

  • 기본적으로 수평적 확장을 지원하기 때문에 대용량의 데이터를 저장하기에 적합합니다.

 

  • join문이 없는 대신에 document안에 document를 저장하여 join문을 사용하지 않고 읽으려는 document와 관련된 document를 한 번에 가져올 수 있습니다.


  • mongoDB의 트랜잭션은 ACID의 일부를 포기하는 대신 높은 성능을 보여줍니다.




mongoDB 단점

 

  • 유연성 때문에 데이터베이스 구조를 결정을 하지 못하고 미루게될 수 있습니다.

 

  • 각 collection 마다 관계를 가지지 않고 정해진 규격없이 데이터를 저장하기 때문에 데이터의 중복 또는 이상현상이 발생될 수 있습니다. 그렇기 때문에 삽입, 수정, 삭제 시 중복 데이터가 발생되지 않도록 application 레벨에서 관리해주어야 합니다.


  • 금융 시스템과 같이 consistency가 중요한 환경에서는 적합하지 않음




MySQL과 mongoDB 사용 시점

 

MySQL 사용 시점

 

  • 관계를 맺고 있는 데이터가 자주 변경되는 애플리케이션일 경우 NoSQL보다는 MySQL이 유리합니다. ( NoSQL에서라면 여러 컬렉션을 모두 직접 수정해줘야 하기 때문입니다. )

 

  • 스키마가 변경될 여지가 없고, 명확한 스키마가 사용자와 데이터에게 중요한 경우라면 MySQL이 유리합니다.




mongoDB 사용 시점

 

  • 정확한 데이터 구조를 알 수 없거나 변경/확장될 수 있는 경우

 

  • 읽기 처리를 자주하지만 데이터를 자주 변경하지 않는 경우, ( mongoDB는 collection마다 관계를 맺고있지 않기 때문에 수십 개의 문서를 직접 업데이트 해야할 수 있습니다. )

 

  • 대용량의 데이터를 저장해야 하는 경우




mongoDB란?


  • NoSQL DBMS의 한 종류로서 테이블과 같은 schema가 없으며, JSON 형태의 문서 지향적 NoSQL 데이터베이스입니다.

  • mongoDB는 C++로 작성된 오픈소스 문서지향적 Cross-platform 데이터베이스이며, 뛰어난 확장성과 성능을 자랑합니다.




mongoDB 개념


  • mongoDB는 입.출력에서는 JSON 그리고 저장에는 BSON 타입으로 데이터를 저장합니다.




mongoDB의 용어 설명


  • mongoDB에서 사용하는 용어는 RDBMS와 조금 다릅니다. 아래 표와 같이 mongoDB에서는 table를 collection이라 하고, row를 document, db server를 mongod, db client를 mongo라고 부릅니다.

RDBMS mongoDB
database database
table collection
row document
column field
index index
DB Server Mongod
DB Client mongo




스키마 리스의 장점


  • mongoDB는 document 기반 데이터베이스이기 때문에 RDBMS와 다르게 자유로이 데이터 구조를 잡을 수 있습니다.




index


  • query를 더욱 효율적으로 할 수 있도록 document에 기준(key)을 정해 정렬된 목록을 생성합니다. 인덱스가 없다면 MongoDB는 full collection scan 방식으로 데이터를 찾습니다.

  • mongoDB index는 B-Tree 구조로 되어있습니다.




ObjectId


  • 모든 Mongo DB의 document는 기본적으로 12byte 크기의 _id 필드 인덱스가 존재합니다. 컬렉션 생성 시 _id 필드를 따로 지정하지 않으면 mongod 드라이버가 자동으로 _id 필드 값을 ObjectId로 설정합니다. _id 인덱스는 unique하고 이는 MongoDB client가 같은 _id를 가진 문서를 중복적으로 추가하는 것을 방지합니다.

  • ObjectId는 세 가지 영역으로 나뉘어져 있습니다. 첫 4Byte는 UNIX Timestamp 정보를 담고있고, 다음 5byte는 랜덤한 값으로 이루어져 있는데 3byte와 2byte로 나뉩니다. 그리고 마지막 3byte는 클라이언트 머신별로 고유한 키를 이용하여 랜덤한 값을 만들어 사용합니다.




'데이터 베이스 > NoSQL' 카테고리의 다른 글

MongoDB의 특징  (0) 2023.03.29
MongoDB index 종류  (0) 2023.03.22
NoSQL이란?  (0) 2023.01.14
MongoDB transaction 사용법  (0) 2023.01.08

transaction 예시 코드


let session;
try {
  session = await mongoose.startSession();
  await session.withTransaction(async () => {
    const user = await User.findById(
      "63b9873390dac62da722d86c",
      {},
      { session }
    );

    if (user.nickname === "devhun") {
      await session.abortTransaction();
      return;
    }

    user.nickname = "devhun";
    await user.save();
  });
} catch (error) {
  console.log(error);
} finally {
  await session.endSession;
}




startSession


  • startSession을 통해서 다른 세션과 분리된 독립적인 작업을 위한 세션을 생성합니다.

  • 쿼리에 생성한 session을 넣음으로서 해당 session의 트랜잭션에 쿼리를 추가할 수 있습니다.

  • user.save()에서는 이미 findById에서 session을 등록했기 때문에 session을 추가적으로 전달할 필요가 없습니다.




withTransaction


  • withTransaction을 사용하면 접근하려는 document가 다른 트랜잭션에 의해서 사용되고 있어 실패될 경우 재시도까지 하는 메서드입니다.




abortTransaction


  • 특정 조건에 의해서 트랜잭션을 반영하지 않고 중간에 취소해야될 경우 abortTransaction을 통해서 취소할 수 있습니다.




endSession


  • endSession은 트랜잭션 처리 완료 후 세션을 종료할 때 사용하는 메서드입니다. try/catch에서 finally를 통해서 무조건적으로 한 번은 실행될 수 있도록 합니다.




'데이터 베이스 > NoSQL' 카테고리의 다른 글

MongoDB의 특징  (0) 2023.03.29
MongoDB index 종류  (0) 2023.03.22
NoSQL이란?  (0) 2023.01.14
mongoDB 기본 개념 및 용어 설명  (0) 2023.01.13

insert


-- 1
insert into employee values (1, 'MESSI', '1987-02-01', 'M', 'DEV_BACK', 100000000, null);

-- 2
insert into employee values (2, 'JANE', '1996-05-05', 'F', 'DSGN', 90000000, null);

-- 3
insert into employee (name, birth_date, sex, position, id) values ('JENNY', '2000-10-12', 'F', 'DEV_BACK', 3);

-- 4
insert into employee values
    (4, 'BROWN','1996-03-13','M','CEO',120000000, null),
    (5, 'DINGYO','1990-11-05','M','CTO',120000000, null),
    (6, 'JULIA','1986-12-11','F','CFO',120000000, null),
    (7, 'MINA','1993-06-17','F','DSGN',80000000, null),
    (8, 'JOHN','1999-10-22','M','DEV_FRONT',65000000, null),
    (9, 'HENRY','1982-05-20','M','HR',820000000,null),
    (10, 'NICOLE','1991-03-26','F','DEV_FRONT',90000000, null),
    (11, 'SUZANNE','1993-03-23','F','PO',75000000, null),
    (12, 'CURRY','1998-01-15','M','PLN',85000000, null),
    (13, 'JISUNG','1989-07-07','M','PO',90000000, null),
    (14, 'SAM','1992-08-04','M','DEV_INFRA',70000000, null)

  • insert시 attribute 이름을 생략할 경우 반드시 attribute가 정의된 순서대로 모두 insert할 데이터를 셋팅해주어야 합니다.

  • 세 번째 방법처럼 attribute 이름을 명시하고 쿼리문을 작성할 경우 순서를 변경해서 insert할 데이터를 셋팅할 수 있으며, insert 하고싶은 데이터만 셋팅할 수 있습니다.

  • 네 번째 방법은 여러 튜플을 한 번에 추가할 수 있습니다.




sql constraint로 인한 에러가 발생되었을 때 디버깅 방법



show create table employee;

  • sql constraint로 인한 에러가 발생되었을 때 에러 문구를 확인하고 위 sql문을 실행하여 constraint 이름이 어떻게 정의되었는지 비교하여 디버깅하면 어떤 constraint에 의한 에러인지 찾기가 수월합니다.




update


update employee set dept_id = 1003 where id = 1;

update employee set salary = salary + 10000000 where dept_id = 1003;

update employee, works_on
set salary = salary * 2
where employee.id = works_on.empl_id and works_on.proj_id = 2003;

  • update 문은 반드시 where 절을 신경써서 작성해주어야 합니다.




delete



delete from employee where id = 8;

delete from works_on where empl_id = 5 and proj_id != 2001;

-- 모든 project를 삭제
delete from project;

  • update 문과 같이 where 절을 꼭 신경써서 작성해야 됩니다.




SQL(Structured Query Language)

 

  • RDBMS에서 데이터 컨트롤에 쓰이는 표준 언어이지만 실제 구현에 강제가 없기 때문에 RDBMS마다 제공하는 SQL의 스펙이 조금씩 다릅니다.




SQL 주요 용어

 

relation data model SQL
relation table
attribute column
tuple row
domain domain

 

  • relation data model에서 사용하는 용어와 SQL에서 사용하는 용어는 위와 같이 맵핑됩니다.




MySQL에서의 database vs schema

 

  • MySQL에서는 database와 schema는 같은 의미를 같습니다. 그렇기 때문에 CREATE DATABASE company == CREATE SCHEMA company가 같은 의미를 같습니다. 하지만, 다른 RDBMS에서는 다른 의미를 가질 수 있습니다.




MySQL 데이터 타입

 

숫자형

타입 정의 범위 UNSIGNED 사용가능 여부
TINYINT(n) 정수형 데이터 타입 - 1 Byte(2^8) - 128 ~ + 127 또는 0 ~ 255 수 표현 가능 - 1Byte(2^8) - 128 ~ + 127 또는 0 ~ 255 수 표현 가능 O
SMALLINT(n) 정수형 데이터 타입 - 2 Byte(2^16) - 32,768 ~ 32,167 또는 0 ~ 65536수 표현 가능 O
MEDIUMINT(n) 정수형 데이터 타입 - 3 Byte - 8,388,608 ~ 8,388,607 또는 0 ~ 16,777,215 수 표현 가능 O
INT(n) 정수형 데이터 타입 - 4 Byte - 2,147,483,648 ~ 2,147,483,647 또는 0 4,294,967,295 수 표현 가능 O
BIGINT(n) 정수형 데이터 타입(LONG) - 8 byte - 2^64 - 1 표현 가능 O
DECIMAL(m, d) 고정 소수형 데이터 타입고정(길이+1 byte) - 화폐 데이터와 같이 데이터의 정확도를 요하는 경우에 주로 사용
M의 최대값은 65, D는 소수 자릿수이며 0이면 소수점 가지지 않음
- 소수점을 사용한 형태 - Default: m ⇒ 10 X
FLOAT(n) 부동 소수형 데이터 타입 - 4 byte - 부동 소수점을 사용한 형태 X
DOUBLE(n) 부동 소수형 데이터 타입 - 8 byte - DOUBLE을 문자열로 저장 X




문자형

 

타입 정의 사이즈
CHAR(n) - 고정 길이 데이터 타입 - 지정된 길이보다 짧은 데이터 입력 시 나머지 길이는 공백으로 채워짐 0 ~ 255 (byte)
VACHAR(n) - 가변 길이 데이터 타입 - 지정된 길이보다 짧은 데이터 입력시 공백으로 채우지 않음 0 ~ 65,535 (byte)
TINYTEXT(n) - 문자열 데이터 타입(최대 255 byte) 0 ~ 255 (byte)
TEXT(n) - 문자열 데이터 타입(최대 65,535 byte) 0 ~ 65,535 (byte)
MEDIUMTEXT(n) - 문자열 데이터 타입(최대 16,777,215 byte) 0 ~ 16,777,215 (byte)
LONGTEXT(n) - 문자열 데이터 타입(최대 4,294,967,295 byte) 0 ~ 4,294,967,295 (byte)
  • 핸드폰 번호와 같이 고정된 길이를 저장할 떄는 가변 길이인 VARCHAR 보다는 CHAR를 사용하는 편이 성능에 조금 더 이점이 있습니다.




날짜와 시간

 

타입 정의 길이 형식 길이
DATE 날짜(년도, 월, 일) 형태의 기간 표현 데이터 3 byte 0000-00-00 (YYYY-MM-DD) 1000-01-01 ~ 9999-12-31
TIME - 시간(시, 분, 초) 형태의 기간 표현 데이터 - hh:mm:ss or hhh:mm:ss 표현 가능 3 byte 00:00:00 .
DATETIME 날짜와 시간 형태의 기간 표현 데이터 8 byte 0000-00-00 00:00:00 (YYYY-MM-DD hh:mm:ss) 1000-01-01 00:00:00.000000 ~ 9999-12-31 23:59:59.999999
TIMESTAMP 날짜와 시간 형태의 기간 표현 데이터 타입 시스템 변경 시 자동으로 그 날짜와 시간이 저장 4 byte Integer .
YEAR 년도 표현 데이터 타입 1 byte 0000 .
  • TIMESTAMP 같은 경우는 UTC 값을 저장하여 타임존에 따라 변환하여 사용할 수 있습니다.




이진 데이터 타입

 

타입 정의 길이
BINARY(n) & BYTE(n) CHAR 형태의 이진 데이터 타입 최대 255 byte
VARBINARY(n) VARCHAR 형태의 이진 데이터 타입 최대 65,535 byte
TINYBLOB(n) 이진 데이터 타입 최대 255 byte
BLOB(n) 이진 데이터 타입 최대 65,535 byte
MEDIUMBLOB(n) 이진 데이터 타입 최대 16,777,215 byte
LONGBLOB(n) 이진 데이터 타입 최대 4,294,967,295 byte




데이터 베이스 생성 및 삭제 관련 SQL

 

-- 데이터 베이스 생성
create database company;

-- 선택된 데이터 베이스 확인
select database();

-- 사용할 데이터 베이스 선택
use company;

-- company 데이터베이스 삭제
drop database company;




테이블 생성 SQL

 

create table department(
    id int primary key,
    name varchar(20) not null unique,
    leader_id int
);




foreign key를 사용하는 방법

 

유튜버 "쉬운 코드"님의 영상 자료 일부를 참조하였습니다.

  • foreign key를 설정할 때 참조하는 값이 삭제되거나 업데이트될 때 foreign key value를 어떻게 할 것인지를 옵션을 설정할 수 있습니다.


  • MySQL에서 RESTRICT와 NO ACTION은 완전히 동일합니다.


  • on delete는 참조하는 foreign key가 삭제되었을 때 이벤트를 지정할 수 있으며, on update는 foreign key가 업데이트 되었을 때 이벤트를 지정할 수 있습니다.




foreign key를 적용하여 테이블 생성

 

create table employee(
id int primary key,
   name varchar(30) not null,
   birth_date date,
   sex char(1) check(sex in('M','F')),
   position varchar(10),
   salary int default 50000000,
   dept_id int,
   foreign key (dept_id) references department(id)
    on delete set null
       on update cascade,
check (salary >= 50000000)
);

create table project(
id int primary key,
   name varchar(20) not null unique,
   leader_id int,
   start_date date,
   end_date date,
foreign key (leader_id) references employee(id)
    on delete set null
       on update cascade,
check(start_date < end_date)
);

create table works_on(
empl_id int,
   proj_id int,
   primary key(empl_id, proj_id),
   foreign key(empl_id) references employee(id)
    on delete cascade
       on update cascade,
foreign key(proj_id) references project(id)
    on delete cascade
       on update cascade
);

-- department 테이블은 다른 테이블이 만들어진 후 만들어졌기 떄문에 alter table로 foreign key 지정
alter table department add foreign key(leader_id)
references employee(id)
   on delete set null
   on update cascade;




constraint 이름 명시하기

 

create table test(
    age int constraint age_over_20 check(age > 20)
)

 

  • 위와 같이 constraint를 지정할 경우 제약 조건을 위반하였을 때 에러 메시지에 constraint의 이름도 같이 담기기 때문에 에러가 발생되었을 때 조금 더 찾기 수월해집니다.




relational data model에서의 용어

 

 

domain

 

  • "set of atomic values"로서 attribute가 가질 수 있는 원자적인 값의 집합을 의미힙니다.




demain name

 

  • domain 이름을 의미합니다.




attribute

 

  • domain이 relation에서 맡은 역할 이름으로서 테이블에서 데이터들의 속성 이름입니다.




tuple

 

  • 각 attribute의 값으로 이루어진 리스트 즉, 테이블에서 하나의 행(row) 입니다.




relation

 

  • tuple들의 집합을 relation을 의미하며 즉, 테이블으로도 불립니다.




relation name

 

  • relation의 이름을 의미합니다.




relation schema

 

  • relation의 구조를 나타내며, relation 이름과 attributes 리스트로 표기됩니다.




degree of a relation

 

  • relation schema에서 attribute의 수를 의미합니다.




relational database

 

  • relational data model에 기반하여 구조화된 database를 의미하며, relational database는 여러 개의 relations로 구성됩니다.




relational database schema

 

  • relation schemas들의 집합과 relations간의 무결성 제약조건(integrity constraints set)으로 구성된 schema를 의미합니다.




relation의 특징

 

  • relation은 중복된 tuple을 가질 수 없습니다.

 

  • relation의 tuple을 식별하기 위해 attribute의 부분 집합을 key로 설정합니다.

 

  • relation에서 tuple의 순서는 중요하지 않습니다. 순서가 바뀐다고하여 relation의 의미가 바뀌지 않기 때문입니다.

 

  • 하나의 relatino에서는 attribute의 이름은 중복돼선 안됩니다. 또한 attribute의 순서도 중요하지 않습니다.

 

  • attribute는 atomic 해야됩니다.




relation의 key의 의미

 

super key

 

  • relation에서 tuple을 unique하게 식별할 수 있는 attributes set을 말합니다. 즉, super 키는 하나의 attribute 또는 여러 개의 attributes가 될 수 있습니다.

 

  • 슈퍼키는 릴레이션을 구성하는 모든 튜플에 대해 유일성을 만족시키지만, 최소성은 만족시키지 못할 수 있습니다. 즉, super key의 attribute 일부를 가지고 튜플을 식별할 수도 있습니다.




candidate key

 

  • 어느 한 attribute라도 제거하면 unique하게 tuples를 식별할 수 없는 super key를 의미합니다. candidate key는 minimal super key로도 불립니다. 즉, candidate key는 유일성과 최소성을 만족하는 key 입니다.




primary key

 

  • relation에서 tuple을 unique하게 식별하기 위해 선택된 candidate key를 의미합니다. 한 relation에서 특정 튜플을 유일하게 식별할 수 있으며 NULL을 가질 수 없습니다.




unique key

 

  • unique key는 primary key가 아닌 candidate key를 의미합니다. 혹은 alternate key라고도 불립니다.




foreign key

 

  • 다른 relation의 primary key를 참조하는 attribute를 말합니다.




constraint(제약 조건)

 

  • relatinoal database의 relations들이 언제나 항상 지켜줘야 하는 제약 사항을 의미힙니다.




implicit contraints

 

  • relational data model 자체가 가지는 constraint를 의미합니다. relation내에서 중복되는 tuple 또는 중복되는 attribute 가질 수 없다는 제약 사항이 있습니다.




schema-based constraints(or explicit constraints)

 

  • 주로 DDL을 통해 schema에 직접 명시할 수 있는 constraints를 의미합니다. 예를들어 제약 사항을 통해서 attribute의 value를 domain에 속한 value로 제한하거나 서로 다른 tuple이 동일한 key 값을 가질 수 없게 하거나 NULL 값을 가질 수 없게 지정할 수 있습니다.




+ Recent posts