🌱 오늘의 주제 : 테이블의 설계 방식
🌱 테이블의 설계 방식
# 1. 테이블 생성
create table `singer` (
`id` int NOT NULL AUTO_INCREMENT primary key,
`name` varchar(64) NOT NULL,
`debut` int NOT NULL,
`agency` varchar(32) NOT NULL,
`createdAt` timestamp DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp DEFAULT CURRENT_TIMESTAMP
) ENGINE = InnoDB DEFAULT CHARSET='utf8mb4';
create table `album` (
`id` int NOT NULL AUTO_INCREMENT primary key,
`singerId` int NOT NULL,
`title` varchar(255) NOT NULL,
`releaseDate` Date NOT NULL, -- 날짜까지만 저장(시간 X)
`tracks` int NOT NULL,
`createdAt` timestamp DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp DEFAULT CURRENT_TIMESTAMP
) ENGINE = InnoDB DEFAULT CHARSET='utf8mb4';
create table `music` (
`id` int NOT NULL AUTO_INCREMENT primary key,
`singerId` int NOT NULL,
`albumId` int NOT NULL,
`title` varchar(128) NOT NULL,
`playTime` varchar(6) NOT NULL,
`lyricist` varchar(64) NOT NULL,
`composer` varchar(64) NOT NULL,
`createdAt` timestamp DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp DEFAULT CURRENT_TIMESTAMP
) ENGINE = InnoDB DEFAULT CHARSET='utf8mb4';
🌱 데이터 저장
# 2. 데이터 저장
INSERT INTO `singer` (`name`, `debut`, `agency`, `createdAt`, `updatedAt`)
VALUES ('성시경', 2000, '에스케이재원', now(), now()),
('AKMU', 2014, 'YG엔터테인먼트', now(), now()),
('아이유', 2008, '이담엔터테인먼트', now(), now());
INSERT INTO `album` (`singerId`, `title`, `releaseDate`, `tracks`, `createdAt`, `updatedAt`)
VALUES (1, 'The Ballads', '2006-10-10', 16, now(), now()),
(1, '여기, 내 맘속에...', '2008-06-12', 11, now(), now()),
(2, '항해', '2019-09-25', 10, now(), now()),
(2, 'SUMMER EPISODE', '2017-07-20', 4, now(), now()),
(3, 'Love poem', '2019-11-18', 6, now(), now()),
(3, 'Palette', '2017-04-21', 10, now(), now());
INSERT INTO `music` (`title`, `playTime`, `lyricist`, `composer`, `singerId`,`albumId`, `createdAt`, `updatedAt`)
VALUES ('거리에서', 279, '윤종신', '윤종신', 1, 1, now(), now()),
('그리운 날엔', 250, '심재희', '김형석', 1, 1, now(), now()),
('바람,그대', 250, '이미나', '하림', 1, 1, now(), now()),
('여기 내 맘속에', 250, '이미나', '유희열', 1, 2, now(), now()),
('안녕 나의 사랑', 257, '유희열', '성시경', 1, 2, now(), now()),
('어떻게 이별까지 사랑하겠어, 널 사랑하는 거지', 290, '이찬혁', '이찬혁', 2, 3, now(), now()),
('DINOSAUR', 240, '이찬혁', '이찬혁', 2, 4, now(), now()),
('MY DARLING', 225, '이찬혁', '이찬혁', 2, 4, now(), now()),
('Blueming', 217, '아이유', '이종훈', 3, 5, now(), now()),
('Love poem', 258, '아이유', '이종훈', 3, 5, now(), now()),
('밤편지', 253, '아이유', '김희원', 3, 6, now(), now()),
('팔레트', 217, '아이유', '아이유', 3, 6, now(), now());
🌱 조건
# 3. 발매일 조건
-- 2010년대에 발매된 노래를 출력하세요.
-- title(노래) composer title(앨범)
SELECT
A.`title`, A.`composer`, B.`title`
FROM
`music` AS A
JOIN `album` AS B
ON A.`albumId` = B.`id`
where -- B.releaseDate >= '2010-01-01' and B.releaseDate < '2020-01-01';
B.releaseDate between '2010-01-01' and '2020-01-01'; -- 끝날짜는 포함되지 않는다.
# 4. 가수별 총 노래 수
-- 가수별 노래 개수를 출력하세요.(singer)
-- 2005년 이전 데뷔 가수는 제외 하세요.(singer)
-- 노래 수 내림 차순으로 출력하세요.
SELECT
A.`name`, A.`debut`, COUNT(1) AS `count`
FROM
`singer` AS `A`
JOIN `music` AS `B`
ON A.`id` = B.`singerId`
WHERE
A.`debut` >= 2005
GROUP BY A.`id`
ORDER BY `count` DESC;
# 5. AKMU 노래
# AKMU 노래를 모두 출력하세요.(singer, album, music)
-- name title playTime album title
SELECT
C.`name`, B.`title`, B.`playTime`, A.`title` AS `album title`
FROM
`album` AS A
JOIN `music` AS B
ON A.`id` = B.`albumId`
JOIN `singer` AS C
ON C.`id` = B.`singerId`
WHERE
C.`name` = 'AKMU';
# 6. 2008년 부터 10년 동안 발매된 노래를 출력하세요.
# 단 재생시간이 4분 이상인 노래만 출력하세요.
# title(music) name(singer) playTime(music) album title(album)
select B.title, A.name, B.playTime, C.title
from singer AS A
join music AS B
on A.id = B.singerId
join album AS C
on B.albumId = C.id
where C.releaseDate between '2008-01-01' and '2019-01-01'
and B.playTime >= 240;
# 7. 앨범별 총 재생 시간
-- 재생시간이 470초과 인 것만 출력하세요.
-- 재생시간 오름 차순으로 출력하세요.
-- name(singer) title(album) tracks(album) playTime(music)
SELECT
A.`name`, B.`title`, C.`tracks`, sum(B.`playTime`) AS `playTime`
FROM
`singer` AS A
JOIN `MUSIC` AS B
ON A.`id` = B.`singerId`
JOIN `album` AS C
ON C.`id` = B.`albumId`
GROUP BY C.`id`
HAVING `playTime` > 470
ORDER BY `playTime` ASC;
'Database' 카테고리의 다른 글
Oracle Database (0) | 2024.09.01 |
---|---|
Database - DDL 대 DML (0) | 2023.08.03 |
UNIQUE 삭제 후 다시 설정하기. (0) | 2023.05.30 |
Mysql Query - SELECT문 (0) | 2023.05.24 |
Database - 테이블 JOIN (0) | 2023.03.13 |