← К оглавлению занятия

✅ Решения

⚡ Кратко: решения

  • Задание 1 — таблица products, 5 строк, UPDATE с WHERE.
  • Задание 2 — View product_overview с stock_value и stock_status.
  • Задание 3 — таблица health_metrics с CHECK-ограничениями.
  • Задание 4 — таблица Weather и View Weather_Summary_View.
1

Решение задания 1

CREATE TABLE products (
    product_id INT AUTO_INCREMENT PRIMARY KEY,
    product_name VARCHAR(100) NOT NULL,
    category VARCHAR(50) DEFAULT 'General',
    price DECIMAL(8, 2) CHECK (price >= 0),
    stock_quantity INT CHECK (stock_quantity >= 0),
    supplier_id INT
);

INSERT INTO products (product_name, category, price, stock_quantity, supplier_id)
VALUES ('Laptop', 'Electronics', 1200.00, 10, 1),
       ('Office Chair', 'Furniture', 150.00, 25, 2),
       ('Pen', 'Stationery', 1.50, 100, 3),
       ('Desk Lamp', 'Furniture', 45.00, 15, 2),
       ('Notebook', 'Stationery', 3.00, 200, 3);

UPDATE products
SET stock_quantity = stock_quantity - 3
WHERE product_id = 1;
2

Решение задания 2

CREATE VIEW product_overview AS
SELECT
    product_name,
    category,
    price * stock_quantity AS stock_value,
    CASE
        WHEN stock_quantity < 20 THEN 'Low Stock'
        ELSE 'In Stock'
    END AS stock_status
FROM products;
3

Решение задания 3

CREATE TABLE health_metrics (
    metric_id INT AUTO_INCREMENT PRIMARY KEY,
    person_name VARCHAR(100) NOT NULL,
    measurement_date DATE NOT NULL,
    heart_rate INT CHECK (heart_rate BETWEEN 30 AND 220),
    systolic_bp INT CHECK (systolic_bp BETWEEN 70 AND 250),
    diastolic_bp INT CHECK (diastolic_bp BETWEEN 40 AND 150),
    weight_kg DECIMAL(5, 2) CHECK (weight_kg > 0),
    notes TEXT
);

INSERT INTO health_metrics (person_name, measurement_date, heart_rate, systolic_bp, diastolic_bp, weight_kg)
VALUES ('Alice', '2025-06-15', 72, 120, 80, 65.50),
       ('Bob', '2025-06-16', 68, 115, 75, 78.00),
       ('Charlie', '2025-06-17', 75, 122, 82, 70.25);
4

Решение задания 4

CREATE TABLE Weather (
    Id INT AUTO_INCREMENT PRIMARY KEY,
    WeatherDate DATE NOT NULL,
    DayTemperature INT CHECK (DayTemperature BETWEEN -30 AND 30),
    NightTemperature INT CHECK (NightTemperature BETWEEN -30 AND 30),
    WindSpeed DECIMAL(4, 1) CHECK (WindSpeed >= 0)
);

INSERT INTO Weather (WeatherDate, DayTemperature, NightTemperature, WindSpeed)
VALUES ('2025-06-13', 22, 14, 2.5),
       ('2025-06-14', 25, 16, 1.0),
       ('2025-06-15', 19, 11, 5.5),
       ('2025-06-16', 23, 13, 3.0),
       ('2025-06-17', 21, 12, 0.5);

UPDATE Weather
SET NightTemperature = NightTemperature + 1
WHERE WindSpeed <= 3;

CREATE VIEW Weather_Summary_View AS
SELECT
    Id,
    WeatherDate,
    DayTemperature,
    NightTemperature,
    WindSpeed,
    (DayTemperature + NightTemperature) / 2.0 AS AvgDailyTemperature,
    CASE
        WHEN WindSpeed < 2 THEN 'штиль'
        WHEN WindSpeed >= 2 AND WindSpeed < 5 THEN 'умеренный ветер'
        ELSE 'сильный ветер'
    END AS WindCategory
FROM Weather;
5

Ответы на контрольные вопросы

  • Зачем нужны ограничения? Чтобы защитить качество данных: уникальность, запрет NULL, проверка диапазонов.
  • Чем PRIMARY KEY отличается от UNIQUE? PRIMARY KEY одновременно уникален и не может быть NULL; в таблице только один PK.
  • Что произойдёт без WHERE в UPDATE? Изменятся все строки таблицы.
  • Что такое View? Виртуальная таблица на основе сохранённого SELECT; данные не хранит, а запрашивает при каждом обращении.
  • Источники данных: формы, API, импорт файлов, копирование из других баз.