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다, 우영우, 한빛미디어