MSSQL(1)

냐옹·2024년 2월 8일

주의해서

  • 데이터 무결성

  • 참조무결성
     dbms에서 2개의 관련있던 관계 변수(테이블) 간의 일관성(데이터 무결성)을 말한다.

  • CASCADE

  • SET NULL 옵션

  • 임시테이블
     테이블 이름 앞에 #이나 ##을 붙인다.
     세션 종료시 제거
     지역임시테이블 #
     해당 임시 테이블을 만든 세션에서만 사용가능
     전역임시테이블 ##
     해당 임시 테이블을 만든 세션은 물론 다른 세션에서도 조회가 가능한 임시테이블

  • 정규화 Normalization
     데이터를 보다 효율적으로 저장하고
     데이터 중복을 방지하고
     저장공간이 낭비되는 테이블 설계를 제거하기 위함이다.
     정규화를 진행할수록 테이블 개수가 많아진다.
     그러나 정규화를 통해 얻는 이점도 많아진다.
     1차 정규화
     반복되는 속성이나 그룹의 속성을 제거하고
     새로운 테이블을 추가한 후에 기존 테이블과 일대다 관계를 형성하는 것
     2차 정규화
     기본키가 복합키로 구성되었을 때, 복합 키 전체에 의존하지 않고 일부에 의존적인 열이 있으면 이를 제거해야 하는 것
     3차 정규화
     기본 키에 의존하지 않고 일반 열에 의존하는 열이 있다면 이를 제거해야 하는 것을 의미

  • INNER 조인 처리
     논리처리 단계를 카티전 곱으로 처리한다.
     카티전 곱
     두개 이상의 테이블을 조인할 때, 조건을 지정하지 않고 모든 행을 연결하여 결과를 생성하는 연산
     카티전 곱의 결과는 중복된 행이 많이 포함될 수 있다.
     일반적으로 카티전 곱은 성능문제를 유발할 수 있으므로, 조인 조건을 지정하여 필요한 행만 선택하는 것이 좋다.
     내부 조인의 과정을 한번 살펴보자
     1) SELECT emp.FirstName, ord.Amount
     2) FROM HR.Employee AS emp
     3) JOIN Sales.SalesOrder AS ord
     4) ON emp.EmployeeID = ord.EmployeeID;
     라고 했을 때 가장 먼저 from이 수행되고
     그 다음에 join이 수행된다. 여기서 카티전 곱으로 경우의 수가 모두 발생하고 거기서 이제 ON으로 필터링을 거친다.
     필터링을 거친 이후에 맨 마지막으로 SELECT 문이 수행된다.

  • 와일드카드
     MYSQL과 같음
     LIKE %, _

  • 내부조인의 실행순서 한번 다시보기
    SELECT 이름, 내용 등등....
    FROM 테이블 별칭1
    INNER JOIN 테이블 별칭 2
    ON 어떻게 조인?
    WHERE ~랑 ~랑 같다는 조건~~서브쿼리 있음

  1. 서브쿼리 먼저 실행 (WHERE절) 그래서 결국 서브쿼리의 결과는 SELECT문에서 찾는 결과과 같음
  2. 이후에 ON 조인에 따라서 내부조인을 하고
  3. 마지막에 원하는 것만 SELECT 해서 보여준다.
  • 외부조인
     외부조인은 셋으로 나뉨. 왼/풀/오 그런데 왼/오 중 하나만 할 줄 알면 된다. 위치를 바꾸면 되니까

  • 크로스 조인
     크로스 조인은 조인 조건이 필요없다.
     크로스 조인은 테이블 간의 카티전 곱의 데이터를 갖는다.

  • SQL의 실행순서
     FROM을 먼저, JOIN이 있다면 가상 테이블에 JOIN으로 합쳐진 데이터를 결합
     FROM으로 가져온 데이터를 갖다가 WHERE의 조건에 따라서 필터링 한다.
     GROUP BY, 이전의 단계를 거쳐서 추출된 데이터들을 GROUP BY에 명시된 컬럼을 기준으로 그룹핑한다.
     HAVING 그룹핑된 데이터에 대해서 HAVING에 명시된 필터링을 실행한다
     여기서 WHERE와 헷갈릴 수 있는데, HAVING은 그룹핑된 데이터에 필터링을 거는거다.
     그래서 GROUP BY가 없으면 애초에 사용할 수 없고,
     만약에 WHERE절에 걸 수 있는 필터라면 HAVING보다 WHERE에 거는 것이 바람직하다.
     그리고 SELECT로 원하는 컬럼을 선택하고
     ORDER BY로 추출하면 댐
     TOP이나 이런건 뭐 알아서

  • WHERE 절의 성능을 최적화하기 위해서는
     INDEX를 타는지 항상 체크해라
     쿼리 작성시에 반드시 필요한 컬럼만 명시해라
     WHERE 조건문의 왼쪽은 순수한 컬럼만 넣어라
     조인을 사용하면 되도록이면 내부조인을 써라
     서부 쿼리 사용시에 불필요한 SELECT 구문을 줄여라

  • 궁금한게 생겼었다. 필터링의 시간복잡도는 어떻게 될까. SQL의 필터링은 내부적으로 어떻게 구현이 되어있고 무엇에 영향을 받을까?
     어쩔 수 없이 모든 행을 살펴보려면 시간복잡도는 O(N)이 되어야 한다고 생각했으나..분할정복으로 하면 대략 O(LOGN)~ < O(N)
     그런데 CLOVAX한테 물어보니까 병렬처리가 되어있다고 한다.
     병렬처리는 참고로 여러개의 CPU 코어를 사용해서 동시에 여러 작업을 수행하는 기술
     그렇다면 SQL의 성능은 CPU 코어 개수와 CPU의 성능에 좌우된다는 소리이다.
     SQL 안에서 WHERE는 어떻게 구현되어 있길래 병렬처리를 쓴다고 하는걸까
     WHERE절의 조건에 따라서 데이터베이스 테이블을 여러 개의 파티션으로 분할한다. 각 파티션은 독립적으로 처리됌...!
     분할정복
     병렬처리 알고리즘
     분할된 파티션을 여러개의 CPU코어가 동시에 처리
     병렬처리 알고리즘
     그렇기 때문에 CPU속도와 코어 개수에 많이 의존하게 된다. 결론적으로 컴퓨터 성능에 의존한다는 소리.

  • CASE 문은 항상 문자열을 반환한다.
     COUNT는 정수형을 반환한다.
     CASE( ~~ AS 형)으로 데이터 타입을 변환할 수 있다.

  • ISNULL( 1, 2 )
     1이 널이 아니면 2로 대치

  • 특정 부분만 ~로 간주해서 정렬하기
     예를 들어서 부서 아이디 DeptID가 STG라는 부서가 있다고 하자.
     이 부서를 맨 위에 정렬하고, 나머지는 그대로 하고 싶다. 현재 오름차순으로 정렬되어있다고 하자.
     그럼 이 STG를 AAA로 간주한다.
     ORDER BY CASE DeptID WHEN ‘STG’ THEN ‘AAA’ ELSE DeptID END ASC;
     CASE문은 여러모로 쓸 일이 많다.

  • CTE문
     하위 쿼리 대신에 쓴다.
     간단한 문법
    WITH 이름 ( 사용할 컬럼들 )
    AS (
    SELECT 문
    )
    해당 CTE를 사용하여 만들 SELECT 구문

0개의 댓글