DEV Community

Erlan Akbaraliev
Erlan Akbaraliev

Posted on • Edited on

База данных Финальный проект

1. Создайте таблицы с ограничениямы:

  • books: книги

    • id (Serial Primary Key)
    • title: название (Text)
    • publisher_id: id издателя (Integer)
    • format: формат
    • pages: страницы
    • published_date: дата публикации (Date)
  • authors

    • id
    • name: имя
    • country: страна
    • birthdate: дата рождения (Date)
  • authors_books: авторы_книги

    • author_id: id авторы
    • book_id: id книги
  • publishers: издатели

    • id
    • name: название
  • translators: переводчики

    • id
    • name: имя
  • translators_books: переводчики_книги

    • translator_id: id переводчик
    • book_id: id книги
  • rating: рейтинг

    • book_id: id книги
    • rating: рейтинг

Таким образом мы можем создать таблицы книги и издатели.

CREATE TABLE books (
    id SERIAL PRIMARY KEY,
    title TEXT NOT NULL,
    publisher_id INT,
    format TEXT CHECK(format IN ('твердый', 'мягкий')),
    pages INT,
    published_date DATE DEFAULT CURRENT_DATE,
    FOREIGN KEY (publisher_id) REFERENCES publishers(id)
);

CREATE TABLE publishers (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL
);
Enter fullscreen mode Exit fullscreen mode

Так как мы в таблице books пишем что publisher_id является Foreign Key (внешним ключом) и ссылается на столбец id из таблицы publishers, нам нужно сперва создать таблицу publishers.
Без таблицы publishers, мы не сможем создать таблицу books и указать там внешний ключ на таблицу publishers.

Создайте остальные таблицы.

Решение


2. Анализируйте таблицы

-- Решите вопросы 1-3 используя подзапросы (subqueries)
-- 1. Выведите все книги автора 'Ариана Арвис'
-- 2. Выведите все авторы книги 'Валун'
-- 3. Выведите все рейтинги книги 'Пока мы мечтали'

-- Решите вопросы 4-8 используя JOIN
-- 4. Объедините таблицы books и publishers
-- 5. Объедините таблицы books и publishers и выведите все книги опубликованные издателем у которого название начинается с 'And'
-- 6. Объедините таблицы books и rating и выведите все рейтинги книги 'Парадайс'
-- 7. Объедините таблицы authors и books по третьей таблице authors_books
-- 8. Объедините таблицы authors и books по таблице authors_books, 
   -- выведите столбцы name из таблицы authors, 
   -- title, pages, published_date из таблицы books

-- Aggregate функции, GROUP BY, ORDER BY
-- 9. Выведите средний рейтинг каждой книги (таблицы books, rating)
-- 10. Выведите средний рейтинг книги 'Парадайс'
SELECT b.title, ROUND(AVG(r.rating),2) AS "средний_рейтинг"
FROM books b
JOIN rating r ON b.id = r.book_id
GROUP BY b.title
HAVING b.title='Парадайс';
-- 11. Выведите средний рейтинг каждой книги и сортируйте их по средний_рейтинг по убыванию

-- View (Представление)
-- 12. Объедините таблицы authors и books по таблице authors_books, 
   --  выведите столбцы name из таблицы authors, 
   --  title, pages, published_date из таблицы books,
   --  и создайте View (представление) authors_books_view
-- 13. Из представлении authors_books_view, выведите книги которые были опубликованы в 2020 году и сортируйте по количеству страниц (pages) по убыванию
SELECT * FROM authors_books_view
WHERE published_date>='2020-01-01' AND published_date<='2020-12-12'
ORDER BY pages DESC;

-- 14. Объедините таблицы books и rating, 
    -- выведите столбцы id, title, pages, published_date из таблицы books, средниц рейтинг из таблицы rating,
    -- сгруппируйте по id книги и сортируйте по среднему рейтингу по обыванию (DESC)
    -- и создайте временное(Temporary) View(представление) books_ratings_view,
-- 15. Из представлении books_ratings_view, выведите топ 5 книг с самым высоким средним рейтингом
-- 16. Объедините таблицы books и publishers
    -- выведите столбцы title из таблицы books и name из таблицы publishers, 
    -- создайте CTE(Common Table Expression, одноразовое) View(представление) books_publishers_view

-- Insert, Update, Delete
-- 17. Добавьте новый автор в таблицу authors с именем 'Ким Чен Ын', country: 'Korea', birthdate: '1984-01-08'
-- 18. Обновите имя авторы 'Ким Чын Ын' на 'Rumi', country на: Persian, birthdate: '1273-09-30'
-- 19. Удалите автор с именем 'Rumi'

-- CASE
-- 20. Выведите столбцы title, pages, 
    -- и в новом столбце 
        -- если количество страниц больше 0 и меньше 100, напишите 'маленькая книги'
        -- если количество страниц больше 100 и меньше 200, напишите 'средняя книги'
        -- в ином случае напишите 'большая книги' (ELSE)
    --  из таблицы books
-- 21. Выведите столбцы title и
    -- если формат='мягкий', то 'м'
    -- если формат='твердый', то т'
    -- из таблицы books

-- INDEX
-- 22. Создайте индекс с названием books_title_index для столбца title из таблицы books чтобы получение данных по названию книги было очень быстрым
CREATE INDEX books_title_index
ON books(title);

-- Процедура (Procedure)
-- 23. Создайте процедуру add_author(name text, country text, birthdate date), используя которого сможем добавить данные в таблицу authors
CREATE PROCEDURE add_author(name text, country text, birthdate date)
LANGUAGE plpgsql
AS $$
BEGIN
    INSERT INTO authors (name, country, birthdate)
    VALUES (name, country, birthdate);
END;
$$;

CALL add_author('Касымалы Баялинов', 'Кыргызстан', '1902-09-25');

-- 24. Создайте процедуру add_book(title text, publisher_id int, format text, pages int, published_date date), используя которого сможем добавить данные в таблицу books
CREATE PROCEDURE add_book(title text, publisher_id int, format text, pages int, published_date date)
LANGUAGE plpgsql
AS $$
BEGIN
    INSERT INTO books (title, publisher_id, format, pages, published_date)
    VALUES (title, publisher_id, format, pages, published_date);
END;
$$;

CALL add_book('Ажар', NULL, 'твердый', 18, '1928-01-01');


Enter fullscreen mode Exit fullscreen mode

Решении

3. Создайте диаграмму и документацию проекта

Imag1
Создайте диаграмму нашей базы данных через этот сайт: drawsql


# Проект: Управление библиотечной базой данных (SQL)
В проекте реализованы и в процессе научилась(ся) протестировать следующие SQL-операции:
- **Запросы**
  - LIMIT, NOT, LIKE, DISTINCT, CASE
  - Агрегатные функции (ROUND, SUM, AVG, MAX, MIN)
- **Реляции**
  - Подзапросы
  - Primary, Foreign keys
  - Все типы реляций (1:1, 1:n, n:n)
  - IN, JOIN, GROUP BY, HAVING, ORDER BY
- **Дизайнирование**
  - CREATE, DROP
  - CHECK, DEFAULT, NOT NULL, UNIQUE
- **Изменение данных**
  - INSERT INTO
  - UPDATE
  - DELETE
  - Процедуры
- **VIEWS (представлении)**
  - Три типы представлений (Permanent(постоянный), Temporary(временный), CTE(одноразовый))
  - Мягкое удаление
- **Оптимизация**
  - Индексы
  - Транзакция (выполнить несколько запросов одновременно)
Enter fullscreen mode Exit fullscreen mode

4. Загрузите ваш проект на сайт

Github.com


CREATE TABLE covid (
    iso_code TEXT,
    continent TEXT,
    location TEXT,
    date DATE,
    total_case NUMERIC,
    new_cases NUMERIC,
    new_cases_smoothed REAL,
    total_deaths NUMERIC,
    new_deaths NUMERIC,
    new_deaths_smoothed REAL,
    total_cases_per_million REAL,
    new_cases_per_million REAL,
    new_cases_smoothed_per_million REAL,
    total_deaths_per_million REAL,
    new_deaths_per_million REAL,
    new_deaths_smoothed_per_million REAL,
    reproduction_rate REAL,
    icu_patients NUMERIC,
    icu_patients_per_million REAL,
    hosp_patients NUMERIC,
    hosp_patients_per_million REAL,
    weekly_icu_admissions REAL,
    weekly_icu_admissions_per_million REAL,
    weekly_hosp_admissions REAL,
    weekly_hosp_admissions_per_million REAL,
    new_tests NUMERIC,
    total_tests NUMERIC,
    total_tests_per_thousand REAL,
    new_tests_per_thousand REAL,
    new_tests_smoothed NUMERIC,
    new_tests_smoothed_per_thousand REAL,
    positive_rate REAL,
    tests_per_case REAL,
    tests_units TEXT,
    total_vaccinations NUMERIC,
    people_vaccinated NUMERIC,
    people_fully_vaccinated NUMERIC,
    new_vaccinations NUMERIC,
    new_vaccinations_smoothed NUMERIC,
    total_vaccinations_per_hundred REAL,
    people_vaccinated_per_hundred REAL,
    people_fully_vaccinated_per_hundred REAL,
    new_vaccinations_smoothed_per_million NUMERIC,
    stringency_index REAL,
    population NUMERIC,
    population_density REAL,
    median_age REAL,
    aged_65_older REAL,
    aged_70_older REAL,
    gdp_per_capita REAL,
    extreme_poverty REAL,
    cardiovasc_death_rate REAL,
    diabetes_prevalence REAL,
    female_smokers REAL,
    male_smokers REAL,
    handwashing_facilities REAL,
    hospital_beds_per_thousand REAL,
    life_expectancy REAL,
    human_development_index REAL
);
Enter fullscreen mode Exit fullscreen mode

Top comments (0)