지난 글에서 DBeaver에 GPT를 연동하는 방법을 살펴봤습니다.

https://sweetquant.tistory.com/557

 

DBeaver에 GPT 연동하기

파이참에 Copilot을 연결해서 사용하다... 음.. SQL툴에도 AI 연동이 가능할거 같은데란 생각이 들어서.찾아보니.. DBeaver에 GPT API를 연동할 수가 있네요. 준비물DBeaver(저는 24.0.3 버젼을 사용했습니다

sweetquant.tistory.com

 

간단한 SQL은 잘 작성합니다. 조금(?) 복잡한 SQL을 GPT로 시도해봤습니다.

우선, DBeaver에 연동해서 API 형태로 GPT를 사용하는 것은 실제 OpenAI에 접속해 GPT와 채팅하면서 답변을 얻는 것과는 차이가 있어 보입니다. 아무래도 GPT와 채팅하면서 얻는 답변이 좀 더 품질이 좋아보입니다.

 

테스트한 결과를 살펴보겠습니다.

먼저, 매장 테이블과 주문 테이블을 조인하는 간단한 SQL을 요청했습니다.

SQL에 성능 문제가 발생되도록 작성되었습니다. OrdDtm 컬럼을 DATE_FORMAT으로 가공해  인덱스가 있어도 사용을 못하도록 SQL이 만들어졌습니다. 그리고 아래 SQL의 프롬프트는 제 실수가 있었습니다. 사실 매장등급이란 컬럼은 없습니다. 없으면 없다고 메시지를 주면 좋은데, 그러지는 않네요. 자신이 생각할때 적절하다고 생각한 컬럼을 사용해 결과를 만들어 냅니다.

 

-- 프롬프트: 매장 테이블과 주문 테이블을 조인해서 보여줘,
-- 주문일시가 2022년 12월이고, 매장등급이 플래티넘(PLAT)인 데이터만 조회해줘
SELECT *
FROM shop s
JOIN ord o ON s.ShopId = o.ShopId
WHERE DATE_FORMAT(o.OrdDtm, '%Y%m') = '202212' AND s.ShopSt = 'PLAT';

 

이번에는 성능을 고려하라고 프롬프트를 추가하고, 매장이 아닌 회원과 조인을 요청합니다. 이번 SQL은 100점입니다. 인덱스 사용을 고려해달라고 요청하니 OrdDtm에 적절하게 조건 처리를 했습니다. 물론, OrdDtm에 인덱스는 아직 없지만요.

-- 프롬프트
-- 회원 테이블과 주문 테이블을 조인해서 보여줘, 
-- 주문일시가 2022년 12월이고, 회원등급이 플래티넘(PLAT)인 데이터만 조회해줘. 
-- 성능을 고려해서 SQL을 작성해줘. 인덱스를 사용할 수 있게 SQL을 작성해야 한다는 거지.
--  Sure, here is the SQL query that joins the `member` and `ord` tables, and filters for orders made in December 2022 by members with a 'PLAT' grade. This query is optimized for performance by using the appropriate indexes.
/*
This query joins the member and ord tables on the MemberId field.
It then filters for orders made in December 2022 and by members with a 'PLAT' grade.
The WHERE clause is written in a way that allows the use of indexes for performance optimization.
*/
SELECT m.*, o.*
FROM `member` AS m
INNER JOIN ord AS o ON m.MemberId = o.MemberId
WHERE m.MemberGd = 'PLAT'
AND o.OrdDtm >= '2022-12-01 00:00:00'
AND o.OrdDtm < '2023-01-01 00:00:00';
--  Please note that the date format and the 'PLAT' value are just examples and should be replaced with the actual format and value used in your database. Also, make sure that there are indexes on the `MemberId`, `MemberGd`, and `OrdDtm` fields for optimal performance.

 

 

 

조금 수준을 올려봅니다. StartUP SQL에서 사용하는 퀴즈를 활용해봅니다. https://sweetquant.tistory.com/542 의 마지막에 있는 16-4번 문제입니다. 그러나 여전히 성능 관점에서는 빵점 SQL이네요.

문제:
--  [BOOSTER QUIZ 16-4] 가입년도별, 회원상태별 2023년 1월의 주문 건수를 구하시오.
--  특정 가입년도별, 회원상태별 주문이 없어도 0건으로 집계해서 출력해주세요. 그리고 가입년도별 주문건수와 전체 주문건수도 추가해서 보여주세요.
--   - 대상 테이블: 회원(Member), 주문(Ord)
--   - 조회 조건: OrdDtm이 2023년 1월인 주문 데이터
--   - 조회 컬럼: JoinYear, MemberSt, OrdCnt
--   - 추가 조건:
--      : 성능을 고민하고 인덱스를 사용할 수 있도록 SQL을 작성할것.
--      : JoinYear는 JoinDtm을 년도로 변환한 값
--      : JoinYear별, MemberSt별 GROUP BY 처리하시오.
--      : OrdCnt는 JoinYear, MemberSt별 주문 건수
--      : Member와 Ord를 아우터 조인해 주문이 없는 JoinYear, MemberSt도 주문 건수가 0건으로 출력되도록 하시오.
--      : ROLLUP을 사용해 JoinYear별 중간합계와 전체합계를 추가하시오.
    
DBeaver+GPT 답변:

SELECT 
    YEAR(m.JoinDtm) AS JoinYear,
    m.MemberSt,
    COUNT(o.OrdNo) AS OrdCnt
FROM 
    `member` m
LEFT JOIN 
    ord o ON m.MemberId = o.MemberId AND YEAR(o.OrdDtm) = 2023 AND MONTH(o.OrdDtm) = 1
GROUP BY 
    YEAR(m.JoinDtm), m.MemberSt WITH ROLLUP;

 

 

조금 더 수준을 올려봅니다. 세개 테이블 조인과 분석함수까지 사용해야 하는 SQL입니다.

(문제 출처: https://sweetquant.tistory.com/548 )

휴~ 다행이네요. 아래 SQL은 에러가 발생합니다. SELECT 절에서 ItemId 컬럼을 사용할때 테이블이 지정되지 않았기 때문이죠.

--  [BOOSTER QUIZ 20-2] 2022년 11월 2022년 12월 주문에 대해, 주문년월별 상품별 주문수량을 구해주세요, 주문년월별로 주문수량에 따른 순위를 구해주세요.
--   - 대상 테이블: 주문(Ord), 주문상세(OrdDet), 상품(Item)
--   - 조회 조건: OrdDtm이 2022년 11월부터 2022년 12월 말까지인 데이터
--   - 조회 컬럼: OrdYm, ItemId, ItemNm, SumOrdQty, RankOverByYm
--   - 추가 조건:
--      : OrdYm, ItemId별 GROUP BY 처리하시오.
--      : OrdYm은 OrdDtm을 DATE_FORMAT으로 년월 형태로 변환한 값입니다.
--      : SumOrdQty는 OrdYm, ItemId별 SUM한 OrdQty 값입니다.
--      : RankOverByYm은 ItemId의 판매수량(SumOrdQty)에 대한 순위입니다. 이 순위는 년월별로 구해야 하며 판매 수량이 높으면 1이 됩니다.

SELECT 
    DATE_FORMAT(OrdDtm, '%Y%m') AS OrdYm,
    ItemId,
    ItemNm,
    SUM(OrdQty) AS SumOrdQty,
    RANK() OVER (PARTITION BY DATE_FORMAT(OrdDtm, '%Y%m') ORDER BY SUM(OrdQty) DESC) AS RankOverByYm
FROM 
    ord 
JOIN 
    orddet ON ord.OrdNo = orddet.OrdNo
JOIN 
    item ON orddet.ItemId = item.ItemId
WHERE 
    OrdDtm BETWEEN '2022-11-01' AND '2022-12-31'
GROUP BY 
    DATE_FORMAT(OrdDtm, '%Y%m'), 
    ItemId, 
    ItemNm
ORDER BY 
    OrdYm, 
    RankOverByYm;--  This query will return the total quantity of each item ordered per month for November and December 2022, along with a rank for each item based on the quantity ordered. The rank is calculated separately for each month.

 

 

DBeaver에 GPT API를 연동해 다양한 SQL을 시도해봤습니다.
아직은 API 연동으로 복잡한 SQL을 작성하는 데는 한계가 있어 보입니다.

(GPT와 직접 채팅으로 시도해보면 좀 더 결과가 잘나오지 않을까 싶네요.)
그러나 책으로만 SQL을 배운 신입보다는 낫다고도 할 수 있습니다.

지금은 AI를 활용한 SQL 작성에 한계는 있어보이지만,
개인적으로는 언젠가 이 한계를 극복할 것이라고 생각합니다.

다만, GPT가 잘할거라고 해서 우리가 공부를 게을리 해도 된다는 것은 아닙니다.
오히려 이전보다 더 깊이있게 공부할 필요가 있다고 생각합니다.
우리가 잘 알아야 잘 시킬 수 있으니까요..
언젠가는 시킬 일 조차 없게 될지도 모르지만, 그때는 그때고요.
오늘은 노력해야 하지 않을까요?

 

바짝 긴장해라. H.U.M.A.N!

 


[StartUP Tuning]
SQL 입문을 넘어선 MySQL을 활용한 SQL 튜닝 입문 교육
2024년 5월 주말 오프라인 교육 과정 모집중: https://cafe.naver.com/dbian/7717

 

StartUP Tuning - MySQL/MariaDB를 활용한 SQL 튜닝 입문

「StartUP Tuning - MySQL/MariaDB를 활용한 SQL 튜닝 입문」 < 일정 > 5/12(일), 5/19(일), 5/26(일) 오전 9시 ~ 오후 5시 (...

cafe.naver.com

 

[StartUP SQL]
데이터 분석가, 개발자, 기획자를 위한 SQL 입문 교육
교육용 슬라이드 전체 무료 오픈: https://sweetquant.tistory.com/497

 

StartUP SQL 소개 및 목차

SQL을 배우기 위한 최적의 시작점 StartUP SQL! 교육 슬라이드 전체를 블로그에 무료 오픈했습니다. (총 409장 슬라이드, 이미지로 게시) 아래 목차를 차례대로 하나씩 따라해보시기 바랍니다. 본인의

sweetquant.tistory.com

 

+ Recent posts