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’

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은 그룹함수 없이 불러올수 없음

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]

  • 자식테이블에 거는 장치
  • 부모 테이블을 참조하면서 관리

종류

  1. 조건의 형태에 따라
    • EQUI JOIN(=) : 동등 조건
    • NON EQUI JOIN(<, >, >=, <=) : 동등 조건이 아닌 경우
  2. 조인 결과에 따라
    • INNER JOIN : 조건에 성립하는 데이터만 출력
    • OUTER JOIN : 조건에 성립하지 않는 데이터도 출력
  3. NATURAL JOIN : 조인조건 없이 컬럼명이 같을때 사용
    • 조인조건 생략시 두 테이블에 같은 이름으로 자연 연결됨
  4. CROSS JOIN : 조건없이 조인하는경우 = 잘못된 조인방법
    • 조인조건 생략시 두 테이블의 발생 가능한 모든 행을 출력
  5. 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

NATURAL JOIN

  • 동일한 컬럼명에 대해 EQUI JOIN
  • USING, ON, WHERE절 사용 X(조건 명시X)

OUTER JOIN

  • JOIN 조건에서 일치하지 않는 행(동일한 값이 없는 행, 두 테이블의 교차바깥영역)을 출력하고 싶을때 사용
    • EQUI JOIN에서는 NULL이 있으면 출력 X -> 이럴때도 사용
  • 테이블 기준 방향 지정해야함
  1. LEFT OUTER JOIN
    • FROM절에 나열된 왼쪽 테이블에 해당하는 데이터를 읽은 후, 우측 테이블에서 JOIN 대상 읽어옴
      • 왼쪽 테이블 기준, 오른쪽 테이블 데이터를 채우는 방식
    • 우측 테이블에서 왼쪽테이블과 같은 같이 없는 경우 NULL 출력


  1. RIGHT OUTER JOIN
    • LEFT OUTER JOIN의 반대
      • 오른쪽 테이블 기준, 왼쪽 테이블 데이터를 채우는 방식
    • FROM절의 테이블 순서를 변경하면 LEFT OUTER JOIN으로 수행 가능


  1. 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;