SQL/Redshift

Redshift : delete, insert, update (테이블의 데이터 삭제, 삽입, 변경)

CosmosProject 2021. 6. 16. 12:48
728x90
반응형

 

 

 

delete from syntax

delete from table_name
where condition;

table_name이라는 table에서 명시한 condition이 True인 행(row)들을 삭제합니다.

 

 

delete from test_table
where dy > 20201110;

위처럼 적게되면 test_table에 있는 dy컬럼의 데이터가 20201120보다 큰 값을 가진 행(row)을 모두 삭제하게됩니다.

 

 

 

delete from test_table;

만약 조건을 명시하지 않는다면 해당 테이블의 모든 데이터가 지워집니다.(단, 테이블은 그대로 남아있습니다.)

 

 

 

 

 


 

 

 

insert into syntax

insert into table_name
values (value1, value2, ...)
;

insert into 구문은 위처럼 진행할 수 있습니다.

table_name이라는 table에 존재하는 각각의 column에 value1, value2, ...의 값을 집어넣어 새로운 행(row)을 삽입한다는 뜻입니다.

 

 

 

 

insert into test_table
values (1, 2, 3, 4, 5)
;

위 구문은 test_table에 첫 번째 컬럼부터 1, 2, 3, 4, 5의 값을 각각 삽입하여 새로운 행을 test_table에 삽입합니다. 

 

 

 

insert into test_table
values (1, 2, 3, 4)
;

위 test_table은 총 5개의 컬럼을 가지고 있습니다.

근데 만약 위처럼 values에 4개의 값만 입력해주면 마지막 다섯번째 컬럼의 값은 null인채로 인식되어 삽입됩니다.

 

 

 

 

insert into test_table (col1, col2, col3, col4, col5)
values (1, 2, 3, 4, 5)
;

위 또한 위처럼 insert into에 데이터를 삽입할 컬럼을 명시할 수도 있습니다.

 

 

 

 

insert into test_table (col1, col2, col3, col4)
values (1, 2, 3, 4)
;

위 또한 위처럼 insert into에 데이터를 삽입할 컬럼을 명시할 수도 있습니다.

마찬가지로 원하는 컬럼에만 데이터를 삽입할 수도 있으며 이 경우 새로 삽입되는 row에 대해 col5는 null값을 가지게됩니다.

 

 

 

 

 

insert into test_table (col1, col2, col3, col4, col5)
values (1, 2, 'a', Null, 4)
;

만약 일부러 null값을 넣고싶다면 values에 Null이라고 써주면 됩니다.

또한 문자를 삽입하려면 값 양쪽에 따옴표를 붙여야 합니다. 마치 'a' 처럼요.

 

 

 

 

 

insert into test_table (col1, col2, col3, col4, col5)
values 	('a', 'b', 'c', 1, 2),
        ('a', 'b', 'c', 'd', 3),
       	('x', 'y', 'z', '3', '3')
;

또한 위처럼 여러 행을 동시에 삽입하고싶으면 괄호로 값을 감싸 콤마로 구분해주면 됩니다.

위 구문은 3개의 행을 test_table에 삽입하게됩니다.

 

 

 

 

 

 

 

 

 

insert into test_table (col1, col2, col3, col4, col5)
values 	('Man\'s', 'b', 'c', 1, 2),
        ('Women\'s kind', 'b', 'c', 'd', 3),
       	('Apple\'s seed', 'y', 'z', '3', '3')
;

insert into를 이용하여 값을 insert할 때 문자는 반드시 양쪽을 따옴표로 감싸줘야 합니다.

그런데 위처럼 Man's 라는 따옴표를 포함한 텍스트를 insert하고싶으면 따옴표 앞에 백슬래쉬(\)를 붙여 escape를 해주면 됩니다.

 

꼭 따옴표가 아니어도 여러 기능을 가진 특수문자들을 텍스트로서 insert하고싶으면 백슬래쉬(\)를 이용한 escape를 해주면 됩니다.

 

 

 

 

 

 

 

 

insert into table_name (
    select ~
    from ~
)
;



insert into table_name (column1, column2, ...)
(
    select ~
    from ~
)
;

table_name이라는 이름의 table에 select ~ from ~구문으로부터 반환되는 결과를 추가합니다.

마찬가지로 삽입할 컬럼 명을 명시해줄수도 있으며 그렇지 않을수도 있습니다.

 

 

 

insert into test_table (
    select dy
    from test_table_1
    where 1=1
    and dy >= 20201110
)
;

위 구문은 test_table이라는 테이블에 test_table_1 테이블로부터 추출한 dy 컬럼의 데이터를 추가합니다.

다만 test_table_1에서 데이터를 추출할 때 dy가 20201110 이상인 데이터만 추출하여 추가합니다.

 

위 구문이 에러 없이 성공했다면 test_table에도 컬럼이 단 1개여야합니다.

왜냐하면 select ~ from ~ 에서 삽입될 컬럼을 추출할 때 dy라는 컬럼 하나만 추출했기 때문입니다.

 

 

insert into test_table (
    select dy
    from test_table_1
    where 1=1
    and dy >= 20201110
)
;

만약에 동일한 예시에서 test_table에는 dy, name이라는 2개의 컬럼이 존재한다고 가정해봅시다.

그러면 위 쿼리는 컬럼 개수가 다르다는 error를 일으킵니다.

 

 

 

 

 


 

 

 

 

update syntax

update table_name
set column_name = value
where condition
;

테이블의 데이터를 update하고싶으면 위처럼 update 구문을 사용할 수 있습니다.

의미를 해석해보면

table_name에서 column_name이라는 이름의 column 데이터를 value로 변경합니다.

다만 column_name에 있는 모든 데이터가 아니라 condition을 만족하는 행만 value로 값을 바꾸는거죠.

 

 

 

 

 

update test_table
set user_name = 'test_user'
where test_flag = 'YES'
;

위 예시를 보면 test_table의 test_flag 컬럼 값이 'YES'인 row에 대해서 user_name 컬럼의 데이터를 'test_user'로 변경합니다.

 

 

 

 

update test_table
set user_name = 'test_user',
    user_id = 12345
where test_flag = 'YES'
;

만약 여러 컬럼의 값을 동시에 바꾸고싶으면 set 부분에 위처럼 2개의 컬럼과 update할 값을 콤마로 구분하여 동시에 명시할 수도 있습니다.

 

 

 

 

 

 

update test_table
set user_name = ot.name,
    user_id = ot.id
from original_table as ot
--
where test_table.user_id = ot.id
;

update ~ set 구문은 어떠한 값으로 컬럼의 data를 update할 뿐 아니라 위처럼 다른 table의 값으로 update를 할 수 있습니다.

 

 

 

위 예시는

test_table user_name column data를 original_table name column data로 update합니다.

test_table의 user_id column data를 original_table id column data로 update합니다.

단, test_table.user_id = ot.id인 조건을 만족하는 행(row)에 대해서만 update를 진행합니다.

 

 

위 예시에서는 table이 총 2개(test_table, original_table) 사용됩니다.

 

주의할 점은 data를 불러오는 table(original_table)에는 as를 사용해서 table alias를 부여할 수 있지만

update의 대상 table(test_table)에는 as를 통한 alias 부여가 불가능합니다.

 

따라서 where 절에서 test_table.user_id 이런식으로 table이름과 함께 컬럼명을 적은 것을 볼 수 있죠.

 

 

 

또 한가지 주의할 점은

test_table에 alias를 붙일 수 없기 때문에

아래 set 부분에서 =을 기준으로

왼쪽은 update 대상 table(test_table)이고,

오른쪽은 data를 불러오는 table(original_table)이 됩니다.

...
set user_name = ot.name,
    user_id = ot.id
...

 

 

 

 

 

update test_table
set name = ot.name,
    id = ot.id
from original_table as ot
--
where test_table.id = ot.id
;

만약 위 예시처럼 test_table과 original_table의 set에 사용되는 column 이름이 동일하다면

등호(=)를 기준으로 왼쪽에 적힌 것이 test_table의 컬럼이며

오른쪽에 적힌 것이 original_table의 컬럼이라는 것을 알아야 합니다.

 

마치 변수에 값을 할당하듯이

왼쪽에 적힌 컬럼에 오른쪽에 적힌 컬럼 데이터를 할당하는 것 처럼 말이죠.

 

 

 

 

 

 

 

 

 

 

728x90
반응형