SQLD 공부 PART 2 - CH1. SQL 기본
SQLD - Week 4 - Part2 - CH1. SQL 기본
- 유튜브 <홍쌤의 데이터랩>, 강의자료 단권화
- 책 <2023 유선배 SQL개발자(SQLD) 과외노트> 참고
1. 함수
- 문자형, 숫자형, 날짜형, 변환 함수 : 단일행 함수
문자함수
- CONCAT(대상1, 대상2) : 문자열 결합
- =
대상1 || 대상2
- =
날짜형 함수
- DATE_FORMAT(날짜, 형식)
- Oracle 환경은 지원X
- TO_CHAR / TO_DATE 활용
구분기호 | 역할 | 구분기호 | 역할 |
---|---|---|---|
%Y | 4자리 연도 | %m | 숫자 월(두자리) |
%y | 2자리 연도 | %c | 숫자 월(한자리는 한자리) |
%M | 긴 월(영문) | %d | 일자(두자리) |
%b | 짧은 월(영문) | %e | 일자(한자리는 한자리) |
%W | 긴 요일(영문) | %l | 시간(12시간) |
%a | 짧은 요일(영문) | %H | 시간(24시간) |
%i | 분 | %r | hh:mm:ss AM, PM |
%T | hh:mm:SS | %S | 초 |
- 이 표는 오라클에서는 필요없는건가?
그룹함수
- 복수행 함수(여러 행이 요약되어 하나로 나옴)
- NULL 무시하고 연산(데이터 없는 취급)
- COUNT할때 NULL 데이터는 세지 않음
함수명 | 출력내용 | 쿼리문 예시 |
---|---|---|
COUNT | 행의 수 | SELECT COUNT(SAL) FROM EMP; |
SUM | 총 합 | SELECT SUM(SAL) FROM EMP; |
AVG | 평균 | SELECT AVG(SAL) FROM EMP; |
MIN | 최솟값 | SELECT MIN(SAL) FROM EMP; |
MAX | 최댓값 | SELECT MAX(SAL) FROM EMP; |
VARIANCE | 분산 | SELECT VARIANCE(SAL) FROM EMP; |
STDDEV | 표준편차 | SELECT STDDEV(SAL) FROM EMP; |
일반함수
- DECODE(대상, 값1, 리턴 1, 값2, 리턴2, …, 그외리턴) : 대상이 값 1이면 리턴 1, 값2면 리턴2, .. 그 외에는 그외리턴
- CASE : 조건 활용
SELECT CASE WHEN(조건A) THEN A WHEN(조건B) THEN B ELSE C END AS 원하는 컬럼명 FROM TABLE ;
- 조건에 ‘=’만 있으면 “단순 CASE 표현식”으로 변환가능
- e.g. CASE WHEN LOC = ‘NEW YORK’ THEN ‘EAST’
- CASE LOC WHEN ‘NEW YORK’ THEN ‘EAST’
- e.g. CASE WHEN LOC = ‘NEW YORK’ THEN ‘EAST’
NULL 치환 함수 ⭐️
- NVL(대상, 치환값) : 대상이 NULL이면 치환값 으로 리턴
- SQL Server환경 : ISNULL(대상, 치환값)
- NULLIF(표현식1, 표현식2) : 표현식1 = 표현식2 이면 NULL, 다르면 표현식 1 리턴
- COALESCE(대상1, 대상2, 대상3,…, 그외리턴) : 대상 1을 리턴하는데, NULL인 경우 차례차례 다음 값을 리턴
- 다 NULL인 경우 (그외 리턴 없다면) NULL 리턴
오답노트
- SELECT MOD(-15, 0) FROM DUAL;
- 정답: -15
- MOD 함수의 두 번째 인자가 0이면 첫 번째 인자값이 결과로 도출
- SELECT MOD(-15, -4) FROM DUAL;
- 정답: -3
- MOD 함수의 두 인자값이 모두 음수이면 나머지도 음수로 도출
2. WHERE 절
- 조건에 맞는 데이터만 조회하고 싶을때
- 여러 조건 동시 전달 : AND, OR
- NULL 관련 조회하려면 :
IS NULL
/IS NOT NULL
연산자 사용-
WHERE COL1 = NULL
이렇게 사용 X : 이 연산결과는 False
-
- 데이터 타입을 일치시켜서 비교 조건문 생성
- 문자나 날짜 상수 표현할때
' '
홑따옴표 사용 - ORACLE은 문자 상수 → 대소문자 구분함
- 논리연산자 : ( ) → NOT → AND → OR 순으로 처리
- Group function 집계함수(SUM, COUNT…)는 사용할수 없음
- GROUP BY / HAVING 절에서 사용
- 참고)
- WHERE 절은 데이터 집합의 높이를 변화시킴
- SELECT 절은 데이터 집합의 넓이를 변화시킴
- 출처: Sweet DataStory
3. GROUP BY 절
- 특정 조건에 따라 컬럼을 그룹핑
- 비교적 많은 비용이 드는 작업이므로 WHERE 절에서 데이터량을 최소로 줄이는게 좋음
- 그룹별 요약 결과가 도출됨
- 주의 : SELECT 절에 요약하지 않은 정보는 사용할수 없음
- GROUP BY 절에서 사용할 컬럼이 아니라면, 그룹함수로만 불러올수 있음!
- e.g.
SELECT DEPTNO, MAX(SAL), ENAME FROM EMP GROUP BY DEPTNO;
- ENAME 때문에 에러발생!
- DEPTNO로 그룹핑했기때문에 ENAME은 그룹함수 없이 불러올수 없음
- 주의 : SELECT 절에 요약하지 않은 정보는 사용할수 없음
4. HAVING 절
- GROUP BY 절의 조건절 역할(WHERE 과 동일한 역할)
- 집계함수 활용
- SELECT 절 전에 수행됨 = SELECT 절에서 선언한 Alias 사용 X
- WHERE 절에서 사용해도 될 조건까지 포함하지 않도록 조심
5. ORDER BY 절
- SELECT한 데이터를 정렬 : 가장 마지막에 실행되는 절
- SELECT 절 다음 실행 : SELECT 절의 Alias 사용 가능
- 따로 명시하지않으면 임의의 순서로 출력됨
- ASC(Ascending) 오름차순이 기본값 (작 → 커)
- 여러개의 기준 사용 가능
- NULL 관련 옵션 : NULL FIRST / NULL LAST
- Oracle 기준, NULL은 최댓값
6. JOIN
- 여러 테이블 데이터를 한번에 보여줄때 사용
- FROM 절에 조인할 테이블 나열
- WHERE 절에 조인 조건 작성
- ORACLE 표준 / ANSI 표준 다름 : 구분!!
- 일대다 관계가 성립할때 조인 가능 (Primary Key PK / Foreign Key FK)
[PRIMARY KEY(PK) 기본키]
- 유일한 식별자(각 행을 구별할수 있는 식별자 기능)
- UNIQUE + NOT NULL
- 테이블 1개 - PK 1개 - 컬럼 여러개
[FOREIGN KEY]
- 자식테이블에 거는 장치
- 부모 테이블을 참조하면서 관리
종류
- 조건의 형태에 따라
- EQUI JOIN(=) : 동등 조건
- NON EQUI JOIN(<, >, >=, <=) : 동등 조건이 아닌 경우
- 조인 결과에 따라
- INNER JOIN : 조건에 성립하는 데이터만 출력
- OUTER JOIN : 조건에 성립하지 않는 데이터도 출력
- NATURAL JOIN : 조인조건 없이 컬럼명이 같을때 사용
- 조인조건 생략시 두 테이블에 같은 이름으로 자연 연결됨
- CROSS JOIN : 조건없이 조인하는경우 = 잘못된 조인방법
- 조인조건 생략시 두 테이블의 발생 가능한 모든 행을 출력
- SELF JOIN : 하나의 테이블을 두 번 이상 참조해서 연결
7. STANDARD JOIN = ANSI JOIN
- ANSI 표준 방식
- INNER JOIN, OUTER JOIN, CROSS JOIN, NATURAL JOIN
- JOIN 조건은 ‘ON 절’로 사용
INNER JOIN
- 내부 조인 : 조인 조건이 일치하는 데이터만 추출
-
FROM 절에 ‘INNER JOIN / JOIN’이라고 명시
SELECT 컬럼명 FROM 테이블1 INNER JOIN 테이블2 ON 테이블1.조인컬럼 = 테이블2.조인컬럼;
- USING / ON 조건절을 필수로 사용!
- ON
- JOIN 조건 명시(WHERE 절에서 일반 조건 명시)
- ON 조건의 괄호는 옵션(생략가능)
SELECT 테이블1.컬럼명, 테이블2.컬럼명 FROM 테이블1 INNER JOIN 테이블2 ON 테이블1.조인컬럼 = 테이블2.조인컬럼;
- USING
- JOIN 할 컬럼명이 같을때 사용하는 JOIN 조건절
- 괄호 필수!(생략X)
SELECT 테이블1.컬럼명, 테이블2.컬럼명 FROM 테이블1 INNER JOIN 테이블2 USING (동일컬럼명);
- 만약, ON 조건처럼 사용하면 SYNTAX ERROR
- ON
NATURAL JOIN
- 동일한 컬럼명에 대해 EQUI JOIN
- USING, ON, WHERE절 사용 X(조건 명시X)
OUTER JOIN
- JOIN 조건에서 일치하지 않는 행(동일한 값이 없는 행, 두 테이블의 교차바깥영역)을 출력하고 싶을때 사용
- EQUI JOIN에서는 NULL이 있으면 출력 X -> 이럴때도 사용
- 테이블 기준 방향 지정해야함
- LEFT OUTER JOIN
- FROM절에 나열된 왼쪽 테이블에 해당하는 데이터를 읽은 후, 우측 테이블에서 JOIN 대상 읽어옴
- 왼쪽 테이블 기준, 오른쪽 테이블 데이터를 채우는 방식
- 우측 테이블에서 왼쪽테이블과 같은 같이 없는 경우 NULL 출력
- FROM절에 나열된 왼쪽 테이블에 해당하는 데이터를 읽은 후, 우측 테이블에서 JOIN 대상 읽어옴
- RIGHT OUTER JOIN
- LEFT OUTER JOIN의 반대
- 오른쪽 테이블 기준, 왼쪽 테이블 데이터를 채우는 방식
- FROM절의 테이블 순서를 변경하면 LEFT OUTER JOIN으로 수행 가능
- LEFT OUTER JOIN의 반대
- FULL OUTER JOIN
- 두 테이블 전체 기준으로 결과를 생성 → 중복 데이터는 하나만 남기고 삭제 후 리턴
-
'LEFT OUTER JOIN 결과' UNION 'RIGHT OUTER JOIN 결과'
와 동일- ORACLE 표준에는 없음
SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name WHERE condition;
- ORACLE 표준에는 없음