국비학원 24일차 : SQL_3

Digeut·2023년 3월 29일
0

국비학원

목록 보기
18/44

연산자

비교연산자

BETWEEN A AND B

-- a보다 크거나 같으면서 b보다 작거나 같으면 true를 반환
SELECT * FROM Custom
WHERE age BETWEEN 10 AND 20;

IN()

-- 인수로 전달된 값과 동일한 값이 하나라도 존재한다면 true를 반환
SELECT * FROM Custom
WHERE name IN('Jhon Doe','Micle','James');
-- 위와 동일한 값을 나타내는 연산
-- SELECT * FROM Custom
-- WHERE name = 'Jhon Doe'
-- OR name = 'Micle'
-- OR name = 'James';

IS()

왼쪽 피연산자와 오른쪽 피연산자가 같으면 참을 반환함.
(오른쪽 피연산자가 불리언 값인 TRUE, FALSE, UNKNOWN 값일 때 사용함)

-- 비교대상이 Boolean 형태일 때 사용하는 비교 연산자
SELECT * FROM Custom
WHERE accept_marketing IS true;

IS NULL()

-- 비교 대상이 NULL이면 true를 반환
SELECT * FROM Custom
WHERE email IS NULL;

LIKE()

-- 문자열의 패턴을 비교하여 동일한 패턴을 가지고 있는 문자열이면 true를 반환
-- 패턴 적용시 사용하는 와일드카드 
-- % : 0개 이상의 패턴
-- _ : 1개의 패턴 정확한 패턴을 찾아야할때 사용하게 된다

SELECT * FROM Custom
WHERE email LIKE '%gmail%';

제약조건

RDBMS에서 입력, 삽입, 수정, 삭제에 대해 무결성을 보장해주는 조건

NOT NULL

무조건 값이 있어야한다는 조건, DEFAULT 해줄 필요없다

-- 입력 혹은 수정 작업에 있어서 해당 필드에 NULL이 올수 없도록 하는
-- 제약 조건

-- Create문

CREATE TABLE 테이블이름
(
    필드이름 필드타입 NOT NULL,
    ...
)

CREATE TABLE NotNullTable1(
	notnull_field INT NOT NULL
);

-- Alter
-- Alter로 NOT NULL 제약 조건을 추가할 땐
-- 원래 존재하는 레코드에서 해당필드의 데이터가 Null이 존재하면 안된다.

1. ALTER TABLE 테이블이름
ADD 필드이름 필드타입 NOT NULL;

2. ALTER TABLE 테이블이름
MODIFY COLUMN 필드이름 필드타입 NOT NULL;

CREATE TABLE NotNullTable2(
	notnull_field INT 
);

ALTER TABLE NotNullTable2
MODIFY COLUMN notnull_field INT NOT NULL; 
# NOT NULL아닌걸 NOT NULL로 바꾸는건 문제가 안되는데
# 원래 NOT NULL이었던걸 NOT NULL로 바꿀때는 NULL이 하나라도 존재하면 안된다.

Default

사용자가 입력 작업할적에 값을 추가하지 않는다면 기본값으로
지정해놓은 값으로 넣겠다 하는 조건 NOT NULL을 굳이 해줄 필요없다

-- 입력 작업에서 해당 필드의 값이 들어오지 않으면 기본값으로 지정해주는 제약 조건
-- 디폴트 값에 수정으로 NULL을 넣는게 수정이 되는지는 ?

-- Create
CREATE TABLE defaultTable1(
	default_field INT DEFAULT 1
);

-- Alter
CREATE TABLE defaultTable2(
	default_field INT 
);

ALTER TABLE defaultTable2
MODIFY COLUMN defaultTable2 INT DEFAULT 1;
# 디폴트가 아니였는데 디폴트를 넣은 경우 원래 테이블의 값에 
# NULL이 지정되어 있을수도 있다
# 나중에 수정으로 제약조건을 추가해주더라도 NULL이 
# 디폴트 값인 1로 바뀌진 않고, 추가 이후의 작업에 적용된다.
# 업데이트를 통해서 널인 필드를 디폴트값으로 바꿔주는작업이 필요하다

UNIQUE

해당 필드에 대해서 다른 값들이 중복되면 안된다는 조건

UNIQUE 설정하면 인덱스가 설정 된다. (순번을 매겨주는것)
구분지어주기 위해서 인덱스를 생성하면서 만들어줌

-- 삽입, 수정 작업에서 해당 제약조건이 걸려있는 필드의 데이터에 대해
-- 중복을 허용하지 않는 제약조건

-- Create

1. CREATE TABLE 테이블이름
(
    필드명 필드타입 UNIQUE,
    ...
)

2. CREATE TABLE 테이블이름
(
    필드이름 필드타입,
    ...,
    [CONSTRAINT 제약조건이름] UNIQUE (필드이름)
)

CREATE TABLE Unique_Table1(
	unique_field INT UNIQUE
);

CREATE TABLE Unique_Table2(
	unique_field INT,
    CONSTRAINT unique_key_1 /*제약 조건 이름*/UNIQUE (unique_field)
);

-- Alter

1. ALTER TABLE 테이블이름
ADD [CONSTRAINT 제약조건이름] UNIQUE (필드이름);
   
2. ALTER TABLE 테이블이름
MODIFY COLUMN 필드이름 필드타입 UNIQUE;

CREATE TABLE Unique_Table3(
	unique_field INT
);

ALTER TABLE Unique_Table3
MODIFY COLUMN unique_field INT UNIQUE;

CREATE TABLE Unique_Table4(
	unique_field INT
);

ALTER TABLE Unique_Table4
ADD CONSTRAINT unique_key_1 /*제약 조건 이름*/ UNIQUE (unique_field);

PRIMARY KEY

구분자로 쓰인다. 기본 키는 후보키에서 선택
후보키는 해당 필드중에 구분지어 줄수 있는 요소들을 후보키로
중복이 되지 않고, NOT NULL인 값을 후보키로 한다.
NOT NULL과 UNIQUE가 바로 설정이 된다.

PRIMARY KEY 설정하면 인덱스가 설정 된다. (순번을 매겨주는것)
구분지어주기 위해서 인덱스를 생성하면서 만들어줌

-- 기본키에 대한 제약조건, NOT NULL 과 UNIQUE가 포함되어 있음
-- 삽입, 수정시 NULL을 포함할 수 없음, 중복된 데이터를 포함 할 수 없다.

-- Create

1. CREATE TABLE 테이블이름
(
    필드이름 필드타입 PRIMARY KEY,
    ...
)
2. CREATE TABLE 테이블이름
(
    필드이름 필드타입,
    ...,
    [CONSTRAINT 제약조건이름] PRIMARY KEY (필드이름)
)

CREATE TABLE pirmary_Table1(
	primary_field INT PRIMARY KEY
);

CREATE TABLE pirmary_Table2(
	primary_field INT,
    CONSTRAINT primary_key_1
    PRIMARY KEY(primary_field)
);

-- Alter

1. ALTER TABLE 테이블이름
ADD [CONSTRAINT 제약조건이름] PRIMARY KEY (필드이름)

2. ALTER TABLE 테이블이름
MODIFY COLUMN 필드이름 필드타입 PRIMARY KEY

CREATE TABLE pirmary_Table3(
	primary_field INT
);

ALTER TABLE pirmary_Table3
MODIFY COLUMN primary_field INT PRIMARY KEY;

CREATE TABLE pirmary_Table4(
	primary_field INT
);

ALTER TABLE pirmary_Table4
ADD CONSTRAINT primary_key_1 PRIMARY KEY(primary_field);

인덱스가 안걸린것의 검색속도와 인덱스가 걸린것의 검색 속도에는
차이가 난다. 걸린게 더 빠르다. 자주 검색하는 것들은 인덱스를 만들어주게 되면 검색속도가 증가한다

테이블의 경우 순서의 의미가 없다.
단, 테이블 필드 선언할때 자주 검색하는 필드들을
최대한 앞으로 올려놓는게 속도가 빠르게 된다.
where절에 적을때 인덱스가 적힌 요소들을 먼저 적어주는게 좋다.

FOREIGN KEY

해당 테이블이 다른 테이블을 참조 할건데 그 중
어떤 필드를 참조하는 값으로 사용하겠다 하는 조건

한 테이블이 다른 테이블을 참조할 때 참조키 사용
기준이 되는 테이블의 키를 참조할 수있다.
참조키 설정되어있는 테이블이 다른 테이블에 의존할수 있게한다
구분할수 있는 요소를 참조해야한다!
FOREIGN KEY 제약 조건을 설정할 때 참조되는 테이블의 필드는 반드시 UNIQUE나 PRIMARY KEY 제약 조건이 설정되어 있어야 한다. 웬만하면 다 기본키로 제약조건을 건다. 데이터 타입이 같아야한다 (참조키와 그 필드의 기본키가)

-- 참조 제약조건, 해당 테이블을 해당 필드를 기준으로 
-- 외부 테이블의 외부필드를 참조하도록 하는 제약조건
-- 해당 제약 조건이 걸려있는 필드의 경우 참조하는 테이블의 참조 필드에
-- 존재하는 데이터만 삽입 할 수 있다. 

-- Create
CREATE TABLE Referenced_Table1(
	primary_key INT PRIMARY KEY
); # 이걸 참조하는 테이블을 만든다

-- CREATE 시에 참조 제약조건을 추가할땐
-- 선행적으로 참조할 테이블과 필드가 존재해야하고
-- 참조할 필드가 PRIMARY KEY 혹은 UNIQUE 제약조건이 지정되어 있어야한다.
-- 참조 제약조건이 걸리는 필드는 참조할 필드의 데이터 타입과 일치해야한다.
CREATE TABLE Foreign_Table1(
	foreign_field INT,
    CONSTRAINT foreign_key_1
    FOREIGN KEY (foreign_field)
    REFERENCES Referenced_Table1(primary_key)
);

-- ALTER
CREATE TABLE Foreign_Table2(
	foreign_field INT
);

ALTER TABLE Foreign_Table2
ADD CONSTRAINT foreign_key_1
FOREIGN KEY (foreign_field)
REFERENCES Reference_Table(primary_key);

PRIMARY KEY 와 FOREIGN KEY

기본키와 참조키의 경우, 해당 테이블이 다른 테이블을 참조할때 다른 테이블이 아직 생성되지 않으면 참조키를 설정할수가 없다.
테이블이 다 생성, 설정해주고 기본키를 설정해준 다음에 후에 참조키를 하나씩 붙여주는 작업을 한다. '-키'가 붙은 애들은 테이블을 선언하고 나서 후에 제약조건으로 붙여주는 경우가 많다.

ON DELETE, ON UPDATE

b 테이블이 a 테이블 참조하고 있을때 a 를 삭제할수 없다
삭제가 되면 참조하는 조건에 결점이 생긴다 그래서 b를 먼저 지우고 a를 지워야한다

어떤 특정한 1 2 3 이라는 레코드가 있고 ㄱ ㄴ ㄷ 라는 레코드가 있을때
ㄱ 이 1을 참조할때 ㄱ이 1을 쳐다보고 있음
1이라는 레코드 자체도 삭제가 불가능하다
삭제하려면 ㄱ에 있는 1값을 다 null로 바꾸거나
다른 값을 참조하게해야 지울수 있다.

수정을 할때도 1을 4로 바꾸려고하면 ㄱ이 1을 참조하므로
ㄱ의 참조를 null로 바꾸거나 다른 값을 참조하게 해줘야한다.
그래서 처음부터 설계를 잘해야한다.

이런 문제들을 ON DELETE, ON UPDATE 옵션으로 해결할 수 있다.

  1. CASCADE : 참조되는 테이블에서 데이터를 삭제하거나 수정하면, 참조하는 테이블에서도 삭제와 수정이 같이 이루어집니다.
  2. SET NULL : 참조되는 테이블에서 데이터를 삭제하거나 수정하면, 참조하는 테이블의 데이터는 NULL로 변경됩니다. not null로 설정되어있으면 안된다

CASCADE, SET NULL 중 어떤걸 걸어줘야할지 생각해서 걸어줘야한다

B테이블은 A테이블을 의존한다. 이때 CASCADE이 의존도가 더 높게 된다
1 대 1 관계에서 가장 많이 이뤄지는게 CASCADE(대부분)

참조하고 있는 테이블이 원래있던 테이블에서 파생된게 아니라
독립된 테이블로써 결과에 대한 관계일 적에 SET NULL을 쓴다.
관계가 끊어진다고 해서 존재에 영향을 미치지 않을때 사용함.

열차예약

ALTER TABLE Cost #제약조건 추가
ADD CONSTRAINT cost_primary_key
PRIMARY KEY (departure_station, arrival_station); 
#복합 기본키 두개를 구분자로사용, 중복해서 UNIQUE하도록?

ALTER TABLE Cost
ADD CONSTRAINT cost_foreign_key_1
FOREIGN KEY (departure_station)
REFERENCES Station (station_number); 

ALTER TABLE Cost
ADD CONSTRAINT cost_foreign_key_2
FOREIGN KEY (arrival_station)
REFERENCES Station (station_number); 

ALTER TABLE Stop_station
ADD CONSTRAINT stop_station_primary_key
PRIMARY KEY (station_number, train_number);

ALTER TABLE Stop_station
ADD CONSTRAINT stop_station_foreign_key
FOREIGN KEY (station_number)
REFERENCES Station (station_number);

ALTER TABLE Stop_station
ADD CONSTRAINT stop_station_foreign_key_2
FOREIGN KEY (train_number)
REFERENCES Train (train_number);

관계

profile
개발자가 될 거야!

0개의 댓글