Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.DS_Store
Binary file added .gradle/7.4/checksums/checksums.lock
Binary file not shown.
Binary file not shown.
Empty file.
Binary file added .gradle/7.4/executionHistory/executionHistory.lock
Binary file not shown.
Binary file added .gradle/7.4/fileChanges/last-build.bin
Binary file not shown.
Binary file added .gradle/7.4/fileHashes/fileHashes.lock
Binary file not shown.
Empty file added .gradle/7.4/gc.properties
Empty file.
Binary file added .gradle/buildOutputCleanup/buildOutputCleanup.lock
Binary file not shown.
2 changes: 2 additions & 0 deletions .gradle/buildOutputCleanup/cache.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#Thu May 16 16:36:19 KST 2024
gradle.version=7.4
Empty file added .gradle/vcs-1/gc.properties
Empty file.
3 changes: 3 additions & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/compiler.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 16 additions & 0 deletions .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 20 additions & 0 deletions .idea/jarRepositories.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

74 changes: 38 additions & 36 deletions src/main/java/com/jungmin/migrations/schema.sql
Original file line number Diff line number Diff line change
@@ -1,46 +1,48 @@
CREATE TABLE Users (
user_id BIGINT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL UNIQUE,
email VARCHAR(255) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
CREATE TABLE `Tags` (
`tag_id` BIGINT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL UNIQUE
);

CREATE TABLE Boards (
board_id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
description TEXT
CREATE TABLE `Users` (
`user_id` BIGINT PRIMARY KEY AUTO_INCREMENT,
`username` VARCHAR(255) NOT NULL UNIQUE,
`email` VARCHAR(255) NOT NULL UNIQUE,
`password` VARCHAR(255) NOT NULL,
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE Posts (
post_id BIGINT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
user_id BIGINT,
board_id BIGINT,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES Users(user_id),
FOREIGN KEY (board_id) REFERENCES Boards(board_id)
CREATE TABLE `Boards` (
`board_id` BIGINT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`description` TEXT
);

CREATE TABLE Comments (
comment_id BIGINT AUTO_INCREMENT PRIMARY KEY,
content TEXT NOT NULL,
user_id BIGINT,
post_id BIGINT,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES Users(user_id),
FOREIGN KEY (post_id) REFERENCES Posts(post_id)
CREATE TABLE `Posts` (
`post_id` BIGINT PRIMARY KEY AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`content` TEXT NOT NULL,
`user_id` BIGINT,
`board_id` BIGINT,
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
FOREIGN KEY (`user_id`) REFERENCES `Users` (`user_id`),
FOREIGN KEY (`board_id`) REFERENCES `Boards` (`board_id`)
);

CREATE TABLE Tags (
tag_id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL UNIQUE
CREATE TABLE `Comments` (
`comment_id` BIGINT PRIMARY KEY AUTO_INCREMENT,
`content` TEXT NOT NULL,
`user_id` BIGINT,
`post_id` BIGINT,
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
FOREIGN KEY (`user_id`) REFERENCES `Users` (`user_id`),
FOREIGN KEY (`post_id`) REFERENCES `Posts` (`post_id`)
);

CREATE TABLE Post_Tags (
post_id BIGINT NOT NULL,
tag_id BIGINT NOT NULL,
FOREIGN KEY (post_id) REFERENCES Posts(post_id),
FOREIGN KEY (tag_id) REFERENCES Tags(tag_id)
);
CREATE TABLE `Post_Tags` (
`post_id` BIGINT,
`tag_id` BIGINT,
FOREIGN KEY (`post_id`) REFERENCES `Posts` (`post_id`),
FOREIGN KEY (`tag_id`) REFERENCES `Tags` (`tag_id`)
);


16 changes: 8 additions & 8 deletions src/main/java/com/jungmin/script/Part1.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,55 +3,55 @@
public class Part1 {
/*
----------------------------------------------------------------------------------------------
TODO: 유어클래스의 requirement를 참조하여, migration/schema.sql에 알맞은 테이블을 구성해주세요.
TODO: requirement를 참조하여, migration/schema.sql에 알맞은 테이블을 구성해주세요.
*/

/*
----------------------------------------------------------------------------------------------
TODO: Q 1-1. 현재 있는 데이터베이스에 존재하는 모든 테이블 정보를 보기위한 SQL을 작성해주세요.
*/
public static final String PART1_1 = "show tables";
public static final String PART1_1 = "SHOW TABLES";

/*
----------------------------------------------------------------------------------------------
TODO: Q 1-2. Users 테이블의 구조를 보기위한 SQL을 작성해주세요.
- 요구사항에 맞는 Users 테이블을 작성해야만, 테스트를 통과합니다.
*/
public static final String PART1_2 = "DESCRIBE Users;";
public static final String PART1_2 = "DESC Users";

/*
----------------------------------------------------------------------------------------------
TODO: Q 1-3. Posts 테이블의 구조를 보기위한 SQL을 작성해주세요.
- 요구사항에 맞는 Posts 테이블을 작성해야만, 테스트를 통과합니다.
*/
public static final String PART1_3 = "desc posts";
public static final String PART1_3 = "DESC Posts";

/*
----------------------------------------------------------------------------------------------
TODO: Q 1-4. Tags 테이블의 구조를 보기위한 SQL을 작성해주세요.
- 요구사항에 맞는 Tags 테이블을 작성해야만, 테스트를 통과합니다.
*/
public static final String PART1_4 = "desc Tags";
public static final String PART1_4 = "DESC Tags";

/*
----------------------------------------------------------------------------------------------
TODO: Q 1-5. Post_Tags 테이블의 구조를 보기위한 SQL을 작성해주세요.
- 요구사항에 맞는 Post_Tags 테이블을 작성해야만, 테스트를 통과합니다.
*/
public static final String PART1_5 = "desc Post_Tags";
public static final String PART1_5 = "DESC Post_tags";

/*
----------------------------------------------------------------------------------------------
TODO: Q 1-6. Comments 테이블의 구조를 보기위한 SQL을 작성해주세요.
- 요구사항에 맞는 Comments 테이블을 작성해야만, 테스트를 통과합니다.
*/
public static final String PART1_6 = "desc Comments";
public static final String PART1_6 = "DESC Comments";

/*
----------------------------------------------------------------------------------------------
TODO: Q 1-7. Boards 테이블의 구조를 보기위한 SQL을 작성해주세요.
- 요구사항에 맞는 Boards 테이블을 작성해야만, 테스트를 통과합니다.
*/
public static final String PART1_7 = "desc Boards";
public static final String PART1_7 = "DESC Boards";

}
43 changes: 24 additions & 19 deletions src/main/java/com/jungmin/script/Part2.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,124 +11,129 @@ public class Part2 {
----------------------------------------------------------------------------------------------
TODO: Q 2-2. users 테이블에 존재하는 모든 데이터에서 username 컬럼만을 확인하기 위한 SQL을 작성해주세요.
*/
public static final String PART2_2 = "SELECT username FROM Users";
public static final String PART2_2 = "SELECT u.username FROM Users u";

/*
----------------------------------------------------------------------------------------------
TODO: Q 2-3. users 테이블에 데이터를 추가하기 위한 SQL을 작성해주세요.")
- 원하는 username, email, password를 사용하시면 됩니다.
*/
public static final String PART2_3 = "INSERT INTO Users (username, email, password, created_at) VALUES ('newuser', 'newuser@example.com', 'newpassword', NOW())";
public static final String PART2_3 = "INSERT INTO Users(username, email, password) VALUES('이름', 'abc@naver.com', '123123')";

/*
----------------------------------------------------------------------------------------------
TODO: Q 2-4. users 테이블에서 특정 조건을 가진 데이터를 찾기위한 SQL을 작성해주세요.
- 조건 : username이 luckykim이여야 합니다.
*/
public static final String PART2_4 = "SELECT * FROM Users WHERE username = 'luckykim'";
public static final String PART2_4 = "SELECT * FROM Users u WHERE u.username = 'luckykim'";

/*
----------------------------------------------------------------------------------------------
TODO: Q 2-5. users 테이블에서 특정 조건을 가진 데이터를 찾기위한 SQL을 작성해주세요.
- 조건 : username이 luckykim이 아니여야 합니다.
*/
public static final String PART2_5 = "SELECT * FROM Users WHERE username <> 'luckykim'";
public static final String PART2_5 = "SELECT u.username FROM Users u WHERE u.username <> 'luckykim'";

/*
----------------------------------------------------------------------------------------------
TODO: Q 2-6. posts 테이블에 존재하는 모든 데이터에서 title 컬럼만을 찾기 위한 SQL을 작성해주세요.
*/

public static final String PART2_6 = "SELECT title FROM Posts";
public static final String PART2_6 = "SELECT p.title FROM Posts p";

/*
----------------------------------------------------------------------------------------------
TODO: Q 2-7. posts의 title과 그 게시글을 작성한 user의 username을 찾기 위한 SQL을 작성해주세요.
- 저자가 없더라도, posts의 title을 모두 찾아야합니다.
*/
public static final String PART2_7 = "SELECT p.title, u.username FROM Posts p LEFT JOIN Users u ON p.user_id = u.user_id";
public static final String PART2_7 = "SELECT p.title, u.username FROM Posts p LEFT JOIN Users u ON u.user_id = p.user_id";

/*
----------------------------------------------------------------------------------------------
TODO: Q 2-8. posts의 title과 그 게시글을 작성한 user의 username을 찾기 위한 SQL을 작성해주세요.
- 저자가 있는 posts의 title만 찾아야합니다.
*/
public static final String PART2_8 = "SELECT p.title, u.username FROM Posts p INNER JOIN Users u ON p.user_id = u.user_id";
public static final String PART2_8 = "SELECT p.title, u.username FROM Posts p JOIN Users u ON u.user_id = p.user_id";

/*
----------------------------------------------------------------------------------------------
TODO: Q 2-9. posts 테이블의 데이터를 수정하기 위한 SQL을 작성해주세요.
- title이 'New Tech Trends'인 posts 데이터에서 content를 'Updated content'로 수정해야합니다.
*/
public static final String PART2_9 = "UPDATE Posts SET content = 'Updated content' WHERE title = 'New Tech Trends'";
public static final String PART2_9 = "UPDATE Posts p SET p.title = 'Updated content' WHERE p.title = 'New Tech Trends'";

/*
----------------------------------------------------------------------------------------------
TODO: Q 2-10. posts 테이블의 데이터를 추가하기 위한 SQL을 작성해주세요.
- luckykim이 작성한 게시글을 추가해주세요. 제목과 본문은 자유입니다. (참고: luckykim의 아이디는 1입니다.)
*/
public static final String PART2_10 = "INSERT INTO Posts (title, content, user_id, board_id, created_at) VALUES ('New Post', 'This is a new post by luckykim.', 1, 1, CURRENT_TIMESTAMP)";
public static final String PART2_10 = "INSERT INTO Posts (title, content, user_id, board_id) " +
"VALUES ('title', 'content', 1, 10);";

/*
----------------------------------------------------------------------------------------------
TODO: Q 2-11. 어느 board에도 속하지 않는 post의 모든 데이터를 찾기위한 SQL을 작성해주세요.")
*/
public static final String PART2_11 = "SELECT * FROM Posts WHERE board_id IS NULL";
public static final String PART2_11 = "SELECT * FROM Posts p WHERE p.board_id IS NULL";

/*
----------------------------------------------------------------------------------------------
TODO: Q 2-12. users 테이블의 user_id가 1인 유저가 작성한 post의 title을 찾기위한 SQL을 작성해주세요.
*/
public static final String PART2_12 = "SELECT title FROM Posts WHERE user_id = 1";
public static final String PART2_12 = "SELECT p.title FROM Posts p WHERE p.user_id = 1";

/*
----------------------------------------------------------------------------------------------
TODO: Q 2-13. users 테이블의 user_id가 1인 유저가 작성한 post의 board name을 찾기위한 SQL을 작성해주세요.
*/
public static final String PART2_13 = "SELECT b.name FROM Posts p INNER JOIN Boards b ON p.board_id = b.board_id WHERE p.user_id = 1";
public static final String PART2_13 = "SELECT b.name FROM Boards b JOIN Posts p ON b.board_id = p.board_id WHERE p.user_id = 1";

/*
----------------------------------------------------------------------------------------------
TODO: Q 2-14. board의 name이 'General Discussion'인 post의 title, content, created_at을 찾기위한 SQL을 작성해주세요.
*/
public static final String PART2_14 = "SELECT p.title, p.content, p.created_at FROM Posts p INNER JOIN Boards b ON p.board_id = b.board_id WHERE b.name = 'General Discussion'";
public static final String PART2_14 = "SELECT p.title, p.content, p.created_at FROM Posts p JOIN Boards b ON b.board_id = p.board_id WHERE b.name = 'General Discussion'";

/*
----------------------------------------------------------------------------------------------
TODO: Q 2-15. luckykim이 작성한 comment의 개수 (컬럼명: CommentCount)를 출력하기 위한 SQL을 작성해주세요.
*/
public static final String PART2_15 = "SELECT COUNT(*) AS CommentCount FROM Comments WHERE user_id = 1";
public static final String PART2_15 = "SELECT COUNT(c.comment_id) as CommentCount FROM Comments c JOIN Users u ON c.user_id = u.user_id WHERE u.username = 'luckykim'";

/*
----------------------------------------------------------------------------------------------
TODO: Q 2-16. 각 user(컬럼명: username)가 작성한 comment의 개수 (컬럼명: CommentCount)를 출력하기 위한 SQL을 작성해주세요.
- 단, 0개의 comment를 작성한 유저도 모두 출력해야 합니다.
*/
public static final String PART2_16 = "SELECT u.username, COUNT(c.comment_id) AS CommentCount FROM Users u LEFT JOIN Comments c ON u.user_id = c.user_id GROUP BY u.username";
public static final String PART2_16 = "SELECT u.username as username, COUNT(c.comment_id) as CommentCount FROM Comments c LEFT JOIN Users u ON c.user_id = u.user_id GROUP BY u.username";

/*
----------------------------------------------------------------------------------------------
TODO: Q 2-17. 각 board의 name과 해당 board에 속한 post의 개수 (컬럼명: PostCount)를 출력하기 위한 SQL을 작성해주세요.
*/
public static final String PART2_17 = "SELECT b.name, COUNT(p.post_id) AS PostCount FROM Boards b LEFT JOIN Posts p ON b.board_id = p.board_id GROUP BY b.name";
public static final String PART2_17 = "SELECT b.name, COUNT(p.post_id) as PostCount FROM Boards b LEFT JOIN Posts p ON b.board_id = p.board_id GROUP BY b.name";

/*
----------------------------------------------------------------------------------------------
TODO: Q 2-18. 각 board의 name과 해당 board에 속한 posts 테이블의 content의 평균 길이 (컬럼명: AvgLength)를 출력하기 위한 SQL을 작성해주세요.")
*/
public static final String PART2_18 = "SELECT b.name, AVG(CHAR_LENGTH(p.content)) AS AvgLength FROM Boards b LEFT JOIN Posts p ON b.board_id = p.board_id GROUP BY b.name";
public static final String PART2_18 = "SELECT b.name, AVG(CHAR_LENGTH(p.content)) as AvgLength FROM Boards b LEFT JOIN Posts p ON b.board_id = p.board_id GROUP BY b.name";

/*
----------------------------------------------------------------------------------------------
TODO: Q 2-19. 각 board의 name과 해당 board에 속한 posts 테이블의 content의 평균 길이 (컬럼명: AvgLength)를 출력하기 위한 SQL을 작성해주세요.
- 단, content가 null인 경우를 제외해야 합니다.
*/
public static final String PART2_19 = "SELECT b.name, AVG(CHAR_LENGTH(p.content)) AS AvgLength FROM Boards b LEFT JOIN Posts p ON b.board_id = p.board_id GROUP BY b.name HAVING AvgLength IS NOT NULL ";
public static final String PART2_19 = "SELECT b.name, AVG(CHAR_LENGTH(p.content)) as AvgLength FROM Boards b JOIN Posts p ON b.board_id = p.board_id GROUP BY b.name HAVING AvgLength IS NOT NULL";

/*
----------------------------------------------------------------------------------------------
TODO: Q 2-20. 각 tag의 name과 해당 tag가 달린 post의 개수 (컬럼명: PostCount)를 출력하기 위한 SQL을 작성해주세요.
- 단, post에 할당되지 않은 tag의 이름도 모두 출력해야 합니다.")
*/
public static final String PART2_20 = "SELECT t.name, COUNT(pt.post_id) AS PostCount FROM Tags t LEFT JOIN Post_Tags pt ON t.tag_id = pt.tag_id GROUP BY t.name";
public static final String PART2_20 = "SELECT t.name, COUNT(pt.post_id) AS PostCount " +
"FROM Tags t " +
"LEFT JOIN Post_Tags pt ON t.tag_id = pt.tag_id " +
"GROUP BY t.name " +
"ORDER BY t.name";
}