본문 바로가기

SQL12

MySQL CREATE, INSERT, ALTER 문법 모음 MySQL의 여러가지 CREATE, INSERT, ALTER 문법을 소개하는 문서이다. 1. 테이블 생성CREATE TABLE DB명.테이블명( [컬럼1] [데이터 타입], -- ex) INT [컬럼2] [데이터 타입], -- ex) VARCHAR(30) [컬럼3] [데이터 타입], -- ex) DATE PRIMARY KEY ([컬럼1])); 참고로 primary key를 2 설정하는 것도 가능하다.CREATE TABLE DB명.테이블명( [컬럼1] [데이터 타입], -- ex) INT [컬럼2] [데이터 타입], -- ex) VARCHAR(30) [컬럼3] [데이터 타입], -- ex) DATE PRIMARY KEY ([컬럼1], [컬럼2])); 2. 기존 테이블에 새로운 컬럼 추.. 2024. 11. 7.
쿼리 최적화 데이터 베이스에서 성능 최적화는 디스크 I/O과 관련이 많다. 즉, 성능개선을 한다고 하는 것은 디스크 I/O를 줄이는 것이 핵심이다.  인덱스를 쓰면 조회는 빨라지지만 데이터 수정, 삭제, 생성은 느려진다는 말이 있다. 그럼에도 불구하고, 인덱스를 쓰는 것이 좋다. 일반적으로 웹서비스의 경우엔 CRUD에서 R(Read)과 CUD(Create, Update, Delete)의 비율이 8:2에서 9:1이기 때문이다. API 호출을 할때, get 요청을 하면 이게 전부 R 작업에 해당하는데, 보통 get 요청이 가장 많다.  인덱스는 데이터베이스 테이블에 대한 검색 성능 속도를 높여주는 자료구조이다. 즉, 인덱스는 책에 있는 목차라고 생각하면 된다. 목차에서 원하는 주제를 찾고 페이지 번호를 찾아가듯이, 인덱.. 2024. 11. 7.
[해커랭크] SQL 심화 응용 팁들 1. SELECT 서비스쿼리에서 where 조건으로 필터링https://www.hackerrank.com/challenges/the-company/problem?isFullScreen=true select a.company_code, a.founder,(select count(distinct lead_manager_code) from lead_manager where company_code = a.company_code),(select count(distinct senior_manager_code) from senior_manager where company_code = a.company_code),(select count(distinct manager_code) from manager where com.. 2024. 9. 24.
[solvesql]쇼핑몰의 일일 매출액과 ARPPU solvesql 사이트의 쇼핑몰의 일일 매출액과 ARPPU 문제 정답과 풀이이다. 난이도는 3단계였고, 한번에 정답을 맞췄다. 풀이하면서 쿼리 수행시간을 최대한 낮추려고 신경쓰면서 풀었다. 난이도 : 3풀이시간 : 15분수행시간 : 0.998초https://solvesql.com/problems/daily-arppu/  정답 쿼리select date(order_purchase_timestamp) as dt, count(*) as pu, round(sum(revenue),2) as revenue_daily, round(sum(revenue)/count(*),2) as arppufrom olist_orders_dataset aleft join (select order_id, sum(.. 2024. 7. 11.
[solvesql] 할부는 몇개월로 해드릴까요 해설 solvesql 할부는 몇개월로해드릴까요 sql 문제 정답 및 해설입니다. 문제 : https://solvesql.com/problems/installment-month/ 정답select payment_installments, count(distinct order_id) as order_count, min(payment_value) as min_value, max(payment_value) as max_value, avg(payment_value) as avg_valuefrom olist_order_payments_datasetwhere payment_type = 'credit_card'group by payment_installments;  해설정답률이 매우 낮길래 어렵나 하고 문제를 풀.. 2024. 7. 7.
[BigQuery] 신규사용자가 첫 접속날짜에 남긴 이벤트만 필터링 이글에서는 user_pseudo_id 또는 user_id를 활용해서 신규사용자가 처음 접속한 당일에 발생시킨 이벤트들만 필터링하는 방법에 대해서 알아볼 것이다. user_id를 수집하고 있지 않은 경우, 사용자를 식별할 수 있는 user_pesuo_id를 사용해야 한다.(user_id 관련 글) 이를 사용하여 사용자가 가장 처음 사이트를 접속한 날짜를 필터링하는 방법을 알아보자.  SELECT user_pseudo_id, event_dateFROM `프로젝트ID.events_*`WHERE event_name = 'first_visit'  위와 같이 쿼리를 작성하면, user_pseudo_id를 기준으로 'first_visit' 이벤트를 발생시킨 날짜만 필터링되어서 출력된다.('first_visit'는 .. 2024. 2. 25.
[BigQuery] event_date 날짜 형식 변경 방법 BigQuery의 event_date 날짜 형식을 보면, 20240225 이런식으로 되어있는 걸 볼 수 있다. 이러한 날짜 형식을 변경하고 싶을 때 사용할 수 있는 문법을 정리해봤다.  1. PARSE_DATE(format_string, date_string)이 함수는 텍스트 형식의 날짜형태를 날짜 형식으로 바꾸는 함수이다. format_string 부분에는 원본 데이터의 날짜형태를 그대로 입력해주어야한다. 예를 들어 event_date의 형태가 20240225이었기 때문에 아래와 같이 %Y%m%d 형태로 작성해주는 것이다. 다른 예시로 event_date의 형태가 24/02/25 였다면, format_string 부분에 %y/%m/%d 형태로 작성해야한다.PARSE_DATE('%Y%m%d',event_.. 2024. 2. 25.
MySQL 내장 함수 53가지 정리 (숫자, 문자, 날짜, 논리, 집계) MySQL을 사용할 때, 사용할 수 있는 내장 함수 53가지를 준비했다. 함수 종류가 많아서 하니씩 다 찾아보기 힘든 분들을 위해 카테고리 별로 나눠서 표로 정리했다. 숫자, 문자, 날짜, 논리, 집계 5가지 카테고리로 분류된다.   내용은 예시 SQL문, 실행 결과, 데이터를 가져왔을 때 사용하는 예문으로 구성된다. 각 함수에 대한 설명은 예시에 설명해 놓았다.숫자 관련 함수 1. ABS(number)-- 예시: 음수의 절대값 계산SELECT ABS(-15); -- 결과: 15-- 활용: 테이블의 특정 열에 있는 모든 값의 절대값 계산SELECT ABS(column_name) FROM table_name; 2. CEILING(number)-- 예시: 소수점 이하를 올림SELECT CEILING(15.7.. 2023. 11. 23.
[프로그래머스 SQL] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 정답 쿼리SELECT DISTINCT(C.CAR_ID), C.CAR_TYPE, ROUND(DAILY_FEE * 30 - (DAILY_FEE * 30 * (DISCOUNT_RATE/100))) AS FEEFROM CAR_RENTAL_COMPANY_CAR CJOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY HON C.CAR_ID = H.CAR_IDJOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN PON C.CAR_TYPE = P.CAR_TYPEWHERE C.CAR_TYPE IN ('세단', 'SUV')AND C.CAR_ID NOT IN ( SELECT CAR_ID FROM CAR_RENTA.. 2023. 8. 14.
[프로그래머스 SQL]조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기 정답쿼리SELECT CONCAT('/HOME/GREP/SRC/', F.BOARD_ID, '/',FILE_ID, FILE_NAME, FILE_EXT) AS FILE_PATHFROM USED_GOODS_FILE FJOIN USED_GOODS_BOARD BON F.BOARD_ID = B.BOARD_IDWHERE VIEWS = (SELECT MAX(VIEWS) FROM USED_GOODS_BOARD)ORDER BY F.FILE_ID DESC; 해설이번 문제는 ORDER BY VIEWS \ LIMIT 1; 이렇게 작성하면 안 되나? 헷갈렸던 문제였다.  SELECT MAX(VIEWS) FROM USED_GOODS_BOARD 쿼리를 이렇게 작성하면, 조회수가 가장 높은 VIEWS 값 하나만 추출하게 된다. 이를 W.. 2023. 8. 8.
[프로그래머스 SQL] 오랜 기간 보호한 동물(2) 정답 쿼리SELECT I.ANIMAL_ID, I.NAMEFROM ANIMAL_INS IJOIN ANIMAL_OUTS OON I.ANIMAL_ID = O.ANIMAL_IDORDER BY DATEDIFF(O.DATETIME, I.DATETIME) DESCLIMIT 2; 해설FROM ANIMAL_INS IJOIN ANIMAL_OUTS OON I.ANIMAL_ID = O.ANIMAL_ID이 문제는 '입양을 간 동물' 중에 보호 기간이 길었던 동물을 찾는 문제이다. '입양을 간 동물'만 필터링하기 위해서는 입양을 보낸 날짜가 NULL값이 아니어야 한다. 즉, ANIMAL_OUTS의 DATETIME이 결측치가 아니어야 한다. 이는 INNER JOIN을 쓰면, 쉽게 해결할 수 있다. INEER JOIN을 쓰면 들어왔.. 2023. 8. 7.
[프로그래머스 SQL] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 정답쿼리SELECT MONTH(START_DATE) AS MONTH, CAR_ID, COUNT(HISTORY_ID) AS RECORDSFROM CAR_RENTAL_COMPANY_RENTAL_HISTORYWHERE CAR_ID IN ( SELECT CAR_ID FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY WHERE (DATE_FORMAT(START_DATE, '%Y-%m') BETWEEN '2022-08' AND '2022-10') GROUP BY CAR_ID HAVING COUNT(CAR_ID) >= 5 ) AND (DATE_FORMAT(START_DATE, '%Y-%m') BETWEEN '2022-08' AND.. 2023. 8. 3.