SQL 데이터 조작 언어(DML) – 2





INSERT

INSERT INTO 테이블명 (Column1, Column2,…) VALUES (Value1, Value2,…)

INSERT INTO TYPE (NAME,PRICE,PERIOD) VALUES ('공포',1000,3)

위 쿼리는 비디오 장르 테이블에 공포장르 정보를 등록하는 쿼리입니다. 이렇게 INSERT 명령을 수행하면 테이블에 행을 추가할 수 있습니다. INSERT INTO 구문 뒤에 테이블 이름을 명시하고 대상 컬럼 명을 기술하고 값은 VALUES 다음에 기입합니다. 이때, 추가하는 테이블의 정의에 따라 순서대로 기술하여야 하며 반드시 컬럼 개수와 값 개수는 일치하여야 합니다. 그리고 문자열형의 값을 입력하고자 할 경우에는 ‘값’ 과 같이 홑따옴표로 묶어 문자열임을 표시하도록 합니다.

INSERT INTO TYPE  VALUES ('공포',1000,3)

다음과 같이 테이블 뒤에 컬럼 명을 기술하지않고 바로 값을 입력할 수도 있습니다. 마찬가지로 값에는 해당 테이블의 모든 컬럼에 들어갈 값 개수를 일치시켜야 합니다.

INSERT INTO TYPE (NAME,PRICE,PERIOD) SELECT   TOP 1  '공포', AMOUNT, 2 FROM MEMBER

SELECT에서 얻은 결과를 그대로 테이블에 INSERT 할 수 있습니다. 필요할 경우에는 INSERT하는 테이블에 열을 지정할 수도 있습니다. 여기서도 INSERT와 SELECT에서 열의 수는 같아야 합니다.

UPDATE

UPDATE 테이블명 SET Column1 = Value1 , Column2 = Value2, ….

UPDATE VIDEO SET COMPANY = '맹구필름' , DIRECTOR= '맹구'   WHERE PK = '1'

기존의 행 내용을 변경하기 위해서 UPDATE 문을 사용합니다. 위의 예문은 비디오 테이블에서 PK값이 1인 행을 찾아 COMPANY 값이 ‘영구필름’이었던 것을 ‘맹구필름’으로, ‘심영래’였던 DIRECTOR 컬럼의 값을 ‘맹구’로 변경하는 내용입니다. 형식은 UPDATE 문 뒤에 변경하고자 하는 테이블 이름을 기술하고 그다음 SET 문 뒤에 변경하는 컬럼과 그 값을 부등호로 연결합니다. 뒤에 WHERE 절을 생략하게 되면 테이블의 모든 행이 변경됩니다.

WHERE 절을 기술하게되면 변경 대상의 범위가 한정됩니다. 보통 데이터의 변경처리는 어떤 행이 있는 열을 변경하는 것이기 때문에 WHERE 조건에 해당하는 행이 없을 경우는 아무 행도 변경되지 않습니다. 변경하고자 하는 컬럼이 여러개 있을 경우 , 콤마를 사용하여 컬럼명=값 형식으로 반복하여 기술합니다.

UPDATE TYPE SET PRICE = (SELECT MAX(PRICE) FROM TYPE) WHERE NAME = '액션'

SET를 사용하여 부여하는 변경값에 서브쿼리를 입력 할 수도 있습니다. 장르 테이블에서 액션장르의 가격을 장르테이블에서 가장 가격이 비싼 장르의 가격으로 업데이트하는 내용입니다. 이런 방법으로 다른 테이블에 있는 열의 값을 참조하거나 집계해서 UPDATE 할 수 있습니다.

DELETE

DELETE FROM 테이블명

DELETE FROM MEMBER WHERE NAME  ='김부식 '

테이블에서 기존 데이터 행을 삭제하기 위해 DELETE FROM 다음에 삭제 대상의 되는 테이블 이름을 입력합니다. 위 쿼리는 회원 테이블에서 이름이 김부식인 회원의 정보를 삭제하는 쿼리입니다. 이렇게 삭제하고자하는 행을 지정하고 싶다면 WHERE 절을 사용하여 조건을 붙일 수도있지만 생략할 수도 있습니다. 생략한 경우에는 테이블 내의 모든 행이 삭제됩니다. 모든 행을 삭제하고 싶다면 DELETE 문 보다 ‘TRUNCATE TABLE 테이블명’ 구문을 사용하는게 더 유용합니다.

DELETE FROM RENT WHERE PK = (SELECT PK FROM VIDEO WHERE VIDEO.NAME = '영구와 땡칠이')

UPDATE 문과 같이 WHERE 조건에 해당하는 행이 존재하지 않을 경우에 행은 삭제되지 않으며 위 쿼리와 같이 대여 테이블에서 특정 비디오이름을 가진 행을 삭제하고 샆지만 그 조건이, 관계한 비디오 테이블에 있는 경우 서브쿼리를 사용하여  삭제를 할 수도 있습니다.




TRANSACTION

데이터베이스 시스템에서는 트랜잭션이라는 것이 있습니다. 복수의 명령을 하나의 논리 단위로 묶어 그것들의 처리가 끝나지 않은 동안은 다른 사용자의 요구에 응답하지 않는 것으로 데이터의 일관성을 유지할 수 있습니다.

sql1

예를 들어 안중근 회원의 예치금으로 현재 1,000원이 데이터베이스에 기록이 되어 있어서 시스템에서 조회하면  1,000원이 나오게 됩니다. 2,000원 상당의 비디오를 대여하기 위해서 여유있게 5,000원의 예치금을 더 충전하게 되면 6,000원이 됩니다. 허나 동시에 다른 시스템에서 예치금이 충전된 되기전에 조회한 1,000원 잔액에서 2,000원에 비디오 대여기록을 하게되면 1,000원에서 -1,000원으로 계산하여 6,000원의 예치금 값을 업데이트해버리는 불상사가 발생하게 됩니다. 이렇듯 데이터를 얻는 행위와 데이터를 변경한다는 행위가 따로 발생되면 매우 위험성이 있습니다.

트랜잭션을 사용하면 복수의 INSERT나 UPDATE 명령을 하나로 묶어 실행 할 수 있습니다. SQL 명령에서 트랜잭션 시작은 BEGIN TRANSACTION 이라고 하는데 저 문구를 실행하여 트랜잭션이 시작된 후의 INSERT, UPDATE, DELETE 명령은 실제로는 실행되지 않고 보류 상태가 됩니다.

이렇게 보류상태가 된 명령을 COMMIT TRANSACTION 명령을 써서 모두 데이터베이스에 적용하는 방법과 모든 것을 무효화시키고 종료하는 ROLLBACK TRANSACTION이 있습니다.

BEGIN TRANSACTION
DELETE FROM MEMBER WHERE NAME = '안중근'
COMMIT TRANSACTION

위 명령은 실제로 회원 테이블에서 안중근 회원의 정보를 실제로 삭제하게 되지만,

아래 명령은 삭제를 무효화해서 회원 테이블을 조회하면 안중근 회원의 정보가 살아있는것을 확인 할 수 있습니다.

BEGIN TRANSACTION
DELETE FROM MEMBER WHERE NAME = '안중근'
ROLLBACK TRANSACTION
SQL 데이터 조작 언어(DML) – 1
SQL 데이터 정의 언어(DDL) – 1

댓글 남기기