2026/05 9

Ch04. UNION - UNION 정렬

"UNION" 또는 "UNION ALL"을 사용하여 여러 "SELECT" 문의 결과를 합칠 때, 최종 결과 집합에 대해 정렬(Sorting)을 적용할 수 있다. 이때 "ORDER BY" 절의 위치가 중요하다. "ORDER BY" 절은 전체 "UNION" 연산의 가장 마지막에 한 번만 사용해야 한다. 만약 각 "SELECT" 문 안에 "ORDER BY"를 사용하면 에러가 발생하거나, 예상과 다른 결과가 나올 수 있다. 왜냐하면 "UNION"은 각 "SELECT" 문의 개별적인 정렬 순서가 아니라, 합쳐진 최종 결과 전체에 대한 순서를 결정해야 하기 때문이다. UNION 결과를 order by"활동 고객과 탈퇴 고객의 명단을 합친 후, 이름(name)을 기준으로 오름차순 정렬하고 싶다"select name..

Ch04. UNION - UNION ALL

"마케팅팀에서 두 종류의 고객에게 이벤트 안내 메일을 보내려고 한다. 첫 번째 그룹은 '전자기기' 카테고리의 상품을 구매한 이력이 있는 고객이고, 두 번째 그룹은 '서울'에 거주하는 고객이다. 두 그룹의 명단을 합쳐서 전체 발송 목록을 만들고 싶다." '서울'에 살면서 '전자기기'를 구매한 고객은 두 그룹에 모두 속하게 되는데, 이 고객을 최종 목록에 한 번만 포함해야 할까? 아니면 중복을 허용해도 될까?? -> 정답은 "비즈니스 요구사항에 따라 다르다" 이다. 하지만 이 선택에 따라 우리는 "UNION"과 "UNION ALL" 중 무엇을 쓸 지결정해야 한다. UNION과 UNION ALL의 차이"UNION"과 "UNION ALL"의 유일한 차이점은 "중복 처리" 여부다."UNION": 두 결과 집합을 ..

Ch04. UNION - UNION

"UNION"은 여러 개의 결과 집합을 아래로(수직으로) 이어 붙여서 더 많은 행을 가진 하나의 집합으로 만드는 기술이다. "우리 쇼핑몰은 현재 활동 중인 고객을 "users" 테이블에, 과거에 탈퇴한 고객을"retired_users"라는 별도의 테이블에 보관하고 있다. 연말을 맞아 모든 고객(활동+탈퇴)에게 감사 이메일을 보내기 위해, 두 테이블에 흩어져 있는 이름과 이메일을 합쳐서 하나의 전체 목록을 만들어야 한다." retired_users 생성-- 본 실습을 위한 탈퇴 고객 테이블 생성DROP TABLE IF EXISTS retired_users;CREATE TABLE retired_users (id BIGINT PRIMARY KEY,name VARCHAR(255) NOT NULL,email V..

Ch03. 서브쿼리 - 서브쿼리 VS Join

지금까지 "JOIN"과 서브 쿼리라는두 가지 강력한 기술을 배웠다. 그러면서 아마도 이런 의문이 들었을 것이다. "어? 어떤 문제는 두 가지 방법으로 모두 풀 수 있네?" 맞다. 실제로 많은 문제는 "JOIN"으로도, 서브쿼리로도 해결할 수 있다. 그렇다면 우리는 무엇을 선택해야 할까? 성능과 가독성 측면에서 둘은 어떤 차이가 있을까? 문제 상황: "서울에 거주하는 모든 고객들의 주문 목록을 조회해라." 해결 방법 1. 서브 쿼리 사용서브쿼리를 이용한 접근법은 우리의 사고 흐름과 매우 유사하다.먼저, 서울에 사는 고객들의 "user_id" 목록을 찾는다 (users 테이블).그다음, 이 "user_id" 목록에 포함된 "order_id"를 가진 주문들을 찾는다 (orders 테이블).select *fr..

Ch12. 검색어 자동완성 시스템(1)

문제 이해 및 설계 범위 확정사용자는 입력하는 단어는 자동 완성될 검색어의 첫 부분이어야 하나요? 아니면 중간 부분이 될 수도 있나요?(ex. 첫 부분으로 한정하겠습니다.)몇 개의 자동완성 검색어가 표시되어야 하나요?(ex. 5개입니다.)자동 완성 검색어 5개를 고르는 기준이 무엇인가요?(ex. 질의 빈도에 따라 정해지는 검색어 인기 순위를 기준으로 삼겠습니다.)맞춤법 검사 기능도 제공해야 하나요?(ex. 아뇨. 맞춤법 검사나 자동 수정은 지원하지 않습니다.)질의는 영어입니까?(ex. 네 하지만 시간이 허락한다면 다국어 지원을 생각해도 좋습니다.)대문자나 특수 문자 처리도 해야 합니까?(ex. 아뇨 모든 질의는 영어 소문자로 이루어진다고 가정하겠습니다)얼마나 많은 사용자를 지원해야 합니까?(ex. 일간 ..

Ch01. 내부 조인 - 내부 조인(3)

실무 팁: 조인 순서는 언제 중요할까? 내부 조인에서는 결과가 같으므로 어떤 순서로 작성해도 무방하다. 하지만 쿼리를 읽는 사람의 입장에서 어떤 데이터가 중심이 되는가에 따라 순서를 정하면 가독성이 높아진다주문 목록을 중심으로 고객 정보를 추가하고 싶다면 "FROM orders JOIN users"고객 목록을 중심으로 주문 정보를 조회하고 싶다면 "FROM users JOIN orders" "OUTER JOIN" 에서는 조인 순서가 결과에 매우 큰 영향을 미친다. 하지만 "INNER JOIN"에서는 교집합을 선택하기 때문에 순서와 상관없이 결과는 항상 같다 가독성을 높이는 테이블 별칭(Alias) 앞선 쿼리들을 보면 "users.user_id" , "orders.status" 처럼 테이블 이름을 계속 반..

Ch01. 내부 조인 - 내부 조인(2)

조인과 집합내부 조인("INNER JOIN" )은 두 테이블의 교집합을 찾는 것과 같다. 두 집합(테이블)에서 공통된 원소(연결 컬럼의 값이 일치하는 데이터)만을 결과로 반환한다.A 집합: "orders" 테이블에 있는 모든 사용자들의 "user_id" 집합B 집합: "users" 테이블에 있는 모든 "user_id" 집합"INNER JOIN"은 은 A 집합과 B 집합에 모두 포함된"user_id"에해당하는 데이터만을 결합하여 보여준다. 벤 다이어그램으로 이해하기"orders" 집합 (왼쪽 원): 지금까지 들어온 모든 주문을 나타낸다. 주문 데이터에 기록된 "user_id"는 {1, 2, 3, 4, 5}가 있다. (참고로 집합은 중복 값은 제거하고 표현한다)"users" 집합 (오른쪽 원): 우리 쇼핑몰..

Ch01. 내부 조인 - 내부 조인(1)

우리 쇼핑몰의 대표님이 다음과 같은 요청을 한다."주문이 완료된(`COMPLETED` ) 모든 주문에 대해, 어떤 고객이 주문했는지 고객 ID, 고객 이름과 주문 날짜를 함께 보고 싶네." 이 요구사항을 충족하려면 "고객 이름"을 담고 있는 "users" 테이블과, "주문 날짜"와 "주문 상태"를 담고 있는 "orders" 테이블의 정보가 모두 필요하다. 즉, 두 테이블을 연결해야만 한다. 조인은 크게 내부 조인("INNER JOIN")과 외부 조인("OUTER JOIN")으로 나눌 수 있다. 내부 조인이란내부 조인("INNER JOIN")은 두 테이블을 연결할 때, 양쪽 테이블에 모두 공통으로 존재하는 데이터만을 결과로 보여준다. 기준이 되는 컬럼(예: "orders.user_id" 와 "users.u..

Ch01. 내부 조인 - 조인이 필요한 이유

대표님이 "최근 주문 현황을 고객 이름과 상품명을 포함해서 보고서로 만들어줘!"라고 요청했다고 가정하자.우리는 앞서 쇼핑몰 운영에 필요한 users , products , orders 테이블을 만들고 데이터를 입력했다. 주문 현황이 필요하기 때문에 orders 의 정보를 제공하면 될 것 같다.select * from orders;대표님의 요구사항은 "최근 주문 현황을 고객 이름과 상품명을 포함해서 보고서로 만들어줘!"라는 것이었다. 그런데 orders 테이블에는 고객 이름과 상품명이 없다. 이 테이블만 보고서는 user_id가 1인 고객이 누구인지, product_id가 4인 상품이 무엇인지 즉시 알 수가 없다.추가 과정이 필요하다.고객 이름을 구하기 위해서는 users 테이블을 통해 user_id 에 ..