주의해서
데이터 무결성
참조무결성
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 ~랑 ~랑 같다는 조건~~서브쿼리 있음
외부조인
외부조인은 셋으로 나뉨. 왼/풀/오 그런데 왼/오 중 하나만 할 줄 알면 된다. 위치를 바꾸면 되니까
크로스 조인
크로스 조인은 조인 조건이 필요없다.
크로스 조인은 테이블 간의 카티전 곱의 데이터를 갖는다.
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문은 여러모로 쓸 일이 많다.