SQL -> реляционная алгебра - PullRequest
4 голосов
/ 24 апреля 2011

Предположим, у меня есть следующие отношения:

Branch (branchNo(PK), street, city, postcode)

Staff (staffNo(PK), fName, lName, sex, branchNo(FK))

Не то чтобы это имеет значение для этого вопроса, но PK = первичный ключ и FK = внешний ключ

Как бы я написал реляционную алгебру для следующего запроса:

Перечислите имена всех сотрудников женского пола, которые работают в Глазго.

Моя попытка:

σ<sub>Staff.sex=F & Branch.city = Glasgow</sub>(π<sub>fName, lName, sex, branchNo</sub>(Staff) x π<sub>city, branchNo</sub>(Branch))

Я знаю, что мой оператор selection (σ) (НЕ ЗАМЕТЛЯЕТСЯ В SELECT) синтаксически неверен:

σStaff.sex=F & Branch.city = Glasgow

Как мне написать две выборки для разных отношений? Или, другими словами, как мне выразить оператор SQL с двумя или более условиями в предложении WHERE в реляционной алгебре? Я использовал '&', но это не может быть правильно? Нужно ли встраивать один выбор в другой?

НЕ РАБОТАЕТ

1 Ответ

6 голосов
/ 24 апреля 2011

Формальная реляционная алгебра использует логическое соединение и дизъюнкция и (как правило) символы для одного и того же ( и соответственно)Хотя авторы могут сами выбирать свой синтаксис.Запрос может быть записан как:

&pi;<sub>fName, lName</sub>(&sigma;<sub>(gender=F &and; city=Glasgow)</sub>(Staff &#x22C8; Branch))

Обратите внимание, что x (скорее, ⨯) является символом для декартового произведения.Для естественных объединений вы хотите bow (галстук-бабочка).

Если вы хотите получить декартово произведение, а не естественное объединение, вы в основном реализуете естественное объединение, добавляя соответствующее условие в выборку.Вам также необходимо учитывать тот факт, что атрибут branchNo является общим для обоих отношений, что можно сделать с помощью оператора переименования (ρ).

&pi;<sub>fName, lName</sub>(&sigma;<sub>(gender=F &and; city=Glasgow &and; branchNo=bNum)</sub>(Staff &#x2A2F; &rho;<sub>bNum/branchNo</sub>(Branch)))

Формально вы можете сделать это, потому что:

R &#x22C8; S = &pi;<sub>&alpha;(R),&alpha;(S)-&alpha;(R)</sub>(&sigma;<sub>&alpha;(R)&cap;&alpha;(S)=t<sub>1..k</sub></sub>(R &#x2A2F; &rho;<sub> t<sub>1..k</sub>/&alpha;(R)&cap;&alpha;(S)</sub>(S))))

где α (T) - имена атрибутов для отношения T(делая α (R) ∩ α (S) именами общих атрибутов) и t 1..k ⊈ α (R) ∪ α (S) являются новыми именами для общих атрибутов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...