본문 바로가기
Programming/DB (SQL)

[SQL Server] Chapter 03. T-SQL기초(2)

by 곰네Zip 2014. 12. 4.

*이 포스팅은 개인의 학습 내용을 정리한 것입니다.

 

11. UNION

  - 두 테이블을 조합한다. 선택된 목록의 수가 같아야 하고, 컬럼의 데이터 형식은 동일하거나 변환 가능해야 한다.

  - UNION 사용의 기준

 1) 컬럼명은 첫 번째 SELECT문의 컬럼명을 따른다.

 2) 최종 결과 순서를 정의하거나 요약 값을 계산하기 위한 ORDER BY 및 COMPUTE절은 UNION문의 끝에서만 사용가능

 3) GROUP BY및 HAVING절은 개별 쿼리에만 사용할 수 있으며 최종결과 집합에 영향을 주도록 사용할 수 없다. 대신 하위 쿼리로 만들은 파생 테이블에서 처리가 가능

 4) INTO절은 첫 SELECT문에 포함하여 새로운 테이블을 만들고 삽입할 수 있다.

 5) FOR BROWSE절은 UNION연산자를 포함하는 명령에 사용할 수 없다.

  - UNION과 UNION ALL의 차이.

   (1) UNION : 중복된 결과를 제거한다.

   (2) UNION ALL : 중복된 결과를 제거하지 않고 표현

   -> 모든 데이터가 중복되지 않는다면 UNION과 UNION ALL의 결과는 중복되지 않겠지만, UNION의 경우 모든 행을 체크하는 과정이 있으므로, 단순히 연결만 할 경우엔 ALL을 붙여주는 것이 좋다. 

 

 

 

13. DELETE문

  - 데이터 삭제시에 사용 

 DELETE [FROM] <데이터삭제할 테이블> [ FROM <검색조건을위한 참조테이블>] [ WHERE <삭제조건>]

 

14. UPDATE문

  - 데이터 업데이트시 사용 

 UPDATE <갱신할테이블> SET <갱신컬럼>=<신규값> [FROM <검색조건용참조테이블>][WHERE <검색조건>]

   * DELETE, UPDATE는 WHERE절이 없을 경우 전체 행이 영향을 받는다.

 

16. UPDATE컬럼에 다중행 적용시.

  특정 컬럼들의 누적된 합을 저장하고 싶을 때 다음과 같이 쿼리를 작성할 수도 있다. 아래 쿼리의 예를 보자.

 원본데이터>

 -Titles

 title_id       ytd_sales

-----------------------

 PS2091         0

 PS2092         0

 -Sales

stor_id ord_num         ord_date             qty          title_id

-------------------------------------------------------

 0001     722a      2014-12-01 00:00:00      3          PS2091

 0002     222a      2014-12-01 00:00:00      13         PS2091

 0003     522a      2014-12-01 00:00:00      2          PS2091

 0004     122a      2014-12-01 00:00:00      5          PS2091

 0002     722b      2014-12-02 00:00:00      12        PS2091

 0001     724a      2014-12-02 00:00:00      11         PS2092

 0001     723a      2014-12-03 00:00:00      8          PS2092

 쿼리>

 update titles set ytd_sales = titles.ytd_sales + sales.qty FROM titles, sales WHERE titles.title_id = sales.title_id

 결과> (update후 Titles를 select)

 title_id       ytd_sales

-----------------------

 PS2091         12

 PS2092         8

  위 조건에서 확인하여 보면, 마지막 행의 qty만 추가되었다.

  모든 합을 적용하고 싶을 경우 쿼리를 다음과 같이 수정해야 한다.  

 update titles set ytd_sales = titles.ytd_sales + s.SumQty FROM titles, (SELECT title_id, SUM(qty) AS SumQty FROM Sales GROUP BY title_id) s WHERE titles.title_id = s.title_id

 이렇게 수행하면 각 qty의 합이 ytd_sales 컬럼에 정상적으로 저장된다.

 

17. 갱신된 컬럼의 내용을 변수에 담기

 - 변수를 선언하여 그 변수에 값을 담을 수 있다. 로컬 변수 선언은 DECLARE로 선언한다. 사용 방법은 다음과 같다. 

 DECLARE @id type

  위에서 사용한 쿼리를 변수를 사용하여 처리하면 아래와 같다.

 쿼리>

 DECLARE @TotSales int
 UPDATE Titles SET @TotSales = ytd_sales = (SELECT SUM(qty) FROM Sales WHERE title_id='PS2091')  

   FROM Titles WHERE title_id = 'PS2091'
 SELECT @TotSales

결과>

 35

 

 18. INSERT문

  - 테이블에 데이터(행)을 추가할때 사용한다. 

 INSERT INTO <테이블명> [삽입할컬럼이름] VALUES ( <컬럼의 순서에 맞는 값들> )

  - 삽입에서 명시되지 않아도 되는 컬럼

   (1) NULL값인 경우

   (2) 기본값을 가진경우

   (3) 자동증가형 속성을 가진 경우

   (4) Rowversion이나 Timestamp데이터 형식

  - 자동증가형 속성의 경우 컬럼이 IDENTITY_INSERT 세션 옵션이 ON이어야 값을 대입할 수 있다.

  아닐경우 8101 에러메시지 발생. IDENTITY_INSERT옵션의 설정은 다음과 같이 한다. 

 SET IDENTITY_INSERT table {ON | OFF};

    -> 테이블 명 앞에 db명, 스키마명이 필요하지만 생략 가능하다.

 

19. TRUNCATE TABLE문

 - 이 구문은 WHERE절 없는 DELETE와 기능적으로 동일하다. DELETE의 경우 각 행별로 데이터를 삭제하지만, TRUNCATE TABLE은 데이터 페이지의 할당자체를 취소해 버린다. 테이블의 데이터를 모두 제거.

 - DELETE는 UNDO data가 있어 undo가 가능하지만, TRUNCATE는 해당 데이터가 없어 undo불가능.

 - 이 구문은 해당 테이블이 참조중이지 않은 경우에만 동작할 수 있다.

 

출처 : [SQL Server advanced programming]

반응형

댓글