목록Programming Skill (52)
Data Blog
1. CTE를 활용한 테이블 생성 CTE는 자주 사용되는 테이블을 일시적으로 새로운 이름으로 저장해 재사용할 수 있으며, 이를 통해 코드의 가독성을 크게 높이는 장점이 있다. 이전 포스팅에서는 이미 존재하는 DB 테이블을 변형하여 CTE를 활용해 일시적으로 테이블을 생성한 바 있다. 이번 포스팅에서는 CTE를 사용해 유사 테이블을 만들어보자. 입력할 데이터를 SELECT AS , AS , ... 형태로 나열한 후, 중복된 값을 모두 포함하는 UNION ALL로 연결하면 유사 테이블이 완성된다.WITH class_info AS ( SELECT 1 AS class_id, 'Math' AS class_name UNION ALL SELECT 2 AS class_id, 'English' AS cla..
1. 조건 만족 여부를 0과 1로 표현 값의 존재 유무나 특정 조건의 만족 여부를 0과 1로 나타내는 방법은 앞선 포스팅에서 많이 다뤘듯이, CASE WHEN 구문을 사용할 수 있다. 이와 유사하게 SIGN 함수를 활용하여 조건의 만족 여부를 0과 1로 표현할 수 있다.-- user_id별 card_number 등록 이력 여부와 구매 이력의 유무SELECT c.user_id , c.card_number , CASE WHEN c.card_number IS NOT NULL THEN 1 ELSE 0 END AS card_ox -- 신용카드 등록 이력 유무 , COUNT(p.purchase_id) AS purchase_count -- 구매 횟수 (0 이상의 정수) , SIGN(..
📢 본 포스팅에서 사용되는 자료와 출처는 HackerRank 임을 밝힙니다. https://www.hackerrank.com/challenges/draw-the-triangle-1/problem?isFullScreen=true 해당 문제를 요약하면 다음과 같다.1. 특수기호 20행 출력 많은 것을 배울 수 있었던 문제 !! 항상 주어진 테이블에서 자료를 추출하는 문제만 다뤘는데, 특수 기호만 출력하는 문제는 생소해서 체크하고 넘어가고자 한다. 우선, 문자열을 반복하는 데 사용되는 함수는 REPEAT(데이터, 반복 횟수) 함수이다.이 문제에서 반복 대상은 *이며, 반복 횟수는 계층형 쿼리를 이용해 표현할 수 있다. 그럼 여기서 FROM 절에 오는 DB는 무엇일까? information_schema.ta..
1. 세로로 데이터 결합 UNION ALL 연산자를 이용해 여러 개의 테이블을 세로로 결합할 수 있다는 점은 이미 많이 언급했으므로 잘 알고 있을 것이라 생각한다. (추가로 말씀드리자면, 중복을 제외한 결과를 얻을 수 있는 UNION은 UNIONALL에 비해 거의 사용되지 않는다!) 여러 번 언급했듯이, '합쳐지는 SELECT문의 열의 숫자는 반드시 동일해야' 한다. 만약 아래 테이블처럼 칼럼이 완전히 일치하지 않는다면, 해당 칼럼은 SELECT 구문에서 제외해야 한다.SELECT 'app1' AS app_name -- 테이블 식별 col (문자 app1 출력) , id , name , emailFROM app1_usersUNION ALL SELECT 'app2' AS app_name -..
1. CROSS JOIN Cross Join(Cartesian Product, 곱집합)은 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인하는 기능이다. 이때, 두 테이블의 각 행의 개수를 곱한 수만큼 조인 결과의 전체 행 개수가 생성된다.SELECT *FROM city AS c CROSS JOIN transport AS t;SELECT *FROM city AS c JOIN transport AS t;SELECT *FROM city AS c , transport AS t; 2. 열→행 변환 행 단위로 저장된 '세로 기반' 데이터를 열과 쉼표로 구분된 문자열 등의 '가로 기반'으로 변환하는 과정은 앞선 포스팅에서 알아보았다. 이번에는 가로 기반 데이터를 세로 기반으로 변환하는 ..
📢 본 포스팅에서 사용되는 자료와 출처는 Programmers 임을 밝힙니다. https://school.programmers.co.kr/learn/courses/30/lessons/59413 해당 문제를 요약하면 다음과 같다.1. 0시부터 23시까지 각 시간대별 입양 건수를 조회2. 시간대 기준으로 오름차순 정렬 많은 것을 배울 수 있었던 문제 !! 처음 문제를 보고 Lv.4 문제 치고는 쉽다고 생각하며 코드를 작성했는데, 틀려서 당황했다. 문제는 0시~23시까지를 원했지만 내가 작성한 코드는 7시~19시까지만 출력되는 것이었다. 즉, 테이블(DB)에 없는 시간대(row)도 함께 출력해야 하는 문제였던 것이다.SELECT HOUR(datetime) AS hour , COUNT(*) AS coun..
1. 카테고리별 상위 n개 추출 ORDER BY 절과 LIMIT 함수를 조합하면 전체 데이터에서 상위 10개에 해당하는 데이터를 추출할 수 있었다. 하지만 전체 데이터가 아닌 각 카테고리별로 상위 n개 데이터를 추출하려면 순위 함수와 PARTITION BY를 활용해야 한다. Window Function은 WHERE 절에서 사용할 수 없으므로, 이를 위한 서브 쿼리를 사용하는 것이 필요하다.SELECT *FROM (SELECT category , product_id , score , ROW_NUMBER() OVER(PARTITION BY category ORDER BY score DESC) AS `row` FROM products ) AS ..
📢 본 포스팅에서 사용되는 자료와 출처는 LeetCode 임을 밝힙니다. https://leetcode.com/problems/delete-duplicate-emails/description/ 해당 문제를 요약하면 다음과 같다.1. 중복된 email 삭제2. 중복된 email 중에서 가장 작은 id를 가진 유니크한 email만 남기기3. SELECT문이 아닌 DELETE문 사용 방법 1) Window FunctionDELETE문의 WHERE 절에 조건을 주면, 해당 조건에 맞는 레코드만 삭제되어 테이블에서 제거된다. 그렇다면 우리가 지워야 할 행은 무엇일까? 중복된 email 중에서 id가 가장 작은 값을 제외한 나머지 행들이다. 이를 해결하기 위해 email별 id에 순위를 매기는 순위 함수를 사용할..