You are on page 1of 9

Горбань Ю. В.

КІ-18
Лабораторна робота № 5.
Тема: Складання запитів до бази даних. Складні та вкладені запити.
Мета: Закріплення практичних навичок по роботі з таблицями БД та
формуванню запитів.

Хід виконання.
1. У власній БД створити схему lab5
2. Додати до схеми (створити) та заповнити наступні таблиці:

provider
id_ prov name_prov statu city_ prov
s
P1 Сміт 20 Кривий Ріг
P2 Джонес 10 Київ
P3 Блек 30 Київ
P4 Кларк 20 Кривий Ріг
P5 Адамс 30 Одеса
wine
id_win name_wine color aging city_wine
e
W1 Ай – Серез Червон 2 Кривий Ріг
е
W2 Піно – Грі Рожеве 4 Київ
W3 Мускат Біле 4 Львів
W4 Мускат Червон 3 Кривий Ріг
е
W5 Херес Біле 2 Київ
W6 Бастардо червоне 5 Кривий Ріг
restaurant
id_ name_ rest city_ rest
rest
R1 Метрополь Київ
Горбань Ю. В. КІ-18

R2 Рудана Львів
R3 Єва Одеса
R4 Бурштин Одеса
R5 Ліра Кривий Ріг
R6 Киянка Ялта
R7 Чорний кіт Кривий Ріг
supply
id id_ prov id_wine id_ amount
rest
01 P1 W1 R1 200
02 P1 W1 R4 700
03 P2 W3 R1 400
04 P2 W3 R2 200
05 P2 W3 R3 200
06 P2 W3 R4 500
07 P2 W3 R5 600
08 P2 W3 R6 400
09 P2 W3 R7 800
10 P2 W5 R2 100
11 P3 W3 R1 200
12 P3 W4 R2 500
13 P4 W6 R3 300
14 P4 W6 R7 300
15 P5 W2 R2 200
16 P5 W2 R4 100
17 P5 W5 R5 500
18 P5 W5 R7 100
Горбань Ю. В. КІ-18
19 P5 W6 R2 200
20 P5 W1 R4 100
21 P5 W3 R4 200
22 P5 W4 R4 800
23 P5 W5 R4 400
24 P5 W6 R4 500

3. Зробити зв’язки між таблицями

Створення таблиць:

CREATE TABLE lab5.provider


(
id_prov char(2),
name_prov char(6),
status int,
city_prov char(10),
primary key(id_prov)
);

CREATE TABLE lab5.wine


(
id_wine char(2),
name_wine text,
color text,
aging int,
city_wine text,
primary key(id_wine)
);
Горбань Ю. В. КІ-18

CREATE TABLE lab5.restaurant


(
id_rest char(2),
name_rest text,
city_rest text,
primary key(id_rest)
);

CREATE TABLE lab5.supply


(
id serial,
id_prov char(2),
id_wine char(2),
id_rest char(2),
amount int,
primary key(id),
constraint fkey_id_prov
foreign key(id_prov) references lab5.provider(id_prov)
on delete cascade
on update cascade,
constraint fkey_id_wine
foreign key(id_wine) references lab5.wine(id_wine)
on delete cascade
on update cascade,
constraint fkey_id_rest
foreign key(id_rest) references lab5.restaurant(id_rest)
on delete cascade
on update cascade
Горбань Ю. В. КІ-18
);

Заповнення таблиць:

INSERT INTO lab5.provider(


id_prov, name_prov, status, city_prov)
VALUES
('P1', 'Сміт', 20, 'Кривий Ріг'),
('P2', 'Джонес', 10, 'Київ'),
('P3', 'Блек', 30, 'Київ'),
('P4', 'Кларк', 20, 'Кривий Ріг'),
('P5', 'Адамс', 30, 'Одеса');

INSERT INTO lab5.wine(


id_wine, name_wine, color, aging, city_wine)
VALUES
('W1', 'Ай–Серез', 'Червоне', 2, 'Кривий Ріг'),
('W2', 'Піно–Грі', 'Рожеве', 4, 'Київ'),
('W3', 'Мускат', 'Біле', 4, 'Львів'),
('W4', 'Мускат', 'Червоне', 3, 'Кривий Ріг'),
('W5', 'Херес', 'Біле', 2, 'Київ'),
('W6', 'Бастардо', 'Червоне', 5, 'Кривий Ріг');

INSERT INTO lab5.supply(


id_prov, id_wine, id_rest, amount)
VALUES
('P1', 'W1', 'R1', 200),
('P1', 'W1', 'R4', 700),
('P2', 'W3', 'R1', 400),
Горбань Ю. В. КІ-18
('P2', 'W3', 'R2', 200),
('P2', 'W3', 'R3', 200),
('P2', 'W3', 'R4', 500),
('P2', 'W3', 'R5', 600),
('P2', 'W3', 'R6', 400),
('P2', 'W3', 'R7', 800),
('P2', 'W5', 'R2', 100),
('P3', 'W3', 'R1', 200),
('P3', 'W4', 'R2', 500),
('P4', 'W6', 'R3', 300),
('P4', 'W6', 'R7', 300),
('P5', 'W2', 'R2', 200),
('P5', 'W2', 'R4', 100),
('P5', 'W5', 'R5', 500),
('P5', 'W5', 'R7', 100),
('P5', 'W6', 'R2', 200),
('P5', 'W1', 'R4', 100),
('P5', 'W3', 'R4', 200),
('P5', 'W4', 'R4', 800),
('P5', 'W5', 'R4', 400),
('P5', 'W6', 'R4', 500);

INSERT INTO lab5.restaurant(


id_rest, name_rest, city_rest)
VALUES
('R1', 'Метрополь', 'Київ'),
('R2', 'Рудана', 'Львів'),
('R3', 'Єва', 'Одеса'),
('R4', 'Бурштин', 'Одеса'),
Горбань Ю. В. КІ-18
('R5', 'Ліра', 'Кривий Ріг'),
('R6', 'Киянка', 'Ялта'),
('R7', 'Чорний кіт', 'Кривий Ріг');

4. Обрати та виконати  9 запитів (номер варіанту +4*i, де і=0,1…8)

1. Отримати номери постачальників, які постачають вино W2.

SELECT DISTINCT id_prov


FROM lab5.supply
WHERE id_wine = 'W2'

5. Отримати всі пари номерів постачальників, розташованих в одному


місті.

SELECT city_prov, ARRAY_AGG (id_prov)


FROM lab5.provider
GROUP BY city_prov

9. Отримати всі такі трійки “номер постачальника – номер вина – номер


ресторану”, для яких постачальники, вина і ресторани розташовані у
різних містах.

WITH cte AS(


SELECT prov.id_prov, wine.id_wine, rest.id_rest
FROM lab5.provider prov, lab5.wine wine, lab5.restaurant rest
WHERE (prov.city_prov <> rest.city_rest)
AND (prov.city_prov <> wine.city_wine)
AND (rest.city_rest <> wine.city_wine)
)
SELECT id_prov, id_wine, id_rest
FROM lab5.supply
JOIN cte
USING (id_prov, id_wine, id_rest)

13.Отримати номери вин, що постачаються для усіх ресторанів


постачальником із того ж міста, де розміщується ресторан.

SELECT id_wine
FROM lab5.supply
Горбань Ю. В. КІ-18
WHERE id_rest IN(
SELECT id_rest
FROM lab5.restaurant
WHERE city_rest IN(
SELECT city_prov
FROM lab5.provider
)
)
GROUP BY id_wine

17. Отримати загальну кількість вина W1, що постачається


постачальником P1.

SELECT SUM(amount)
FROM lab5.supply
WHERE id_wine = 'W1' AND id_prov = 'P1'

21.Отримати номери вин, що постачаються для будь-якого криворізького


ресторану.

SELECT DISTINCT id_wine


FROM lab5.supply
WHERE id_rest IN (
SELECT id_rest
FROM lab5.restaurant
WHERE city_rest = 'Кривий Ріг')

25.Отримати номери ресторанів, місто яких стоїть першим в алфавітному


спискові міст.

SELECT id_rest, city_rest


FROM lab5.restaurant
ORDER BY city_rest

29.Отримати назви ресторанів, які повністю забезпечуються


постачальником P1.

SELECT name_rest
FROM lab5.restaurant
WHERE id_rest IN (
SELECT id_rest
FROM lab5.supply
WHERE id_rest IN(
SELECT id_rest
FROM (
Горбань Ю. В. КІ-18
SELECT id_prov, id_rest
FROM lab5.supply
GROUP BY id_prov, id_rest
ORDER BY id_rest
) prov_rest
GROUP BY id_rest
HAVING COUNT(id_rest) = 1
ORDER BY id_rest
)
AND id_prov = 'P1'
)

33. Отримати всі міста, в яких розташовані хоча б один постачальник,


одне вино чи один ресторан.

SELECT city_prov FROM lab5.provider


UNION
SELECT city_rest FROM lab5.restaurant
UNION
SELECT city_wine FROM lab5.wine

Висновок: в ході лабораторної роботи було отримано навички складання


складних та вкладених запитів до бази даних. Закріплено практичні навички
по роботі з таблицями БД та формуванню запитів.

You might also like