diff --git a/erd.png b/erd.png new file mode 100644 index 00000000..ab03cc79 Binary files /dev/null and b/erd.png differ diff --git a/queries.sql b/queries.sql new file mode 100644 index 00000000..223f805e --- /dev/null +++ b/queries.sql @@ -0,0 +1,64 @@ +/* 1. 내 정보 업데이트 하기 */ +UPDATE _TDAUser +SET UserName = 'test' +WHERE UserId = 1; + +/* 2. 내가 생성한 상품 조회 (UserId=1, 최신순, 3페이지) */ +SELECT * FROM _TDAItem +WHERE UserId = 1 +ORDER BY UpdateAt DESC +LIMIT 10 OFFSET 20; + +/* 3. 내가 생성한 상품의 총 개수 */ +SELECT COUNT(*) FROM _TDAItem +WHERE UserId = 1; + +/* 4. 내가 좋아요 누른 상품 조회 (3페이지) */ +SELECT i.* FROM _TDAItem i +JOIN _TDAItemFavorite f ON i.ItemId = f.ItemId +WHERE f.UserId = 1 +ORDER BY f.CreateAt DESC +LIMIT 10 OFFSET 20; + +/* 5. 내가 좋아요 누른 상품의 총 개수 */ +SELECT COUNT(*) FROM _TDAItemFavorite +WHERE UserId = 1; + +/* 6. 상품 생성 */ +INSERT INTO _TDAItem (UserId, ItemName, ItemImage, ItemRemark, Price) +VALUES (1, '새 상품', 'image_url', '상품 설명입니다.', 50000); + +/* 7. 상품 목록 조회 ("test" 포함, 좋아요 개수 포함, 1페이지) */ +SELECT i.*, + (SELECT COUNT(*) FROM _TDAItemFavorite f WHERE f.ItemId = i.ItemId) AS FavoriteCount +FROM _TDAItem i +WHERE i.ItemName LIKE '%test%' +ORDER BY i.UpdateAt DESC +LIMIT 10 OFFSET 0; + +/* 8. 상품 상세 조회 (1번 상품) */ +SELECT * FROM _TDAItem WHERE ItemId = 1; + +/* 9. 상품 정보 수정 (1번 상품) */ +UPDATE _TDAItem +SET ItemName = '수정된 상품명', Price = 45000, UpdateAt = NOW() +WHERE ItemId = 1; + +/* 10. 상품 삭제 (1번 상품) */ +DELETE FROM _TDAItem WHERE ItemId = 1; + +/* 11. 상품 좋아요 (1번 유저가 2번 상품 좋아요) */ +INSERT INTO _TDAItemFavorite (UserId, ItemId) VALUES (1, 2); + +/* 12. 상품 좋아요 취소 */ +DELETE FROM _TDAItemFavorite WHERE UserId = 1 AND ItemId = 2; + +/* 13. 상품 댓글 작성 */ +INSERT INTO _TDAItemComment (ItemId, UserId, CommentText) +VALUES (2, 1, '이 상품 아직 팔렸나요?'); + +/* 14. 상품 댓글 조회 (특정 날짜 이전 데이터 10개) */ +SELECT * FROM _TDAItemComment +WHERE ItemId = 1 AND CreateAt < '2025-03-25' +ORDER BY CreateAt DESC +LIMIT 10; \ No newline at end of file diff --git a/schema.sql b/schema.sql new file mode 100644 index 00000000..d439a940 --- /dev/null +++ b/schema.sql @@ -0,0 +1,83 @@ +-- 1. 유저 테이블 +CREATE TABLE _TDAUser ( + UserId SERIAL PRIMARY KEY, + Email VARCHAR(255) UNIQUE NOT NULL, + Password VARCHAR(255) NOT NULL, + UserName VARCHAR(50) NOT NULL, + CreateAt TIMESTAMP DEFAULT NOW() +); + +-- 2. 태그 마스터 테이블 +CREATE TABLE _TDATag ( + TagId SERIAL PRIMARY KEY, + TagName VARCHAR(50) UNIQUE NOT NULL +); + +-- 3. 상품 테이블 +CREATE TABLE _TDAItem ( + ItemId SERIAL PRIMARY KEY, + UserId INTEGER REFERENCES _TDAUser(UserId) ON DELETE CASCADE, + ItemName VARCHAR(255) NOT NULL, + ItemImage TEXT, + ItemRemark TEXT, + Price INTEGER NOT NULL DEFAULT 0, + IsClosed BOOLEAN DEFAULT FALSE, + IsCompleted BOOLEAN DEFAULT FALSE, + UpdateAt TIMESTAMP DEFAULT NOW() +); + +-- 4. 상품 문의(댓글) 테이블 +CREATE TABLE _TDAItemComment ( + ItemId INTEGER REFERENCES _TDAItem(ItemId) ON DELETE CASCADE, + Serl SERIAL, + UserId INTEGER REFERENCES _TDAUser(UserId) ON DELETE CASCADE, + CommentText TEXT NOT NULL, + CreateAt TIMESTAMP DEFAULT NOW(), + UpdateAt TIMESTAMP DEFAULT NOW(), + PRIMARY KEY (ItemId, Serl) +); + +-- 5. 상품 찜하기 테이블 +CREATE TABLE _TDAItemFavorite ( + ItemId INTEGER REFERENCES _TDAItem(ItemId) ON DELETE CASCADE, + UserId INTEGER REFERENCES _TDAUser(UserId) ON DELETE CASCADE, + CreateAt TIMESTAMP DEFAULT NOW(), + PRIMARY KEY (ItemId, UserId) +); + +-- 6. 상품 태그 연결 테이블 +CREATE TABLE _TDAItemTag ( + ItemId INTEGER REFERENCES _TDAItem(ItemId) ON DELETE CASCADE, + TagId INTEGER REFERENCES _TDATag(TagId) ON DELETE CASCADE, + PRIMARY KEY (ItemId, TagId) +); + +-- 7. 게시판 테이블 +CREATE TABLE _TDABoard ( + BoardId SERIAL PRIMARY KEY, + UserId INTEGER REFERENCES _TDAUser(UserId) ON DELETE CASCADE, + BoardTitle VARCHAR(255) NOT NULL, + BoardContents TEXT NOT NULL, + BoardImage TEXT, + CreateAt TIMESTAMP DEFAULT NOW(), + UpdateAt TIMESTAMP DEFAULT NOW() +); + +-- 8. 게시판 댓글 테이블 +CREATE TABLE _TDABoardComment ( + BoardId INTEGER REFERENCES _TDABoard(BoardId) ON DELETE CASCADE, + UserId INTEGER REFERENCES _TDAUser(UserId) ON DELETE CASCADE, + Serl SERIAL, + CommentContents TEXT NOT NULL, + CreateAt TIMESTAMP DEFAULT NOW(), + UpdateAt TIMESTAMP DEFAULT NOW(), + PRIMARY KEY (BoardId, Serl) +); + +-- 9. 게시판 좋아요 테이블 +CREATE TABLE _TDABoardLike ( + BoardId INTEGER REFERENCES _TDABoard(BoardId) ON DELETE CASCADE, + UserId INTEGER REFERENCES _TDAUser(UserId) ON DELETE CASCADE, + CreateAt TIMESTAMP DEFAULT NOW(), + PRIMARY KEY (BoardId, UserId) +); \ No newline at end of file diff --git a/sprint-mission-6.sql b/sprint-mission-6.sql new file mode 100644 index 00000000..a50e29ba --- /dev/null +++ b/sprint-mission-6.sql @@ -0,0 +1,55 @@ +-- 1. 모든 주문 조회 +SELECT * FROM orders; + +-- 2. id가 423인 주문 조회 +SELECT * FROM orders WHERE id = 423; + +-- 3. 총 주문 건수 구하기 +SELECT COUNT(*) AS total_orders FROM orders; + +-- 4. 최신 순으로 주문 조회 (날짜와 시간 기준) +SELECT * FROM orders ORDER BY date DESC, time DESC; + +-- 5. 오프셋 기반 페이지네이션 (1페이지, 10개) +SELECT * FROM orders ORDER BY date DESC, time DESC LIMIT 10 OFFSET 0; + +-- 6. 오프셋 기반 페이지네이션 (5페이지, 10개) +SELECT * FROM orders ORDER BY date DESC, time DESC LIMIT 10 OFFSET 40; + +-- 7. 커서 기반 페이지네이션 (id 42 기준 다음 페이지) +SELECT * FROM orders WHERE id < 42 ORDER BY id DESC LIMIT 10; + +-- 8. 2025년 3월 주문 내역 조회 +SELECT * FROM orders WHERE date >= '2025-03-01' AND date <= '2025-03-31'; + +-- 9. 2025년 3월 12일 오전 주문 내역 조회 +SELECT * FROM orders WHERE date = '2025-03-12' AND time < '12:00:00'; + +-- 10. 이름에 'Cheese' 혹은 'Chicken'이 포함된 피자 종류 조회 +SELECT * FROM pizza_types WHERE name LIKE '%Cheese%' OR name LIKE '%Chicken%'; + +-- 11. 각 피자별 주문된 건 수 +SELECT pizza_id, COUNT(DISTINCT order_id) FROM order_details GROUP BY pizza_id; + +-- 12. 각 피자별 총 주문 수량 +SELECT pizza_id, SUM(quantity) FROM order_details GROUP BY pizza_id; + +-- 13. 가격이 20보다 큰 피자 종류만 order_details에서 조회 +SELECT * FROM order_details +WHERE pizza_id IN (SELECT id FROM pizzas WHERE price > 20); + +-- 14. 날짜별 총 주문 건수 80건 이상인 날 조회 및 정렬 +SELECT date, COUNT(id) AS order_count FROM orders +GROUP BY date HAVING COUNT(id) >= 80 ORDER BY order_count DESC; + +-- 15. 총 주문 수량 10개 이상인 피자 조회 및 내림차순 정렬 +SELECT pizza_id, SUM(quantity) AS total_qty FROM order_details +GROUP BY pizza_id HAVING SUM(quantity) >= 10 ORDER BY total_qty DESC; + +-- 16. 피자별 총 수익 구하기 +SELECT od.pizza_id, SUM(od.quantity * p.price) AS total_revenue +FROM order_details od JOIN pizzas p ON od.pizza_id = p.id GROUP BY od.pizza_id; + +-- 17. 날짜별 주문 건수와 총 주문 수량 +SELECT o.date, COUNT(DISTINCT o.id) AS order_count, SUM(od.quantity) AS total_quantity +FROM orders o JOIN order_details od ON \ No newline at end of file