[20230801] 클라우드 플랫폼 기반 웹서비스 개발자 양성 과정 18일차.

양희정·2023년 8월 1일
0

논리 연산자

  • AND, && : 좌항과 우항이 모두 true일 때 true 반환
SELECT * FROM bbq WHERE 위도 > 129.028 AND 경도 > 35.1;
  • OR, || : 좌항과 우항 중 하나라도 true일 때 true 반환
SELECT * FROM bbq WHERE 위도 > 129.028 OR 경도 > 35.1;
  • 우선순위가 AND이기 때문에 [WHERE 업소명 = '교촌치킨' AND 위도 > 129.028] -> [나온 값 OR 경도 > 35.1]
# 업소명이 교촌치킨이면서 위도가 129.028을 초과하는 레코드와 경도가 35.1보다 큰 레코드를 뽑아라.
# 괄호를 사용해서 묶어주어 먼저 계산할 수 있다.
SELECT * 
FROM bbq 
WHERE 업소명 = '교촌치킨' 
AND (위도 > 129.028 
OR 경도 > 35.1);
  • XOR : 좌항과 우항이 서로 다르면 true 반환
SELECT * FROM bbq WHERE 위도 > 129.028 XOR 경도 > 35.1;
  • NOT : 우항의 부정을 반환. true면 false, false면 true.
SELECT * FROM bbq WHERE NOT 위도 > 129.028;

LIKE 연산자

  • 문자열 데이터에서 특정 패턴에 맞는 데이터를 찾아주는 연산자.
  • 특정 단어가 포함되어 있는 것을 찾아준다.

% : 임의 개수(0 ~ )를 표현하는 와일드 카드.
_ : 임의의 하나의 문자를 표현하는 와일드 카드.

  • 업소명이 치킨으로 끝나는 레코드를 검색
SELECT * FROM bbq WHERE 업소명 LIKE '%치킨';
  • 업소명이 4글자이면서 치킨으로 끝나는 레코드를 검색
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
    사용자로부터 권한을 회수하는 쿼리
    REVOKE 권한, ... ON 데이터베이스명.테이블명 FROM 유저명@접근위치;
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;
  • UNIQUE : 해당 컬럼에 중복되는 값을 가질 수 없도록 하는 조건 (중복 제어)
    INSERT, UPDATE에 영향을 미친다.
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; 
  • PREPARE KEY : 기본키 제약조건, 해당 컬럼을 기본키(구분자)로 지정한다.
    UNIQUE + NOT NULL
    INSERT, UPDATE, DELETE에 영향을 미친다.
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';
  • FOREIGN KEY : 외래키 제약조건, 해당 컬럼이 외부 테이블의 기본키와 관계가 있음을 나타낸다.
    참조타입과 FOREIGN KEY의 타입이 같아야 사용할 수 있다.
    개발 시 무결성을 꼭 지켜야 할 때 사용하며 아닐 땐 꼭 사용하지 않아도 된다.
    제약 조건만 걸지 않을 뿐이다.
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)
);
  • 다른 제약조건들 보다 제한력이 강하다.
    1) 삽입에 대한 제한
# 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

  • 수정 및 삭제 작업에 대해서 참조하고 있는 데이터가 변경될 때의 작업을 지정한다.
  • CASCADE : 참조되어지는 데이터가 변경되면(super), 참조하는 데이터(sub)도 변경되는 것.
  • SET NULL : 참조되어지는 데이터가 변경되면, 참조하는 데이터가 null로 변경된다.
  • RESTRICT : 참조되어지는 데이터가 변경이 불가능하게 만들어 준다. (디폴트값)
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)
 );

0개의 댓글