본문 바로가기
SQL

SQLD 마무리

by 뱅뱅뱅뱅뱅 2024. 11. 12.

데이터 모델링의 세 가지 중요개념

 

업무가 관여하는 어떤 것(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')

두 인자 데이터형이 달라 오류

 

 

컬럼 크기를 늘리는 것은 언제든지 가능하며 반대로 줄이는 것은 해당 칼럼의 최대 길이만큼 줄일 수 있다.

못 줄이는 건 아니다..