Большинство ответов здесь находятся на правильном пути. Однако строка не является кортежем . Кортежи *
являются неупорядоченными наборами известных значений с именами. Таким образом, следующие кортежи - это одно и то же (я использую воображаемый синтаксис кортежа, поскольку реляционный кортеж в значительной степени является теоретической конструкцией):
(x=1, y=2, z=3)
(z=3, y=2, x=1)
(y=2, z=3, x=1)
... при условии, конечно, что x, y и z являются целыми числами. Также обратите внимание, что не существует такого понятия, как «дубликат» кортежа. Таким образом, они не только равны, но и 1011 * одно и то же . Наконец, кортежи могут содержать только известные значения (т. Е. Ноль).
A строка **
- упорядоченный набор известных или неизвестных значений с именами (хотя они могут быть опущены). Поэтому следующие сравнения возвращают false в SQL:
(1, 2, 3) = (3, 2, 1)
(3, 1, 2) = (2, 1, 3)
Обратите внимание, что есть способы «подделать это». Например, рассмотрим этот оператор INSERT
:
INSERT INTO point VALUES (1, 2, 3)
Предполагая, что x является первым, y является вторым, а z является третьим, этот запрос может быть переписан следующим образом:
INSERT INTO point (x, y, z) VALUES (1, 2, 3)
или это:
INSERT INTO point (y, z, x) VALUES (2, 3, 1)
... но все, что мы на самом деле делаем, это меняем порядок, а не удаляем его.
А также обратите внимание, что могут быть и неизвестные значения. Таким образом, у вас могут быть строки с неизвестными значениями:
(1, 2, NULL) = (1, 2, NULL)
... но учтите, что это сравнение всегда даст UNKNOWN
. В конце концов, как узнать, равны ли два неизвестных значения?
И, наконец, строки могут дублироваться. Другими словами, (1, 2)
и (1, 2)
могут сравниваться, чтобы быть равными, но это не обязательно означает, что это одно и то же.
Если эта тема вас интересует, я настоятельно рекомендую прочитать SQL и реляционная теория: как написать точный код SQL от CJ Date.
*
Обратите внимание, что я говорю о кортежах, которые существуют в реляционной модели, которая немного отличается от математики в целом.
**
И на тот случай, если вам интересно, почти все в SQL - это строка или таблица. Следовательно, (1, 2)
- это строка, а VALUES (1, 2)
- таблица (с одной строкой).
ОБНОВЛЕНИЕ : я немного расширил этот ответ в сообщении в блоге здесь .