reference :
데이터베이스라는 데이터의 집합을 만들고, 저장 및 관리할 수 있는 기능들을 제공하는 응용 프로그램. 구조적으로 정보를 저장하고 원활하게 삽입 삭제 갱신작업을 할 수 있다.
기본적으로 높은 차수의 정규형은 낮은 차수의 정규형을 모두 만족하여야 한다. 즉, 제3정규형은 제1,2 정규형의 조건을 모두 만족하여야 하며, BCNF는 1,2,3 정규형을 기본적으로 모두 만족하고 있어야 한다
sql명 / use / 호스트 아이피 / 패스워드
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
drop / create database test;
> use test;
Database changed
show tables;
use로 test 데이터베이스에 접근함. 어떤 테이블이 있는지 확인.
나갈땐 exit;로 빠져나와야 데이터 손실을 예방할 수 있다.
TABLE제작. 속성을 부여함
create table abc(no int,name varchar(10));
CREATE TABLE DEF(BUNHO INT(5),IRUM CHAR(10))ROW_FORMAT=COMPRESSED;
COMPRESSED는 압축
INSERT INTO ABC(NO,NAME) VALUES(1,'신기해');
INSERT INTO ABC(NO,NAME) VALUES('2','신기루');
DELETE FROM ABC WHERE NO = 2;
cafe 63
String 형은 CHAR / VARCHAR 를 주로 사용한다.
VARCHAR는 동적이기때문에 메모리 절약차원에서는 좋다.
다만 CHAR가 처리속도가 더빠른편이다.
이미지나 사운드는 BLOB, 많은 자료는 TEXT,
매우 많은 자료를 다룰땐 CLOB를 사용한다.
테이블 생성후 INSERT문의 여러 사용법
--테이블 생성
CREATE TABLE aa(bun INT, irum CHAR(10),inwon INT(5),juso VARCHAR(20));
--테이블 정보
DESCRIBE aa;
DESC aa;
SHOW TABLE STATUS;
--자료추가
/*
--INSERT INTO 테이블명(칼럼명,..) VALUES(입력자료,...)
*/
INSERT INTO aa(bun,irum,inwon,juso) VALUES(1,'인사과',5,'강남구 역삼동 12번지');
INSERT INTO aa VALUES(2,'영업과',12,'강남구 역삼동 12번지');
INSERT INTO aa(bun,irum) VALUES(3,'자제과');
INSERT INTO aa(inwon,juso,bun,irum) VALUES(10,'서초구 서초1동 1',4,'총무과');
SELECT * FROM aa;
DELETE FROM aa WHERE(irum = '자제과');
SQL문은 양식에 맞지않게 순서를 어긴다거나 지정 크기보다 길게 입력하거나 제대로 지정하지않고 데이터를 작성하려 하면 에러가 발생한다.
INSERT INTO AA VALUES('자제2과',5); --ERR
INSERT INTO AA(BUN,IRUM) VALUES('자제2과',5); --ERR
INSERT INTO AA(BUN,IRUM) VALUES('기분좋은 일만 생기는 멋진과',5); --ERR
UPDATE 테이블 명 SET 칼럼명1 = 수정값1, .... WHERE 조건
DELETE FROM 테이블명 WHERE 조건
SELECT * FROM AA;
DELETE FROM AA WHERE BUN = 4;
DELETE FROM AA;
TRUNCATE TABLE AA; -- WHERE로 일부삭제가 불가
DROP TABLE AA; -- 구조를 포함한 테이블 전체 삭제
DELETE FROM AA; 는 모든 레코드를 삭제한다. 구조(열)만 남게되고
로그를 남기기때문에 TRUNCATE에 비해 속도가 비교적 떨어진다.
기본키 제약 조건 : PRIMARY KEY
중복 레코드 방지. 특정 컬럼에 적용.
해당칼럼은 NULL을 허용하지 않게됨
CREATE TABLE AA(BUN INT PRIMARY KEY,IRUM CHAR(10));
DESC AA;
INSERT INTO AA VALUES(1,'AA');
INSERT INTO AA VALUES(1,'BB'); -- PK ERR
INSERT INTO aa(BUN) VALUES(2);
SELECT * FROM AA;
INSERT INTO BB(BUN) VALUES(1); -- IRUM 컬럼에는 자료를 반드시 입력해야함 NOT NULL
제약조건 수정
-- alter table 테이블명 add constraint 제약조건명 제약조건(대상컬럼명)
-- alter table 테이블명 add constraint 제약조건명
ALTER TABLE aa ADD CONSTRAINT ck_name CHECK(irum IN('abc','mbc'));
이름은 abc와 mbc만 넣을 수 있다는 제약조건을 추가함
check 제약조건 : 입력되는 자료의 특정 컬럼값 검사
CREATE TABLE aa(bun INT , irum VARCHAR(10), nai INT CHECK(nai >= 20));
INSERT INTO aa VALUES(1,'tom',23);
INSERT INTO aa VALUES(2,'tom2',13); --err
입력 나이가 20세 이상만 허용함.
UNIGUE 제약조건 : 특정 칼럼의 동일값 불허
CREATE TABLE aa(BUN INT PRIMARY KEY, IRUM CHAR(10) UNIQUE);
DESC aa;
INSERT INTO aa VALUES(1,'AA');
INSERT INTO aa VALUES(3,'BB');
INSERT INTO aa VALUES(2,'CC');
INSERT INTO aa VALUES(4,'BB'); -- UNIQUE ERR
INSERT INTO aa VALUES(3,'DD'); -- PK ERR
/* SQL 오류 (1062): Duplicate entry 'BB' for key 'IRUM' */
이름 칼럼은 UNIQUE이기때문에 동일한 BB를 입력할 수 없었다.
default : 특정칼럼에 초기치를 부여
CREATE TABLE CC(BUN INT PRIMARY KEY, IRUM CHAR(10) NOT NULL, JUSO VARCHAR(20) DEFAULT '역삼1동');
ALTER TABLE CC ALTER COLUMN JUSO SET DEFAULT '역삼1동';
INSERT INTO CC(BUN,IRUM) VALUES(2,'OSCAR');
CREATE 또는 ALTER에서 DEFAULT값을 줄 수 있다. 위 INSERT문에서 주소를 지정하지 않았지만 DEFAULT값으로 기본값이 들어가있는걸 확인했다.
AUTO_INCREMENT 특정 INT컬럼이 자동으로 증가
CREATE TABLE DD(BUN INT AUTO_INCREMENT PRIMARY KEY,IRUM CHAR(10) NOT NULL);
또는
ALTER TABLE DD AUTO_INCREMENT = 1;
INSERT INTO DD(IRUM) VALUES('JAMES');
INSERT INTO DD(IRUM) VALUES('TOM');
..
.
ROW가 증가할때마다 지정한 BUN변수도 함께 증가한다. 아예 지정한적이 없거나 NULL, 0으로 지정하더라도 BUN변수는 작성순서대로 번호가 붙는다.
만약 1,2,3을 넣다가 6을 넣으면 7부터 증가한다.
명령어는 툴마다 다를 수 있다.
SET @@AUTO_INCREMENT = 3;
번외로 SET으로 N씩 증가하도록 지정할 수도 있다.
FOREIGN KEY[FK] : 다른테이블의 컬럼값을 참조.
외래키는 두 테이블을 서로 연결하는 데 사용되는 키이다.
외래키가 포함된 테이블을 자식 테이블이라고 하고 외래키 값을 제공하는 테이블을 부모 테이블이라한다.
외래키 값은 NULL이거나 부모 테이블의 기본키 값과 동일해야한다. (참조 무결성 제약조건)
부모 테이블의 기본키, 고유키를 외래키로 지정할 수 있다.
부모 테이블의 기본키, 고유키가 여러개의 컬럼으로 이루어져 있다면 부모가 가진 기본키, 고유키 컬럼을 원하는 개수만큼 묶어서 외래키로 지정할 수 있다.
컬럼명이 일치할 필요는 없지만 동일한 성격을 지닌 컬럼, 기본키와 역할이 같은 컬럼이 외래키의 대상으로 적절하다
<부모테이블>
CREATE TABLE SAWON(
BUN INT PRIMARY KEY,
IRUM VARCHAR(10) NOT NULL,
BUSER CHAR(10)
);
<자식테이블>
CREATE TABLE GAJOK(
CODE INT PRIMARY KEY,
NAME VARCHAR(10) NOT NULL,
BIRTH DATETIME,
SAWON_BUN INT,
FOREIGN KEY(SAWON_BUN) -- FK
REFERENCES SAWON (BUN) -- PK
);
자식테이블에서 FOREIGN KEY(필드) REFERENCES 부모테이블(필드)
형태로 선언하여 두 테이블간의 연결고리를 만들었다.
ALTER로도 외래키를 사용할 수 있다.
ALTER TABLE 테이블이름
ADD [CONSTRAINT 제약조건이름]
FOREIGN KEY (필드이름)
REFERENCES 부모테이블이름 (필드이름)
CREATE TABLE SAWON(
BUN INT PRIMARY KEY,
IRUM VARCHAR(10) NOT NULL,
BUSER CHAR(10)
);
CREATE TABLE GAJOK(
CODE INT,
NAME VARCHAR(10) NOT NULL,
BIRTH DATETIME,
SAWON_BUN INT,
PRIMARY KEY(CODE),
FOREIGN KEY(SAWON_BUN) -- FK
REFERENCES SAWON (BUN) -- PK
);
1> INSERT INTO GAJOK VALUES(103,'신선해','2000-2-12',4); -- FK ERR
2> DELETE FROM SAWON WHERE BUN = 1; -- ERR
1> 참조할때 부모테이블에 없는 외래키는 넣을 수 없다.
2> 부모에서 행을 지우려해도 지워지지 않았다.
이미 자식에서 해당 행을 참조중이기 때문이였는데 이는 관련된 자식 행을 먼저 지우고
부모에서 지우면 가능하다.
ON DELETE CASCADE 와 같은 옵션을 이용 할 수도 있다.
이는 DROP TABLE 에서도 똑같이 적용된다. 자식을 지워야 지울 수 있음
1) On Delete
Cascade : 부모 데이터 삭제 시 자식 데이터도 삭제
Set null : 부모 데이터 삭제 시 자식 테이블의 참조 컬럼을 Null로 업데이트
Set default : 부모 데이터 삭제 시 자식 테이블의 참조 컬럼을 Default 값으로 업데이트
Restrict : 자식 테이블이 참조하고 있을 경우, 데이터 삭제 불가
No Action : Restrict와 동일, 옵션을 지정하지 않았을 경우 자동으로 선택된다.
2) On Update
Cascade : 부모 데이터 업데이트 시 자식 데이터도 업데이트
Set null : 부모 데이터 업데이트 시 자식 테이블의 참조 컬럼을 Null로 업데이트
Set default : 부모 데이터 업데이트 시 자식 테이블의 참조 컬럼을 Default 값으로 업데이트
Restrict : 자식 테이블이 참조하고 있을 경우, 업데이트 불가
No Action : Restrict와 동일, 옵션을 지정하지 않았을 경우 자동으로 선택된다.