Что означает выбор 1 из таблицы?

146

Я видел много запросов с чем-то следующим.

Select 1  
From table

Что это 1значит, как он будет выполнен и что он вернет?

Кроме того, в каких случаях это можно использовать?

Разработчик Microsoft
источник
Покажите нам полный запрос, пожалуйста
gbn

Ответы:

107

SELECT 1 FROM TABLE_NAMEозначает «Возврат 1 из таблицы». Сам по себе он довольно ничем не примечателен, поэтому обычно его используют WHEREи часто EXISTS(как отмечает @gbn, это не обязательно является наилучшей практикой, однако достаточно распространенным, чтобы его можно было заметить, даже если оно не имеет особого смысла ( Тем не менее, я буду использовать его, потому что другие используют его, и это сразу становится «более очевидным». Конечно, это может быть проблема вязкой курицы и яйца, но я обычно не зацикливаюсь)).

 SELECT * FROM TABLE1 T1 WHERE EXISTS (
     SELECT 1 FROM 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 *, просто потому, что часто бывает, что чем больше столбцов возвращает БД на язык, тем больше объем данных. структура, которая, в свою очередь, означает, что потребуется больше времени.

cwallenpoole
источник
А почему "нормально" с 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
Этот ответ
Джозеф Астрахань,
2
Очень важный момент по сути: «для КАЖДОЙ строки в таблице». Таким образом, проверка «доступности таблицы» как части, например, проверки работоспособности таблицы с сотнями миллионов строк, приведет к результирующему набору сотен миллионов «1». (примечание: не то, чтобы это когда-либо происходило ... в производстве;);))
Конни
Буквально, это должен быть принятый ответ здесь!
Фахад Джавед
41

Если вы имеете в виду что-то вроде

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT 1 FROM table WHERE...) 

тогда это миф, что 1лучше, чем

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT * FROM table WHERE...) 

Знак 1или *в EXISTS игнорируется, и вы можете написать это в соответствии со стандартом ANSI SQL 1992 :

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT 1/0 FROM table WHERE...) 
ГБН
источник
1
только что проверил, что postgres уважает это, exists (select 1/0работает как шарм
alex
22

он делает то, что говорит - он всегда возвращает целое число 1. Он используется для проверки, существует ли запись, соответствующая вашему предложению where.

Невилл Кайт
источник
22
хм - вопрос был "что это значит", а не "это хорошая практика". Я согласен, что это не имеет значения с точки зрения производительности - но это соглашение, которое используют разработчики, предположительно, потому что 1 обычно интерпретируется как «истина».
Невилл Кайт
20

select 1 from table используется некоторыми базами данных в качестве запроса для проверки соединения на предмет его работоспособности, часто используется при получении или возврате соединения в / из пула соединений.

Том
источник
2
Это был мой случай, он довольно распространен среди приложений JBOSS и TOMCAT.
Вальтер Сильва
13

Результат 1для каждой записи в таблице. __

TiyebM
источник
Не совсем, я попытался создать пустую таблицу и выполнить запрос, результат - шесть единиц.
r0ng
9

Хотя это широко не известно, запрос может иметь HAVINGпредложение без GROUP BYпредложения.

При таких обстоятельствах HAVINGпункт применяется ко всему набору. Очевидно, что SELECTпредложение не может ссылаться ни на один столбец, в противном случае вы бы (исправили) получили ошибку: «Столбец недопустим в select, потому что он не содержится в GROUP BY» и т. Д.

Таким образом, буквенное значение должно быть использовано (поскольку SQL не позволяет результирующего с нулевыми столбцами - почему ?!) и буквенное значение 1 ( INTEGER) обычно используется: если HAVINGоговорка оценивает TRUEто ResultSet будет одна строка с одним столбец показывает значение 1, в противном случае вы получите пустой набор.

Пример: чтобы определить, имеет ли столбец более одного отдельного значения:

SELECT 1
  FROM tableA
HAVING MIN(colA) < MAX(colA);
onedaywhen
источник
«Очевидно, что ВЫБРАТЬ положение не может ссылаться на любой столбец» - Не было бы более разумно выбрать логическое выражение: SELECT MIN(colA) < MAX(colA) FROM tableA?
Пол Шпигель
7

Чтобы быть немного более конкретным, вы должны использовать это, чтобы сделать

SELECT 1 FROM MyUserTable WHERE user_id = 33487

вместо того, чтобы делать

SELECT * FROM MyUserTable WHERE user_id = 33487

потому что вам не важно смотреть на результаты. Запрашивать номер 1 очень просто для базы данных (так как она не требует каких-либо поисков).

Роберт Мартин
источник
Согласно комментариям выше, похоже, что Select 1 не лучше по производительности, чем select *, так ли это?
eRaisedToX
5

Если вы не знаете, есть ли какие-либо данные в вашей таблице или нет, вы можете использовать следующий запрос:

SELECT cons_value FROM table_name;

Для примера:

SELECT 1 FROM employee;
  1. Он вернет столбец, который содержит общее количество строк, и все строки имеют одинаковое постоянное значение 1 (для этого времени он возвращает 1 для всех строк);
  2. Если в вашей таблице нет строки, она ничего не вернет.

Таким образом, мы используем этот SQL-запрос, чтобы узнать, есть ли какие-либо данные в таблице, а количество строк показывает, сколько строк существует в этой таблице.

mahbub_siddique
источник
3

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

Это статически даст вам вывод как значение 1.

DShah
источник
3

Если вы просто хотите проверить истину или ложь на основе предложения WHERE, выберите 1 из таблицы, где условие - самый дешевый способ.


источник
2

Я вижу, что он всегда используется в SQL-инъекциях, таких как:

www.urlxxxxx.com/xxxx.asp?id=99 union select 1,2,3,4,5,6,7,8,9 from database;

Эти числа могут использоваться, чтобы угадать, где база данных существует, и угадать имя столбца базы данных, которую вы указали. И значения таблиц.

EmilyAvon
источник
0

это просто означает, что вы извлекаете номер первого столбца из таблицы ,,,, означает, что выберите Emply_num, Empl_no From Employees; здесь вы используете выберите 1 из сотрудников; это означает, что вы получаете столбец Emply_num. Спасибо

Зеешан Раджпут
источник
Я помню такой синтаксис, но он специфичен для базы данных, я не могу вспомнить. Postgresql?
diynevala
0

Причина в другом, по крайней мере, для MySQL. Это из руководства MySQL

InnoDB вычисляет значения мощности индекса для таблицы при первом обращении к ней после запуска, вместо сохранения таких значений в таблице. Этот шаг может занять значительное время в системах, которые разбивают данные на множество таблиц. Поскольку эти издержки применяются только к начальной операции открытия таблицы, чтобы «прогреть» таблицу для последующего использования, получите к ней доступ сразу после запуска, выполнив инструкцию, такую ​​как SELECT 1 FROM tbl_name LIMIT 1

Рамона Морея
источник
0

Это просто для удобства используется с IF EXISTS (). В противном случае вы можете пойти с

select * from [table_name]

Image В случае 'IF EXISTS' нам просто нужно знать, что любая строка с указанным условием существует или не имеет значения, что является содержимым строки.

select 1 from Users

приведенный выше пример кода, возвращает нет. строк равно нет. пользователей с 1 в одном столбце

Арвинд Сингх
источник