일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Excel
- django
- Kotlin
- Tkinter
- numpy
- math
- Python
- PANDAS
- Mac
- Github
- array
- Apache
- 파이썬
- gas
- Google Excel
- list
- dataframe
- c#
- matplotlib
- hive
- GIT
- Java
- google apps script
- string
- PySpark
- Redshift
- Google Spreadsheet
- SQL
- PostgreSQL
- Today
- Total
달나라 노트
Redshift : delete, insert, update (테이블의 데이터 삭제, 삽입, 변경) 본문
Redshift : delete, insert, update (테이블의 데이터 삭제, 삽입, 변경)
CosmosProject 2021. 6. 16. 12:48
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의 컬럼이라는 것을 알아야 합니다.
마치 변수에 값을 할당하듯이
왼쪽에 적힌 컬럼에 오른쪽에 적힌 컬럼 데이터를 할당하는 것 처럼 말이죠.