-
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