mysql에 사용자 만들때
create user 'marco'@'%' with identified by 'db1004';
유저 테이블에 마르코가 추가된다.
마르코라는 유저가 db1004를 비번으로 유저가 만들어진다.
db를 자기자신의 정보
db가 자기자신의 정보를 이용해 db를 관리하는 것을 자기기술성, self-descriptive한것이라고 한다.
createdb asiadb
grant all on asia.* to 'marco'@'%' with grant option
아시아db 안에 모든 것을 접근할 권한을 마르코에게 준다.
with grant option-> 이것으로 인해 아시아도 권한설정할 권한을 부여하게된다.
flush privileges
새로고침같은 역할.
create db란 명령이하는역할이 무엇일까?
create user하면 하나의 1 row에 추가, 삽입된다. 반면 create db를 하면 db가 만들어진다.
디스크에 db가 들어간다. asia.db 파일이 디스크에 들어간다. 파일 포맷은 byte 파일이다. 저장 공간 효율적인 것은 바이트파일이다.
use asia; 테이블 만들기위한 디비 선택해주고
create table corea
DDL: 언어로 코리아란 테이블을 아시아 디비 안에 만들었다.
Os 종속적이지 않은 것을 맘ㄴ들기 위해선?
1)오라클이 File System을 쓰지 않고, 낸드 플래쉬 디스크 위에 직접 써서 오라클이 직접 제어한다. 운영체제의 도움없이 하드디스크를 직접 제어한다는 것은 건방진 생각이다.
그런데 그 사이 unix window 등이 좋아졌고, linux가 ok 수준이다. 리눅스가 좋긴한데 조금 마음 안들면 리눅스를 수정해서 오라클 리눅스를 만들었다. 후졌지만, 배포가 아주 잘된다는 장점이 있다. 오라클이 예전에는 오라클 설치시
마이크로소프트사는 MS sql와 윈도우 사이에 sql os를 끼워넣어서 잘 돌아가게 했다.
mysql은 대충 돌아간다. 대신 오픈소스여서 많은 커뮤니티들이 mysql을 서포트해서 돌아간다
하드웨어 위 OS Linux 위 EX4(FS) 위 Mysql이 돌아간다.
문제는 transaction
커밋하고 나면 데이터가 디스크에 반영이 되어야한다. 그 뜻은 디스크의 실제 io 작업이 io만 일어나는 것에 그치는게 아니라 hw에 write date가 반영이 되어야한다. 디스크에 buffer가 있다. 파일시스템, 커널, 하드웨어에 전부 버퍼가 있어서 이것을 전부 뚫고 들어가 디스크를 써줘야한다. flush라는 시스템 콜(fsync)를 해줘야한다. 그리고 flush가 잘 동작하려면 4개의 모든 api가 잘 협조해줘야한다.
mysql은 실행방법이 한가지밖에없어서 빠르다. 대신 복잡한 쿼리에서 성능이 느려진다. 오라클은 어떻게 효율적으로 처리할지 고민하느라 짧은 쿼리에서 mysql에 성능이 떨어진다.
join
jpq에서 메소드 findByName처럼 이름만 갖다주면 작동하는 거 reflection 방식이다.
db를 쪼개서 슈퍼페이지의 슈퍼블록. 슈퍼는 메타와 같은 뜻으로, 초-란 뜻이다.
테이블을 만들어서 1번 블록은 user테이블로 쓰겠다고 한것이다. 테이블을 하나 만드는 순간 블록 하나가 테이블용으로 예약이 된다. 노트 맨 앞에 인덱스 만드고 실제 데이터는 그 다음에 들어간다.
커다란 파일을 쪼개서 16kb 고정크기로 파일이 생긴다.??
데이터베이스 파일 안에 고정 크기 페이지가 생기고 테이블은 페이지들에 나뉘어서 저장된다.
16kb
레코드에 저장하는 방법은두가지가 있다.
RS(row store) 레코드(네임+패스워드) 하나씩 저장하는 방법을
CS(Column store) 이 페이지엔 네임만 저장, 저긴 패스워드만 저장.
rdb는 row store로 되어있다. 레코드 한개 읽으려면 RS에선 1개, CS에선 레코드의 칼럼 개수만큼 페이지를 읽어야한다.
OLTP에선 RS가 좋고,, OLAP(빅데이터 분석: 매출 집계, 등..) 엔 CS가 유리하다. 분석용 db는 아마존 레드쉬프트가 있어서, 빨간색을 몰아내자는 의미가 있다. 빨간색은 오라클을 타케팅한 것이다. (이클립스는 일식으로, sun mycro systems을 가린다는뜻)
DROP TABLE IF EXISTS PROF;
CREATE TABLE PROF(
PID INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(64), //CHAR(64)
SALARY DEC(10,2)
) CHARSET = 'utf8'
INSERT INTO PROF VALUES(NULLL, 'ABC', 9999.99)
INSERT INTO PROF VALUES(NULL, 'BOO', 500)
SELECT * FROM PROF;
DROP TABLE IF EXISTS COURSE
CREATE TABLE COURSE(
CID CHAR(5) PRIMARY KEY,
PROFID INT
) CHARSET = 'utf8'
ALTER TABLE COURSE ADD COLUMN(NAME VARCHAR(64) AFTER CID;
INSERT INTO COURSE VALUES('CS246', 'DB BASIC', 1);
INSERT INTO COURSE VALUES('CS007', 'DDD', 2);
SELECT * FROM COURSE;
//10진수 소수점2자리란 뜻(달러)
//INT로하면 (부동소수점때문에)정확한 계산이 안된다. 돈은 반드시 decimal 10진수로 저장해야한다.
VARCHAR은 가변길이로, 오버헤드가 있을수있다.
DB는 집합과관계있다. 집합에서 원소의 순서는 의미가 없지만,실무에선 실제론 의미가 있다. ALTER로 저장 순서를 바꿀 수 있따.
PROF 와 COURSE간 관계
교수1명이 COURSE 여럿 담당. PROF ID가 교수의 PID를 참조해서 값을 가진다. COURSE에서 PROFID로 존재하지 않는 교수의 ID(3번이라든지)를 넣을수는 없고, 아무 의미 없다. 존재하는 교수의 ID를 넣어야 누군지 알수가 있다. 3번 교수가 없기에 COURSE테이블에 PROFID부분에 3번을 넣는다면,
INSERT INTO COURSE VALUES('CS333', '수업3', 3);
INSERT INTO COURSE VALUES('CS444', '수업4', NULL);
DB에서 NULL은 어떤 값인지 아직 모른다는 의미이다. 네번쨰는 문제가 안되고, 수업3은 문제가 되는 의미이다. PROFID는 FOREIGN KEY이다. 부모 테이블인 PROF 테이블의 PRIMARY KEY를 참조해야한다.
외래키값은 반드시 부모 테이블의 P KEY값(또는 NULL)이어야한다.
(참조 무결성 제약조건)
DELETE FROM COURSE WHERE PROFID=3;
하면 3번 수업이 삭제된다.
과목과 교수를 출력하는 것이 오늘의 미션이다.
SELECT FROM PROF CROSS JOIN COURSE;
두 테이블을 CROSS JOIN 하면 어떻게 되나? 가능한 순서쌍 전체를 만들어준다. 곱집합이고, 카테션 프로덕트라고 부른다.
카테션이란, 카테시우스의~ 란 뜻이다. 카테시우스가 데카르트이다.
그럼 이 카테션 프로덕트에서 의미 있는 것만 필터링 하려며 ㄴ어떻게 해야할까?
SELECT FROM PROF P CROSS JOIN COURSE C WHERE P.PID=C.PROFID;
교수가 NULL인 수업이 사라진다. 조인할 대상이 사라졌기 때문이다.
SELECT P.PID, P.NAME, C.NAME FROM PROF P CROSS JOIN COURSE C WHERE P.PID=C.PROFID;
원하는 것(이름)만 골라보기
SELECT P.PID, P.NAME, C.NAME
FROM PROF P INNER JOIN COURSE C
ON P.PID=C.PROFID;
몽고디비??에서 하는 법...?
ALTER TABLE COURSE
ADD CONSTRAINT FK_PROF_COURSE
FOREIGN KEY(PROFID) REFERENCES PROF(PID);
코스 테이블을 바꿀 것인데, 외래키를 추가하는 것을 제약조건으로 할 것이다.
이렇게 하면
INSERT INTO COURSE VALUES('CS555', '수업5', 5);
와 같이 존재하지 않는 교수를 추가했을 때 안되게 한다.
외래키제약조건 추가시 디비가 외래키로 인덱스?를 하나 더 추가한다.