SQL Server 교육 복습(2)

냐옹·2024년 4월 22일
0

SQL

목록 보기
17/18
SET QUOTED_IDENTIFIER ON;
  • SQL Server에서 따옴표로 묶인 식별자 ( 테이블, 컬럼 이름 )와 리터럴을 구분하는 방식을 정의한다.
  • 이 옵션이 활성화되면 대괄호[]가 아닌 이중 따옴표""를 사용하여 개체 이름을 식별할 수 있다.
SET ANSI_NULLS ON;
  • SQL Server에서 NULL 비교동작을 정의한다.
  • 이 옵션 활성화 시, NULL은 다른 NULL 값과 비교했을 때 같지 않다고 간주한다.
  • NULL = NULLFALSE로 평가된다.

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 를 사용한다.
  • 하지만, 기존의 것들과의 호환성을 고려해야 한다.

명시적 트랜잭션 사용

  • 트랜잭션은 기본적으로 3가지로 분류할 수 있다. 자동 / 명시적 / 묵시적
  • 기본적으로 SQL Server는 자동 트랜잭션을 사용한다.
  • 우리가 DML- DELETE를 했다고 쳐보자. 실행 이후에 자동으로 커밋된다. 그럼 삭제한 이후에 절대 되돌릴 수 없다.
  • 때문에 명시적 트랜잭션을 사용하는 것이 좋다.
BEGIN TRANSACTION;
~~~~~작업
COMMIT TRANSACTION;

--ROLLBACK TRANSACTION

잘못되었다면 ROLLBACK TRANSACTION으로 트랜잭션을 되돌릴 수 있다.

  • 묵시적 트랜잭션도 쓸 수 있긴하지만, 뭐가 되었던지 생략하는 것은 좋지 않은 것 같아서 쓰지 않도록 한다.

TRUNCATE와 DELETE
TRUNCATE를 사용하면 테이블 안의 행을 빠르게 모두 지울 수 있다.
DELETE를 사용하여 행을 지울 수 있다.
TRUNCATE를 사용하여 모두 지우면 IDENTITY또한 초기화되지만 DELETE는 그렇지 못하다는 점에서 다르다.

집계함수 ( Cf. GROUP BY )

  • 먼저 첫번째로 기준열에 대해서는 왠만하면 무조건 조회를 한다. 왜냐하면 GROUP BY를 할텐데 뭐를 기준으로 그렇게 하는지 정도는 알아야 하기 때문이다.

HAVING 문

  • GROUP BY가 없으면 절대로 있을 수 없다.
  • GROUP BY를 사용하여 집계한 결과에 조건을 지정한다.
  • 예를 들어서,
    SELECT
    FROM
    WHERE
    GROUP BY
    HAVING 이 있다고 쳐보자. 실행 순서는 다음과 같다.

FROM - WHERE - GROUP BY - HAVING - SELECT

0개의 댓글