🚀
Growth log
  • About me
  • I LEARNED
    • General
      • 개발자 꿀팁
      • 그로스해킹 기초
      • 개발자에게 도메인 지식은 얼마나 중요할까?
      • DTO 논쟁에 대하여
      • MSA란?
    • Seminar
      • 테스트 커버리지 100% - SLASH 21
      • TDD가 실패하는 이유 - by 이규원님
      • 대규모 트래픽 애플리케이션 성능 튜닝 노하우 다 알려 드림|라인개발실록
      • 결제 시스템의 SDK와 API 디자인 - SLASH 21
    • Web
      • SOP와 CORS
    • Spring & OOP
      • DTO vs VO
    • Ruby On Rails
      • Rails lib 디렉토리에 대하여
      • Rails의 concerns란?
      • Rails에서의 GC 작동원리
      • Eager loading vs Lazy loading
      • Rails 환경 구성
      • ActionCable
      • 📔Perfect ruby on rails
        • MVC 패턴인 Rails
        • Ruby on Rails 기본 - 컨트롤러
        • Ruby on Rails 기본 - 뷰
        • Ruby on Rails 기본 - 모델
        • 스캐폴딩 기능을 사용한 Rails 개발 기초
        • 뷰 개발
        • 모델 개발
        • 모델 개발 - 낙관적 동시 실행 제어
        • 모델 개발 - 유효성 검사 구현
        • 모델 개발 - Association
        • 모델 개발 - 콜백
        • 모델 개발 - 마이그레이션
        • 모델 개발 - 데이터 초기화
        • 컨트롤러 개발 - 요청 정보 추출
        • 컨트롤러 개발 - 응답
        • 컨트롤러 개발 - 상태 관리
        • 라우팅 - RESTful
        • 라우팅 - RESTful 인터페이스의 사용자 정의화
        • 라우팅 - RESTful 하지 않은 라우트 정의
        • 테스트
        • 테스트 - 준비
        • 테스트 - Unit 테스트
        • 테스트 - Functional 테스트
        • 테스트 - Integration 테스트
        • 클라이언트 개발 - Sprockets vs Webpacker
        • 클라이언트 개발 - Sprockets
    • Node.js & Express
      • 기본 개념
      • npx
    • Programing Language
      • Java
        • JavaDoc에 대해
        • invocation에 대해서
        • 어노테이션
        • 추상클래스 & 인터페이스
        • Package
        • 오버로딩 vs 오버라이딩
      • Javascript
        • TCP School 훑어보기
          • 타입
          • 형 변환
          • 변수
          • 연산자
          • 반복문
          • 배열(array)
          • 함수
          • 함수 - 스코프와 호이스팅
          • 함수 - 매개변수와 인수
          • 함수 - 미리 정의된 전역 함수
          • 객체
          • 프로토타입
          • DOM
          • BOM - Window 객체
          • 이벤트(event)
      • Ruby
        • 📔퍼펙트 루비
    • DB
      • Redis
        • Redis 개요
      • Index(인덱스)?
      • DB Transaction & Lock
      • 동시성 제어에 관하여
      • Lock(잠금)이란?
      • ActiveRecord lock vs with_lock
      • Table lock vs Row lock
      • WHERE 1=1 구문에 대하여
      • COUNT(*) vs COUNT(indexed column)
      • 📕관계형 데이터베이스 실전입문
      • 📔SQL 첫걸음
      • 📔모두의 SQL
    • Design Patterns
      • Observer pattern
      • Flyweight pattern
      • Singleton pattern
    • OOP
      • 📔오브젝트
        • 6장 메시지와 인터페이스
      • 클래스간 관계 간단 정리
    • Regex
    • Collaboration
      • Git
      • Sourcetree
  • DAILY REVIEW
    • 2021
      • August
        • 2021-08-25(Wed)
        • 2021-08-23(Mon)
        • 2021-08-11(Wed)
        • 2021-08-04(Wed)
        • 2021-08-03(Tue)
        • 2021-08-02(Mon)
      • July
        • 2021-07-29(Thu)
        • 2021-07-26(Mon)
        • 2021-07-23(Fri)
        • 2021-07-22(Thu)
        • 2021-07-21(Wed)
        • 2021-07-20(Tue)
        • 2021-07-19(Mon)
        • 2021-07-15(Thu)
        • 2021-07-14(Wed)
        • 2021-07-13(Tue)
        • 2021-07-12(Mon)
      • June
        • 2021-06-05(Sat)
        • 2021-06-04(Fri)
        • 2021-06-03(Thu)
        • 2021-06-02(Wed)
        • 2021-06-01(Tue)
      • May
        • 2021-05-31(Mon)
        • 2021-05-29(Sat)
        • 2021-05-28(Fri)
        • 2021-05-27(Thu)
        • 2021-05-26(Wed)
        • 2021-05-25(Tue)
        • 2021-05-24(Mon)
        • 2021-05-22(Sat)
        • 2021-05-21(Fri)
        • 2021-05-20(Thu)
        • 2021-05-19(Wed)
        • 2021-05-18(Tue)
        • 2021-05-17(Mon)
        • 2021-05-15(Sat)
        • 2021-05-13(Thu)
        • 2021-05-12(Wed)
        • 2021-05-11(Tue)
        • 2021-05-10(Mon)
        • 2021-05-03(Mon)
      • April
        • 2021-04-30(Fri)
        • 2021-04-29(Thu)
        • 2021-04-28(Wed)
        • 2021-04-27(Tue)
        • 2021-04-26(Mon)
        • 2021-04-24(Sat)
        • 2021-04-23(Fri)
        • 2021-04-21(Wed)
        • 2021-04-20(Tue)
        • 2021-04-19(Mon)
        • 2021-04-18(Sun)
        • 2021-04-16(Fri)
        • 2021-04-15(Thu)
        • 2021-04-14(Wed)
        • 2021-04-12(Mon)
        • 2021-04-11(Sun)
        • 2021-04-09(Fri)
        • 2021-04-08(Thu)
        • 2021-04-06(Tue)
        • 2021-04-05(Mon)
        • 2021-04-04(Sun)
        • 2021-04-03(Sat)
        • 2021-04-02(Fri)
        • 2021-04-01(Thu)
      • March
        • 2021-03-29(Mon)
        • 2021-03-28(Sun)
        • 2021-03-26(Fri)
        • 2021-03-25(Thu)
        • 2021-03-24(Wed)
        • 2021-03-23(Tue)
        • 2021-03-22(Mon)
        • 2021-03-21(Sun)
        • 2021-03-20(Sat)
        • 2021-03-17(Wed)
        • 2021-03-16(Tue)
        • 2021-03-15(Mon)
        • 2021-03-12(Fri)
        • 2021-03-11(Thu)
        • 2021-03-10(Wed)
        • 2021-03-09(Tue)
        • 2021-03-08(Mon)
        • 2021-03-07(Sun)
        • 2021-03-05(Fri)
        • 2021-03-03(Wed)
        • 2021-03-02(Tue)
        • 2021-03-01(Mon)
      • Feb
        • 2021-02-26(Fri)
        • 2021-02-25(Thu)
        • 2021-02-24(Wed)
        • 2021-02-23(Tue)
        • 2021-02-22(Mon)
        • 2021-02-19(Fri)
        • 2021-02-18(Thu)
        • 2021-02-17(Wed)
        • 2021-02-16(Tue)
        • 2021-02-15(Mon)
        • 2021-02-14(Sun)
        • 2021-02-13(Sat)
        • 2021-02-12(Fri)
        • 2021-02-10(Wed)
        • 2021-02-09(Tue)
        • 2021-02-08(Mon)
        • 2021-02-07(Sun)
        • 2021-02-05(Fri)
        • 2021-02-03(Wed)
        • 2021-02-02(Tue)
        • 2021-02-01(Mon)
      • Jan
        • 2021-01-29(Fri)
        • 2021-01-28(Thu)
        • 2021-01-27(Wed)
        • 2021-01-26(Tue)
        • 2021-01-25(Mon)
        • 2021-01-23(Sat)
        • 2021-01-22(Fri)
        • 2021-01-20(Wed)
        • 2021-01-19(Tue)
        • 2021-01-18(Mon)
        • 2021-01-12(Tue)
        • 2020-01-11(Mon)
        • 2021-01-08(Fri)
        • 2021-01-07(Thu)
        • 2021-01-06(Wed)
        • 2021-01-05(Tue)
        • 2021-01-04(Mon)
        • 2021-01-01(Fri)
    • 2020
      • Dec
        • 2020-12-30(Thu)
        • 2020-12-25(Fri)
        • 2020-12-24(Thu)
        • 2020-12-23(Wed)
        • 2020-12-22(Tue)
        • 2020-12-21(Mon)
        • 2020-12-18 (Fri)
      • Nov
        • 2020-11-30(Mon)
        • 2020-11-28(Sat)
        • 2020-11-26(Thu)
        • 2020-11-25(Wed)
        • 2020-11-24(Tue)
        • 2020-11-23(Mon)
        • 2020-11-22(Sun)
        • 2020-11-20(Fri)
        • 2020-11-19(Thu)
        • 2020-11-18(Wed)
        • 2020-11-17(Tue)
        • 2020-11-14(Sat)
        • 2020-11-13(Fri)
        • 2020-11-12(Thu)
        • 2020-11-11(Wed)
        • 2020-11-09(Mon)
        • 2020-11-07(Sat)
        • 2020-11-05(Thu)
        • 2020-11-04(Wed)
        • 2020-11-03(Tue)
        • 2020-11-02(Mon)
    • Good article 아카이빙
Powered by GitBook
On this page
  • 조인(Join)
  • 집합 연산자
  • 서브쿼리

Was this helpful?

  1. I LEARNED
  2. DB

모두의 SQL

ORM만 쓰다보니 헷갈리는 SQL 개념을 잡는다.

조인(Join)

조인 기법의 종류

  • 곱집합(cartesian product)

    • 가능한 모든 행을 조인

  • 동등 조인(equi join or inner join)

    • 조인 조건이 정확히 일치하는 경우에 결과 출력

  • 비동등 조인(non equi join)

    • 조인 조건이 정확히 일치하지 않는 경우에 결과를 출력

  • 외부 조인(outer join)

    • 조인 조건이 정확히 일치하지 않아도 모든 결과를 출력

  • 자체 조인(self join)

    • 자체 테이블에서 조인하고자 할 때 사용

동등 조인 예시

-- employees 테이블과 departments 테이블과 locations 테이블을 조인 예시
​
SELECT  A.employee_id, A.department_id, B.department_name, C.location_id, C.city
FROM employees A, departments B, locations C
WHERE A.department_id = B.department_id
AND B.location_id = C.location_id;

외부 조인

외부 조인은 조건을 만족하지 않은 행도 모두 출력하기 위한 조인 기법.

-- employees 테이블과 departments 테이블을 department_id로 외부 조인하여 department_id가 null 값인 Kimberely Grant도 함께 출력해라.
​
SELECT A.employee_id, A.first_name, A.last_name, B.department_id, B.department_name
FROM employees A, departemnts B
WHERE A.department_id = B.department_id(+)
ORDER BY A.employee_id;

아래처럼 쉽게 생각해보자.

  1. 양쪽 테이블 중 전부 출력하고 싶은 테이블 쪽을 먼저 생각한다.

  2. (+)는 다른 쪽 테이블 쪽 조인 조건에 붙인다.

자체 조인

자체 조인을 사용하려면 별칭을 사용해야 한다.

-- employees 테이블을 자체 조인하여 직원별 담당 매니저가 누구인지 조회하자.
SELECT A.employee_id, A.first_name, A.last_name, A.manager_id, B.first_name || ' ' B.last_name manger_name
FROM employees A, employees B
WHERE A.manager_id = B.employee_id
ORDER BY A.employee_id;

집합 연산자

집합 연산자를 이용해도 테이블을 연결할 수 있다. 간단하게 합집합, 교집합, 차집합이라 생각하면 된다.

종류

  • UNION

    • SELECT 문의 조회 결과의 합집합. 중복되는 행은 한 번만 출력한다. (합집합)

  • UNION ALL

    • SELECT 문의 조회 결과의 합집합. 중복되는 행도 그대로 출력한다. (합집합)

  • INTERSET

    • SELECT 문의 조회 결과의 교집합. 중복되는 행만 출력한다. (교집합)

  • MINUS

    • 첫 번째 SELECT 문의 조회 결과에서 두 번째 조회 결과를 뺀다. (차집합)

-- employees 테이블의 department_id 집합과 departments 테이블의 department_id 집합을 UNION 연산자를 이용해 합쳐 보세요.
​
SELECT department_id
FROM employees
UNION
SELECT department_id
FROM departments;

서브쿼리

서브쿼리의 결과는 메인 쿼리의 조건으로 사용된다.

메인 쿼리와 서브 쿼리의 연결 형태는 연산자에 따라 의미가 다르다.

연산자 구분

종류

사용처

단일 행 연산자

=, >, >=, <, <=, <>, !=

단일 행 서브쿼리, 다중 열 서브쿼리

다중 행 연산자

IN, NOT IN, EXISTS, ANY, ALL

다중 행 서브쿼리, 다중 열 서브쿼리

단일 행 서브쿼리

-- employees 테이블의 last_name이 'De Haan'인 직원과 salary가 동일한 직원에는 누가 있는지 단일 행 서브쿼리를 이용해서 출력해보자.
​
SELECT *
FROM employees A
WHERE A.salary = (
                  SELECT salary
                  FROM employees
                  WHERE last_name = 'De Haan'
                  )

다중 행 서브쿼리

-- employees 테이블에서 department_id별로 가장 낮은 salary가 얼마인지 찾아보고, 찾아낸 salary에 해당하는 직원이 누구인지 다중 행 서브쿼리를 이용해 찾아보자.
​
SELECT *
FROM employees A
WHERE A.salary = IN (
                    SELECT MIN(salary) 최저급여
                    FROM employees
                    GROUP BY department_id
                    )
ORDER BY A.salary DESC;

다중 열 서브쿼리

-- employees 테이블에서 job_id별로 가장 낮은 salary가 얼마인지 찾아보고, 찾아낸 job_id별 salary에 해당하는 직원이 누구인지 다중 열 서브쿼리를 이용해 찾아보자.
​
SELECT *
FROM employees A
WHERE (A.job_id, A.salary) IN  (
                                SELECT job_id, MIN(salary) 그룹별급여
                                FROM employees
                                GROUP BY job_id
                                )
ORDER BY A.salary DESC;

FROM 절 서브쿼리: 인라인 뷰

FROM 절에서도 서브쿼리를 사용할 수 있다!

-- 직원 중에서 department_name이 IT인 직원의 정보를 인라인 뷰를 이용해서 출력해 보라.
​
SELECT *
FROM employees AS A,
                  ( 
                  SELECT department_id
                  FROM departments
                  WHERE department_name = 'IT'
                  ) AS B
WHERE A.departemnt_id = B.department_id;
PreviousSQL 첫걸음NextDesign Patterns

Last updated 4 years ago

Was this helpful?

📔