{"id":21530709,"url":"https://github.com/seigtm/db-spbpu-control-work","last_synced_at":"2025-10-05T12:31:07.687Z","repository":{"id":264065206,"uuid":"879196905","full_name":"seigtm/db-spbpu-control-work","owner":"seigtm","description":"Control work for \"Databases\" course at Saint Petersburg Polytechnic University, featuring solutions in relational algebra, relational calculus, and SQL queries.","archived":false,"fork":false,"pushed_at":"2024-11-21T19:40:37.000Z","size":20,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-11-21T20:27:14.066Z","etag":null,"topics":["database","databases","polytech","polytech-university","postgres","postgresql","psql","relational-algebra","relational-calculus","spbpu","spbstu","sql"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/seigtm.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-10-27T09:10:58.000Z","updated_at":"2024-11-21T19:40:41.000Z","dependencies_parsed_at":"2024-11-21T20:38:16.783Z","dependency_job_id":null,"html_url":"https://github.com/seigtm/db-spbpu-control-work","commit_stats":null,"previous_names":["seigtm/db-spbpu-control-work"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seigtm%2Fdb-spbpu-control-work","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seigtm%2Fdb-spbpu-control-work/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seigtm%2Fdb-spbpu-control-work/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seigtm%2Fdb-spbpu-control-work/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/seigtm","download_url":"https://codeload.github.com/seigtm/db-spbpu-control-work/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":235395111,"owners_count":18983091,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["database","databases","polytech","polytech-university","postgres","postgresql","psql","relational-algebra","relational-calculus","spbpu","spbstu","sql"],"created_at":"2024-11-24T02:09:50.431Z","updated_at":"2025-10-05T12:31:02.395Z","avatar_url":"https://github.com/seigtm.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!-- markdownlint-disable MD024 MD040 --\u003e\n\n\u003c!-- omit in toc --\u003e\n# Базы данных, контрольная работа №1\n\n\u003c!-- omit in toc --\u003e\n## Оглавление\n\n- [Описание базы данных](#описание-базы-данных)\n  - [Отношение `S` - поставщики](#отношение-s---поставщики)\n  - [Отношение `P` - детали](#отношение-p---детали)\n  - [Отношение `J` - проекты](#отношение-j---проекты)\n  - [Отношение `SPJ` - поставки деталей поставщиками в рамках какого-либо проекта](#отношение-spj---поставки-деталей-поставщиками-в-рамках-какого-либо-проекта)\n- [Задание](#задание)\n- [Оффтоп: создание и заполнение таблиц для задания](#оффтоп-создание-и-заполнение-таблиц-для-задания)\n  - [1. Создание необходимых SQL таблиц](#1-создание-необходимых-sql-таблиц)\n  - [2. Заполнение таблиц данными](#2-заполнение-таблиц-данными)\n- [Варианты](#варианты)\n  - [7.13. Получить полные сведения обо всех проектах](#713-получить-полные-сведения-обо-всех-проектах)\n    - [Реляционная алгебра](#реляционная-алгебра)\n    - [Реляционное исчисление](#реляционное-исчисление)\n    - [SQL](#sql)\n  - [7.14. Получить полные сведения обо всех проектах в Лондоне](#714-получить-полные-сведения-обо-всех-проектах-в-лондоне)\n    - [Реляционная алгебра](#реляционная-алгебра-1)\n    - [Реляционное исчисление](#реляционное-исчисление-1)\n    - [SQL](#sql-1)\n  - [7.15. Определить номера поставщиков деталей для проекта с номером J1](#715-определить-номера-поставщиков-деталей-для-проекта-с-номером-j1)\n    - [Реляционная алгебра](#реляционная-алгебра-2)\n    - [Реляционное исчисление](#реляционное-исчисление-2)\n    - [SQL](#sql-2)\n  - [7.16. Определить все поставки, в которых количество деталей находится в диапазоне от 300 до 750 штук включительно](#716-определить-все-поставки-в-которых-количество-деталей-находится-в-диапазоне-от-300-до-750-штук-включительно)\n    - [Реляционная алгебра](#реляционная-алгебра-3)\n    - [Реляционное исчисление](#реляционное-исчисление-3)\n    - [SQL](#sql-3)\n  - [7.17. Найти все существующие сочетания вида \"цвета детали - город, из которого поставляются детали\"](#717-найти-все-существующие-сочетания-вида-цвета-детали---город-из-которого-поставляются-детали)\n    - [Реляционная алгебра](#реляционная-алгебра-4)\n    - [Реляционное исчисление](#реляционное-исчисление-4)\n    - [SQL](#sql-4)\n  - [7.18. Найти все такие тройки значений \"номер поставщика – номер детали – номер проекта\", для которых указанные поставщик, деталь и проект находятся в одном городе](#718-найти-все-такие-тройки-значений-номер-поставщика--номер-детали--номер-проекта-для-которых-указанные-поставщик-деталь-и-проект-находятся-в-одном-городе)\n    - [Реляционная алгебра](#реляционная-алгебра-5)\n    - [Реляционное исчисление](#реляционное-исчисление-5)\n    - [SQL](#sql-5)\n  - [7.19. Найти все такие тройки значений \"номер поставщика – номер детали – номер проекта\", для которых указанные поставщик, деталь и проект не находятся в одном городе](#719-найти-все-такие-тройки-значений-номер-поставщика--номер-детали--номер-проекта-для-которых-указанные-поставщик-деталь-и-проект-не-находятся-в-одном-городе)\n    - [Реляционная алгебра](#реляционная-алгебра-6)\n    - [Реляционное исчисление](#реляционное-исчисление-6)\n    - [SQL](#sql-6)\n  - [7.20. Найти все такие тройки значений \"номер поставщика – номер детали – номер проекта\", для которых никакие из двух поставщиков, деталей и проектов не находятся в одном городе](#720-найти-все-такие-тройки-значений-номер-поставщика--номер-детали--номер-проекта-для-которых-никакие-из-двух-поставщиков-деталей-и-проектов-не-находятся-в-одном-городе)\n    - [Реляционная алгебра](#реляционная-алгебра-7)\n    - [Реляционное исчисление](#реляционное-исчисление-7)\n    - [SQL](#sql-7)\n  - [7.21. Получить полные сведения о деталях, поставляемых поставщиком из Лондона](#721-получить-полные-сведения-о-деталях-поставляемых-поставщиком-из-лондона)\n    - [Реляционная алгебра](#реляционная-алгебра-8)\n    - [Реляционное исчисление](#реляционное-исчисление-8)\n    - [SQL](#sql-8)\n  - [7.22. Определить номера деталей, поставляемых поставщиком из Лондона для проекта в Лондоне](#722-определить-номера-деталей-поставляемых-поставщиком-из-лондона-для-проекта-в-лондоне)\n    - [Реляционная алгебра](#реляционная-алгебра-9)\n    - [Реляционное исчисление](#реляционное-исчисление-9)\n    - [SQL](#sql-9)\n  - [7.23. Найти все пары названий городов, для которых поставщик из первого города обеспечивает проект во втором городе](#723-найти-все-пары-названий-городов-для-которых-поставщик-из-первого-города-обеспечивает-проект-во-втором-городе)\n    - [Реляционная алгебра](#реляционная-алгебра-10)\n    - [Реляционное исчисление](#реляционное-исчисление-10)\n    - [SQL](#sql-10)\n  - [7.24. Определить номера деталей, поставляемых для всех проектов, поставляемых поставщиком из того же города, в котором разрабатывается проект](#724-определить-номера-деталей-поставляемых-для-всех-проектов-поставляемых-поставщиком-из-того-же-города-в-котором-разрабатывается-проект)\n    - [Реляционная алгебра](#реляционная-алгебра-11)\n    - [Реляционное исчисление](#реляционное-исчисление-11)\n    - [SQL](#sql-11)\n  - [7.25. Найти все номера проектов, детали для которых поставляются по крайней мере одним поставщиком из другого города](#725-найти-все-номера-проектов-детали-для-которых-поставляются-по-крайней-мере-одним-поставщиком-из-другого-города)\n    - [Реляционная алгебра](#реляционная-алгебра-12)\n    - [Реляционное исчисление](#реляционное-исчисление-12)\n    - [SQL](#sql-12)\n  - [7.26. Определить все пары номеров деталей, в которых обе детали поставляются  одним и тем же поставщиком](#726-определить-все-пары-номеров-деталей-в-которых-обе-детали-поставляются--одним-и-тем-же-поставщиком)\n    - [Реляционная алгебра](#реляционная-алгебра-13)\n    - [Реляционное исчисление](#реляционное-исчисление-13)\n    - [SQL](#sql-13)\n  - [7.27. Определить общее число проектов, детали для которых поставляются поставщиком с номером S1](#727-определить-общее-число-проектов-детали-для-которых-поставляются-поставщиком-с-номером-s1)\n    - [Реляционная алгебра](#реляционная-алгебра-14)\n    - [Реляционное исчисление](#реляционное-исчисление-14)\n    - [SQL](#sql-14)\n  - [7.28. Определить общее количество деталей с номером P1, поставляемых поставщиком с номером S1](#728-определить-общее-количество-деталей-с-номером-p1-поставляемых-поставщиком-с-номером-s1)\n    - [Реляционная алгебра](#реляционная-алгебра-15)\n    - [Реляционное исчисление](#реляционное-исчисление-15)\n    - [SQL](#sql-15)\n  - [7.29. Для каждой детали, поставляемой для проекта, определить номер детали, номер проекта и соответствующее общее количество](#729-для-каждой-детали-поставляемой-для-проекта-определить-номер-детали-номер-проекта-и-соответствующее-общее-количество)\n    - [Реляционная алгебра](#реляционная-алгебра-16)\n    - [Реляционное исчисление](#реляционное-исчисление-16)\n    - [SQL](#sql-16)\n  - [7.30. Определить номера деталей, поставляемых для некоторого проекта, со средним количеством, составляющим больше 350 штук](#730-определить-номера-деталей-поставляемых-для-некоторого-проекта-со-средним-количеством-составляющим-больше-350-штук)\n    - [Реляционная алгебра](#реляционная-алгебра-17)\n    - [Реляционное исчисление](#реляционное-исчисление-17)\n    - [SQL](#sql-17)\n  - [7.31. Определить названия проектов, детали для которых поставляются поставщиком с номером S1](#731-определить-названия-проектов-детали-для-которых-поставляются-поставщиком-с-номером-s1)\n    - [Реляционная алгебра](#реляционная-алгебра-18)\n    - [Реляционное исчисление](#реляционное-исчисление-18)\n    - [SQL](#sql-18)\n  - [7.32. Определить цвета деталей, поставляемых поставщиком с номером S1](#732-определить-цвета-деталей-поставляемых-поставщиком-с-номером-s1)\n    - [Реляционная алгебра](#реляционная-алгебра-19)\n    - [Реляционное исчисление](#реляционное-исчисление-19)\n    - [SQL](#sql-19)\n  - [7.33. Установить номера деталей, поставляемых для любого проекта, разрабатываемого в Лондоне](#733-установить-номера-деталей-поставляемых-для-любого-проекта-разрабатываемого-в-лондоне)\n    - [Реляционная алгебра](#реляционная-алгебра-20)\n    - [Реляционное исчисление](#реляционное-исчисление-20)\n    - [SQL](#sql-20)\n  - [7.34. Определить номера проектов, в которых используется по крайней мере одна деталь, имеющуюся у поставщика с номером S1](#734-определить-номера-проектов-в-которых-используется-по-крайней-мере-одна-деталь-имеющуюся-у-поставщика-с-номером-s1)\n    - [Реляционная алгебра](#реляционная-алгебра-21)\n    - [Реляционное исчисление](#реляционное-исчисление-21)\n    - [SQL](#sql-21)\n  - [7.35. Определить номера поставщиков по крайней мере одной детали, поставляемой по крайней мере одним поставщиком, который поставляет хотя бы одну деталь красного цвета](#735-определить-номера-поставщиков-по-крайней-мере-одной-детали-поставляемой-по-крайней-мере-одним-поставщиком-который-поставляет-хотя-бы-одну-деталь-красного-цвета)\n    - [Реляционная алгебра](#реляционная-алгебра-22)\n    - [Реляционное исчисление](#реляционное-исчисление-22)\n    - [SQL](#sql-22)\n  - [7.36. Определить номера поставщиков со статусом, меньшим, чем у поставщика с номером S1](#736-определить-номера-поставщиков-со-статусом-меньшим-чем-у-поставщика-с-номером-s1)\n    - [Реляционная алгебра](#реляционная-алгебра-23)\n    - [Реляционное исчисление](#реляционное-исчисление-23)\n    - [SQL](#sql-23)\n  - [7.37. Определить номера проектов, разрабатываемых в городе, который находится на первом месте в алфавитном списке таких городов](#737-определить-номера-проектов-разрабатываемых-в-городе-который-находится-на-первом-месте-в-алфавитном-списке-таких-городов)\n    - [Реляционная алгебра](#реляционная-алгебра-24)\n    - [Реляционное исчисление](#реляционное-исчисление-24)\n    - [SQL](#sql-24)\n  - [7.38. Определить номера проектов, для которых среднее количество поставляемых деталей с номером P1 больше, чем наибольшее количество любых деталей, поставляемых для проекта с номером J1](#738-определить-номера-проектов-для-которых-среднее-количество-поставляемых-деталей-с-номером-p1-больше-чем-наибольшее-количество-любых-деталей-поставляемых-для-проекта-с-номером-j1)\n    - [Реляционная алгебра](#реляционная-алгебра-25)\n    - [Реляционное исчисление](#реляционное-исчисление-25)\n    - [SQL](#sql-25)\n  - [7.39. Определить номера поставщиков детали с номером Р1 для некоторого проекта в количестве, большем среднего количества деталей с номером Р1, поставляемых для этого проекта](#739-определить-номера-поставщиков-детали-с-номером-р1-для-некоторого-проекта-в-количестве-большем-среднего-количества-деталей-с-номером-р1-поставляемых-для-этого-проекта)\n    - [Реляционная алгебра](#реляционная-алгебра-26)\n    - [Реляционное исчисление](#реляционное-исчисление-26)\n    - [SQL](#sql-26)\n  - [7.40. Найти номера проектов, для которых поставщиками из Лондона не поставляется ни одна деталь красного цвета](#740-найти-номера-проектов-для-которых-поставщиками-из-лондона-не-поставляется-ни-одна-деталь-красного-цвета)\n    - [Реляционная алгебра](#реляционная-алгебра-27)\n    - [Реляционное исчисление](#реляционное-исчисление-27)\n    - [SQL](#sql-27)\n  - [7.41. Определить номера проектов, детали для которых полностью поставляются поставщиком с номером S1](#741-определить-номера-проектов-детали-для-которых-полностью-поставляются-поставщиком-с-номером-s1)\n    - [Реляционная алгебра](#реляционная-алгебра-28)\n    - [Реляционное исчисление](#реляционное-исчисление-28)\n    - [SQL](#sql-28)\n  - [7.42 Определить номера деталей, поставляемых для лондонских проектов](#742-определить-номера-деталей-поставляемых-для-лондонских-проектов)\n    - [Реляционная алгебра](#реляционная-алгебра-29)\n    - [Реляционное исчисление](#реляционное-исчисление-29)\n    - [SQL](#sql-29)\n  - [7.43. Установить номера поставщиков одной и той же детали для всех проектов (_SPJ не пустое отношение_)](#743-установить-номера-поставщиков-одной-и-той-же-детали-для-всех-проектов-spj-не-пустое-отношение)\n    - [Реляционная алгебра](#реляционная-алгебра-30)\n    - [Реляционное исчисление](#реляционное-исчисление-30)\n    - [SQL](#sql-30)\n  - [7.44. Определить номера проектов, в состав которых входят, по меньшей мере, все типы деталей, поставляемых поставщиком с номером S1](#744-определить-номера-проектов-в-состав-которых-входят-по-меньшей-мере-все-типы-деталей-поставляемых-поставщиком-с-номером-s1)\n    - [Реляционная алгебра](#реляционная-алгебра-31)\n    - [Реляционное исчисление](#реляционное-исчисление-31)\n    - [SQL](#sql-31)\n  - [7.45. Установить все города, в которых находится по крайней мере один поставщик, одна деталь или один проект](#745-установить-все-города-в-которых-находится-по-крайней-мере-один-поставщик-одна-деталь-или-один-проект)\n    - [Реляционная алгебра](#реляционная-алгебра-32)\n    - [Реляционное исчисление](#реляционное-исчисление-32)\n    - [SQL](#sql-32)\n  - [7.46. Определить номера деталей, поставляемых либо лондонским поставщиком, либо для лондонского проекта](#746-определить-номера-деталей-поставляемых-либо-лондонским-поставщиком-либо-для-лондонского-проекта)\n    - [Реляционная алгебра](#реляционная-алгебра-33)\n    - [Реляционное исчисление](#реляционное-исчисление-33)\n    - [SQL](#sql-33)\n  - [7.47. Найти все пары \"номер поставщика – номер детали\", причем только такие, в которых данный поставщик не поставляет данную деталь](#747-найти-все-пары-номер-поставщика--номер-детали-причем-только-такие-в-которых-данный-поставщик-не-поставляет-данную-деталь)\n    - [Реляционная алгебра](#реляционная-алгебра-34)\n    - [Реляционное исчисление](#реляционное-исчисление-34)\n    - [Из книги : только такие пары, в которых данный поставщик не поставляет данную деталь](#из-книги--только-такие-пары-в-которых-данный-поставщик-не-поставляет-данную-деталь)\n  - [7.48. **TODO** Определить все пары номеров поставщиков (скажем, Sx и Sy), причем такие, что оба эти поставщика поставляют в точности одно и то же множество деталей](#748-todo-определить-все-пары-номеров-поставщиков-скажем-sx-и-sy-причем-такие-что-оба-эти-поставщика-поставляют-в-точности-одно-и-то-же-множество-деталей)\n  - [7.49. **TODO** Подготовить в виде бинарного отношения \"сгруппированную\" версию всех поставок, в которой для каждой пары \"номер поставщика - номер детали\" показан соответствующий номер проекта и количество поставленных деталей](#749-todo-подготовить-в-виде-бинарного-отношения-сгруппированную-версию-всех-поставок-в-которой-для-каждой-пары-номер-поставщика---номер-детали-показан-соответствующий-номер-проекта-и-количество-поставленных-деталей)\n  - [7.50. **TODO** Получить \"разгруппированную\" версию отношения, полученного в результате выполнения упражнения 7.49](#750-todo-получить-разгруппированную-версию-отношения-полученного-в-результате-выполнения-упражнения-749)\n- [Листинг](#листинг)\n  - [SQL скрипт инициализации базы данных для задания, `init.sql`](#sql-скрипт-инициализации-базы-данных-для-задания-initsql)\n  - [SQL скрипт со всеми вариантами запросов](#sql-скрипт-со-всеми-вариантами-запросов)\n\n## Описание базы данных\n\n- Отношение `S` - поставщики.\n- Отношение `P` - детали.\n- Отношение `J` - проекты.\n- Отношение `SPJ` - поставки деталей поставщиками в рамках какого-либо проекта.\n\n### Отношение `S` - поставщики\n\n| S#  | SNAME | STATUS | CITY   |\n| --- | ----- | ------ | ------ |\n| S1  | Smith | 20     | London |\n| S2  | Jones | 10     | Paris  |\n| S3  | Blake | 30     | Paris  |\n| S4  | Clark | 20     | London |\n| S5  | Adams | 30     | Athens |\n\n### Отношение `P` - детали\n\n| P#  | PNAME | COLOR | WEIGHT | CITY   |\n| --- | ----- | ----- | ------ | ------ |\n| P1  | Nut   | Red   | 12.0   | London |\n| P2  | Bolt  | Green | 17.0   | Paris  |\n| P3  | Screw | Blue  | 17.0   | Oslo   |\n| P4  | Screw | Red   | 14.0   | London |\n| P5  | Cam   | Blue  | 12.0   | Paris  |\n| P6  | Cog   | Red   | 19.0   | London |\n\n### Отношение `J` - проекты\n\n| J#  | JNAME   | CITY   |\n| --- | ------- | ------ |\n| J1  | Sorter  | Paris  |\n| J2  | Display | Rome   |\n| J3  | OCR     | Athens |\n| J4  | Console | Athens |\n| J5  | RAID    | London |\n| J6  | EDS     | Oslo   |\n| J7  | Tape    | London |\n\n### Отношение `SPJ` - поставки деталей поставщиками в рамках какого-либо проекта\n\n| S#  | P#  | J#  | QTY |\n| --- | --- | --- | --- |\n| S1  | P1  | J1  | 200 |\n| S1  | P1  | J4  | 700 |\n| S2  | P3  | J1  | 400 |\n| S2  | P3  | J2  | 200 |\n| S2  | P3  | J3  | 200 |\n| S2  | P3  | J4  | 500 |\n| S2  | P3  | J5  | 600 |\n| S2  | P3  | J6  | 400 |\n| S2  | P3  | J7  | 800 |\n| S2  | P5  | J2  | 100 |\n| S3  | P3  | J1  | 200 |\n| S3  | P4  | J2  | 500 |\n| S4  | P6  | J3  | 300 |\n| S4  | P6  | J7  | 300 |\n| S5  | P2  | J2  | 200 |\n| S5  | P2  | J4  | 100 |\n| S5  | P5  | J5  | 500 |\n| S5  | P5  | J7  | 100 |\n| S5  | P6  | J2  | 200 |\n| S5  | P1  | J4  | 100 |\n| S5  | P3  | J4  | 200 |\n| S5  | P4  | J4  | 800 |\n| S5  | P5  | J4  | 400 |\n| S5  | P6  | J4  | 500 |\n\n## Задание\n\nНужно составить запрос в трёх вариантах:\n\n1. используя реляционную алгебру;\n2. используя реляционное исчисление;\n3. используя язык SQL и само решение (_таблица-ответ_).\n\n```sql\nS { S#, SNAME, STATUS, CITY }\n    PRIMARY KEY { S# }\n\nP { P#, PNAME, COLOR, WEIGHT, CITY }\n    PRIMARY KEY { P# }\n\nJ { J#, JNAME, CITY }\n    PRIMARY KEY { J# }\n\nSPJ { S#, P#, J#, QTY }\n    PRIMARY KEY { S#, P#, J# }\n    FOREIGN KEY { S# } REFERENCES S\n    FOREIGN KEY { P# } REFERENCES P\n    FOREIGN KEY { J# } REFERENCES J\n```\n\n## Оффтоп: создание и заполнение таблиц для задания\n\n### 1. Создание необходимых SQL таблиц\n\n```sql\n-- Creating the Suppliers table\n\nCREATE TABLE s (\n    s_id VARCHAR(2) PRIMARY KEY,\n    sname VARCHAR(50),\n    status INT,\n    city VARCHAR(50)\n);\n\n-- Creating the Parts table\n\nCREATE TABLE p (\n    p_id VARCHAR(2) PRIMARY KEY,\n    pname VARCHAR(50),\n    color VARCHAR(20),\n    weight DECIMAL(5, 2),\n    city VARCHAR(50)\n);\n\n-- Creating the Projects table\n\nCREATE TABLE j (\n    j_id VARCHAR(2) PRIMARY KEY,\n    jname VARCHAR(50),\n    city VARCHAR(50)\n);\n\n-- Creating the SPJ (Suppliers-Parts-Projects) table\n\nCREATE TABLE spj (\n    s_id VARCHAR(2),\n    p_id VARCHAR(2),\n    j_id VARCHAR(2),\n    qty INT,\n    PRIMARY KEY (s_id, p_id, j_id),\n    FOREIGN KEY (s_id) REFERENCES S(s_id),\n    FOREIGN KEY (p_id) REFERENCES P(p_id),\n    FOREIGN KEY (j_id) REFERENCES J(j_id)\n);\n```\n\n### 2. Заполнение таблиц данными\n\n```sql\n-- Inserting data into the Suppliers table\n\nINSERT INTO s (s_id, sname, status, city)\nVALUES ('S1', 'Smith', 20, 'London'),\n       ('S2', 'Jones', 10, 'Paris'),\n       ('S3', 'Blake', 30, 'Paris'),\n       ('S4', 'Clark', 20, 'London'),\n       ('S5', 'Adams', 30, 'Athens');\n\n-- Inserting data into the Parts table\n\nINSERT INTO p (p_id, pname, color, weight, city)\nVALUES ('P1', 'Nut', 'Red', 12.0, 'London'),\n       ('P2', 'Bolt', 'Green', 17.0, 'Paris'),\n       ('P3', 'Screw', 'Blue', 17.0, 'Oslo'),\n       ('P4', 'Screw', 'Red', 14.0, 'London'),\n       ('P5', 'Cam', 'Blue', 12.0, 'Paris'),\n       ('P6', 'Cog', 'Red', 19.0, 'London');\n\n-- Inserting data into the Projects table\n\nINSERT INTO j (j_id, jname, city)\nVALUES ('J1', 'Sorter', 'Paris'),\n       ('J2', 'Display', 'Rome'),\n       ('J3', 'OCR', 'Athens'),\n       ('J4', 'Console', 'Athens'),\n       ('J5', 'RAID', 'London'),\n       ('J6', 'EDS', 'Oslo'),\n       ('J7', 'Tape', 'London');\n\n-- Inserting data into the SPJ table\n\nINSERT INTO spj (s_id, p_id, j_id, qty)\nVALUES ('S1', 'P1', 'J1', 200),\n       ('S1', 'P1', 'J4', 700),\n       ('S2', 'P3', 'J1', 400),\n       ('S2', 'P3', 'J2', 200),\n       ('S2', 'P3', 'J3', 200),\n       ('S2', 'P3', 'J4', 500),\n       ('S2', 'P3', 'J5', 600),\n       ('S2', 'P3', 'J6', 400),\n       ('S2', 'P3', 'J7', 800),\n       ('S2', 'P5', 'J2', 100),\n       ('S3', 'P3', 'J1', 200),\n       ('S3', 'P4', 'J2', 500),\n       ('S4', 'P6', 'J3', 300),\n       ('S4', 'P6', 'J7', 300),\n       ('S5', 'P2', 'J2', 200),\n       ('S5', 'P2', 'J4', 100),\n       ('S5', 'P5', 'J5', 500),\n       ('S5', 'P5', 'J7', 100),\n       ('S5', 'P6', 'J2', 200),\n       ('S5', 'P1', 'J4', 100),\n       ('S5', 'P3', 'J4', 200),\n       ('S5', 'P4', 'J4', 800),\n       ('S5', 'P5', 'J4', 400),\n       ('S5', 'P6', 'J4', 500);\n```\n\n## Варианты\n\n### 7.13. Получить полные сведения обо всех проектах\n\n#### Реляционная алгебра\n\n`J`\n\n#### Реляционное исчисление\n\n`JX`\n\n#### SQL\n\n```sql\nSELECT *\nFROM j;\n```\n\n### 7.14. Получить полные сведения обо всех проектах в Лондоне\n\n#### Реляционная алгебра\n\n`J WHERE City='London'`\n\n#### Реляционное исчисление\n\n`JX WHERE JX.City='London'`\n\n#### SQL\n\n```sql\nSELECT *\nFROM j\nWHERE city = 'London';\n```\n\n### 7.15. Определить номера поставщиков деталей для проекта с номером J1\n\n#### Реляционная алгебра\n\n`(SPJ WHERE J#='J1') [S#]`\n\n#### Реляционное исчисление\n\n`SPJX.S# WHERE J#='J1'`\n\n#### SQL\n\n```sql\nSELECT DISTINCT s_id\nFROM spj\nWHERE j_id='J1';\n```\n\n### 7.16. Определить все поставки, в которых количество деталей находится в диапазоне от 300 до 750 штук включительно\n\n#### Реляционная алгебра\n\n`SPJ WHERE Qty\u003e=300 AND Qty\u003c=750`\n\n#### Реляционное исчисление\n\n`SPJX WHERE SPJX.Qty\u003e=300 AND SPJX.Qty\u003c=750`\n\n#### SQL\n\n```sql\nSELECT *\nFROM spj\nWHERE qty \u003e=300\n  AND qty \u003c=750;\n```\n\n### 7.17. Найти все существующие сочетания вида \"цвета детали - город, из которого поставляются детали\"\n\n\u003e[!WARNING]\n\u003e\n\u003e**Примечание**. Здесь и в последующих упражнениях слово \"все\" используется в значении \"все, представленные в настоящий момент в базе данных\", а не \"все возможные\".\n\n#### Реляционная алгебра\n\n`P [Color, City]`\n\n#### Реляционное исчисление\n\n`(PX.Color, PX.City)`\n\n#### SQL\n\n```sql\nSELECT DISTINCT color,\n                city\nFROM p;\n```\n\n### 7.18. Найти все такие тройки значений \"номер поставщика – номер детали – номер проекта\", для которых указанные поставщик, деталь и проект находятся в одном городе\n\n#### Реляционная алгебра\n\n`(S JOIN (P JOIN J)) [S#, P#, J#]`\n\n#### Реляционное исчисление\n\n```\n(SX.S#, PX.P#,JX.J#) WHERE SX.City=PX.City AND\n                     PX.City=JX.City AND SX.City=JX.City\n```\n\n#### SQL\n\n```sql\nSELECT s.s_id,\n       p.p_id,\n       j.j_id\nFROM s\nJOIN p ON s.city = p.city\nJOIN j ON p.city = j.city\nAND s.city = j.city;\n```\n\n\u003e[!NOTE]\n\u003e\n\u003eЛибо, что то же самое:\n\u003e\n\u003e```sql\n\u003eSELECT s.s_id,\n\u003e       p.p_id,\n\u003e       j.j_id\n\u003eFROM s,\n\u003e     p,\n\u003e     j\n\u003eWHERE s.city = p.city\n\u003e  AND p.city = j.city;\n\u003e```\n\n### 7.19. Найти все такие тройки значений \"номер поставщика – номер детали – номер проекта\", для которых указанные поставщик, деталь и проект не находятся в одном городе\n\n#### Реляционная алгебра\n\n```\n(((S RENAME City AS Scity) TIMES\n(P RENAME City AS Pcity) TIMES\n(J RENAME City AS Jcity))\nWHERE SCity≠Pcity OR\n    PCity≠Jcity OR\n    JCity≠Scity) [S#, P#, J#]\n```\n\n#### Реляционное исчисление\n\n```\n(SX.S#, PX.P#,JX.J#) WHERE SX.City\u003c\u003ePX.City OR\nPX.City\u003c\u003eJX.City OR SX.City\u003c\u003eJX.City\n```\n\n#### SQL\n\n```sql\nSELECT s.s_id,\n       p.p_id,\n       j.j_id\nFROM s,\n     p,\n     j\nWHERE NOT (s.city = p.city\n           AND p.city = j.city);\n```\n\n\u003e[!NOTE]\n\u003e\n\u003eЛибо, что то же самое:\n\u003e\n\u003e```sql\n\u003eSELECT s.s_id,\n\u003e       p.p_id,\n\u003e       j.j_id\n\u003eFROM s,\n\u003e     p,\n\u003e     j\n\u003eWHERE s.city != p.city\n\u003e  OR p.city != j.city\n\u003e  OR s.city != j.city;\n\u003e```\n\n### 7.20. Найти все такие тройки значений \"номер поставщика – номер детали – номер проекта\", для которых никакие из двух поставщиков, деталей и проектов не находятся в одном городе\n\n#### Реляционная алгебра\n\n```\n(((S RENAME City AS Scity) TIMES\n(P RENAME City AS Pcity) TIMES\n(J RENAME City AS Jcity))\nWHERE SCity≠Pcity AND\n    PCity≠Jcity AND\n    JCity≠Scity) [S#, P#, J#]\n```\n\n#### Реляционное исчисление\n\n```\n(SX.S#, PX.P#,JX.J#) WHERE SX.City\u003c\u003ePX.City AND\nPX.City\u003c\u003eJX.City AND SX.City\u003c\u003eJX.City\n```\n\n#### SQL\n\n```sql\nSELECT s.s_id,\n       p.p_id,\n       j.j_id\nFROM s,\n     p,\n     j\nWHERE s.city \u003c\u003e p.city\n  AND p.city \u003c\u003e j.city\n  AND j.city \u003c\u003e s.city;\n```\n\n### 7.21. Получить полные сведения о деталях, поставляемых поставщиком из Лондона\n\n#### Реляционная алгебра\n\n`P SEMIJOIN (SPJ SEMIJOIN (S WHERE CITY = London))`\n\n#### Реляционное исчисление\n\n`PX WHERE PX.P# = SPJX.P# AND EXISTS SX (SX.S# = SPJX.S# AND SX.City = 'London')`\n\n#### SQL\n\n```sql\nSELECT DISTINCT p.*\nFROM p\nJOIN spj ON p.p_id = spj.p_id\nJOIN s ON spj.s_id = s.s_id\nWHERE s.city = 'London';\n```\n\n### 7.22. Определить номера деталей, поставляемых поставщиком из Лондона для проекта в Лондоне\n\n#### Реляционная алгебра\n\n```\n((SPJ JOIN (S WHERE City='London')) [P#, J#]\n    JOIN (J WHERE City='London')) [P#]\n```\n\n#### Реляционное исчисление\n\n```\nSPJX.P# WHERE EXISTS SX EXISTS JX (SX.S#=SPJX.S# AND\nSX.City='London' AND JX.J#=SPJX.J# AND JX.City='London')\n```\n\n#### SQL\n\n```sql\nSELECT DISTINCT spj.p_id\nFROM spj\nWHERE\n    (SELECT s.city\n     FROM s\n     WHERE s.s_id = spj.s_id) = 'London'\n  AND\n    (SELECT j.city\n     FROM j\n     WHERE j.j_id = spj.j_id) = 'London';\n```\n\n### 7.23. Найти все пары названий городов, для которых поставщик из первого города обеспечивает проект во втором городе\n\n#### Реляционная алгебра\n\n```\n((S RENAME City AS Scity) JOIN SPJ JOIN\n(J RENAME City AS Jcity)) {SCity, JCity}\n```\n\n#### Реляционное исчисление\n\n```\n(SX.City AS Scity, JX.City AS JCity) WHERE EXISTS SPJX\n(SPJX.S#=SX.S# AND SPJX.J#=JX.J#)\n```\n\n#### SQL\n\n```sql\nSELECT DISTINCT s.city,\n                j.city\nFROM s,\n     j\nWHERE EXISTS\n    (SELECT *\n     FROM spj\n     WHERE spj.s_id = s.s_id\n       AND spj.j_id = j.j_id);\n```\n\n### 7.24. Определить номера деталей, поставляемых для всех проектов, поставляемых поставщиком из того же города, в котором разрабатывается проект\n\n#### Реляционная алгебра\n\n`(J JOIN SPJ JOIN S) {P#}`\n\n#### Реляционное исчисление\n\n```\nSPJX.P# WHERE EXISTS SX EXISTS JX (SX.City=JX.City AND\nSPJX.S#=SX.S# AND SPJX.J#=JX.J#)\n```\n\n#### SQL\n\n```sql\nSELECT DISTINCT spj.p_id\nFROM spj\nWHERE\n    (SELECT s.city\n     FROM s\n     WHERE s.s_id = spj.s_id) =\n    (SELECT j.city\n     FROM j\n     WHERE j.j_id = spj.j_id);\n```\n\n### 7.25. Найти все номера проектов, детали для которых поставляются по крайней мере одним поставщиком из другого города\n\n#### Реляционная алгебра\n\n```\n(((J RENAME City AS Jcity) JOIN SPJ JOIN\n(S RENAME City AS Scity))\n    WHERE JCity≠Ccity) [J#]\n```\n\n#### Реляционное исчисление\n\n```\nSPJX.P# WHERE EXISTS SX EXISTS JX (SX.City\u003c\u003eJX.City AND\nSPJX.S#=SX.S# AND SPJX.J#=JX.J#)\n```\n\n#### SQL\n\n```sql\nSELECT DISTINCT spj.j_id\nFROM spj\nWHERE\n    (SELECT s.city\n     FROM s\n     WHERE s.s_id = spj.s_id) \u003c\u003e\n    (SELECT j.city\n     FROM j\n     WHERE j.j_id = spj.j_id);\n```\n\n### 7.26. Определить все пары номеров деталей, в которых обе детали поставляются  одним и тем же поставщиком\n\n#### Реляционная алгебра\n\n```\n(((SPJ [S#,P#] RENAME S# AS XS#, P# AS XP#)) TIMES\n((SPJ [S#,P#] RENAME S# AS YS#, P# AS YP#)))\n    WHERE XS#=YS# AND XP#\u003cYP#) [XP#, YP#]\n```\n\n#### Реляционное исчисление\n\n```\n(SPJX.P# AS XP#, SPJY AS Y#) WHERE SPJX.S#=SPJY.S# AND\nSPJX.P#\u003cSPJY.P#)\n```\n\n#### SQL\n\n```sql\nSELECT DISTINCT spj1.p_id,\n                spj2.p_id\nFROM spj AS spj1,\n     spj AS spj2\nWHERE spj1.s_id = spj2.s_id\n  AND spj1.p_id \u003c spj2.p_id;\n```\n\n### 7.27. Определить общее число проектов, детали для которых поставляются поставщиком с номером S1\n\n#### Реляционная алгебра\n\n`(SUMMARIZE ((SPJ WHERE S#='S1') [J#]) BY () ADD COUNT AS N) [N]`\n\n#### Реляционное исчисление\n\n`COUNT(SPJX.J# WHERE SPJX.S#='S1') AS N`\n\n#### SQL\n\n```sql\nSELECT COUNT (DISTINCT spj.j_id)\nFROM spj\nWHERE spj.s_id = 'S1';\n```\n\n### 7.28. Определить общее количество деталей с номером P1, поставляемых поставщиком с номером S1\n\n#### Реляционная алгебра\n\n```\n(SUMMARIZE (SPJ WHERE S#='S1' AND P#='P1')) BY ()\n    ADD SUM(Qty) AS Q) [Q] \n(EXTEND (S WHERE S#='S1')\n    ADD SUM((MATCHING SPJ) WHERE P#='P1', Qty) AS Q) [Q]\n```\n\n#### Реляционное исчисление\n\n`SUM ( SPJX WHERE SPJX.S#=SPJX.'S1' AND SPJX.P#=SPJX.'P1', Qty) AS Q`\n\n#### SQL\n\n```sql\nSELECT sum(spj.qty)\nFROM spj\nWHERE spj.s_id = 'S1'\n  AND spj.p_id = 'P1';\n```\n\n### 7.29. Для каждой детали, поставляемой для проекта, определить номер детали, номер проекта и соответствующее общее количество\n\n#### Реляционная алгебра\n\n`SUMMARIZE SPJ BY (P#,J#) ADD SUM(Qty) AS Q`\n\n#### Реляционное исчисление\n\n`(SPJX.P#, SPJX.J#, SUM(SPJY WHERE SPJY.P#=SPJX.P# AND SPJY.J#=SPJX.J#, Qty) AS Q)`\n\n#### SQL\n\n```sql\nSELECT spj.p_id,\n       spj.j_id,\n       sum(spj.qty)\nFROM spj\nGROUP BY spj.p_id,\n         spj.j_id;\n```\n\n### 7.30. Определить номера деталей, поставляемых для некоторого проекта, со средним количеством, составляющим больше 350 штук\n\n#### Реляционная алгебра\n\n`((SUMMARIZE SPJ BY (P#,J#) ADD AVG(Qty) AS Q) WHERE Q\u003e350)[P#]`\n\n#### Реляционное исчисление\n\n`SPJX.P# WHERE AVG (SPJY WHERE SPJY.P#=SPJX.P# AND SPJY.J#=SPJX.J#, Qty) \u003e350`\n\n#### SQL\n\n```sql\nSELECT DISTINCT spj.p_id\nFROM spj\nGROUP BY spj.p_id,\n         spj.j_id\nHAVING avg(spj.qty) \u003e 350;\n```\n\n### 7.31. Определить названия проектов, детали для которых поставляются поставщиком с номером S1\n\n#### Реляционная алгебра\n\n`(J JOIN (SPJ WHERE S#='S1')) [JName]`\n\n#### Реляционное исчисление\n\n`JX.Jname WHERE EXISTS SPJX (SPJX.J#=JX.J# AND SPJX.S#='S1')`\n\n#### SQL\n\n```sql\nSELECT DISTINCT j.jname\nFROM j,\n     spj\nWHERE j.j_id = spj.j_id\n  AND spj.s_id = 'S1';\n```\n\n### 7.32. Определить цвета деталей, поставляемых поставщиком с номером S1\n\n#### Реляционная алгебра\n\n`(P JOIN (SPJ WHERE S#='S1')) [Color]`\n\n#### Реляционное исчисление\n\n`PX.Color WHERE EXISTS SPJX (SPJX.P#=PX.P# AND SPJX.S#='S1')`\n\n#### SQL\n\n```sql\nSELECT DISTINCT p.color\nFROM p,\n     spj\nWHERE p.p_id = spj.p_id\n  AND spj.s_id = 'S1';\n```\n\n### 7.33. Установить номера деталей, поставляемых для любого проекта, разрабатываемого в Лондоне\n\n#### Реляционная алгебра\n\n`(SPJ JOIN (J WHERE City='London')) [P#]`\n\n#### Реляционное исчисление\n\n`SPJX.P# WHERE EXISTS JX (JX.City='London' AND JX.J#=SPJPX.J#)`\n\n#### SQL\n\n```sql\nSELECT DISTINCT spj.p_id\nFROM spj,\n     j\nWHERE spj.j_id = j.j_id\n  AND j.city = 'London';\n```\n\n### 7.34. Определить номера проектов, в которых используется по крайней мере одна деталь, имеющуюся у поставщика с номером S1\n\n#### Реляционная алгебра\n\n`(SPJ JOIN (SPJ WHERE S#='S1') [P#]) [J#]`\n\n#### Реляционное исчисление\n\n`SPJX.J# WHERE EXISTS SPJY(SPJX.P#=SPJY.P# AND SPJY.S#='S1'`\n\n#### SQL\n\n```sql\nSELECT DISTINCT spj1.j_id\nFROM spj AS spj1,\n     spj AS spj2\nWHERE spj1.p_id = spj2.p_id\n  AND spj2.s_id = 'S1';\n```\n\n### 7.35. Определить номера поставщиков по крайней мере одной детали, поставляемой по крайней мере одним поставщиком, который поставляет хотя бы одну деталь красного цвета\n\n#### Реляционная алгебра\n\n```\n(((SPJ JOIN (P WHERE Color='Red') [P#]) [S#]\n    JOIN SPJ) [P#] JOIN SPJ) [S#]\n```\n\n#### Реляционное исчисление\n\n```\nSPJX.S# WHERE EXISTS SPJY EXISTS SPJZ EXISTS PX\n(SPJX.P#=SPJY.P# AND SPJX.S#=SPJZ.S# AND SPJZ.P#=PX.P# AND\nPX.Color='Red')\n```\n\n#### SQL\n\n```sql\nSELECT DISTINCT spj1.s_id\nFROM spj AS spj1,\n     spj AS spj2,\n     spj AS spj3\nWHERE spj1.p_id = spj2.p_id\n  AND spj2.s_id = spj3.s_id\n  AND\n    (SELECT p.color\n     FROM p\n     WHERE p.p_id = spj3.p_id) = 'Red';\n```\n\n### 7.36. Определить номера поставщиков со статусом, меньшим, чем у поставщика с номером S1\n\n#### Реляционная алгебра\n\n```\n((S [S#, Status] RENAME S# AS XS#, Status AS XStatus) TIMES\n(S [S#, Status] RENAME S# AS YS#, Status AS YStatus))\n    WHERE XS#='S1' AND XStatus\u003eYStatus) [YS#]\n```\n\n#### Реляционное исчисление\n\n`SX.S# WHERE EXISTS SY(SY.S#='S1' AND SX\u003eStatus\u003cSY.Status)`\n\n#### SQL\n\n```sql\nSELECT s.s_id\nFROM s\nWHERE s.status \u003c\n    (SELECT s.status\n     FROM s\n     WHERE s.s_id = 'S1');\n```\n\n### 7.37. Определить номера проектов, разрабатываемых в городе, который находится на первом месте в алфавитном списке таких городов\n\n#### Реляционная алгебра\n\n```\nJ [J#] MINUS\n((J [J#, City] RENAME City AS XCity) TIMES J [City])\n    WHERE XCity\u003eCity) [J#]\n```\n\n#### Реляционное исчисление\n\n```\nJX.J# WHERE FORALL JY(JY.CityJX.City)\nJX.J# WHERE JX.City=MIN(JY.City)\n```\n\n#### SQL\n\n```sql\nSELECT j.j_id\nFROM j\nWHERE j.city =\n    (SELECT MIN (j.city)\n     FROM j);\n```\n\n### 7.38. Определить номера проектов, для которых среднее количество поставляемых деталей с номером P1 больше, чем наибольшее количество любых деталей, поставляемых для проекта с номером J1\n\n#### Реляционная алгебра\n\n```\n(((SUMMARIZE (SPJ WHERE P#='P1') BY (J#) ADD AVG (Qty) AS QX) TIMES\n(SUMMARIZE (SPJ WHERE J#='J1') BY ()\n    ADD MAX(Qty) AS QY) [QY]\nWHERE QX\u003eQY)[J#]\n```\n\n#### Реляционное исчисление\n\n```\nSPJX.J# WHERE SPJX.P#='P1' AND\nAVG(SPJY WHERE SPJY.P#='P1' AND SPJY.J#=SPJX.J#, Qty)\u003e\nMAX (SPJZ.Qty WHERE SPJZ.J#='J1')\n```\n\n#### SQL\n\n```sql\nSELECT DISTINCT spj1.j_id\nFROM spj AS spj1\nWHERE spj1.p_id = 'P1'\n  AND\n    (SELECT AVG (spj2.qty)\n     FROM spj AS spj2\n     WHERE spj2.j_id = spj1.j_id\n       AND spj2.p_id = 'P1') \u003e\n    (SELECT max(spj3.qty)\n     FROM spj AS spj3\n     WHERE spj3.j_id = 'J1');\n```\n\n\u003e[!WARNING]\n\u003e\n\u003e**(Если же для проекта J1 вообще нет поставок, то возникает проблема!)**\n\n### 7.39. Определить номера поставщиков детали с номером Р1 для некоторого проекта в количестве, большем среднего количества деталей с номером Р1, поставляемых для этого проекта\n\n#### Реляционная алгебра\n\n```\n(((((SPJ WHERE P#='P1') [S#,J#,Qty])\n    RENAME J# AS XJ#, Qty AS XQ) TIMES\n    (SUMMARIZE (SPJ WHERE P#='P1') BY (J#)\n    ADD AVG (Qty) AS Q))\n WHERE XJ#=J# AND XQ\u003eQ)[S#]\n```\n\n#### Реляционное исчисление\n\n```\nSPJX.S# WHERE SPJX.P#='P1' AND SPX.Qty\u003e\nAVG(SPJY WHERE SPJY.P#='P1' AND SPJY.J#=SPJX.J#, Qty)\n```\n\n#### SQL\n\n```sql\nSELECT DISTINCT spj1.s_id\nFROM spj AS spj1\nWHERE spj1.p_id = 'P1'\n  AND spj1.qty \u003e\n    (SELECT avg(spj2.qty)\n     FROM spj AS spj2\n     WHERE spj2.p_id = 'P1'\n       AND spj2.j_id = spj1.j_id);\n```\n\n### 7.40. Найти номера проектов, для которых поставщиками из Лондона не поставляется ни одна деталь красного цвета\n\n#### Реляционная алгебра\n\n```\nJ [J#] MINUS\n(( S WHERE City='London') [S#]\nJOIN SPJ JOIN (P WHERE Color='Red')) [J#]\n```\n\n#### Реляционное исчисление\n\n```\nJX.J# WHERE NOT EXISTS SPJX EXISTS SX EXISTS PX\n(SX.City='London' AND PX.Color='Red' AND\nSPJX.S#=SX.S# AND SPJX.P#=PX.P# AND SPJX.J#=JX.J#)\n```\n\n#### SQL\n\n```sql\nSELECT j.j_id\nFROM j\nWHERE NOT EXISTS\n    (SELECT *\n     FROM spj,\n          p,\n          s\n     WHERE spj.j_id = j.j_id\n       AND spj.p_id = p.p_id\n       AND spj.s_id = s.s_id\n       AND p.color = 'Red'\n       AND s.city = 'London');\n```\n\n### 7.41. Определить номера проектов, детали для которых полностью поставляются поставщиком с номером S1\n\n#### Реляционная алгебра\n\n```\nJ [J#] MINUS\n(SPJ WHERE S# = 'S1') [J#]\n```\n\n#### Реляционное исчисление\n\n`JX.J# WHERE FORALL SPJY (IF SPJY.J=JX.J# THEN SPJY.S#='S1')`\n\n#### SQL\n\n```sql\nSELECT j.j_id\nFROM j\nWHERE NOT EXISTS\n    (SELECT *\n     FROM spj\n     WHERE spj.j_id = j.j_id\n       AND NOT (spj.s_id = 'S1'));\n```\n\n### 7.42 Определить номера деталей, поставляемых для лондонских проектов\n\n#### Реляционная алгебра\n\n`(SPJ JOIN (J WHERE City='London')) [P#]`\n\n#### Реляционное исчисление\n\n`SPJX.P# WHERE EXISTS JX (JX.J#=SPJX.J# AND JX.City='London')`\n\n#### SQL\n\n```sql\nSELECT DISTINCT spj.p_id FROM spj\nJOIN j ON spj.j_id = j.j_id\nWHERE j.city = 'London';\n```\n\n### 7.43. Установить номера поставщиков одной и той же детали для всех проектов (_SPJ не пустое отношение_)\n\n#### Реляционная алгебра\n\n`(SPJ [S#,P#,J#] DIVIDEBY J [J#]) [S#]`\n\n#### Реляционное исчисление\n\n```\nSX.S# WHERE EXISTS PX FORALL JX EXISTS SPJY\n(SPJY.S#=SX.S# AND SPJY.J#=JX.J# AND SPJY.P#=PX.P#)\n```\n\n#### SQL\n\n```sql\nSELECT s.s_id\nFROM s\nWHERE EXISTS\n    (SELECT *\n     FROM p\n     WHERE NOT EXISTS\n         (SELECT *\n          FROM j\n          WHERE NOT EXISTS\n              (SELECT *\n               FROM spj\n               WHERE spj.s_id = s.s_id\n                 AND spj.p_id = p.p_id\n                 AND spj.j_id = j.j_id)));\n```\n\n### 7.44. Определить номера проектов, в состав которых входят, по меньшей мере, все типы деталей, поставляемых поставщиком с номером S1\n\n#### Реляционная алгебра\n\n`(J WHERE (MATCHING SPJ) [P#]\u003e= (SPJ WHERE S#='S1') [P#]) [J#]`\n\n#### Реляционное исчисление\n\n```\nJX.J# WHERE FORALL SPJY\n(IF SPJY.S#='S1' THEN\nEXISTS SPJZ (SPJZ.J#=JX.J# AND SPJZ.P#=SPJY.P#))\n```\n\n#### SQL\n\n```sql\nSELECT j.j_id\nFROM j\nWHERE NOT EXISTS\n    (SELECT *\n     FROM spj AS spj1\n     WHERE spj1.s_id ='S1'\n       AND NOT EXISTS\n         (SELECT *\n          FROM spj AS spj2\n          WHERE spj2.p_id = spj1.p_id\n            AND spj2.j_id = j.j_id));\n```\n\n### 7.45. Установить все города, в которых находится по крайней мере один поставщик, одна деталь или один проект\n\n#### Реляционная алгебра\n\n`S [City] UNION P [City] UNION J [City]`\n\n#### Реляционное исчисление\n\n```\nRANGE OF VX IS (SX.City), (PX.City), (JX.City);\nVX.City\n```\n\n#### SQL\n\n```sql\nSELECT s.city\nFROM s\nUNION\nSELECT p.city\nFROM p\nUNION\nSELECT j.city\nFROM j;\n```\n\n### 7.46. Определить номера деталей, поставляемых либо лондонским поставщиком, либо для лондонского проекта\n\n#### Реляционная алгебра\n\n```\n(SPJ JOIN (S WHERE City='London')) [P#]\nUNION\n(SPJ JOIN (J WHERE City='London')) [P#]\n```\n\n#### Реляционное исчисление\n\n```\nSPJX.P# WHERE EXISTS SX(SX.S#=SPJX.S# AND SX.City='London')\nOR EXISTS JX(JX.J#=SPJX.J# AND JX.City='London')\n```\n\n#### SQL\n\n```sql\nSELECT DISTINCT spj.p_id\nFROM spj\nWHERE\n    (SELECT s.city\n     FROM s\n     WHERE s.s_id = spj.s_id) = 'London'\n  OR\n    (SELECT j.city\n     FROM j\n     WHERE j.j_id = spj.j_id) = 'London';\n```\n\n### 7.47. Найти все пары \"номер поставщика – номер детали\", причем только такие, в которых данный поставщик не поставляет данную деталь\n\n#### Реляционная алгебра\n\n`(S TIMES P) [S#,P#] MINUS SP [S#,P#]`\n\n#### Реляционное исчисление\n\n```\n(SX.S#, PX.P#) WHERE NOT EXISTS SPJX\n(SX.S#=SPJX.S# AND PX.P#=SPJX.P#)\n```\n\n#### Из книги : только такие пары, в которых данный поставщик не поставляет данную деталь\n\n```sql\nSELECT s.s_id,\n       p.p_id\nFROM s\nCROSS JOIN p\nEXCEPT\nSELECT spj.s_id,\n       spj.p_id\nFROM spj;\n```\n\n### 7.48. **TODO** Определить все пары номеров поставщиков (скажем, Sx и Sy), причем такие, что оба эти поставщика поставляют в точности одно и то же множество деталей\n\n\u003e[!WARNING]\n\u003e\n\u003e**Примечание**. Для упрощения в данном упражнении рекомендуется использовать первоначальную версию базы данных поставщиков и деталей, а не расширенную версию базы данных поставщиков, деталей и проектов.\n\n### 7.49. **TODO** Подготовить в виде бинарного отношения \"сгруппированную\" версию всех поставок, в которой для каждой пары \"номер поставщика - номер детали\" показан соответствующий номер проекта и количество поставленных деталей\n\n### 7.50. **TODO** Получить \"разгруппированную\" версию отношения, полученного в результате выполнения упражнения 7.49\n\n## Листинг\n\n### SQL скрипт инициализации базы данных для задания, `init.sql`\n\n```sql\n-- Creating the Suppliers table\n\nCREATE TABLE s (\n    s_id VARCHAR(2) PRIMARY KEY,\n    sname VARCHAR(50),\n    status INT,\n    city VARCHAR(50)\n);\n\n-- Creating the Parts table\n\nCREATE TABLE p (\n    p_id VARCHAR(2) PRIMARY KEY,\n    pname VARCHAR(50),\n    color VARCHAR(20),\n    weight DECIMAL(5, 2),\n    city VARCHAR(50)\n);\n\n-- Creating the Projects table\n\nCREATE TABLE j (\n    j_id VARCHAR(2) PRIMARY KEY,\n    jname VARCHAR(50),\n    city VARCHAR(50)\n);\n\n-- Creating the SPJ (Suppliers-Parts-Projects) table\n\nCREATE TABLE spj (\n    s_id VARCHAR(2),\n    p_id VARCHAR(2),\n    j_id VARCHAR(2),\n    qty INT,\n    PRIMARY KEY (s_id, p_id, j_id),\n    FOREIGN KEY (s_id) REFERENCES S(s_id),\n    FOREIGN KEY (p_id) REFERENCES P(p_id),\n    FOREIGN KEY (j_id) REFERENCES J(j_id)\n);\n\n\n-- Inserting data into the Suppliers table\n\nINSERT INTO s (s_id, sname, status, city)\nVALUES ('S1', 'Smith', 20, 'London'),\n       ('S2', 'Jones', 10, 'Paris'),\n       ('S3', 'Blake', 30, 'Paris'),\n       ('S4', 'Clark', 20, 'London'),\n       ('S5', 'Adams', 30, 'Athens');\n\n-- Inserting data into the Parts table\n\nINSERT INTO p (p_id, pname, color, weight, city)\nVALUES ('P1', 'Nut', 'Red', 12.0, 'London'),\n       ('P2', 'Bolt', 'Green', 17.0, 'Paris'),\n       ('P3', 'Screw', 'Blue', 17.0, 'Oslo'),\n       ('P4', 'Screw', 'Red', 14.0, 'London'),\n       ('P5', 'Cam', 'Blue', 12.0, 'Paris'),\n       ('P6', 'Cog', 'Red', 19.0, 'London');\n\n-- Inserting data into the Projects table\n\nINSERT INTO j (j_id, jname, city)\nVALUES ('J1', 'Sorter', 'Paris'),\n       ('J2', 'Display', 'Rome'),\n       ('J3', 'OCR', 'Athens'),\n       ('J4', 'Console', 'Athens'),\n       ('J5', 'RAID', 'London'),\n       ('J6', 'EDS', 'Oslo'),\n       ('J7', 'Tape', 'London');\n\n-- Inserting data into the SPJ table\n\nINSERT INTO spj (s_id, p_id, j_id, qty)\nVALUES ('S1', 'P1', 'J1', 200),\n       ('S1', 'P1', 'J4', 700),\n       ('S2', 'P3', 'J1', 400),\n       ('S2', 'P3', 'J2', 200),\n       ('S2', 'P3', 'J3', 200),\n       ('S2', 'P3', 'J4', 500),\n       ('S2', 'P3', 'J5', 600),\n       ('S2', 'P3', 'J6', 400),\n       ('S2', 'P3', 'J7', 800),\n       ('S2', 'P5', 'J2', 100),\n       ('S3', 'P3', 'J1', 200),\n       ('S3', 'P4', 'J2', 500),\n       ('S4', 'P6', 'J3', 300),\n       ('S4', 'P6', 'J7', 300),\n       ('S5', 'P2', 'J2', 200),\n       ('S5', 'P2', 'J4', 100),\n       ('S5', 'P5', 'J5', 500),\n       ('S5', 'P5', 'J7', 100),\n       ('S5', 'P6', 'J2', 200),\n       ('S5', 'P1', 'J4', 100),\n       ('S5', 'P3', 'J4', 200),\n       ('S5', 'P4', 'J4', 800),\n       ('S5', 'P5', 'J4', 400),\n       ('S5', 'P6', 'J4', 500);\n```\n\n### SQL скрипт со всеми вариантами запросов\n\n```sql\n-- 7.13. Получить полные сведения обо всех проектах\n\nSELECT *\nFROM j;\n\n-- 7.14. Получить полные сведения обо всех проектах в Лондоне\n\nSELECT *\nFROM j\nWHERE city = 'London';\n\n-- 7.15. Определить номера поставщиков деталей для проекта с номером J1\n\nSELECT DISTINCT s_id\nFROM spj\nWHERE j_id='J1';\n\n-- 7.16. Определить все поставки, в которых количество деталей находится в диапазоне от 300 до 750 штук включительно\n\nSELECT *\nFROM spj\nWHERE qty \u003e=300\n  AND qty \u003c=750;\n\n-- 7.17. Найти все существующие сочетания вида \"цвета детали - город, из которого поставляются детали\"\n\nSELECT DISTINCT color,\n                city\nFROM p;\n\n-- 7.18. Найти все такие тройки значений \"номер поставщика – номер детали – номер проекта\", для которых указанные поставщик, деталь и проект находятся в одном городе\n\nSELECT s.s_id,\n       p.p_id,\n       j.j_id\nFROM s\nJOIN p ON s.city = p.city\nJOIN j ON p.city = j.city\nAND s.city = j.city;\n\n-- Или, может быть?\n\nSELECT s.s_id,\n       p.p_id,\n       j.j_id\nFROM s,\n     p,\n     j\nWHERE s.city = p.city\n  AND p.city = j.city;\n\n-- 7.19. Найти все такие тройки значений \"номер поставщика – номер детали – номер проекта\", для которых указанные поставщик, деталь и проект не находятся в одном городе\n\nSELECT s.s_id,\n       p.p_id,\n       j.j_id\nFROM s,\n     p,\n     j\nWHERE NOT (s.city = p.city\n           AND p.city = j.city);\n\n-- 7.20. Найти все такие тройки значений \"номер поставщика – номер детали – номер проекта\", для которых никакие из двух поставщиков, деталей и проектов не находятся в одном городе\n\nSELECT s.s_id,\n       p.p_id,\n       j.j_id\nFROM s,\n     p,\n     j\nWHERE s.city \u003c\u003e p.city\n  AND p.city \u003c\u003e j.city\n  AND j.city \u003c\u003e s.city;\n\n-- 7.21. Получить полные сведения о деталях, поставляемых поставщиком из Лондона\n\nSELECT DISTINCT p.*\nFROM p\nJOIN spj ON p.p_id = spj.p_id\nJOIN s ON spj.s_id = s.s_id\nWHERE s.city = 'London';\n\n-- 7.22. Определить номера деталей, поставляемых поставщиком из Лондона для проекта в Лондоне\n\nSELECT DISTINCT spj.p_id\nFROM spj\nWHERE\n    (SELECT s.city\n     FROM s\n     WHERE s.s_id = spj.s_id) = 'London'\n  AND\n    (SELECT j.city\n     FROM j\n     WHERE j.j_id = spj.j_id) = 'London';\n\n-- 7.23. Найти все пары названий городов, для которых поставщик из первого города обеспечивает проект во втором городе\n\nSELECT DISTINCT s.city,\n                j.city\nFROM s,\n     j\nWHERE EXISTS\n    (SELECT *\n     FROM spj\n     WHERE spj.s_id = s.s_id\n       AND spj.j_id = j.j_id);\n\n-- 7.24. Определить номера деталей, поставляемых для всех проектов, поставляемых поставщиком из того же города, в котором разрабатывается проект\n\nSELECT DISTINCT spj.p_id\nFROM spj\nWHERE\n    (SELECT s.city\n     FROM s\n     WHERE s.s_id = spj.s_id) =\n    (SELECT j.city\n     FROM j\n     WHERE j.j_id = spj.j_id);\n\n-- 7.25. Найти все номера проектов, детали для которых поставляются по крайней мере одним поставщиком из другого города\n\nSELECT DISTINCT spj.j_id\nFROM spj\nWHERE\n    (SELECT s.city\n     FROM s\n     WHERE s.s_id = spj.s_id) \u003c\u003e\n    (SELECT j.city\n     FROM j\n     WHERE j.j_id = spj.j_id);\n\n-- 7.26. Определить все пары номеров деталей, в которых обе детали поставляются  одним и тем же поставщиком\n\nSELECT DISTINCT spj1.p_id,\n                spj2.p_id\nFROM spj AS spj1,\n     spj AS spj2\nWHERE spj1.s_id = spj2.s_id\n  AND spj1.p_id \u003c spj2.p_id;\n\n-- 7.27. Определить общее число проектов, детали для которых поставляются поставщиком с номером S1\n\nSELECT COUNT (DISTINCT spj.j_id)\nFROM spj\nWHERE spj.s_id = 'S1';\n\n-- 7.28. Определить общее количество деталей с номером P1, поставляемых поставщиком с номером S1\n\nSELECT sum(spj.qty)\nFROM spj\nWHERE spj.s_id = 'S1'\n  AND spj.p_id = 'P1';\n\n-- 7.29. Для каждой детали, поставляемой для проекта, определить номер детали, номер проекта и соответствующее общее количество\n\nSELECT spj.p_id,\n       spj.j_id,\n       sum(spj.qty)\nFROM spj\nGROUP BY spj.p_id,\n         spj.j_id;\n\n-- 7.30. Определить номера деталей, поставляемых для некоторого проекта, со средним количеством, составляющим больше 350 штук\n\nSELECT DISTINCT spj.p_id\nFROM spj\nGROUP BY spj.p_id,\n         spj.j_id\nHAVING avg(spj.qty) \u003e 350;\n\n-- 7.31. Определить названия проектов, детали для которых поставляются поставщиком с номером S1\n\nSELECT DISTINCT j.jname\nFROM j,\n     spj\nWHERE j.j_id = spj.j_id\n  AND spj.s_id = 'S1';\n\n-- 7.32. Определить цвета деталей, поставляемых поставщиком с номером S1\n\nSELECT DISTINCT p.color\nFROM p,\n     spj\nWHERE p.p_id = spj.p_id\n  AND spj.s_id = 'S1';\n\n-- 7.33. Установить номера деталей, поставляемых для любого проекта, разрабатываемого в Лондоне\n\nSELECT DISTINCT spj.p_id\nFROM spj,\n     j\nWHERE spj.j_id = j.j_id\n  AND j.city = 'London';\n\n-- 7.34. Определить номера проектов, в которых используется по крайней мере одна деталь, имеющуюся у поставщика с номером S1\n\nSELECT DISTINCT spj1.j_id\nFROM spj AS spj1,\n     spj AS spj2\nWHERE spj1.p_id = spj2.p_id\n  AND spj2.s_id = 'S1';\n\n-- 7.35. Определить номера поставщиков по крайней мере одной детали, поставляемой по крайней мере одним поставщиком, который поставляет хотя бы одну деталь красного цвета\n\nSELECT DISTINCT spj1.s_id\nFROM spj AS spj1,\n     spj AS spj2,\n     spj AS spj3\nWHERE spj1.p_id = spj2.p_id\n  AND spj2.s_id = spj3.s_id\n  AND\n    (SELECT p.color\n     FROM p\n     WHERE p.p_id = spj3.p_id) = 'Red';\n\n-- 7.36. Определить номера поставщиков со статусом, меньшим, чем у поставщика с номером S1\n\nSELECT s.s_id\nFROM s\nWHERE s.status \u003c\n    (SELECT s.status\n     FROM s\n     WHERE s.s_id = 'S1');\n\n-- 7.37. Определить номера проектов, разрабатываемых в городе, который находится на первом месте в алфавитном списке таких городов\n\nSELECT j.j_id\nFROM j\nWHERE j.city =\n    (SELECT MIN (j.city)\n     FROM j);\n\n-- 7.38. Определить номера проектов, для которых среднее количество поставляемых деталей с номером P1 больше, чем наибольшее количество любых деталей, поставляемых для проекта с номером J1\n\nSELECT DISTINCT spj1.j_id\nFROM spj AS spj1\nWHERE spj1.p_id = 'P1'\n  AND\n    (SELECT AVG (spj2.qty)\n     FROM spj AS spj2\n     WHERE spj2.j_id = spj1.j_id\n       AND spj2.p_id = 'P1') \u003e\n    (SELECT max(spj3.qty)\n     FROM spj AS spj3\n     WHERE spj3.j_id = 'J1');\n\n-- 7.39. Определить номера поставщиков детали с номером Р1 для некоторого проекта в количестве, большем среднего количества деталей с номером Р1, поставляемых для этого проекта\n\nSELECT DISTINCT spj1.s_id\nFROM spj AS spj1\nWHERE spj1.p_id = 'P1'\n  AND spj1.qty \u003e\n    (SELECT avg(spj2.qty)\n     FROM spj AS spj2\n     WHERE spj2.p_id = 'P1'\n       AND spj2.j_id = spj1.j_id);\n\n-- 7.40. Найти номера проектов, для которых поставщиками из Лондона не поставляется ни одна деталь красного цвета\n\nSELECT j.j_id\nFROM j\nWHERE NOT EXISTS\n    (SELECT *\n     FROM spj,\n          p,\n          s\n     WHERE spj.j_id = j.j_id\n       AND spj.p_id = p.p_id\n       AND spj.s_id = s.s_id\n       AND p.color = 'Red'\n       AND s.city = 'London');\n\n-- 7.41. Определить номера проектов, детали для которых полностью поставляются поставщиком с номером S1\n\nSELECT j.j_id\nFROM j\nWHERE NOT EXISTS\n    (SELECT *\n     FROM spj\n     WHERE spj.j_id = j.j_id\n       AND NOT (spj.s_id = 'S1'));\n\n-- 7.42 Определить номера деталей, поставляемых для лондонских проектов\n\nSELECT DISTINCT spj.p_id FROM spj\nJOIN j ON spj.j_id = j.j_id\nWHERE j.city = 'London';\n\n-- 7.43. Установить номера поставщиков одной и той же детали для всех проектов (*SPJ не пустое отношение*)\n\nSELECT s.s_id\nFROM s\nWHERE EXISTS\n    (SELECT *\n     FROM p\n     WHERE NOT EXISTS\n         (SELECT *\n          FROM j\n          WHERE NOT EXISTS\n              (SELECT *\n               FROM spj\n               WHERE spj.s_id = s.s_id\n                 AND spj.p_id = p.p_id\n                 AND spj.j_id = j.j_id)));\n\n-- 7.44. Определить номера проектов, в состав которых входят, по меньшей мере, все типы деталей, поставляемых поставщиком с номером S1\n\nSELECT j.j_id\nFROM j\nWHERE NOT EXISTS\n    (SELECT *\n     FROM spj AS spj1\n     WHERE spj1.s_id ='S1'\n       AND NOT EXISTS\n         (SELECT *\n          FROM spj AS spj2\n          WHERE spj2.p_id = spj1.p_id\n            AND spj2.j_id = j.j_id));\n\n-- 7.45. Установить все города, в которых находится по крайней мере один поставщик, одна деталь или один проект\n\nSELECT s.city\nFROM s\nUNION\nSELECT p.city\nFROM p\nUNION\nSELECT j.city\nFROM j;\n\n-- 7.46. Определить номера деталей, поставляемых либо лондонским поставщиком, либо для лондонского проекта\n\nSELECT DISTINCT spj.p_id\nFROM spj\nWHERE\n    (SELECT s.city\n     FROM s\n     WHERE s.s_id = spj.s_id) = 'London'\n  OR\n    (SELECT j.city\n     FROM j\n     WHERE j.j_id = spj.j_id) = 'London';\n\n-- 7.47. Найти все пары \"номер поставщика – номер детали\", причем только такие, в которых данный поставщик не поставляет данную деталь\n\nSELECT s.s_id,\n       p.p_id\nFROM s\nCROSS JOIN p\nEXCEPT\nSELECT spj.s_id,\n       spj.p_id\nFROM spj;\n\n-- 7.48. **TODO** Определить все пары номеров поставщиков (скажем, Sx и Sy), причем такие, что оба эти поставщика поставляют в точности одно и то же множество деталей\n\n-- 7.49. **TODO** Подготовить в виде бинарного отношения \"сгруппированную\" версию всех поставок, в которой для каждой пары \"номер поставщика - номер детали\" показан соответствующий номер проекта и количество поставленных деталей\n\n-- 7.50. **TODO** Получить \"разгруппированную\" версию отношения, полученного в результате выполнения упражнения 7.49\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseigtm%2Fdb-spbpu-control-work","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fseigtm%2Fdb-spbpu-control-work","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseigtm%2Fdb-spbpu-control-work/lists"}