-- User, Game, Item, Play, UserItem CREATE TABLE users ( user_id INT PRIMARY KEY, user_name VARCHAR(30) NOT NULL, nickname VARCHAR(30) NOT NULL, user_level INT, join_date DATE ); CREATE TABLE games ( game_id INT PRIMARY KEY, game_name VARCHAR(50) NOT NULL, genre VARCHAR(20), release_date DATE ); CREATE TABLE items ( item_id INT PRIMARY KEY, item_name VARCHAR(30), price INT, grade CHAR -- 'S' ); CREATE TABLE plays ( user_id INT, game_id INT, start_date DATE, play_time INT, -- 시작: Time.now(), 현재: Time.now() -- Time.now() = 176864523 - 176854321 = 10202 / 3600 PRIMARY KEY (user_id, game_id), FOREIGN KEY (user_id) REFERENCES users(user_id), FOREIGN KEY (game_id) REFERENCES games(game_id) ); CREATE TABLE user_items ( user_id INT, item_id INT, acquired_date DATE, quantity INT, PRIMARY KEY (user_id, item_id), FOREIGN KEY (user_id) REFERENCES users(user_id), FOREIGN KEY (item_id) REFERENCES items(item_id) ); TABLE users; TABLE games; TABLE items; TABLE plays; TABLE user_items; -- INSERT VALUES INSERT INTO users VALUES (1, '김민준', 'DragonKing', 15, '2024-03-01'), (2, '이서연', 'StarMage', 22, '2024-03-15'), (3, '박지훈', 'DarkKnight', 8, '2024-04-05'), (4, '최유진', 'HealerQueen', 34, '2024-06-11'), (5, '정도윤', 'FastArcher', 17, '2024-11-11'); INSERT INTO games VALUES (101, 'Super Mario RPG', 'RPG', '2021-01-01'), (102, 'Gran Turismo', 'Racing', '2019-12-31'), (103, 'Puzzle Bobble', 'Puzzle', '2022-07-14'); INSERT INTO items VALUES (1001, '강철검', 5000, 'B'), (1002, '마법지팡이', 12000, 'A'), (1003, '회복포션', 500, 'C'), (1004, '황금방패', 20000, 'S'), (1005, '불꽃활', 15000, 'A'); INSERT INTO plays VALUES (1, 101, '2024-03-23', 120), (2, 101, '2021-03-21', 97), (3, 102, '2024-05-05', 500), (4, 101, '2024-03-21', 140), (5, 103, '2019-12-31', 1000); INSERT INTO user_items VALUES (1, 1001, '2024-03-23', 1), (2, 1003, '2021-03-21', 2), (3, 1002, '2024-05-05', 5), (4, 1004, '2024-03-21', 4), (5, 1005, '2019-12-31', 10); TABLE users; TABLE games; TABLE items; TABLE plays; TABLE user_items; -- 기본 조회 연습 -- 1. 전체 유저 조회 SELECT * FROM users; -- 2. 레벨 높은 순서로 조회 SELECT * FROM users ORDER BY user_level DESC; -- 3. 레벨이 10 이상인 유저 조회 SELECT * FROM users WHERE user_level >= 10; -- 4. 'S' 등급 아이템 조회 SELECT * FROM items WHERE grade = 'S'; -- 테이블 수정할 때 (ALTER TABLE) -- 1. 게임 회사에서 유저의 이메일도 저장하기로 했다. ALTER TABLE users ADD COLUMN email VARCHAR(50); TABLE users; -- 2. 유저에게 현재 접속 상태를 저장해야 한다. ALTER TABLE users ADD COLUMN status VARCHAR(10) DEFAULT 'offline'; TABLE users; -- 3. 아이템 테이블에 판매 가능 여부를 추가해야 한다. ALTER TABLE items ADD COLUMN is_sellable BOOLEAN DEFAULT TRUE; TABLE items; -- 4. 게임 테이블에 게임 등급 정보를 추가해야 한다. ALTER TABLE games ADD COLUMN age_rating VARCHAR(10); TABLE games; -- 테이블에 있는 값이 변경할 때 (UPDATE) -- 1. 김민준 유저의 이메일을 추가합니다. UPDATE users SET email = 'minjun@email.com' WHERE user_id = 1; -- 2. 이서연 유저의 레벨이 25로 올랐다. UPDATE users SET user_level = 25 WHERE user_id = 2; -- 3. 모든 유저의 기본 접속 상태를 online으로 설정한다. UPDATE users SET status = 'online'; -- 4. DragonKing 유저가 현재 연결 중이다. UPDATE users SET status = 'connecting' WHERE nickname = 'DragonKing'; -- 5. 회복포션의 가격을 700으로 변경한다. UPDATE items SET price = 700 WHERE item_name = '회복포션'; -- 6. Gran Turismo의 이용 가능 연령을 12세 이상으로 설정한다. UPDATE games SET age_rating = '12+' WHERE game_id = 102; -- 주의 설명 -- DELETE는 데이터를 삭제한다. -- DROP TABLE은 테이블 자체를 삭제한다. -- ALTER TABLE은 테이블 구조를 변경한다. -- UPDATE는 기존 데이터를 수정한다.