*이 포스팅은 개인의 학습 내용을 정리한 것입니다.
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 FROM Titles WHERE title_id = 'PS2091' 결과> 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]
댓글