SET QUOTED_IDENTIFIER ON;
[]
가 아닌 이중 따옴표""
를 사용하여 개체 이름을 식별할 수 있다. SET ANSI_NULLS ON;
NULL
은 다른 NULL
값과 비교했을 때 같지 않다고 간주한다.NULL = NULL
은 FALSE
로 평가된다. VARCHAR와 NVARCHAR
예를 들어서 VARCHAR(10)에는 한글 10글자가 들어갈 수 없다. 그러나 NVARCHAR(10)에는 한글 10자리가 들어갈 수 있다. 그리고 이에 유니코드 문자를 넣기 위해서는 N'날씨좋다'
와 같이 유니코드 문자열 리터럴임을 알 수 있는 힌트를 앞에 삽입한다.
int
int를 아무생각 없이 넣는 경우가 많은데, 데이터베이스 설계는 아주 나중까지 생각하고 만든다. 때문에 요즘에는 경우에 따라서 int
보다는 bigint
가 사용되는 경우가 많다.
PK와 IDENTITY
PK는 기본적으로 그냥 PRIMARY KEY
가 아니라 PRKMARY KEY CLUSTERED
라고 생각해야한다. 물론 PK라고 해서 모두 그 컬럼에 대해서 클러스터 인덱스가 만들어진다고 볼 수는 없지만, PK에 클러스터 인덱스를 설정하지 않는 것이 흔한 케이스가 아니다.
그리고 나서는, 추가적으로 많이 SELECT
하여 쓰는 컬럼 같은 경우는 비클러스터 인덱스로 설정하여 사용한다.
IDENTITY
는 그냥 쓰지말고 명시적으로 디폴트 값 (1,1)
을 같이 붙여서 적어주자. IDENTITY(1,1)
와 같이. IDENTITY 같은 경우는 1씩 늘어나지만, 이걸 갖다가 PK로 쓰기는 무리가 있을 수 있다. 무조건 늘어나는 방향으로 변하지만, 넣지 않는 방향으로 할 수 도 있기 때문이다. 예를 들어서
1
2
3
4
이런 방향으로 붙여나가고 있다고 하자. 그러다가 중간 것을 삭제했다.
1
3
4
2
를 삭제한 것인데 여기서 데이터를 추가하게 되면
1
3
4
5
5
가 추가되게 된다. 이 경우에 2를 인위적으로 넣을 수 있다.
다음 쿼리를 추가하면 된다.
SET IDENTITY_INSERT dbo.테이블 이름 ON
하지만,
1
3
4
5
2
이런식으로 들어가게 된다.
SET IDENTITY_INSERT dbo.테이블 이름 OFF
취소는 꼭 해줘야 한다.
지역임시테이블
#
을 사용한다.CREATE TABLE #TEMPTABLENAME
(
~~
)
전역임시테이블
DATETIME, DATETIME2
DATETIME
대신에 DATETIME2
를 사용한다. 명시적 트랜잭션 사용
BEGIN TRANSACTION;
~~~~~작업
COMMIT TRANSACTION;
--ROLLBACK TRANSACTION
잘못되었다면 ROLLBACK TRANSACTION으로 트랜잭션을 되돌릴 수 있다.
TRUNCATE와 DELETE
TRUNCATE를 사용하면 테이블 안의 행을 빠르게 모두 지울 수 있다.
DELETE를 사용하여 행을 지울 수 있다.
TRUNCATE를 사용하여 모두 지우면 IDENTITY또한 초기화되지만 DELETE는 그렇지 못하다는 점에서 다르다.
집계함수 ( Cf. GROUP BY )
HAVING 문
FROM - WHERE - GROUP BY - HAVING - SELECT