데이터 모델링의 세 가지 중요개념
업무가 관여하는 어떤 것(Things)
업무가 관여하는 어떤 것의 성격(Events)
업무가 관여하는 어떤 것의 관계(Relationships)
SQL
비절차 언어
비교연산자(<, >, ...) 뒤에 GROUP BY를 사용한 다중행 서브쿼리는 올 수 없다
CROSS JOIN
카타시안 조합
분산 데이터베이스는 시스템의 가용성을 높이기 위한 것
SELECT id, name, age FROM users ORDER BY 3;
3번째 컬럼 기준으로 정렬
age
ROUND(-2.6) -> -3
윈도함수 안에 GROUP BY 절 올 수 없음
GROUP BT 대신 PATITION BY
GRANT <권한> ON <테이블> TO <사용자 또는 역할>;
GRANT SELECT ON employees TO user1;
SELECT EMP.DEPTNO NATURAL JOIN
- NATURAL JOIN은 두 테이블에서 동일한 열 이름을 기준으로 자동으로 조인합니다.
- SELECT EMP.DEPTNO NATURAL JOIN...처럼 특정 열을 명시하면 NATURAL JOIN의 원래 동작과 충돌이 발생합니다.
- NATURAL JOIN에서 같은 이름의 열을 기준으로 조인하므로, 테이블명.컬럼명 (EMP.DEPTNO) 형식으로 특정 열을 지정하면 SQL 구문 오류가 발생
- NATURAL JOIN 구문 자체는 명시적인 열 이름이나 ON 조건을 허용하지 않습니다.
합집합
UNION
중복 행 제거
정렬
교집합
INTERSECT
공통된 건만 추출
중복 제거 후 추출
차집합
MINUS, EXCEPT
왼쪽 테이블에서 오른쪽 테이블 제외
중복을 제거 후 추출
UNION ALL 만 중복이 생김
성능 측면에서 UNION 보다 UNION ALL이 우수
UNION은 내부적으로 SORT가 발생하기 때문
패턴문자를 그대로 문자열 해석하는 방법
LIKE '%@_%' ESCAPE '@'에서:
- %: 임의의 여러 문자
- @_: 언더바 _를 문자 그대로 찾음 (@가 탈출 문자 역할을 해서 _를 그대로 검색)
- ESCAPE '@': @를 탈출 문자로 지정하여, _를 패턴이 아닌 문자로 검색
결과적으로, _가 포함된 문자열을 찾습니다. (@말고 다른 문자 와도 됨)
SELECT * FROM TBL WHERE (COL1, COL2) IN ((10000, 'ABC'));
행의 수: 1
BETWEEN 2020 AND 2021
2020 <= A <= 2021
교차 엔터티
다대다 관계를 해소하려는 목적으로 인위적으로 만들어진 엔터티
논리모델에만 존재
주식별자를 도출하는 기준
명칭은 중복될 수 있고 내역은 계속 변경될 수 있으니 적합하지 않음
CODE='A' AND 200 BETWEEN COL1 AND COL2
COL1 <= 200 <= COL2
TBL_2
COL |
2 |
NULL |
WHERE A.COL NOT IN (SELECT COL FROM TBL_2);
NOT IN 은 AND
IN 은 OR
NULL = NULL 은 다 FALSE
IS NULL => TRUE
A.COL != 2 AND A.COL != NULL
결과: FALSE
WHERE A.COL IN (SELECT COL FROM TBL_2);
IN 인 경우는 OR 이기 때문에
결과: 2
( NULL은 그냥 FALSE 그래서 NULL 값은 반영 안 됨 )
CHAR은 비교시 서로 길이가 다를 경우 같은 내용으로 판단
CHAR는 고정길이
비교 시 길이가 다르면 짧은 쪽에 공백 추가하여 길이를 맞춤
문자열값 자체가 같은 경우 같은 내용으로 판단
'ABC' == 'ABC '
VARCHAR는 틀림
GROUP BY 된 테이블
GROUP BY 된 칼럼만 SELECT 가능 또는 집계함수
인덱스
검색 성능↑
EQUI, NON EQUI 비교 가능
DML 속도↓ ( 추가로 INDEX 값 계산해야 되기 때 )
**기본 키(PK)**를 설정하면 자동으로 인덱스가 생성
[TBL]
C1 |
1 |
2 |
3 |
INSERT FIRST 조건문
INSERT FIRST
WHEN C1 >= 2 THEN INTO T1
WHEN C1 >= 3 THEN INTO T2
ELSE INTO T3
SELECT * FROM TBL;
INSERT FIRST 조건문 때문에 WHEN은 앞 조건이 성공하면 넘어감
2, 0, 1
NATURAL JOIN, CROSS JOIN
ON 절을 쓸 수 없음
( WHERE 절을 쓸 수 있음 )
테이블에 대한 권한은 각 테이블의 소유자가 가지고 있기 때문에 소유자로부터 권한을 받지 않으면 다른 유저의 테이블에 접근할 수 없다
다른 유저의 테이블은 그 테이블에 대한 권한 없이 조회할 수 없다 (조회는 가능한지 앎)
논리 모델링의 외래키는 물리 모델에서 반드시 구현되지 않는 선택 사항
null 값 저장
SQL Server 인덱스 맨 앞에 저장
Oracle 인덱스 맨 뒤에 저장
서브쿼리의 한 종류인 인라인뷰의 칼럼은 메인 쿼리에서 사용 가능
그 외는 불가능
NTILE(ARGUMENT) 윈도우 함수는 데이터를 ARGUMENT 값으로 N등분하는 함수이다. 위의 예처럼 NTILE(4)는 1부터 4까지 4 등분한다.
현재 행을 기준으로 파티션 내에서 앞의 한 건, 현재행, 뒤의 한 건을 범위를 지정하는 Over의 옵션
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
Student_ID, Module을 조인할 때 Student와 Grades를 비식별자 관계로 설계하면 조인이 더욱 불편해짐
왜냐하면
- Module 테이블에서 Student_ID를 포함하지 않을 가능성이 생긴다..
- 이렇게 되면 Module과 Student를 직접적으로 조인할 수 없게 되고, 조인을 위해 중간 테이블(Grades)을 통해야 하므로 조인 과정이 복잡해질 수 있다.
4개의 테이블을 조인하기 위한 최소 조건은 n-1인 3이다
뷰의 특징
- 편리성
- 보안성
- 독립성
테이블 조회하는 것과 똑같이 조회
쿼리 실행 중 동적으로 메모리에 생성
자신만의 인덱스 생성 불가능
삽입, 수정, 삭제 불가능
테이블의 컬럼값 -> 고객번호, 주문금액
INSERT INTO 주문 VALUES(1004); -> ERROR
테이블 뒤 칼럼값이 없으면 전체 컬럼에 대한 인설트절이므로 오류
NULL 값 대체: 두 함수 모두 첫 번째 값이 NULL인 경우, 두 번째 값을 반환합니다.
- ISNULL(COMM, 100)
- NVL(COMM, 100)
- ISNULL: MSSQL 전용.
- NVL: Oracle 전용.
CEIL(-12.345) = -12
FLOOR(-12.345) = -13
round(-12.345) = -12
12, 11, 06, 01, 08 TO_CHAR 12, 11, 6, 1, 8
SUBSTR(JUMIN, 3, 2)은 태어난 월을 추출하기 때문에, 순서대로 12, 11, 06, 01, 08의 문자 유형으로 출력된다. 이를 TO_NUMBER를 사용하여 숫자 형태로 변환하면 12, 11, 6, 1, 8이 되는데, 이를 다시 TO_CHAR로 변환하게 되면 문자값의 비교 규칙에 따라 1 < 11 < 12 < 6 < 8 순서대로 출력된다. (문자는 가장 왼쪽부터 비교하여 값이 작을수록 작은 값이 된다)
barker 표기법
# 식별자
* 필수 속성 ( null 가질 수 없음 )
o 선택적 속성 ( null 가질 수 있음 )
(COL1, COL2) IN ((10000, 'ABC')); col1 이 10000 이고 col2 가 abc 인 것 (and)
OR,
중복된 결과는 제거 후 추출
NUMBER(5,2)
5자리 중 2자리를 소수점 자리로 사용하므로 정수 자리는 최대 3자리만 삽입 가능
ROLLBACK TO SAVE1;
save1 지점으로 롤백
ROLLBACK;
commit 지점으로 롤백
TO_CHAR('123', '999.99')
형식 '999.99':
- 999: 최대 3자리의 정수 부분.
- .99: 소수점 이하 최대 2자리
결과
'123.00'
행 값이 아무 값도 없는 경우
아무것도 반환 안 함
행 값이 null 만 있는 경우의 count()
0을 반환
UNPIVOT (판매량 FOR 구분 IN (Q1, Q2))
구분 칼럼에 q1, q2 있으니 IN 절 생각
두 엔터티의 관계가 서로 필수적일 때 하나의 트랜잭션을 형성할 수 있다
테이블명과 칼럼명은 무조건 문자 시작
SELECT 100 + '1' FROM DUAL;
문자열 '1'을 숫자 1로 암시적으로 변환
NVL(100, 'NULL')
두 인자 데이터형이 달라 오류
컬럼 크기를 늘리는 것은 언제든지 가능하며 반대로 줄이는 것은 해당 칼럼의 최대 길이만큼 줄일 수 있다.
못 줄이는 건 아니다..
'SQL' 카테고리의 다른 글
sqld 공부 ( 2 과목 : 관리구문 ) (0) | 2024.11.10 |
---|---|
sqld 공부 ( 2 과목 : SQL 활용 ) (0) | 2024.11.09 |
sqld 공부 ( 2 과목 : SQL 기본 ) (1) | 2024.11.03 |
sqld 공부 ( 1 과목 : 데이터 모델링의 이해 ) (4) | 2024.11.02 |