ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQLD 벼락치기...
    연습장 2024. 8. 24. 01:42

    2-29 다시 보기

     

    엔티티 매핑 관련 문제는 NULL인 것 제외 혹은 VALID CUSTOMER 같은 것 생각!! 중복 제외도 생각!

     

    SELECT 절에 DISTINCT는 항상 SELECT 바로 뒤에 위치한다.

     

    별칭(ALIAS)에 공백, 특수기호가 포함되거나 대소문자를 구분하고 싶을 때 "쌍따옴표" 붙여줘야 함.

     

    TRUNCATE는 DDL

     

    SELECT절에서 컬럼 별칭을 사용하면 ORDER BY 절에서만 사용 가능

     

    LPAD('X', 5, 'Y') → X의 왼쪽에 Y를 삽입해서 5개를 만들어라

     

    INSTR('A', 'B', x, y) → A에서 B를 x번째부터 찾는데, y번째 발견된 위치를 반환해라

     

    CEIL() → 올림. CEIL(3)은 3

     

    ROUND(X, -3) → 3번째에서 반올림

     

    SIGN() → 양수 음수 판별, 양수면 1, 0이면 0, 음수면 -1 return

     

    NVL(A, B), ISNULL(A, B) → A가 NULL이면 B, NOT NULL이면 A

    A와 B의 데이터 타입은 꼭 일치해야 함!! 불일치하면 오류

     

    COALESCE(A, B, ...) → NULL이 아닌 가장 앞에 있는 값 return

     

    NULLIF(A, B) → A와 B가 같으면 NULL이 return. 같지 않으면 A return

     

    DECODE(A, B, C, D, .... ) → A가 B와 같으면 C, 같지 않으면 D return

    DECODE(A, B, C) → A가 B와 같으면 C, 같지 않으면 NULL return

     

    TRIM()함수는 제거해 나가다가, 제거하지 않을 문자를 만나면 스탑!

     

    INITCAP() → 카멜 표기법으로 바꿈

     

    REPLACE(A, B, C) → A에서 B를 C로 치환

    REPLACE(A, B) → A에서 B를 모두 삭제

     

    TO_CHAR(100, '9999.99') → 공백100.00

    TO_CHAR(100, '0000.00') → 0100.00

    즉, 9는 공백 / 0은 0으로 채움

     

    INNER JOIN 사용 시, USING이나 ON을 반드시 사용해야 한다. 참

     

    CASE문에서 WHEN 앞에 비교대상이 들어가면 타입이 무조건 맞아야 함.... 1-18

    CASE문에서 CASE ~ WHEN ~ THEN ~

                                        WHEN ~ THEN~ ELSE ~. // 이렇게 ELSE는 마지막에 한 번만 올 수 있음

     

    오라클에서 100+'1' 은 101!

     

    일(DAY)만 쓰게 되면 나머지 년월 시분초 등은 현재 날짜를 따름...!

    날짜 +- 1에서 1은 하루

    날짜 계산시 30/24/60의 값은 30 * 1/24/60으로 보면 됨 → 30 * 1시간/60 → 30분

     

    CASE WHEN DEPTNO = 10 THEN 1 ELSE 0 END

    CASE WHEN DEPTNO = 10 THEN 1 END → 1이 아니면 NULL임

     

    연산자 우선순위 → NOT, AND, OR 순

     

    NULL을 포함한 SUM → NULL로만 구성된 SUM은 NULL return / 포함이 됐으면 NULL은 무시

    NULL과 사칙연산 → NULL return

     

    NULL을 포함한 COUNT → NULL은 카운트하지 않음!! / NULL로만 구성된 COUNT는 0

     

    WHERE 절이 FALSE이면 아무것도 출력되지 않음!!

     

    ORDER BY와 NULL → 오라클에서는 NULLS LAST가 DEFAULT(오름차순)

    근데 내림차순으로 ORDER BY 를 하면 거꾸로 되니까 NULL이 첫번째로 옴....

     

    MOD(X, Y) → X를 Y로 나눈 나머지

     

    GROUP BY절에는 컬럼 별칭을 사용할 수 없다..... → 별칭을 지정할 수 없다는 게 아니라, SELECT절에서 지정한 컬럼 별칭을 사용할 수 없다는 뜻...!

    ORDER BY절에서만 유일하게 사용 가능하다.

     

    OFFSET N → N 행을 건너 뜀

     

    GROUP BY절에서는 그룹함수를 사용할 수 없다!

    GROUP BY절에서는 명시되지 않은 컬럼을 그룹함수 없이 SELECT절에서 사용할 수 없다 1- 24 - 3

    GROUP BY절에서 나열되는 컬럼 순서는 중요하지 않다

    GROUP BY절에 사용한 컬럼만 ORDER BY 절에 사용할 수 있

     

    GROUP BY절에서 NULL도 묶임...!

     

    공집합에 대해 GROUP BY를 하면 공집합

    공집합을 COUNT()하면 공집합

     

    공집합은 아무것도 없는 것이고, NULL은 비어 있는 것이어서 둘은 다름

     

    GROUP BY의 결과가 아무것도 없을 때 COUNT를 하면 공집합

    단순히 WHERE절을 만족시키지 않을 때 COUNT를 하면 0

     

    SELECT절에서 컬럼 별칭을 정의하면, 컬럼 별칭 앞에 테이블 명을 사용할 수 없음

     

    <>과 !=은 같음. 같지 않으면 TRUE return

    비교 연산자와 NULL → NULL을 포함하면 FALSE / NULL = NULL 또는 NULL != NULL이 성립할 수 없음

     

    FROM절에서 , 로 이어져 있으면, JOIN임....

     

    LEFT OUTER JOIN → A LEFT OUTER JOIN B ON 조건이면, 조건을 만족하지 않는 A컬럼은 유지되고, 나머지 컬럼은 NULL로 채워짐

     

    FULL OUTER JOIN → UNION으로 됨.. 중복 제거!!!

     

    CROSS JOIN → 카디널리티의 곱 (모든 경우의 수)

     

    NATURAL JOIN → 컬럼의 이름이 같은 놈들끼리 JOIN  / 주의!!! NULL과 NULL은 같다고 할 수 없음!!

                                    USING이나 ON을 사용할 수 없음!!!!

     

    IN 연산자와 NULL → A IN (X, Y, Z)이면 A = X or A = Y or A = Z이므로 X, Y, Z 중에 NULL이 오면 반환 제외 1- 31

    NOT IN 연산자와 NULL → A NOT IN (X, Y, Z)이면 A != X and A != Y and A != Z이므로, X, Y, Z에 하나라도 NULL이 오면 모두 제외. 아무것도 안 나옴.

     

    EXISTS(서브쿼리) → 서브쿼리의 결과가 존재하면 출력

    NOT EXISTS(서브쿼리) → 서브쿼리의 결과가 존재하지 않으면 출력

    여기서 서브쿼리내 SELECT A 에서 A에는 아무거나 들어가도 상관 없음!!! 존재 유무만 판단하면 되기 때문

     

    날짜 대소비교에서 2020/02 보다 크면, 2020/02/01 이후이면 됨(크거나 같으면 2월 1일 포함)

     

    WHERE A <= ALL(30, 40, 50) → A가 30 보다 작거나 같아야 함

     

    서브쿼리가 있을 때 무조건 서브 쿼리가 먼저 실행되는 게 아니라, 해당 절을 탔을 때의 서브쿼리가 먼저 실행

     

    JOIN시 USING (필수)을 사용하는 경우 → 두 테이블의 공통된 컬럼을 기준으로 JOIN할 때... 무조건 괄호!

     

    INNER JOIN을 걸면 구매를 안 한 고객은 생략되고 구매가 안 된 서비스는 생략 됨.. 1 - 35

     

    LEFT OUTER JOIN을 걸고 COUNT를 해주면 됨...! 근데 COUNT를 하더라도 무엇을 하냐에 따라 차이가 있음!!

     

    SELECT TOP(2) WITH TIES → 2등이 여러명이더라도 2등까지 모두 출력!!

     

    ROLLBACK TO SAVE1; → SAVE POINT로 롤백!!!

    ROLLBACK; → 아직 커밋하지 않은 쿼리 모두 롤백!!!!!!!

     

    타입 관련

    NUMBER(5, 2) → XXX.XX // 정수 부분은 무조건 최대 3자리수! 소수 부분은 아무리 많이 들어와도 자동으로 2자리

     

    테이블 컬럼 별칭을 지정할 때 A, "A"는 다른 것임

     

    HAVING절에서는 그룹함수가 없는 일반 조건을 사용할 수가 있다.

     

    TRUNC(A, B) → 숫자일 때, 소수점 아래 B까지 버림

                                날짜일 때, TRUNC(8월 24일, 'MM') 이면 월의 첫째날인 8월 1일이 됨 // DEFAULT는 DAY값 버림

     

    날짜 포멧 

    RRMMDD → RR이 1~49이면 2000년대, 50~99이면 1900년대

    TTMMDD → YY는 무조건 2000년대 이후

     

    (SYSDATE - BIRTHDAY) / 365 → (오늘 날짜 - 생일) / 365 = 만 나이

     

    ORDER BY절에 SELECT절에 정의되지 않은 컬럼을 사용할 수 있다

     

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------

     

    그룹 함수

    GROUPING SETS(A, B, . . .) → A, B, . . .로 GROUP BY 결과

     

    ROLLUP(A, B) → A, (A, B), 전체()로 GROUP BY 결과 / 전체는 GROUPING SETS로 표현했을 때, ()이나 NULL?

     

    CUBE(A, B) → A, B, (A, B), 전체()로 GROUP BY 결과

    여기서 전체는 전체 총계 의미!!! 아마 SUM값 구하고 나머지는 NULL로 채우면 될듯

     

    윈도우 함수

    기본 골격

    SELECT

      윈도우함수([대상])

        OVER([PARTITION BY 컬럼] // 출력할 총 데이터 수 변화 없이 그룹연산 수행할 GROUP BY 컬럼

                   [ORDER BY 컬럼 ASC | DESC] // RANK의 경우 필수

                   [ROWS | RANGE BETWEEN A AND B]); // 연산 범위 설정, ORDER BY절 필수

     

    PARTITION BY는 ㅇㅋ

    ORDER BY 도 ㅇㅋ

    ROWS | RANGE BETWEEN A AND B가 문제인데....

     

    ROWS: 값이 같더라도 각 행씩 연산

    RANGE: 같은 값의 경우 하나의 RANGE로 묶어서 동시 연산(DEFAULT)

     

    BETWEEN A AND B → DEFAULT는 처음부터 현재행까지

     

    A) 시작점 정의

    • CURRENT ROW: 현재행부터
    • UNBOUNDED PRECEDING: 처음부터(DEFAULT)
    • N PRECEDING: N 이전부터

    B) 마지막 시점 정의

    • CURRENT ROW: 현재행까지(DEFAULT)
    • UNBOUNDED FOLLOWING: 마지막까지
    • N FOLLOWING: N 이후까지

     

    윈도우 함수 종류

    순위 관련 함수

    RANK(특정 값) WITHIN GROUP: 특정 값에 대한 순위 확인

    RANK() OVER(): 내가 평소에 생각하던 랭킹 시스템. → ORDER BY절 필수

    DENSE_RANK() OVER(): 1등이 여러 명이더라도 그 다음 순위가 2등

    ROW_NUMBER() OVER(): 그냥 나열한 순서대로.. 1순위가 두 명이어도 순서대로, 1순위 2순위

     

    LAG() OVER(): 이전 값

    LEAD() OVER(): 이후 값

     

    주의 : DEFAULT는 처음부터 현재행까지임

    FIRST_VALUE() OVER(): 처음 값

    LAST_VALUE() OVER(): 마지막 값

     

    NTILE(특정 값) OVER(): 특정 값이 2이면 컬럼들을 2개로 분리

     

     

    TOP N QUERY → 페이징 처리를 효과적으로 수행하기 위해 사용

    추출 방법

    ROUNUM

    RANK

    FETCH

     

    계층형 질의

    기본 골격

    SELECT 

    FROM 테이블명

    START WITH 시작 조건

    CONNECT BY PRIOR 연결조건; // A = B 이면 상위레벨의 A 와 하위레벨의 B가 같은 것을 찾으면 됨

    현재 읽은 컬럼을 지정하는 구문 → PRIOR

     

     

    PIVOT과 UNPIVOT

    PIVOT: LONG DATA → WIDE DATA

    UNPIVOT: WIDE DATA → LONG DATA

     

    PIVOT 기본 골격

    SELECT * FROM 테이블명 또는 서브쿼리

    PIVOT (VALUE 컬럼명  FOR UNSTACK 컬럼명 IN (값1, 값2, 값3));

     

    STACK 컬럼은 FROM절에서 선언한 컬럼 중 VALUE와 UNSTACK컬럼을 제외한 모든 컬럼!!!

    따라서 FROM절을 반드시 제한해줘야 함! 에러는 아님....

     

     

    UNPIVOT 기본 골격

    SELECT * FROM 테이블명 또는 서브쿼리 // UNPIVOT은 여기를 굳이 제한할 필요는 없음

    UNPIVOT (VALUE 컬럼명 FOR STACK 컬럼명 IN ("값1", "값2", ... )); // 컬럼 이름은 문자이므로 쌍따옴표로 전달

                                                                                                                   // 단, 대명사는 쌍따옴표 붙이지 않음!!!

     

     

    정규 표현식

     

     

     

    '연습장' 카테고리의 다른 글

    vite-react 프로젝트 생성 후 실행 시 error 사항 (작성 중)  (0) 2024.12.20
    DB Lock  (0) 2024.10.17
    SQLD 정리...  (0) 2024.08.23
    장애 대응 4 - 후속 조치, 예방 조치  (0) 2024.08.21
    장애 대응 3 - 장애 복구  (0) 2024.08.21
Designed by Tistory.