Могут ли все SQL-запросы быть представлены в реляционной алгебре, исчислении доменов и кортежей

#sql #database #relational-database #relational-algebra #relational-division

#sql #База данных #реляционная база данных #реляционная алгебра #реляционное разделение

Вопрос:

Мой запрос включает в себя наличие и количество или все. Как они представлены в RA / DRC / TRC? Должен ли я еще больше упростить свой SQL-запрос? Вот упрощенный пример:

 empl(employee (primary key), city)
managers(employee (primary key), manager (foreign key of employee))
  

Если бы я нашел всех сотрудников, которые являются менеджерами (из любого города) ВСЕХ сотрудников в городе X.. Мне нужно было бы использовать having / count. Не уверен, как это будет сделано в RA / DRC / TRC.

Я знаю, что необходимость такого запроса может не иметь смысла, но предполагаю, что это разумно для целей этого вопроса.

Спасибо

Комментарии:

1. Подробнее о реляционном разделении см. В этой статье

2. Какой вопрос вы задаете — заголовок сообщения или текст сообщения? Какие версии RA / DRC / TRC? Что именно означает «представлен в»? Что вы можете сделать, следуя какой ссылке?

Ответ №1:

Ваш запрос был сформулирован немного двусмысленно. Действительно, цель состоит в том, чтобы найти всех менеджеров, которые являются менеджерами для КАЖДОГО сотрудника, который находится в городе X?

Как указал dportas, это вполне выполнимо в RA.

Вот как :

Получите коллекцию всех сотрудников в городе X. Вызовите это EMPX.

Получите коллекцию всех менеджеров. Вызовите этот MGRS.

Сделайте декартово произведение двух. Вызовите это MGRS_EMPX.

Вычтите из этого фактическое значение таблицы (соответствующим образом спроецированное до необходимых атрибутов), в котором указано, какие менеджеры управляют каким сотрудником. Это различие содержит все комбинации менеджеров, которые действительно существуют, с сотрудником, который находится в X, но где этот менеджер не управляет этим сотрудником.

Спроецируйте это различие на атрибут manager. Это отношение сообщает вам, какие менеджеры существуют, так что в городе X существует какой-то сотрудник, которым НЕ управляет этот менеджер.

Вычтите это отношение из MGRS. Очевидно, что это отношение сообщает вам, какие менеджеры существуют, так что НЕ существует сотрудника, расположенного в городе X, которым НЕ управляет этот менеджер.

Переписывание этого отрицания экзистенциального квантора в качестве универсального квантификатора покажет, что это именно тот результат, который вы хотите: НЕ СУЩЕСТВУЕТ (EMP : EMP находится в X, а EMP управляется MGR) === ДЛЯ ВСЕХ EMP: НЕТ (EMP находится в X, а EMP управляется MGR) === ДЛЯ ВСЕХEMP : (EMP отсутствует в X ИЛИ EMP управляется MGR) === ДЛЯ ВСЕХ EMP: (если EMP находится в X, тогда EMP управляется MGR).

И все это совершенно точные операции алгебры.

(Дополнительное упражнение: посмотрите, что произойдет, если в городе X вообще нет сотрудников.)

Комментарии:

1. Отличный ответ. Подробный и информативный. Премного благодарен, добрый сэр!

Ответ №2:

Реляционное разделение — это ответ на ваш конкретный пример — вам не нужен агрегат. Разделение является частью алгебры.

Ваш более общий вопрос является сложным из-за проблем определения того, когда любой возможный результат SQL совпадает с реляционным. Является ли SQL-запрос, возвращающий повторяющиеся строки, эквивалентным реляционному выражению, которое этого не делает? Является ли SQL-запрос с нулевыми значениями в стиле SQL эквивалентным любому реляционному выражению? Как вы выражаете реляционную проекцию без атрибутов, используя только синтаксис SQL?

Я думаю, что единственный разумный ответ — сказать, что модель SQL и реляционная — это две совершенно разные и несовместимые вещи. Вероятно, вам не стоит слишком усердно искать соответствия между ними.

Комментарии:

1. Как бы я использовал разделение в этом случае? Вы имеете в виду разницу в наборе?

2. Менеджеры РАЗДЕЛЯЮТ (ОГРАНИЧИВАЮТ (city =’x’) Empl)

Ответ №3:

Комментарии:

1. Верно, но утверждение OP: «Мне нужно было бы использовать having / count», является ложным.

Ответ №4:

возможно, вы упростили свой вопрос.. но поиск менеджера для сотрудников в городе X — это простое объединение — без учета или наличия.

Редактировать:

 select  * 
from managers m,
( select employee from empl where city = 'XXXXX' ) e
where m.employee = e.employee
  

Комментарии:

1. Привет, Рэнди, спасибо за комментарий. Запрос состоит в том, чтобы найти менеджеров (которые могут быть в разных городах) ВСЕХ сотрудников city X.

2. Рэнди, твой запрос даст менеджерам ЛЮБЫХ (1 или более) сотрудников в городе X. В примере вопроса запрашиваются менеджеры ВСЕХ сотрудников в городе X. Например, если в городе X было три сотрудника, E1 E2 и E3.. Предположим, что M1 является менеджером E1, E2, E3, а M2 является менеджером только E2, E3.. Таблица будет возвращать только M1

3. И он использует SQL-антипаттерн неявного синтаксиса, который является очень плохой техникой программирования, и нет никаких оправданий для использования в 21 веке

4. @John Smith — хорошо, я не понял этого из вашего первоначального сообщения.