DBMS: "DB 관리 도구" - oracla, mysql, ms-sql, mariadb
DBMS가 DB를 관리하기 위한 용도로 사용하는 언어: SQL -> 특정 벤더에 의존적이지 않다
SQL + 자체 기술 -> 벤더에 의존적인 SQL(대표적으로 오라클 -> PL/SQL)
Database: 데이터를 담는 큰 그릇
database는 data를 table에 담아 정리한다.
생성된 테이블은 관계를 형성하여 유의미한 데이터를 추출해 낼 수 있게 된다.
이러한 관계형 database는 여전히 많이 사용되고 있지만, 최근의 경향과 같이 소규모 데이터의 잦은 입출력에 대해서는 관계형 보다 NoSQL 등을 활용하는 경향도 늘어나고 있다.
기본키(PK): 각 행을 구분하는 유일한 열
회원가입 시 각 행의 유일성을 보장 받기 위하여 ID를 필수 입력 사항으로 받는다. 이 때 기존 DB에 동일한 ID가 있는지 여부를 미리 확인하고, 없을 경우에 DB에 행을 작성하게 된다. 우리는 ID를 통해 특정 유저를 확인할 수 있는데 이러한 ID와 같은 열을 기본키로 지정할 수 있다. -> 기본키로 지정되면 데이터 입력이 필수이므로 별도로 체크하지 않더라도 NOT NULL로 지정된다. 비슷하게 데이터 작성 시 유일성을 보장 받기 위한 것으로 UNIQUE를 사용할 수 있다. 이는 회원가입 시 휴대폰 번호와 같은 것으로 유일성을 보장 받으나, 반드시 입력해야 하는 사항은 아니다.
FK(외래키) -> 외래키를 따라가서 부모 테이블을 만나면 유일한 데이터를 만날 수 있다.
데이터베이스 생성 -> 테이블 생성 -> 데티업 입력 -> 활용(select 정렬, 구매 전체 금액 -> 포인트 지급): 웹이나 CLI와 연결하여 사용자에게 정보를 제공
weget http://dw.hanbit.co.kr/mariadb/10.3/employees.zip
mkdir dbtest
mv employees.zip dbtest/
cd dbtest/
unzip employees.zip

mysql -u root -p1234
source employees.sql

show tables;

desc employees;

select * from employees limit 100;

select * from employees where first_name = 'Jayson';

CREATE TABLE indextbl (first_name varchar(14), last_name varchar(16), hire_date date);
show tables;

desc indextbl;

insert into indextbl
select first_name, last_name, hire_date
from employees limit 500;

select * from indextbl;

select * from indextbl where first_name = 'Mary';

explain select * from indextbl where first_name = 'Mary';
-> type 부분을 보면 ALL이라고 되어있음
-> 전체 데이터를 다 보고 검색했다는 뜻

CREATE INDEX idx_test ON indextbl(first_name);

explain select * from indextbl where first_name = 'Mary';
-> type를 보면 ref라고 되어있음
-> key: idx_test
-> Extra: Using index condition
-> index를 적용하여 데이터를 검색헀음


CREATE VIEW v_emp
AS
SELECT first_name, hire_date
FROM employees LIMIT 50;

show tables;

select * from v_emp;

[HeidiSQL]
v_emp 생성되었음

[HeidiSQL]
DELIMITER //
CREATE PROCEDURE myproc()
BEGIN
SELECT FROM indextbl
WHERE first_name = 'Maris';
SELECT FROM indextbl
WHERE first_name = 'Lobel';
END //
DELIMITER ;

CALL myproc();

BEFORE/AFTER :
INSTEAD OF :
OLD.컬럼명 : DELETE 시 임시 저장
NEW.컬럼명 : insert,update,delete 작업시 변경할 새로운 데이터를 임시저장. 따라서 NEW 를 조작하면 입력되는 값을 변경시킬 수 있음.
CREATE TABLE deletedUserTBL (
id CHAR(8),
username CHAR(20),
email CHAR(30),
deletedDate DATE -- 삭제한 날짜
);

DELITIMER //
CREATE TRIGGER trg_deletedUserTBL -- 트리거 이름
AFTER DELETE -- 삭제 후에 작동하게 지정
ON usertbl -- 트리거를 부착할 테이블
FOR EACH ROW -- 각 행마다 적용시킴
BEGIN
-- OLD 테이블의 내용을 백업 테이블에 삽입
INSERT INTO deletedUserTBL
VALUES (OLD.id, OLD.username, OLD.email, CURDATE());
END //

SELECT * FROM usertbl; -- 원본 테이블

DELETE FROM usertbl WHERE id = 'user1'; -- 사용자 삭제
SELECT FROM usertbl; -- 원본테이블(user1 없는 것 확인)

SELECT FROM deletedUserTBL; -- 삭제된 사용자 저장된 테이블(user1 정보 확인 가능)



usertbl 삭제해보기

내보냈던 SQL 파일 불러오기


삭제했던 usertbl 정상적으로 불러와졌음

dbForge v8.0.124 설치
http://dw.hanbit.co.kr/mariadb/10.3/dbforgemysql80exp.exe

centos와 연결 설정
모델링에서의
실선: 부오 테이블의 PK가 자식 테이블의 Fk가 되는 경우
점선: 부모 테이블의 PK가 자식 테이블의 일반 속성이 되는 경우
(부모가 없어도 자식이 생기는 경우)
새 모눈종이
file -> new -> database diagram


데이터베이스 불러오기 -> employees 데이터베이스 선택

새 데이터베이스 생성

db name: modelDB

테이블 생성

usertbl 생성

buytbl 생성


FK 설정

각 테이블의 username 연결


usertbl에 행 삽입

buytbl에 행 삽입

usertbl에 입력했던 username을 drop down list에서 선택

테이블 조회

아래의 순서 지켜야 함
select
from
where
group by
having
order by
ex) userTbl에서 경남 사람의 키가 170, 173일 때
다음과 같은 서브쿼리 오류 발생
subquery returns more than 1 row

1) ANY(SOME) -> 여러 조건 중 하나라도 만족
-> 170 이상인 사람

2) ALL -> 여러 조건 모두 만족해야 함
-> 173 이상인 사람

3) = ANY -> IN 과 같은 기능

4) IN

참고: 이것이 MariaDB다, 우영우, 한빛미디어