훈스비
개발잡부
훈스비
전체 방문자
오늘
어제
  • 분류 전체보기 (35)
    • 스터디 (29)
      • 데이터 분석 (4)
      • SQL (4)
      • Python (1)
      • JavaScript (1)
      • Spark (1)
      • DevOps (7)
      • 기타 (8)
      • 검색 엔진 (3)
    • 나의 이야기 (4)
      • 회사 생활 (3)
    • 사이드 프로젝트 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Docker
  • elasticsearch
  • flask
  • GCP
  • github copilot
  • helm
  • java
  • jupyterhub
  • k8s
  • Kubernetes
  • leetcode
  • linux
  • ncp
  • Ray
  • ReplicaSet
  • spark
  • spring
  • sql
  • udemy
  • Virtualization
  • vm
  • vsCode
  • vue
  • 개발원칙
  • 검색엔진
  • 데이터 분석
  • 랭킹
  • 백엔드
  • 사이드프로젝트
  • 유사도 정규화

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
훈스비

개발잡부

스터디/SQL

[SQL] SQL 기초교재 10 ~ 12

2019. 8. 3. 15:29

10장 테이블 합치기

 

1. 내부 조인

    • SELECT 테이블명1.열 이름1, 테이블명2.열 이름2
      FROM 테이블명1, 테이블명2
      WHERE 테이블명1.KEY=테이블명2.KEY;
    • SELECT 별칭1.열 이름1, 별칭2.열 이름2
      FROM 테이블명1 (AS) 별칭1, 테이블명2 (AS) 별칭2
      WHERE 별칭1.KEY=별칭2.KEY;
    • SELECT 테이블명1.열 이름1, 테이블명2.열 이름2
      FROM 테이블명1 INNER JOIN 테이블명2
      ON 테이블명1.KEY=테이블명2.KEY;
    • SELECT 별칭1.열 이름1, 별칭2.열 이름2
      FROM 테이블명1 (AS) 별칭1 INNER JOIN 테이블명2 (AS) 별칭2
      ON 별칭1.KEY=별칭2.KEY;

 

EX1) INNER JOIN 사용하기

  • SELECT TMP1.*, TMP2.MOBILE_NO
    FROM ADDR AS TMP1 INNER JOIN MOBILE AS TMP2
    ON TMP1.CUST_ID = TMP2.CUST_ID;

 

EX2) CUSTOMERS와 ORDERS 테이블을 이용하여 주문이력이 있는 고객아이디, 고객이름, 주문번호를 출력

    • SELECT C.CUST_ID, C.CUST_NM, O.ORDER_ID
      FROM CUSTOMERS AS C INNER JOIN ORDERS AS O
      ON C.CUST_ID = O.CUST_ID

 

조인 조건을 지정하지 않고 조인하면 곱집함이 되어 모든 행을 곱하여 출력한다.

SELECT CUSTOMERS.*, ORDERS.* FROM CUSTOMERS, ORDERS;

2. 외부 조인

a. LEFT/RIGHT JOIN

      • SELECT 별칭1.열 이름1, 별칭2.열 이름2
        FROM 테이블명1 (AS) 별칭1 LEFT/RIGHT (OUTER) JOIN 테이블명2 (AS) 별칭2
        ON 별칭1.KEY = 별칭2.KEY;

b. FULL JOIN

      • SELECT 별칭1.열 이름1, 별칭2.열 이름2
        FROM 테이블명1 (AS) 별칭1 FULL (OUTER) JOIN 테이블명2 (AS) 별칭2
        ON 별칭1.KEY = 별칭2.KEY;

 

EX3) CUSTOMERS와 ORDERS 테이블을 이용하여 주문이력이 있는 고객과 없는 고객의 숫자 출력

    • SELECT CASE WHEN O.CUST_ID IS NOT NULL THEN 1
                       CASE WHEN O.CUST_ID IS NULL THEN 0
                       ELSE -1 END AS ORDER_FLAG,
                       COUNT(*) AS CNT
      FROM CUSTOMERS C LEFT JOIN ORDERS O
      ON C.CUST_ID = O.CUST_ID
      GROUP BY ORDER_FLAG;

EX4) EMPLOYEE, ORDERS, CUSTOMERS 테이블을 이용하여 직원아이디, 이름, 해당 직원이 맡았던 주문번호를 나타내고

          해당 주문번호와 고객아이디를 매칭시켜 고객이름을 출력

    • SELECT E.EMP_ID, E.NM, O.ORDER_ID, C.CUST_NM
      FROM EMPLOYEE E 
                   LEFT JOIN ORDERS O
                   ON E.EMP_ID = O.EMP_ID
                   LEFT JOIN CUSTOMERS C
                   ON O.CUST_ID = C.CUST_ID
      ORDER BY E.EMP_ID;

3. 행 합치기 - UNION

    • SELECT 열 이름1, 열 이름2 FROM 테이블명1 WHERE 조건절
      UNION
      SELECT 열 이름1, 열 이름2 FROM 테이블명1 WHERE 조건절
      ORDER BY 1;

기본적으로 중복을 제거하고 출력한다.

중복을 포함한 모든 값을 출력하고 싶다면 UNION ALL 연산자를 이용하자.

 

 


11장 하위 쿼리

 

1. FROM절의 하위 쿼리

    • SELECT 열 이름1, 열 이름2
      FROM
                   (SELECT *
                     FROM 테이블명
                     WHERE 조건절) (AS) 별칭
      WHERE 조건저리
    • SELECT 별칭1.열 이름1, 별칭2.열 이름2
      FROM 테이블명1 (AS) 별칭1 LEFT JOIN
                    (SELECT 열 이름1, 열 이름2
                      FROM 테이블명2
                      WHERE 조건절) (AS) 별칭2
      ON 별칭1.KEY = 별칭2.KEY;

 

EX1) CARD_ACCT, CUST_PARTY 테이블을 이용하여 현재 살아있는 신용카드 보유 고객과 미보유 고객의 수 출력

    • SELECT CASE WHEN CLOSE_DT IS NULL THEN 1
                       CASE WHEN CLOSE_DT IS NOT NULL THEN 0
                       ELSE -1 END AS ALIVE_FLG,
                       COUNT(*) AS CNT
      FROM CUST_PARTY TMP1
      LEFT JOIN (SELECT DISTINCT SSN
                              FROM CARD_ACCT
                              WHERE CLOSE_DT IS NULL
                              AND CC_GRADE IN ('1', '2')) TMP2
      ON TMP1.SSN = TMP2.SSN
      GROUP BY ALIVE_FLG;

2. WHERE절의 하위 쿼리

    • SELECT 열 이름1, 열 이름2
      FROM 테이블명1
      WHERE 열 이름 IN (SELECT 열 이름 FROM 테이블명2 WHERE 조건절);

EX2) CUST_PARTY, DLQ_PARTY 테이블을 사용하여 연체일 수가 30일이 안 된 고객의 주민등록번호, 이름, 휴대폰번호 출력

    • SELECT SSN, PARTY_NM, MOBILE_NO
      FROM CUST_PARTY
      WHERE SSN IN (SELECT DISTINCT SSN
                                       FROM DLQ_PARTY
                                       WHERE CURR_DLQ = 'Y'
                                                        AND DLQ_DURATION <= 30);

 

EX3) 현재 연체 중이거나 과거 10일 이상 연체 기록이 있는 고객들을 제외한 대출 가능 고객 리스트 출력

    • SELECT SSN, PARTY_NM, MOBILE_NO
      FROM CUST_PARTY
      WHERE SSN NOT IN (SELECT DISTINCT SSN
                                                 FROM DLQ_PARTY
                                                 WHERE CURR_DLQ = 'Y'
                                                                  OR (CURR_DLQ = 'N'
                                                                          AND DLQ_DURATION >= 10)
                                                 );

 


 

12장 데이터 및 테이블 조작

 

1. 데이터 삽입

    • INSERT INTO 테이블명(열 이름1, 열 이름2, 열 이름3)
      VALUES (값1, 값2, 값3);
    • INSERT INTO 테이블명1(열 이름1, 열 이름2, 열 이름3)
      SELECT 열 이름1, 열 이름2, 열 이름3 FROM 테이블명2 WHERE 조건절;

2.  데이터 삭제

    • DELETE FROM 테이블명;
    • DELETE FROM 테이블명
      WHERE 조건절;

3. 데이터 수정

    • UPDATE 테이블명
      SET 열 이름=변경할 값
      WHERE 조건절;

4. 테이블 생성

    • CREATE TABLE 생성할 테이블명
      (
                열 이름       데이터 형식 (크기)       NOT NULL DEFAULT 1,
                SSN            CHAR (10)                     PRIMARY KEY,
                CUST_ID  VARCHAR(100)            NOT NULL
                                                                               REFERENCES 테이블1 (테이블1 고유키)
      );

5. 테이블 변경

    • ALTER TABLE 수정할 테이블명
      ADD (추가/변경할 열 이름 데이터 형식(크기);
    • RENAME 변경 전 테이블명 TO 변경 후 테이블명;

6. 테이블 삭제

    • DROP TABLE 삭제할 테이블명;

 

여기까지 '칼퇴족 김대리는 알고 나만 모르는 SQL 기초편'의 내용입니다.

저작자표시 비영리 변경금지 (새창열림)

'스터디 > SQL' 카테고리의 다른 글

[SQL] SQL 기초교재 07 ~ 09  (0) 2019.08.03
[SQL] SQL 기초교재 04 ~ 06  (0) 2019.08.03
[SQL] SQL 기초교재 01 ~ 03  (0) 2019.08.03
    '스터디/SQL' 카테고리의 다른 글
    • [SQL] SQL 기초교재 07 ~ 09
    • [SQL] SQL 기초교재 04 ~ 06
    • [SQL] SQL 기초교재 01 ~ 03

    티스토리툴바