목록Total (102)
zimslog
처음 정답 코드)-- 생산일자 22.5-- id, name, 총매출-- order by 총매출 desc, id ascSELECT F.PRODUCT_ID, F.PRODUCT_NAME, F.PRICE*O.AMOUNT AS TOTAL_SALESFROM FOOD_PRODUCT FJOIN (SELECT PRODUCT_ID, SUM(AMOUNT) AS AMOUNTFROM FOOD_ORDERWHERE DATE_FORMAT(PRODUCE_DATE,'%Y-%m') = '2022-05'GROUP BY PRODUCT_ID) OON F.PRODUCT_ID = O.PRODUCT_IDORDER BY TOTAL_SALES DESC, PRODUCT_ID ASC
프로그래머스 - 상품의 구매한 회원 비율 구하기 처음 정답 코드)SELECT YEAR(SALES_DATE) as YEAR, MONTH(SALES_DATE) AS MONTH, COUNT(DISTINCT S.USER_ID) AS PURCHASED_USERS, ROUND( COUNT(DISTINCT S.USER_ID)/J.CNT , 1) AS PURCHASED_RATIOFROM ONLINE_SALE SJOIN (SELECT COUNT(*) AS CNT FROM USER_INFO WHERE YEAR(JOINED) = 2021) JWHERE EXISTS (SELECT 1 FROM USER_INFO ..
프로그래머스 - 멸종위기의 대장균 찾기 처음 정답 코드)WITH RECURSIVE ED AS ( -- 정적 CTE 선언 가능 SELECT ID, PARENT_ID FROM ECOLI_DATA ), -- 동적 CTE 선언 R AS ( -- 1세대 먼저 넣고 SELECT ID, PARENT_ID, 1 AS gen FROM ED WHERE PARENT_ID IS NULL UNION ALL -- 1세대에 조인으로 자식 붙여서 2세대 -- 2세대에 조인으로 자식 붙여서 3세대 -- ... -- 조인할 게 없으면 자동으로 멈추네 SELECT C.ID, C.PARENT_ID, gen+1 FROM R P -- 여기서 R은 직전에서 추가된 ..
재귀적 CTE - WITH RECURSIVE AS WITH CTE는 정적 테이블을 만들고,WITH RECURSIVE CTE는 동적 테이블을 만든다. (자기 자신을 호출하면서 데이터 만듬) 기본 구문)WITH RECURSIVE cte AS ( SELECT 1 AS n -- 가장 첫번째 행 정의, 한번만 실행 UNION ALL SELECT n+1 FROM cte -- 두번째부터 마지막 행까지 정의 WHERE n SELECT 문에서 컬럼명 명시하지 않고, 테이블명(컬럼명)으로 지정해주어도 됨. 위 쿼리와 같은 결과WITH RECURSIVE cte(n) AS ( SELECT 1 UNION ALL SELECT n+1 FROM cte WHERE n 피보나치 수열) 첫째, 둘째 항..
MySQL 날짜 함수/연산 정리 1. 날짜 추출NOW(), CURDATE(), CURTIME() : 현재 날짜/시간, 날짜, 시간 추출DATE(), YEAR(), MONTH(), DAY(), WEEK(), DAYNAME(): 날짜, 연도, 월, 일, 주, 요일 추출DATE_FORMAT(col, format): format대로 추출 ex) '%Y-%m-%d' 2. 날짜 연산DATEDIFF(d1, d2) : d1 - d2DATE_SUB(d, INTERVAL 30 DAY) : 30일 전 날짜 계산LAST_DAY(d) : 해당 월의 마지막 날 계산 TIMESTAMPDIFF(MONTH, start, end) : 연, 월, 일 지정해서 차이 계산 3. 특정 날짜 / 패턴 찾기 월별 주문 건수)SELECT DAT..
Leetcode 180, 511 - 윈도우 함수 180. Consecutive Numbers# Write your MySQL query statement below-- 3번 이상 연속으로 나타나는 모든 숫자-- 정렬 없음-- ID로 정렬한 다음, 2번, 1번 앞의 숫자 현재 숫자와 비교SELECT DISTINCT T.num as ConsecutiveNumsFROM (SELECT LAG(num, 2) OVER (ORDER BY id) AS lag2, -- 2행 앞 num LAG(num, 1) OVER (ORDER BY id) AS lag1, -- 1행 앞 num num -- 현재 num FROM Logs) TWHERE T.lag1 = T.num AND T.lag2 = T.num 5..
윈도우 함수 정리 (순위 함수, 집계 함수) SELECT 수행 시에 특정 윈도우 안에서 순위를 계산하거나 집계할 때 사용한다.모든 윈도우 함수는 OVER절과 함께 쓰이고, OVER절 안에는 ORDER BY나 PARTITION BY절이 사용된다. 1. 순위 함수 + OVER ( 조건.. ): 동일 순위 처리 방식에 따라 사용하는 함수가 다르다. OVER 절과 함께 쓰이면 OVER 절 안의 ORDER BY 등 조건대로 순위를 계산한다.RANK() 1 2 2 4DENSE_RANK() 1 2 2 3ROW_NUMBER 1 2 3 4SELECT MPG, COUNT(*), RANK() OVER (ORDER BY COUNT(*) DESC) AS RANKFROM MTCARSGROUP BY MPG GROUP BY 후에..
1. 처음 정답 코드WITH -- 트럭에 대한 정보만 뽑음 TRUCK AS (SELECT CAR_ID, DAILY_FEE FROM CAR_RENTAL_COMPANY_CAR C WHERE CAR_TYPE = '트럭'), -- 히스토리에 기간 뽑음 HISTORY AS (SELECT HISTORY_ID, CAR_ID, DATEDIFF(END_DATE, START_DATE)+1 AS DAYS FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY)SELECT H.HISTORY_ID, ROUND(T.DAILY_FEE*H.DAYS* (100-IFNULL(D.DISCOUNT_RATE, 0)) /100)..
프로그래머스 - 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 1. 처음 정답 코드WITH PLIST AS (SELECT *FROM CAR_RENTAL_COMPANY_CAR CWHERE C.CAR_TYPE IN ('세단','SUV') AND C.CAR_ID NOT IN (SELECT H.CAR_ID FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY H WHERE NOT (END_DATE '2022-11-30')) ) SELECT L.CAR_ID AS CAR_ID, L.CAR_TYPE AS CAR_TYPE, ROUND(L.DAILY_FEE*30..
SQL 튜닝 - 쿼리 최적화 옵티마이저가 스토리지 엔진으로부터 데이터를 가져오는 과정에서 성능을 개선하고 싶다면 두 가지 방법이 있다. 1. 읽어오는 데이터의 양을 줄이거나 2. 데이터를 읽는 속도를 높이거나 이번 포스팅에서는 데이터 양을 줄이고, 읽는 속도는 높일 수 있게 쿼리를 작성하는 방법에 대해 알아보겠다. 1. SELECT시 불필요한 컬럼, 행 제거SELECT * 를 통해 전체 컬럼을 불러오는 것은 좋지 않다.컬럼명을 지정해서 필요한 컬럼만 조회하도록 해야한다. 또 필요한 데이터만 LIMIT로 제한해서 가져오는 것이 좋다. 2. 적절한 조건절 사용마찬가지로 WHERE절과 같은 조건절을 통해 읽어오는 데이터를 줄여야 한다. 이 때 조건절 안에 함수, 형변환, 계산 등을 사용하는 것은 ..