MySQL(5)
-
[MySQL] Retention & Cohort Analysis
이번 포스팅에서는 MySQL 쿼리문을 이용하여 다양한 종류의 Retention을 산출하는 방법에 대해 설명해보려고 합니다. 이를 설명하기 이전에 우선 간략하게 Retention, 그리고 이와 밀접한 관계가 있는 Cohort Analysis에 대해 먼저 설명하겠습니다. 1. Retention 이란? 아마 고객 데이터 분석에 대해 관심이 있다면 Retention에 대해 들어본적이 있을꺼라고 생각합니다. Retention은 도메인을 막론하고 고객 분석을 진행할 때 대부분의 스타트업에서 매우 중요한 지표입니다. Retention을 통해 서비스를 지속적으로 이용하는 고객의 비중을 알 수 있습니다. 일반적으로 신규 고객을 유입시키는 비용보다 기존 고객을 유지하는 비용이 낮기때문에 기존 고객 유지와 관련되어 있는 R..
2022.02.16 -
[MySQL] WITH AS
최근 HankerRank와 Leetcode에서 SQL 코딩 문제들을 풀던 도중 동일한 서브쿼리문을 여러곳에서 길게 작성하다 보니 코드 정리가 안되는 느낌을 받았다. 또한 가끔은 서브쿼리안에도 서브쿼리문을 작성해야할 경우가 있어서 가독성이 매우 떨어진다고 느꼈었다. 사용할 쿼리 결과를 미리 저장해두고 사용하는 방법이 없는지 찾아본 결과 MySQL에서 WITH AS 라는 아주 유용한 문법을 제공함을 알 수 있었다. 꼭 SQL 코딩 문제 풀이뿐 아니라 반복적으로 동일한 구문 결과를 사용할 일이 있을 경우 WITH AS 를 이용하여 반복적인 사용이 용이하게 가능하다. WITH AS 문법은 아래와 같다. WITH table_a AS ( 쿼리문 ) SELECT * FROM table_a; WITH 와 AS 사이에 ..
2022.01.10 -
[MySQL] != 처럼 JOIN 하기
최근 두 테이블 JOIN 시 아래 벤다이어그램과 같은 결과가 나오도록 쿼리문을 작성할 일이 있었다. 원래 어떻게 작성하면 위와 같은 결과가 나오는지 알고 있었는데.. 멍청하게도 JOIN ON 조건에 != 를 사용했다. 부끄럽지만 실수로 작성한 쿼리문을 공개하면 다음과 같다. SELECT a.*, b.* FROM table_a a LEFT JOIN table_b b ON a.key != b.key; 쿼리문 실행 후 아무리 기다려도 결과가 나오지 않아 이상함을 느낀 후 생각해보니 아주 잘못된 방식으로 쿼리문을 작성했음을 깨달았다. 위 쿼리문이 안되는 정확한 이유를 알기 위해 구글링 해보니 다음과 같은 이유로 위 쿼리문은 엄청난 연산 과정을 거친다고 한다. LEFT JOIN이 table a의 1,000,000..
2021.12.29 -
[MySQL] LIKE와 REGEXP
평소 특정한 문자열에 대한 검색을 할 때 LIKE가 사용하기 편하다는 이유로 REGEXP는 이용해본 경험이 거의 없다. 하지만 REGEXP 정규표현식을 활용하여 LIKE 보다 조금 더 복잡한 문자열 조건을 부여할 수 있기 때문에 이번 포스트에서는 LIKE와 REGEXP 대해 모두 정리해보려고 한다. LIKE LIKE는 WHERE절 안에 사용되며 문자열 내에서 조회하고 싶은 문자열을 찾는 함수이며 WILDCARDS(와일드 카드) 문자들과 함께 사용된다. MySQL의 LIKE에서 사용되는 와일드 카드 문자는 다음과 같다. %: 0개 이상의 문자를 대신 표현 _(under bar): 1개의 문자를 표현 이에 대해 구체적인 예시를 보면 다음과 같다. % 사용 # %ab: 앞 부분과 상관 없이 맨 마지막이 ab로..
2021.12.10 -
[MySQL] Foreign Key(외래키)
Foreign Key(외래키)는 한 테이블의 키 중에서 다른 테이블의 레코드를 유일하게 식별할 수 있는 키입니다. 두 테이블을 서로 연결하는 데 사용되는 키입니다. Foreign Key(외래키) 예제 제가 축구를 좋아해서 축구와 관련된 테이블 두 개를 생성한 후 이를 이용해서 설명해보겠습니다. 팀 정보가 담긴 테이블(team_table)과 선수 정보가 담긴 테이블(player_table)을 생성했습니다. # team\_table CREATE TABLE team_tab ( Team VARCHAR(50) NOT NULL, League VARCHAR(100) NOT NULL, Standings INT NOT NULL ); INSERT INTO team_table (Team, League, Standings) ..
2021.04.26