Загрузка данных
-- Создание таблицы товаров
CREATE TABLE "products" (
"id" INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
"name" VARCHAR(255) NOT NULL,
"price" DECIMAL(10, 2) NOT NULL,
"category" VARCHAR(100),
"stock" INT DEFAULT 0
);
-- Создание таблицы клиентов
CREATE TABLE "customers" (
"id" INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
"name" VARCHAR(255) NOT NULL,
"email" VARCHAR(255),
"city" VARCHAR(100)
);
-- Создание таблицы заказов
CREATE TABLE "orders" (
"id" INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
"customer_id" INT,
"product_id" INT,
"quantity" INT,
"order_date" DATE,
FOREIGN KEY ("customer_id") REFERENCES "customers"("id"),
FOREIGN KEY ("product_id") REFERENCES "products"("id")
);
-- Заполнение таблицы товаров (id создается автоматически)
INSERT INTO "products" ("name", "price", "category", "stock") VALUES ('Смартфон Apple iPhone 13', 65000.00, 'Электроника', 10);
INSERT INTO "products" ("name", "price", "category", "stock") VALUES ('Смартфон Xiaomi Redmi Note 12', 15000.00, 'Электроника', 0); -- нет в наличии
INSERT INTO "products" ("name", "price", "category", "stock") VALUES ('Наушники беспроводные', 1200.00, 'Электроника', 15);
INSERT INTO "products" ("name", "price", "category", "stock") VALUES ('Чехол для телефона', 450.00, 'Аксессуары', 50);
INSERT INTO "products" ("name", "price", "category", "stock") VALUES ('Книга по SQL', 800.00, 'Книги', 5);
INSERT INTO "products" ("name", "price", "category", "stock") VALUES ('Кофеварка капельная', 2500.00, 'Бытовая техника', 3);
-- Заполнение таблицы клиентов
INSERT INTO "customers" ("name", "email", "city") VALUES ('Иванов Иван', 'ivanov@gmail.com', 'Москва');
INSERT INTO "customers" ("name", "email", "city") VALUES ('Петрова Анна', 'petrova@yandex.ru', 'Санкт-Петербург');
INSERT INTO "customers" ("name", "email", "city") VALUES ('Сидоров Петр', 'sidorov@mail.ru', 'Новосибирск');
INSERT INTO "customers" ("name", "email", "city") VALUES ('Кузнецова Елена', 'kuznetsova@gmail.com', 'Москва');
-- Заполнение таблицы заказов (обратите внимание на формат дат YYYY-MM-DD)
-- Предполагаем, что id товаров и клиентов начинаются с 0 или 1 (Base присвоит их по порядку)
INSERT INTO "orders" ("customer_id", "product_id", "quantity", "order_date") VALUES (0, 0, 1, '2023-05-15');
INSERT INTO "orders" ("customer_id", "product_id", "quantity", "order_date") VALUES (1, 2, 2, '2022-11-20'); -- старый заказ (до 2023)
INSERT INTO "orders" ("customer_id", "product_id", "quantity", "order_date") VALUES (2, 4, 1, '2023-01-10');
INSERT INTO "orders" ("customer_id", "product_id", "quantity", "order_date") VALUES (3, 5, 1, '2023-08-01');
Для LibreOffice Base (который использует встроенную СУБД **HSQLDB** по умолчанию) синтаксис SQL немного отличается. Главные особенности:
1. Имена таблиц и полей в запросах Base часто требуют заключения в **двойные кавычки ""**, чтобы избежать ошибок, а текстовые значения — в **одинарные ''**.
2. В HSQLDB вместо привычного LIMIT используется конструкция LIMIT X в конце запроса или SELECT TOP X (в зависимости от версии, но LIMIT в Base работает стабильно).
3. Операции с датами требуют строгого формата YYYY-MM-DD.
Ниже представлены скорректированные запросы для LibreOffice Base.
### 1. Вывести все товары дороже 1000 рублей.
```sql
SELECT * FROM "products"
WHERE "price" > 1000;
```
### 2. Вывести товары из категории "Электроника" в наличии (stock > 0).
```sql
SELECT * FROM "products"
WHERE "category" = 'Электроника' AND "stock" > 0;
```
### 3. Вывести заказы, сделанные после 1 января 2023 года.
```sql
SELECT * FROM "orders"
WHERE "order_date" > '2023-01-01';
```
### 4. Вывести клиентов из Москвы или Санкт-Петербурга.
```sql
SELECT * FROM "customers"
WHERE "city" IN ('Москва', 'Санкт-Петербург');
```
### 5. Вывести топ-5 самых дорогих товаров.
```sql
SELECT * FROM "products"
ORDER BY "price" DESC
LIMIT 5;
```
### 6. Вывести все заказы, отсортированные по дате (новые сначала).
```sql
SELECT * FROM "orders"
ORDER BY "order_date" DESC;
```
### 7. Вывести товары, в названии которых есть слово "Смартфон".
> **Важно:** В LibreOffice Base оператор LIKE чувствителен к регистру. Чтобы поиск работал независимо от того, написано слово с большой или маленькой буквы, лучше использовать функцию LOWER().
>
```sql
SELECT * FROM "products"
WHERE LOWER("name") LIKE '%смартфон%';
```
### 8. Вывести клиентов, у которых email заканчивается на @gmail.com.
```sql
SELECT * FROM "customers"
WHERE "email" LIKE '%@gmail.com';
```
### 9. Вывести товары с ценой от 500 до 2000 рублей, отсортированные по категории.
```sql
SELECT * FROM "products"
WHERE "price" BETWEEN 500 AND 2000
ORDER BY "category";
```
### 10. Вывести количество товаров в каждой категории (используйте GROUP BY).
```sql
SELECT "category", COUNT(*) AS "product_count"
FROM "products"
GROUP BY "category";
```