논리 연산자
SELECT * FROM bbq WHERE 위도 > 129.028 AND 경도 > 35.1;
SELECT * FROM bbq WHERE 위도 > 129.028 OR 경도 > 35.1;
# 업소명이 교촌치킨이면서 위도가 129.028을 초과하는 레코드와 경도가 35.1보다 큰 레코드를 뽑아라.
# 괄호를 사용해서 묶어주어 먼저 계산할 수 있다.
SELECT *
FROM bbq
WHERE 업소명 = '교촌치킨'
AND (위도 > 129.028
OR 경도 > 35.1);
SELECT * FROM bbq WHERE 위도 > 129.028 XOR 경도 > 35.1;
SELECT * FROM bbq WHERE NOT 위도 > 129.028;
LIKE 연산자
% : 임의 개수(0 ~ )를 표현하는 와일드 카드.
_ : 임의의 하나의 문자를 표현하는 와일드 카드.
SELECT * FROM bbq WHERE 업소명 LIKE '%치킨';
SELECT * FROM bbq WHERE 업소명 LIKE '__치킨';
SELECT * FROM bbq WHERE 소재지 LIKE '%부산진구%';
SELECT * FROM bbq WHERE 소재지 LIKE '%%';
SCL (데이터 제어어)
데이터 접근에 대한 권한을 관리하는 언어
GRANT
사용자에게 권한을 부여하는 쿼리
GRANT 권한, ... ON 데이터베이스명.테이블명 TO 유저명@접근위치;
GRANT SELECT ON human_resource.bbq TO 'developer01'@'localhost';
REVOKE SELECT ON human_resource.bbq FROM 'developer01'@'localhost';
제약조건 (Constraint)
테이블 컬럼의 무결성을 보장해주는 조건
NOT NULL : 해당 컬럼에 null을 지정할 수 없도록 하는 조건 (필수 값)
INSERT, UPDATE에 영향을 미친다. 딜리트에는 영향을 미치지 않는다.
CREATE TABLE sample_table_1 (
column1 INT,
not_null_column INT NOT NULL
);
INSERT INTO sample_table_1 VALUE (1, null); # 의미 있는 값을 넣어주어야 한다.
INSERT INTO sample_table_1 (column1) VALUES (1); # 디폴트값을 넣을 수 없다.
INSERT INTO sample_table_1 VALUE (1, 1);
UPDATE sample_table_1 SET not_null_column = null;
CREATE TABLE sample_table_2 (
column1 INT,
unique_column INT UNIQUE
);
INSERT INTO sample_table_2 VALUES (1, 1);
INSERT INTO sample_table_2 VALUES (1, 1); # 중복되어 오류가 뜸
INSERT INTO sample_table_2 VALUES (1, 2);
UPDATE sample_table_2 SET unique_column = 1;
CREATE TABLE sample_table_3 (
column1 INT,
primary_cloum INT PRIMARY KEY
);
INSERT INTO sample_table_3 VALUES (1, null);
INSERT INTO sample_table_3 VALUES (1, 1);
INSERT INTO sample_table_3 VALUES (1, 1);
CREATE TABLE sample_table_4 (
primary_column1 INT,
primary_column2 INT,
column1 INT,
CONSTRAINT sample_table_4_PK # PRIMARY KEY (primary_column1, primary_column2)의 이름.
PRIMARY KEY (primary_column1, primary_column2)
);
SELECT * FROM Information_schema.table_constraints
WHERE table_schema = 'human_resource';
CREATE TABLE super_table (
primary_column INT PRIMARY KEY,
column1 INT
);
CREATE TABLE sub_table (
column2 INT,
foreign_column INT,
CONSTRAINT sub_table_fk
FOREIGN KEY (foreign_column)
REFERENCES super_table (primary_column)
);
# fk 제한조건은 primary_column을 참조하기 때문에 super_table에 1이 존재하지 않으면 넣을 수 없다.
INSERT INTO sub_table VALUES (1, 1);
# super_table에 값을 넣었기 때문에 참조할 수 있다.
INSERT INTO super_table VALUES (1, 1);
INSERT INTO sub_table VALUES (1, 1);
2) 업데이트(수정)에 대한 제한
primary_column값이 2인 것이 존재하지 않기 때문에 할 수 없다.
UPDATE sub_table SET foreign_column = 2;
1이라는 데이터를 참조하기 때문에 참조조건이 무너져 바꿀 수 없다.
UPDATE super_table SET foreign_column = 2;
3) 삭제에 대한 제한
2번과 같은 조건으로 삭제되지 않는다.
DELETE FROM super_table;
DROP TABLE super_table;
ON UPDATE, ON DELETE
CREATE TABLE sub_table (
column2 INT,
foreign_column INT,
CONSTRAINT sub_table_fk
FOREIGN KEY (foreign_column)
REFERENCES super_table (primary_column)
ON UPDATE CASCADE ON DELETE SET NULL
);
BOARD_CONSTRAINT
CREATE TABLE user (
email VARCHAR(50) PRIMARY KEY,
password VARCHAR(255) NOT NULL,
nickname VARCHAR(20) NOT NULL UNIQUE,
tel_number VARCHAR(15) NOT NULL UNIQUE,
address TEXT NOT NULL,
address_detail TEXT,
agreed_personal BOOLEAN NOT NULL,
profile_image TEXT
);
CREATE TABLE board (
board_number INT PRIMARY KEY AUTO_INCREMENT,
title TEXT NOT NULL,
contents TEXT NOT NULL,
write_datetime DATETIME NOT NULL,
writer_email VARCHAR(50) NOT NULL,
view_count INT NOT NULL,
FOREIGN KEY (writer_email) REFERENCES user (emil)
);
# 관계 테이블
# N : M 형태의 관계에서는 무조건 관계 테이블을 생성해야한다.
CREATE TABLE favorite (
board_number INT NOT NULL,
user_email VARCHAR(50) NOT NULL,
UNIQUE (board_number, user_email),
FOREIGN KEY (board_number) REFERENCES board (board_number),
FOREIGN KEY (user_email) REFERENCES user (email)
);
CREATE TABLE comment (
board_number INT NOT NULL,
user_email VARCHAR(50) NOT NULL,
content TEXT NOT NULL,
write_datetime DATETIME NOT NULL,
FOREIGN KEY (board_number) REFERENCES board (board_number),
FOREIGN KEY (user_email) REFERENCES user (email)
);