최종 오답 정리

younghyun·2023년 6월 9일
0

SQLD

목록 보기
18/18

데이터 모델링

  • 물리적인 스키마 설계를 하기 전 단계는 "논리적 모델링"이다.
  • 중심 엔티티는 업무 중심 역할, 기본 엔티티로부터 발생하고 관계를 통해 생성된다.
  • 행위 엔티티는 부모 엔티티로부터 발생, 자주 바뀐다.
  • 데이터 모델링의 3요소는 "엔티티", "속성", "관계"이다.

반정규화

  • 테이블 추가하는 기법 존재
  • 데이터 무결성이 깨질 가능성이 있다.
  • 자주 사용되는 테이블에 접근하는 프로세스 수가 많고 일정한 범위만 조회하는 경우
  • 통계 정보를 필요로 할 때 별도의 통계 테이블을 생성해야 하는 경우

기본적인 DML (SELECT, INSERT, UPDATE, DELETE)

WHERE 회원번호 IS NOT NULL;

기본적인 DDL (CREATE, ALTER, DROP, RENAME, TRUNCATE)

// 테이블 생성
CREATE TABLE <테이블 명> <컬럼명> <데이터형>

// 컬럼의 데이터 타입을 변형하는 SQL구문
ALTER TABLE <테이블 명> ALTER COLUMN <컬럼명> <데이터 타입>

// 연관된 테이블 같이 삭제하는 SQL구문
DROP TABLE <테이블 명> CASCADE

기본적인 DCL (GRANT, REVOKE)

  • GRANT: 권한을 주는 명령어
GRANT CREATE TABLE TO <사용자 명>

기본적인 TCL (COMMIT, ROLLBACK, SAVEPOINT)

  • DDL 문장 실행시 AUTO COMMIT이 실행된다.
  • ROLLBACK시 최신 COMMIT까지 복귀 또는 지정 SAVEPOINT까지 복귀

CONSTRAINT

// 제약 조건 추가
ALTER TABLE <테이블 명> ADD CONSTRAINT <제약조건이름> <제약조건> 
// 제약 조건 삭제
ALTER TABLE <테이블 명> DROP CONSTRAINT <제약조건이름>
// 외래키
CONSTRAINT fk_id FOREIGN KEY (id) REFERENCES apple (id)
// 기본키 
CONSTRAINT pk_id PRIMARY KEY

NULL 관련

// 표현식1이 NULL이면 표현식2 출력
NVL(표현식1, 표현식2)  
ISNULL(표현식1, 표현식2)

// 표현식1 = 표현식2이면 NULL, 아니면 표현식1
NULLIF(표현식1, 표현식2)
// Null! if 표현식1 = 표현식2, 그렇지 않으면 표현식1
// NULL이 아닌 최초의 표현식
COALESCE(표현식1, 표현식2, ...) 
// expression과 search 값들을 순차적으로 비교하며, 일치하는 첫 번째 search 값을 찾으면 해당하는 result 값을 반환
DECODE(expression, search1, result1, search2, result2, ..., default_result)

NULL을 어떻게 계산하는가

  • SUM(컬럼)에서 컬럼 값이 NULL이면 SUM에 포함하지 않는다.
  • COUNT(컬럼)에서 컬럼 값이 NULL인 것을 제외한 행의 수를 계산한다.

JOIN

  • N개의 테이블을 조인할 경우 조인 최소 조건은 N-1개이다.
  • NATURAL JOIN은 WHERE절 불가능, CROSS JOIN은 WHERE절 가능

JOIN

// B-A 차집합을 구하는 구문
FROM B
WHERE NOT EXISTS (SELECT 'X'
                  FROM A
                  WHERE A.ID = B.ID)
                  
// B-A 차집합을 구하는 구문                 
FROM B LEFT OUTER JOIN A
   ON (A.ID = B.ID)
WHERE A.ID IS NULL

JOIN

왼쪽 테이블 m, 오른쪽 테이블 n, 교집합 행 k일때

  • INNER JOIN = k
  • LEFT OUTER JOIN = 왼쪽 테이블 행의 개수 + (교집합에서 오른쪽 테이블의 행이 많은 것 체크)
  • RIGHT OUTER JOIN = 오른쪽 테이블 행의 개수 + (교집합에서 왼쪽 테이블의 행이 많은 것 체크)
  • FULL OUTER JOIN = m+n-k
  • CROSS JOIN = m x n

그룹 함수

GROUP BY: 1행 종류 = m, 2행 종류 = n, 행의 개수 = k일때

  • ROLL UP = k+m+1
  • CUBE = k+m+n+1
  • GROUPING SETS = m+n

ALIAS절

  • FROM절에서 ALIAS를 할 수는 있지만 ALIAS 키워드를 사용하는 것은 불가능하다.
  • WHERE와 GROUP BY에서 사용할 수 없다.

서브 쿼리

  • GROUP BY를 제외한 모든 곳에서 사용 가능하다.
  • 다중행 서브쿼리는 반드시 비교 연산자를 사용해야 한다.
    • 다중행 서브쿼리 비교 연산자(IN, ALL, ANY, SOME, EXISTS)는 단일행 서브쿼리에서 사용가능
    • 단일행 서브쿼리 비교 연산자(=, >, <)는 다중행 서브쿼리에서 사용가능
  • 서브 쿼리 이론
    • 서브쿼리는 메인쿼리 칼럼 사용 가능
    • 메인쿼리는 서브쿼리 칼럼 사용 불가능

GROUP 함수

  1. ROLL UP 함수
  • GROUP BY ROLLUP(A): 전체 합계, 컬럼 A소계
  • GROUP BY ROLLUP(A,B): 전체 합계, 컬럼 A소계, 컬럼 A,B 조합 소계
  1. CUBE 함수
  • GROUP BY CUBE(A): 전체 합계, 컬럼 A소계
  • GROUP BY CUBE(A,B): 전체 합계, 컬럼 A소계, 컬럼 B소계, 컬럼 A,B 조합 소계
  1. GROUPING SETS 함수
  • GROUP BY GROUPING SETS(A): 컬럼 A소계
  • GROUP BY GROUPING SETS(A,B): 컬럼 A소계, 컬럼 B소계

WHERE 1=1

WHERE 1=1  // true
WHERE 1=2  // false  -> SELECT count(*)가 0이 됨

WINDOW 함수

순위, 집계, 행순서, 비율

SELECT WINDOW 함수 OVER (<행을 분할> <행을 정렬> <대상행 지정>)
  • 행을 분할: PARTITION BY (=GROUP BY)
  • 행을 정렬: ORDER BY
  • 행을 지정: ROWS 또는 RANGE
// 순위: RANK, DENSE_RANK, ROW_NUMBER
// RANK(1,2,2,4), DESSE_RANK(1,2,2,3), ROW_NUMBER(1,2,3,4)
SELECT RANK() OVER (ORDER BY <컬럼> DESC) AS RANK

SQL이 오류가 나는 경우

  • 가변 문자열인데 비교 연산하는 경우
  • 단일행 하위 질의에 2개 이상의 행이 리턴되는 경우
  • 고객ID를 FK로 가지고 있는 주문 엔티티에 (고객ID, 주문ID, 상품) 데이터를 넣었을 때, 고객ID가 고객 엔티티에 없는 경우 -> 무결성 제약 조건

Trigger란

  • 특정 테이블에 DML문이 수행되었을 때 자동으로 동작하도록 작성된 프로그램이다.

주관식 키워드

  • 파티셔닝
  • DML / DDL / DCL / TCL
  • GRANT / REVOKE / WITH GRANT OPTION / CASCADE
  • CONSTRAINT
  • VIEW
  • NL JOIN / SORT MERGE JOIN / HASH JOIN

기출 모음

  • NULL이 존재하면 UNKNOWN 반환
  • TRUNC: 소수점 이하의 값을 절삭하여 정수 부분만 남김
  • GROUPING SETS(A,B,C) = GROUP BY A UNION ALL GROUP BY B UNION ALL GROUP BY C
  • INSERT 구문은 IDENTITY 또는 CHECK 문제가 나옴
    • IDENTITY: AUTO_INCREMENT
    • CHECK: 조건을 만족하지 못할 경우 에러가 나나, NULL은 무시돼서 결과로 나온다.
  • 결합함수: CONCAT, || (ORACLE에서), + (SQL에서)
  • NATURAL JOIN에서 사용된 열은 식별자를 가질 수 없다.
  • CHARACTER는 고정 길이 문자열 정보 (고정 길이 문자열 S만큼 최대 길이를 갖고 그보다 작을 시 공백으로 채운다.)
  • VARCHAR : 가변길이 문자열 정보
  • WHERE A.ID = B.ID 는 INNER JOIN이다
  • DCL이 TCL을 포함하고 있다.
  • 차집합 -> MINUS (오라클), EXCEPT (sql)
profile
🌱 주니어 백엔드 개발자입니당

0개의 댓글