Запросы на реляционной алгебре
(обозначаю промежуточные множества буквами, чтобы запись умещалась)
1)
В =
А=
С=
()
2)
А=
В=
3)
A=
B=
4)
А=
В=
С=
D=
5)
А=
В=
С=
θ={ }
θ – условие, накладываемое на выбор элементов
6)
θ={ }
A=
Создание базы данных
1)
Create table town (id int not null auto_increment, name text, primary key(id));
2)
Create table postavshik (id int not null auto_increment, name text, town_id int, primary key(id), foreign key (town_id) references town(id));
3)
Create table project (id int not null auto_increment, name text, town_id int, primary key(id), foreign key (town_id) references town(id));
4)
Create table detail (id int not null auto_increment, name text, primary key(id));
5)
Create table postavka (id int not null auto_increment, id_post int,date_p date, primary key(id), foreign key (id_post) references postavshik(id));
6)
Create table detail_postavka (id int not null auto_increment, id_postavka int, id_detail int, number int, primary key(id),foreign key (id_postavka) references postavka(id), foreign key (id_detail) references detail(id));
7)
Create table detail_project (id int not null auto_increment, id_project int,id_detail int, number int, primary key(id),foreign key (id_project) references project(id),foreign key (id_detail) references detail(id));
Запросы на языке SQL
1) получить все номера деталей, поставляемых поставщиком из заданного города;
Надо задать название города.
SELECT name FROM detail WHERE detail.id in
(SELECT id_detail FROM detail_postavka WHERE detail_postavka.id_postavka in
(SELECT postavka.id FROM postavka INNER JOIN postavshik ON postavka.id_post=postavshik.id AND postavshik.town_id in
(SELECT id FROM town WHERE town.name=”название города”)));
2) получить номера деталей, поставляемых для всех проектов, обеспечиваемых поставщиком из того же города, где размещен проект;
SELECT name FROM detail WHERE detail.id in
(SELECT id_detail FROM detail_project WHERE detail_project.id_project in
(SELECT project.id FROM project INNER JOIN postavshik ON postavshik.town_id=project.town_id));
3) получить список всех поставщиков, поставляющих одну и ту же деталь для всех проектов;
Надо указать название детали.
SELECT name FROM postavshik WHERE postavshik.id in
(SELECT postavka.id_post from postavka INNER JOIN detail_postavka ON postavka.id=detail_postavka.id_postavka AND detail_postavka.id_detail in
|
(SELECT id FROM detail WHERE detail.name=”название детали”));
4) получить список проектов, использующих по крайней мере одну деталь, производимую заданным поставщиком;
SELECT name FROM project WHERE project.id in
(SELECT id_project FROM detail_project WHERE detail_project.id_detail in
(SELECT id_detail FROM detail_postavka WHERE detail_postavka.id_postavka in
(SELECT id FROM postavka WHERE postavka.id_post in
(SELECT id FROM postavshik WHERE postavshik.name=”заданный поставщик”))));
5) получить список троек (номер детали, количество, поставщик), аналогичных деталям, поставляемым заданным поставщиком;
SELECT postavshik.name, detail.name, detail_postavka.number FROM postavshik, detail,detail_postavka,postavka WHERE postavshik.id= postavka.id_post AND detail.id=detail_postavka.id_detail AND detail_postavka.id_postavka=postavka.id AND detail_postavka.id_detail in
(SELECT id_detail FROM detail_postavka WHERE detail_postavka.id_postavka in
(select id from postavka where postavka.id_post in
(select id from postavshik where postavshik.name=”заданное название”)));
получить список проектов, которые обеспечиваются деталями от одного поставщика.
SELECT project.name,count(postavshik.id) FROM project,postavshik,detail_project,detail_postavka,postavka WHERE
project.id=detail_project.id_project AND detail_project.id_detail=detail_postavka.id_detail AND detail_project.number=detail_postavka.number AND detail_postavka.id_postavka=postavka.id AND postavka.id_post =postavshik.id
GROUP BY project.name HAVING count(postavshik.id)=1;