SELECT 1 FROM TABLE_NAMEозначает «Возврат 1 из таблицы». Сам по себе он довольно ничем не примечателен, поэтому обычно его используют WHEREи часто EXISTS(как отмечает @gbn, это не обязательно является наилучшей практикой, однако достаточно распространенным, чтобы его можно было заметить, даже если оно не имеет особого смысла ( Тем не менее, я буду использовать его, потому что другие используют его, и это сразу становится «более очевидным». Конечно, это может быть проблема вязкой курицы и яйца, но я обычно не зацикливаюсь)).
SELECT*FROM TABLE1 T1 WHEREEXISTS(SELECT1FROM TABLE2 T2 WHERE T1.ID= T2.ID
);
По сути, вышесказанное вернет все из таблицы 1, у которой есть соответствующий идентификатор из таблицы 2. (Это, конечно, надуманный пример, но я верю, что он передает идею. Лично я, вероятно, сделал бы вышеизложенное, SELECT * FROM TABLE1 T1 WHERE ID IN (SELECT ID FROM TABLE2);поскольку я рассматриваю это как FAR более явный для читателя, если не было убедительной причины не делать этого).
РЕДАКТИРОВАТЬ
На самом деле есть один случай, о котором я забыл до сих пор. В случае, когда вы пытаетесь определить наличие значения в базе данных на внешнем языке, иногда SELECT 1 FROM TABLE_NAMEбудет использоваться. Это не дает существенного преимущества по сравнению с выбором отдельного столбца, но, в зависимости от реализации, может принести существенный выигрыш по сравнению с выполнением SELECT *, просто потому, что часто бывает, что чем больше столбцов возвращает БД на язык, тем больше объем данных. структура, которая, в свою очередь, означает, что потребуется больше времени.
А почему "нормально" с EXISTS? У вас есть доказательства почему ?
ГБН
6
И -1 для распространения мифа о...EXISTS (SELECT 1...
gbn
2
@ Гбн Понятия не имею, почему я видел это там гораздо чаще, чем что-либо еще. Я просто видел это там гораздо чаще.
cwallenpoole
2
Вязкая курица? Не хотел бы есть это! Может быть, это должна быть «злая проблема с курицей и яйцом»?
No'am Newman
2
@Ben: IN и EXIST обычно оптимизируются по одному и тому же плану
gbn
107
select 1 from tableвернет константу 1 для каждой строки таблицы. Это полезно, когда вы хотите дешево определить, соответствует ли запись вашему whereпредложению и / или join.
Очень важный момент по сути: «для КАЖДОЙ строки в таблице». Таким образом, проверка «доступности таблицы» как части, например, проверки работоспособности таблицы с сотнями миллионов строк, приведет к результирующему набору сотен миллионов «1». (примечание: не то, чтобы это когда-либо происходило ... в производстве;);))
только что проверил, что postgres уважает это, exists (select 1/0работает как шарм
alex
22
он делает то, что говорит - он всегда возвращает целое число 1. Он используется для проверки, существует ли запись, соответствующая вашему предложению where.
хм - вопрос был "что это значит", а не "это хорошая практика". Я согласен, что это не имеет значения с точки зрения производительности - но это соглашение, которое используют разработчики, предположительно, потому что 1 обычно интерпретируется как «истина».
Невилл Кайт
20
select 1 from table используется некоторыми базами данных в качестве запроса для проверки соединения на предмет его работоспособности, часто используется при получении или возврате соединения в / из пула соединений.
Не совсем, я попытался создать пустую таблицу и выполнить запрос, результат - шесть единиц.
r0ng
9
Хотя это широко не известно, запрос может иметь HAVINGпредложение без GROUP BYпредложения.
При таких обстоятельствах HAVINGпункт применяется ко всему набору. Очевидно, что SELECTпредложение не может ссылаться ни на один столбец, в противном случае вы бы (исправили) получили ошибку: «Столбец недопустим в select, потому что он не содержится в GROUP BY» и т. Д.
Таким образом, буквенное значение должно быть использовано (поскольку SQL не позволяет результирующего с нулевыми столбцами - почему ?!) и буквенное значение 1 ( INTEGER) обычно используется: если HAVINGоговорка оценивает TRUEто ResultSet будет одна строка с одним столбец показывает значение 1, в противном случае вы получите пустой набор.
Пример: чтобы определить, имеет ли столбец более одного отдельного значения:
«Очевидно, что ВЫБРАТЬ положение не может ссылаться на любой столбец» - Не было бы более разумно выбрать логическое выражение: SELECT MIN(colA) < MAX(colA) FROM tableA?
Пол Шпигель
7
Чтобы быть немного более конкретным, вы должны использовать это, чтобы сделать
SELECT1FROM MyUserTable WHERE user_id =33487
вместо того, чтобы делать
SELECT*FROM MyUserTable WHERE user_id =33487
потому что вам не важно смотреть на результаты. Запрашивать номер 1 очень просто для базы данных (так как она не требует каких-либо поисков).
Согласно комментариям выше, похоже, что Select 1 не лучше по производительности, чем select *, так ли это?
eRaisedToX
5
Если вы не знаете, есть ли какие-либо данные в вашей таблице или нет, вы можете использовать следующий запрос:
SELECT cons_value FROM table_name;
Для примера:
SELECT1FROM employee;
Он вернет столбец, который содержит общее количество строк, и все строки имеют одинаковое постоянное значение 1 (для этого времени он возвращает 1 для всех строк);
Если в вашей таблице нет строки, она ничего не вернет.
Таким образом, мы используем этот SQL-запрос, чтобы узнать, есть ли какие-либо данные в таблице, а количество строк показывает, сколько строк существует в этой таблице.
Это означает, что вы хотите получить значение « 1 » в качестве выходных данных или большую часть времени использовать как внутренние запросы, потому что по какой-то причине вы хотите вычислять внешние запросы на основе результата внутренних запросов ... не всегда, когда вы используете 1, а вы есть определенные значения ...
это просто означает, что вы извлекаете номер первого столбца из таблицы ,,,, означает, что выберите Emply_num, Empl_no From Employees; здесь вы используете выберите 1 из сотрудников; это означает, что вы получаете столбец Emply_num. Спасибо
Я помню такой синтаксис, но он специфичен для базы данных, я не могу вспомнить. Postgresql?
diynevala
0
Причина в другом, по крайней мере, для MySQL. Это из руководства MySQL
InnoDB вычисляет значения мощности индекса для таблицы при первом обращении к ней после запуска, вместо сохранения таких значений в таблице. Этот шаг может занять значительное время в системах, которые разбивают данные на множество таблиц. Поскольку эти издержки применяются только к начальной операции открытия таблицы, чтобы «прогреть» таблицу для последующего использования, получите к ней доступ сразу после запуска, выполнив инструкцию, такую как SELECT 1 FROM tbl_name LIMIT 1
Это просто для удобства используется с IF EXISTS (). В противном случае вы можете пойти с
select * from [table_name]
Image В случае 'IF EXISTS' нам просто нужно знать, что любая строка с указанным условием существует или не имеет значения, что является содержимым строки.
select 1 from Users
приведенный выше пример кода, возвращает нет. строк равно нет. пользователей с 1 в одном столбце
Ответы:
SELECT 1 FROM TABLE_NAME
означает «Возврат 1 из таблицы». Сам по себе он довольно ничем не примечателен, поэтому обычно его используютWHERE
и частоEXISTS
(как отмечает @gbn, это не обязательно является наилучшей практикой, однако достаточно распространенным, чтобы его можно было заметить, даже если оно не имеет особого смысла ( Тем не менее, я буду использовать его, потому что другие используют его, и это сразу становится «более очевидным». Конечно, это может быть проблема вязкой курицы и яйца, но я обычно не зацикливаюсь)).По сути, вышесказанное вернет все из таблицы 1, у которой есть соответствующий идентификатор из таблицы 2. (Это, конечно, надуманный пример, но я верю, что он передает идею. Лично я, вероятно, сделал бы вышеизложенное,
SELECT * FROM TABLE1 T1 WHERE ID IN (SELECT ID FROM TABLE2);
поскольку я рассматриваю это как FAR более явный для читателя, если не было убедительной причины не делать этого).РЕДАКТИРОВАТЬ
На самом деле есть один случай, о котором я забыл до сих пор. В случае, когда вы пытаетесь определить наличие значения в базе данных на внешнем языке, иногда
SELECT 1 FROM TABLE_NAME
будет использоваться. Это не дает существенного преимущества по сравнению с выбором отдельного столбца, но, в зависимости от реализации, может принести существенный выигрыш по сравнению с выполнениемSELECT *
, просто потому, что часто бывает, что чем больше столбцов возвращает БД на язык, тем больше объем данных. структура, которая, в свою очередь, означает, что потребуется больше времени.источник
...EXISTS (SELECT 1...
select 1 from table
вернет константу 1 для каждой строки таблицы. Это полезно, когда вы хотите дешево определить, соответствует ли запись вашемуwhere
предложению и / илиjoin
.источник
Если вы имеете в виду что-то вроде
тогда это миф, что
1
лучше, чемЗнак
1
или*
в EXISTS игнорируется, и вы можете написать это в соответствии со стандартом ANSI SQL 1992 :источник
exists (select 1/0
работает как шармон делает то, что говорит - он всегда возвращает целое число 1. Он используется для проверки, существует ли запись, соответствующая вашему предложению where.
источник
select 1 from table
используется некоторыми базами данных в качестве запроса для проверки соединения на предмет его работоспособности, часто используется при получении или возврате соединения в / из пула соединений.источник
Результат
1
для каждой записи в таблице.источник
Хотя это широко не известно, запрос может иметь
HAVING
предложение безGROUP BY
предложения.При таких обстоятельствах
HAVING
пункт применяется ко всему набору. Очевидно, чтоSELECT
предложение не может ссылаться ни на один столбец, в противном случае вы бы (исправили) получили ошибку: «Столбец недопустим в select, потому что он не содержится в GROUP BY» и т. Д.Таким образом, буквенное значение должно быть использовано (поскольку SQL не позволяет результирующего с нулевыми столбцами - почему ?!) и буквенное значение 1 (
INTEGER
) обычно используется: еслиHAVING
оговорка оцениваетTRUE
то ResultSet будет одна строка с одним столбец показывает значение 1, в противном случае вы получите пустой набор.Пример: чтобы определить, имеет ли столбец более одного отдельного значения:
источник
SELECT MIN(colA) < MAX(colA) FROM tableA
?Чтобы быть немного более конкретным, вы должны использовать это, чтобы сделать
вместо того, чтобы делать
потому что вам не важно смотреть на результаты. Запрашивать номер 1 очень просто для базы данных (так как она не требует каких-либо поисков).
источник
Если вы не знаете, есть ли какие-либо данные в вашей таблице или нет, вы можете использовать следующий запрос:
Для примера:
Таким образом, мы используем этот SQL-запрос, чтобы узнать, есть ли какие-либо данные в таблице, а количество строк показывает, сколько строк существует в этой таблице.
источник
Это означает, что вы хотите получить значение « 1 » в качестве выходных данных или большую часть времени использовать как внутренние запросы, потому что по какой-то причине вы хотите вычислять внешние запросы на основе результата внутренних запросов ... не всегда, когда вы используете 1, а вы есть определенные значения ...
Это статически даст вам вывод как значение 1.
источник
Если вы просто хотите проверить истину или ложь на основе предложения WHERE, выберите 1 из таблицы, где условие - самый дешевый способ.
источник
Я вижу, что он всегда используется в SQL-инъекциях, таких как:
www.urlxxxxx.com/xxxx.asp?id=99 union select 1,2,3,4,5,6,7,8,9 from database;
Эти числа могут использоваться, чтобы угадать, где база данных существует, и угадать имя столбца базы данных, которую вы указали. И значения таблиц.
источник
это просто означает, что вы извлекаете номер первого столбца из таблицы ,,,, означает, что выберите Emply_num, Empl_no From Employees; здесь вы используете выберите 1 из сотрудников; это означает, что вы получаете столбец Emply_num. Спасибо
источник
Причина в другом, по крайней мере, для MySQL. Это из руководства MySQL
источник
Это просто для удобства используется с IF EXISTS (). В противном случае вы можете пойти с
select * from [table_name]
Image В случае 'IF EXISTS' нам просто нужно знать, что любая строка с указанным условием существует или не имеет значения, что является содержимым строки.
select 1 from Users
приведенный выше пример кода, возвращает нет. строк равно нет. пользователей с 1 в одном столбце
источник