Запутался в числе в выражении SQL SELECT - PullRequest
1 голос
/ 21 сентября 2011

Я читал ссылку на тип SQL "поваренная книга" и натолкнулся на утверждение, с которым мне никогда не приходилось сталкиваться:

INSERT INTO table (col1, col2)
SELECT t.col1, 8
FROM table AS t
WHERE t.col2 = 5
UNION ALL
SELECT 8, 8

Теперь меня смущает число (в данном примере 8), следующее сразу за оператором SELECT. В моем ограниченном опыте работы с SQL я сталкивался только с запросами SELECT, за которыми следуют имена столбцов. Может ли кто-нибудь помочь мне понять, что это делает? Спасибо!

Ответы [ 7 ]

3 голосов
/ 21 сентября 2011

SELECT 8, 8 делает именно то, что кажется;он возвращает результирующий набор с 2 безымянными столбцами, каждый из которых содержит 8 - если вы выполните только это утверждение самостоятельно, вы увидите именно это.

Вы можете выбирать буквальные значения и выражения так же, как и выстолбцы, результаты функций и т. д .;

SELECT 'cake', 123 + 456

UNION ALL объединяет (не дублирует) строки из 1-го выбора таблицы с результатом 2-го выбора, поэтому вы вставляете одну дополнительную строку (8,8) втаблица.

2 голосов
/ 21 сентября 2011
INSERT INTO table1 (col1, col2)

Вставить в таблицу с именем table1 строку со значениями для col и col2.
Установить для всех остальных столбцов значение по умолчанию (или ноль, если их нет).

SELECT t.col1, 8
FROM table AS t
WHERE t.col2 = 5

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

UNION ALL
SELECT 8, 8

Поместите дополнительную строку с помощью только col1= 8, col2 = 8 в результате.

Ссылки :
http://dev.mysql.com/doc/refman/5.0/en/insert-select.html
http://dev.mysql.com/doc/refman/5.0/en/select.html

Из последней ссылки:

SELECT также можно использовать для извлечения строк, вычисленных без ссылки на какую-либо таблицу.
Например:

mysql> SELECT 1 + 1;
       -> 2
2 голосов
/ 21 сентября 2011

Выбирает литералы 8 и 8. Оператор вставит в таблицу значения col1 и 8 из таблицы, где col2 таблицы = 5 И еще одну строку со значениями 8 и 8

2 голосов
/ 21 сентября 2011

Вы можете добавить буквальное значение в оператор выбора.

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

Вы также можете использовать функции, которые не ссылаются на столбцы аналогичным образом.Например,

SELECT t.col1, NOW() AS t

AS t определяет псевдоним столбца для дополнительного столбца.Это не важно в вашем примере, так как он все равно используется в качестве источника для insert.

Я не буду беспокоиться о том, чтобы обратиться к UNION ALL, поскольку это не вызывает у вас замешательства.

1 голос
/ 21 сентября 2011

Это реляционная операция, известная как 'extends * (интересно, что Кодд изначально не использовал расширение в своей реляционной алгебре, вероятно, потому, что он предполагал, что вычисления выполняются во «переднем конце»).

Хотя обычно используется для расчета, расширение, включающее литерал, разрешено, и, хотя оно не очень полезно, с точки зрения языкового дизайна, нет никаких причин его запрещать.

1 голос
/ 21 сентября 2011

Вы можете ВЫБРАТЬ все, что захотите, начиная с полей таблицы и заканчивая пользовательскими выражениями, которые могут быть оценены механизмом SQL (например, table.field * 2).В этом запросе у вас будет 8 полей для каждой возвращаемой записи.

0 голосов
/ 21 сентября 2011

Вы можете поместить значение непосредственно в оператор SELECT.Фактически переменная t.col1 будет иметь разные значения в разных возвращаемых регистрах.8 - буквальное значение.

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