Имеют ли термины «набор строк» и «строка» разное значение в словаре SQL?

#sql #relational-database #definition #relational-algebra

Вопрос:

Рассмотрим отношение enrolled(student, course) , в котором (student, course) находится первичный ключ, и отношение paid(student, amount) , в котором student находится первичный ключ. Не предполагайте никаких нулевых значений и никаких внешних ключей или ограничений целостности. Учитывая следующие четыре запроса:

Запрос 1:

 select student from enrolled where student in (select student from paid)
 

Запрос 2:

 select student from paid where student in (select student from enrolled)
 

Запрос 3:

 select E.student from enrolled E, paid P where E.student = P.student
 

Запрос 4:

 select student from paid where exists 
    (select * from enrolled where enrolled.student = paid.student)
 

Какое из следующих утверждений является правильным?

(A) Все запросы возвращают идентичные наборы строк для любой базы данных

(B) Query2 и Query4 возвращают одинаковые наборы строк для всех баз данных, но существуют базы данных, для которых Query1 и Query2 возвращают разные наборы строк

(C) Существуют базы данных, для которых Query3 возвращает строго меньшее количество строк, чем Query2

(D) Существуют базы данных, для которых Query4 столкнется с нарушением целостности во время выполнения


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

Теперь немногие из моих коллег придерживаются мнения, что термины «наборы строк» и «строки» имеют разные значения. Говорят, что в SQL, когда мы изменяем таблицу, мы получаем подсказку, что x rows affected . Итак, в SQL кортежи в таблице называются строками (где допускаются дубликаты). В то время как «набор строк» — это набор кортежей в таблице с удаленными дубликатами, основанный на концепции теории множеств (или концепции реляционной алгебры).

В то время как другие коллеги придерживаются мнения, что термины «наборы строк» и «строки» означают одно и то же. Говорят, что в SQL, когда мы выводим таблицу, мы получаем подсказку, что x rows in set . Говорят, что в SQL термины «наборы строк» и «строки» используются взаимозаменяемо.

Лично я чувствую, что они означают одно и то же. Но я не уверен. Пожалуйста, кто-нибудь может подтвердить?

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

1. Отчасти это вопрос английского языка, а не SQL. «возвращает строго меньшее количество строк» означает возвращает набор строк с меньшим количеством элементов. (И «строго» является избыточным.) В целом не имеет смысла говорить о значениях слов или словах, «означающих одно и то же», независимо от использования.

2. Результат запроса SQL «набор строк» здесь не является набором значений строк . Неясно, что имеется в виду: либо набор значений строк, либо список значений строк. Запрос возвращает список значений строк. Неясно, игнорирует ли здесь «набор строк» порядок (предоставление пакета) или нет (предоставление списка). Писать о SQL хронически ужасно неаккуратно. PS Неприкрашенная «строка» может означать значение строки или экземпляр значения строки или переменную со значением строки — спросите докладчика / автора. А французский тост — это не тост. (И не французский.) Дайте ссылку на SQL, используемый в этой цитате, и его определение «набор строк».

3. Похоже, что они означают bag, а не list, потому что в противном случае все варианты являются ложными.

4. Ну, а французский тост — это тост? Язык скользкий. Повторите «строка», это похоже, скажем, на «целое число». Когда кто-то говорит, что у них есть два целых числа, они могут означать два значения, которые должны быть разными, поскольку в противном случае было бы только 1 значение; или они могут сказать это, когда у них есть две шестерки, то есть два экземпляра значения шесть; и они могут небрежно означать переменную или константу, которая содержит целое число. В SQL, в частности, «таблица» используется небрежно для табличного значения или базовой таблицы, т.е. табличной переменной. Всегда различайте значение и переменную и точный тип данных, чтобы было понятно. PS Ваша ссылка на SQL, пожалуйста.

5. И GATE сообщает вам, что он говорит, что использует какие ссылки SQL? В своем последнем комментарии я ссылался на свой комментарий до этого. («набор строк» не является официальным техническим термином SQL. «набор результатов» — это. И это не набор, это список.)

Ответ №1:

Пожалуйста, дайте ссылку и определение того, что говорят ваши «коллеги». SQL — это искажение теории отношений, поэтому в SQL есть «строки» или «записи», а не «кортежи». Некоторые запросы в SQL могут возвращать повторяющиеся строки («пакеты», а не «наборы»), поэтому я бы избегал «set» в SQL, за исключением случаев, когда ваш запрос имеет явный SELECT DISTINCT или в таблицах объявлены ключи, чтобы вы могли быть уверены, что результатом является набор.

(student, course) является первичным ключом, … student является первичным ключом… Не предполагайте никаких нулевых значений и никаких внешних ключей или ограничений целостности.

Первичный ключ — это ограничение целостности. Я полагаю, вы не имеете в виду никаких других ограничений.

Таким образом, набор student значений, отображаемых в enrolled , не имеет никакого отношения к набору student значений, отображаемых paid в. Заданное student значение может отображаться в обоих или только в одном или только в другом. student alone не является первичным ключом enrolled , поэтому там могут быть повторяющиеся student значения. Итак

(A) Все запросы возвращают идентичные наборы строк для любой базы данных

Некоторые из этих запросов могут возвращать повторяющиеся строки (потому что у них нет SELECT DISTINCT . Итак, False: не все запросы возвращают наборы.

Если вы имеете в виду, что все запросы сообщают идентичный набор student значений для любой базы данных, в которой хранится схема: True . (Проверьте это, используя SELECT DISTINCT для всех случаев.)

(B) Query2 и Query4 возвращают идентичные наборы строк …

Вопрос, похоже, опирается на какой-то тонкий смысл «наборов строк», о котором я не собираюсь догадываться. В общем случае SQL-запросы не возвращают «наборы». Избегайте этого термина.

(C) Существуют базы данных, для которых Query3 возвращает строго меньшее количество строк, чем Query2

Я бы не хотел угадывать. Это во многом зависит от конкретной СУБД и от того, как она оптимизирует запросы по первичным ключам.

(D) Существуют базы данных, для которых Query4 столкнется с нарушением целостности во время выполнения

False. Запросы не сталкиваются с нарушениями целостности. Только обновления могут нарушить целостность.

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

1. Это не отвечает на вопрос, заданный post.