Что делает «выбрать 1 из»?


80

Я прочитал несколько статей, но действительно не понял, что делает select 1 from? Кто-то говорит: «Вам следует использовать select 1вместо select *». Вот примерная таблица:

cust_id     cust_name       cust_address

1000000001  Village Toys    Mapl
1000000002  Kids Place      South
1000000003  Fun4All         Sunny
1000000004  Fun4All         Riverside
1000000005  The Toy Store   53rd

Каков будет результат, когда я напишу, select 1 from customer_tableчто делает это утверждение?


Примерно десять лет назад было разумным посоветовать предложить select 1вместо, select *например, EXISTSстатьи. Оптимизатор был улучшен очень давно. Он никогда не заменял «получить все столбцы из этого набора результатов».
Damien_The_Unbeliever

12
Вы пробовали ???
Джимми Д.

Ответы:


72
select 1 from table

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

if exists(select 1 from table where some_column = 'some_value')

Вероятно, ваш друг говорил, что вместо того, чтобы делать массовый выбор с помощью select * from table, вы должны точно указать столбцы, которые вам нужны, по двум причинам:

1) производительность, и вы можете получить больше данных, чем вам действительно нужно.

2) пользователь запроса может полагаться на порядок столбцов. Если ваша таблица обновляется, клиент будет получать столбцы в другом порядке, чем ожидалось.


33

Конструкция обычно используется в проверках "существования"

if exists(select 1 from customer_table where customer = 'xxx')

или же

if exists(select * from customer_table where customer = 'xxx')

Обе конструкции эквивалентны. Раньше люди говорили, что select * лучше, потому что тогда регулятор запросов будет использовать лучший индексированный столбец. Это оказалось неправдой.


24

Он делает то, что вы просите, SELECT 1 FROM tableбудет SELECT(вернуть) a 1для каждой строки в этой таблице, если бы в таблице было 3 строки, вы бы получили

1
1
1

Взгляните на Count (*) vs Count (1), который может быть проблемой, которую вы описали.


3
Зачем мне это нужно?
CodyBugstein

7
@Imray Это полезно, когда вас просто интересует, является ли условие в вашем WHEREпредложении истинным или ложным. Часто используется в подзапросах.
Андреас

9

Оператор SELECT 1 FROM SomeTableпросто возвращает столбец, содержащий значение 1для каждой строки в вашей таблице. Если вы добавите еще один столбец, например, SELECT 1, cust_name FROM SomeTableэто сделает его немного понятнее:

            cust_name
----------- ---------------
1           Village Toys
1           Kids Place
1           Fun4All
1           Fun4All
1           The Toy Store

4
SELECT COUNT(*) in EXISTS/NOT EXISTS

EXISTS(SELECT CCOUNT(*) FROM TABLE_NAME WHERE CONDITIONS)- EXISTSусловие всегда будет возвращать истину независимо от того, выполняются УСЛОВИЯ или нет.

NOT EXISTS(SELECT CCOUNT(*) FROM TABLE_NAME WHERE CONDITIONS)- NOT EXISTSусловие всегда будет возвращать false независимо от того CONDITIONS, выполнены они или нет.

SELECT COUNT 1 in EXISTS/NOT EXISTS

EXISTS(SELECT CCOUNT 1 FROM TABLE_NAME WHERE CONDITIONS)- EXISTSусловие вернет истину, если CONDITIONSвыполнено. Иначе ложь.

NOT EXISTS(SELECT CCOUNT 1 FROM TABLE_NAME WHERE CONDITIONS)- NOT EXISTSусловие вернет false, если CONDITIONSвыполнено. Иначе правда.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.