티스토리 뷰
안녕하세요, 끙정입니다.
오늘은 레코드를 삭제하거나 갱신하는 문법에 대해서 알아보도록 하겠습니다.
레코드를 삭제하는 DELETE, 테이블을 비워버리는 TRUNCATE, 레코드를 수정하는 UPDATE가 있습니다.
하나씩 살펴보겠습니다.
1. DELETE
레코드를 삭제할 때는 DELETE를 사용합니다.
삭제는 항상 레코드 단위로 수행하므로 필드(열)에 대한 지정은 없습니다.
/* 필드 지정 없이 레코드 정보가 삭제 된다. */
DELETE FROM 테이블 WHERE 조건
INSERT는 전치사 INTO를 쓰는 반면에,
DELETE는 전치사 FROM을 씁니다.
오라클과 SQL Server는 FROM의 생략을 허용하지만,
Maria DB는 생략을 허용하지 않습니다.
결국 항상 FROM을 써주는 것이 좋습니다.
Maria DB는 FROM 생략이 안된다.
WHERE절의 조건에 해당하는 레코드가 모두 삭제되기 때문에 조심해야 합니다.
심지어 Oracle은 그나마 ROLLBACK이 있어 삭제를 취소할 수 있지만,
SQL Server나 Maria DB는 쿼리를 날리는 즉시 적용되어버리기 때문에 되돌릴 수 없습니다.
그래서 Oracle에서도 COMMIT은 매우 신중히 해주어야 합니다.
COMMIT을 해버리면 다신 돌이킬 수 없으니까요.
그래서 안전장치를 스스로 강구해야 합니다.
DELETE문을 WHERE 조건절 없이 사용하게 되면 모든 레코드를 삭제하게 됩니다.
몇몇의 DBMS는 어떠한 경고도 없을 수 있습니다.
테스트로 해봤는데 진짜였다. 잠시 할 말을 잃었다.
그래서 아래와 같은 방식을 사용하면 괜찮다고 합니다.
1) SELECT문으로 삭제할 레코드를 확인 후, SELECT를 DELETE로 바꿔서 쿼리 날리기
2) DELETE문은 항상 주석으로 감싸두고 필요시에만 주석을 거둔 후 날리기, 날린 후에도 다시 덮기
3) 주석으로 DELETE와 SELECT 를 적어두고 드래그 쿼리 날리기
/* 1) SELECT문으로 삭제할 레코드를 확인 후, SELECT를 DELETE로 바꿔서 쿼리 날리기 */
SELECT * FROM tCity WHERE popu > 50;
DELETE FROM tCity WHERE popu > 50;
/* 2) DELETE문은 항상 주석으로 감싸두고 필요시에만 주석을 거둔 후 날리기, 날린 후에도 다시 덮기 */
/* DELETE FROM tCity WHERE popu > 50; */
/* 3) 주석으로 DELETE와 SELECT 를 적어두고 드래그 쿼리 날리기 */
-- DELETE
-- SELECT *
FROM tStaff WHERE grade = '과장';
3번 방식을 보여주는 그림. --는 주석이기에 그냥 쿼리를 날리면 오류가 뜬다. 드래그를 통해 확인 후 쿼리를 날리면 안전하다.
2. TRUNCATE
애초에 테이블을 비울 목적이라면 WHERE절이 없이 사용하는 것이 맞습니다.
그러나 DELETE는 레코드 단위로 삭제를 하고, 로그도 남기기 때문에 속도가 매우 느립니다.
테이블 안에 레코드가 수십, 수백만개가 존재할 수도 있기 때문이죠.
그럴 때 효율적인 방법은 바로 TRUNCATE를 쓰는 것입니다.
TRUNCATE TABLE 테이블
TRUNCATE는 대상 테이블의 레코드를 모두 비워버리고 로그도 전혀 남기지 않습니다.
그렇기에 DELETE FROM 테이블 보다 훨씬 빠릅니다.
다만 로그를 남기지 않기 때문에 ROLLBACK을 할 수 없다는 리스크가 존재하긴 합니다.
추가로 DELETE는 DML에 속하는 데이터 관리 명령인 반면에
TRUNCATE는 테이블을 관리하는 DDL 명령으로 소속이 다릅니다.
TRUNCATE TABLE은 테이블 안의 레코드만 삭제할 뿐, 테이블 자체는 삭제하지 않습니다.
테이블을 삭제하고 싶다면 DROP TABLE 을 사용하여야 합니다.
3. UPDATE
레코드를 조회하고 입력하고 삭제하는 것까지 알아보았습니다.
마지막으로 이미 존재하는 레코드를 바뀐 정보로 갱신해줄 때 쓰는 UPDATE를 알아보겠습니다.
UPDATE 테이블 SET 필드 = 값 [, 필드 = 값] WHERE 조건
UPDATE 키워드 다음에 변경 대상 테이블을 지정합니다.
SET 키워드 다음에 필드에 값을 대입하는 대입문이 오며 콤마로 끊어 복수개의 필드를 한꺼번에 변경할 수 있습니다.
WHERE 절을 통해 변경 대상 레코드를 지정하는 조건을 줄 수 있습니다.
WHERE를 생략해도 상관없지만 보통은 특정 레코드를 갱신하기 때문에 WHERE가 생략되는 경우는 거의 없습니다.
/* 서울의 인구를 1000만명으로, 지역을 충청도로 변경한다. */
UPDATE tCity SET popu = 1000, region = '충청' WHERE name = '서울';
서울의 레코드가 변했다.
WHERE 절에는 비교연산자, BETWEEN, IN, LIKE 등의 연산자를 모두 사용할 수 있습니다.
또한 SET 문에는 보통 필드에 상수를 대입하는데, 필드끼리의 연산도 가능합니다.
/* 오산의 popu를 2배로 늘려준다. */
UPDATE tCity SET popu = popu * 2 WHERE name = '오산';
실습은 왜 서울로 했지...
그만 알아보겠습니다.
출처
http://www.yes24.com/Product/Goods/101637633
'SQL' 카테고리의 다른 글
PRIMARY KEY에 대해 알아보자 (feat. CANDIDATE KEY, COMPOSITE KEY, UNIQUE) (0) | 2023.02.03 |
---|---|
제약과 무결성에 대해 알아보자 (feat. NULL, DEFAULT, CHECK) (0) | 2023.02.03 |
삽입문에 대해서 알아보자 (feat. INSERT, INSERT SELECT, CREATE SELECT) (2) | 2023.01.29 |
그룹핑을 알아보자 (feat.GROUP BY, HAVING) (0) | 2023.01.29 |
집계함수를 알아보자 (feat.COUNT, SUM, AVG ...) (0) | 2023.01.26 |
- Total
- Today
- Yesterday
- Amazon
- ChatGPT
- searchgpt
- Intel
- genai
- datacenter
- alexa
- Samsung
- OpenAI
- apple intelligence
- Meta
- ai pc
- SSI
- condenast
- sb1047
- sql
- aichip
- galaxyai
- Nvidia
- perplexity
- aitv
- 액침냉각
- IDC
- Apple
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |