TIL: 2024/05/23 - Database (3)

White 와잇·2024년 5월 23일

TIL

목록 보기
25/40
post-thumbnail

SQLD 대비 핵심 요약하기

관계형 데이터베이스 개요

데이터 무결성

데이터 정확성과 일관성을 유지하고 데이터 결손과 부정합이 없음을 보증

데이터 무결성 종류

  • 개체 무결성: 기본키 값은 NULL, 중복 X
  • 참조 무결성: 외래키 값은 NULL이거나 참조 테이블의 기본키 값
  • 도메인 무결성: 속성 값이 도메인에 속한 값
  • NULL 무결성: NULLABLE 여부 위배 X
  • 고유 무결성: UNIQUE 여부 위배 X
  • 키 무결성: 테이블이 서로 관계를 가질 경우 반드시 하나 이상의 조인키 존재

SELECT문

DQL?

Data Query Language
SELECT 문은 (DDL, DML, DCL, TCL)에 속하지 않고 DQL이라 표현

SELECT문 구조

SELECT * | 컬럼명 | 표현식
FROM 테이블명 또는 뷰명
WHERE 조회조건
GROUP BY 그룹핑컬럼명
HAVING 그룹핑 필터링 조건
ORDER BY 정렬컬럼명 [ASC|DESC];

파싱 순서

FROM > WHERE > GROUP BY > HAVING > SELECT > ORDER BY
(AS 정의에 영향!)

별칭 (Alias)

파싱 순서 유의
예약어 사용 불가
아래의 경우 쌍따옴표 (문자열은 홑따옴표!!!!!)
1) 공백
2) 언더스코어(_)를 제외한 특문 포함
3) 대소문자 구분

뷰?

테이블처럼 조회하여 볼 수 있지만 실제 데이터베이스에 저장된 데이터는 아님

여러 개의 테이블 사용

  • FROM절에 테이블 여러 개를 컴마로 나열
    카티시안 곱 발생, 성능하락
  • 조인

함수

DBMS에서의 함수는
input 값이 주어지면 그에 맞는 output 값을 주는 객체

종류

  • 단일행 함수
  • 복수행 함수 = 그룹함수 = 집계함수: 하나의 요약값을 리턴

LIKE 연산자

  • %: 자리수 제한 x
  • : 하나 당 한 자리수

JOIN

종류

  • NATURAL JOIN: 조인조건 생략, 키 연결로 자동 조인
  • CROSS JOIN: 조인조건 생략, 키 연결이 없어서 카티시안 곱 출력
  • SELF JOIN: 하나의 테이블을 두 번 이상 참조
    ..
  • EQUI JOIN: 등가 조인, 조인 조건을 '='으로 비교
  • NON-EQUI JOIN: 비교 조건이 '='이 아닌 경우. '>', BETWEEN, IN 등등

표준조인

ANSI 표준으로 작성되는 INNER JOIN, OUTER JOIN, CROSS JOIN, NATURAL JOIN

USING 구문

FROM A INNER JOIN B
ON A.COLUMN = B.COLUMN

일 때

FROM A INNER JOIN B
USING (COLUMN)

과 동일

서브쿼리

사용 가능한 곳: SELECT, FROM, WHERE, HAVING, ORDER BY, INSERT, DELETE, UPDATE

GROUP BY 절에 서브쿼리 사용 불가

서브쿼리문 안에 ORDER BY 사용 불가 (TOP-N 등 예외 있음)

종류

  1. 스칼라 서브쿼리
    SELECT에 사용되는 서브쿼리
    하나의 컬럼처럼 사용
    단일행만 전달 가능
    조인의 대체 연산
  2. 인라인 뷰
    FROM에 사용
    하나의 테이블처럼 사용
    인라인 뷰 내부에서 MAX()같은 함수컬럼 사용시 컬럼 별칭을 꼭 만들어서 메인쿼리에 전달
  3. WHERE절 서브쿼리
    값을 전달하기 위한 목적으로 주로 사용
    전달 값은 단일행, 다중행, 다중컬럼, 상호연관 서브쿼리의 형태가 있다
  • 단일행: 그냥 비교가능
  • 다중행:
    ANY(), ALL() 사용
    예시) WHERE COL1 > ALL(서브쿼리);
  • 다중컬럼:
    컬럼이 매칭이 되도록 서브쿼리 설계
    IN() 사용, EQUAL'=' 비교
    예제 시나리오) EMP 테이블에서 부서별 최대 급여자 찾기(EQUALS)
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE (DEPTNO, SAL) IN (
	SELECT DEPTNO, MAX(SAL)
    FROM EMP
    GROUP BY DEPTNO
);
  • 상호연관 서브쿼리: 메인쿼리와 서브쿼리의 비교
    다중컬럼 서브쿼리랑 같은 연산을 원하는데 대신 비교가 EQUAL이 아닌 대소비교
    최종 대소 비교할 컬럼을 메인쿼리에, 일치 조건을 서브쿼리에 기술
    예제 시나리오) EMP 테이블에서 부서별로 해당 부서 평균급여보다 높은 급여 받는 사원 찾기(대소비교)
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP E1
WHERE SAL > (
	SELECT AVG(SAL)
    FROM EMP E2
    WHERE E1.DEPTNO = E2.DEPTNO
    GROUP BY DEPTNO
);

집합 연산자

SELECT문 결과를 합침
두 집합의 컬럼 구성, 순서까지 일치해야 함
데이터타입 크기는 달라도 괜찮음

  • 합집합
    UNION: 중복 데이터는 한 번만
    UNION ALL: 중복 데이터도 출력
    중복 데이터가 없어도 UNION <-> UNION ALL은 성능 차이 존재

  • 교집합
    공통(중복) 데이터만 출력
    INTERSECT

  • 차집합
    한 쪽에만 존재하는 행 출력
    A-B 와 B-A는 다름

그룹함수

수학/통계함수

다중행 함수
반드시 한 컬럼
GROUP BY 필요

  • MIN/MAX()
    날짜, 숫자, 문자도 가능
    오름차순 순서

GROUP BY FUNCTION

GROUP BY 절에 사용하는 함수
여러가지 GROUP BY 동시에 가능

  • GROUPING SETS(A, B, ..)
    A별 그룹 결과 + B별 그룹 결과 + ...
SELECT DEPTONO, JOB, SUM(SAL)
FROM EMP
GROUP BY
GROUPING SETS(DEPTNO, JOB);

다음과 동일
GROUP BY A + GROUP BY B 합집합

SELECT DEPTNO, NULL AS JOB, SUM(SAL)
FROM EMP
GROUP BY DEPTNO
UNION ALL
SELECT NULL, JOB, SUM(SAL)
FROM EMP
GROUP BY JOB;

합계 출력을 추가하고 싶다면
GROUPING SETS(DEPTNO, JOB, ()); 처럼 () 입력


  • ROLLUP(A,B)
    A별 그룹 결과 + (A,B)별 그룹 결과 + 총계
    ROLLUP(B,A)와 다름
SELECT DEPTNO, JOB, SUM(SAL)
FROM EMP
GROUP BY
ROLLUP(DEPTNO, JOB);

다음과 동일

SELECT DEPTNO, JOB, SUM(SAL)
FROM EMP
GROUP BY DEPTNO, JOB
UNION ALL
SELECT DEPTNO, NULL, SUM(SAL)
FROM EMP
GROUP BY DEPTNO
UNION ALL
SELECT NULL, NULL, SUM(SAL)
FROM EMP;

  • CUBE(A,B)
    A별 + B별 + (A,B)별 + 총계
SELECT DEPTNO, JOB, SUM(SAL)
FROM EMP
GROUP BY
CUBE(DEPTNO, JOB);

다음과 동일 (GROUPING SETS)

SELECT DEPTNO, JOB, SUM(SAL)
FROM EMP
GROUP BY
GROUPING SETS(DEPTNO, JOB, (DEPTNO, JOB), ());

다음과 동일 (UNION ALL)

SELECT NULL AS DEPTNO, NULL AS JOB, SUM(SAL)
FROM EMP
UNION ALL
SELECT NULL, JOB, SUM(SAL)
FROM EMP
GROUP BY JOB
UNION ALL
SELECT DEPTNO, NULL, SUM(SAL)
FROM EMP
GROUP BY DEPTNO
UNION ALL
SELECT DEPTNO, JOB, SUM(SAL)
FROM EMP
GROUP BY DEPTNO, JOB;
profile
웹개발 도전! 데브옵스 도전!

0개의 댓글