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

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

52 голосов
/ 12 августа 2011

Я прочитал несколько статей, но действительно не понял, что делает select 1 from? Кто-то говорит: «Вы должны использовать вместо 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 что делает это утверждение?

Ответы [ 5 ]

47 голосов
/ 12 августа 2011
select 1 from table

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

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

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

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

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

24 голосов
/ 12 августа 2011

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

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

или

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

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

18 голосов
/ 12 августа 2011

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

1
1
1

Посмотрите на Количество (*) и Количество (1) , которое может быть проблемой, которую вы описали.

7 голосов
/ 12 августа 2011

Оператор 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
3 голосов
/ 23 декабря 2013
SELECT COUNT(*) in EXISTS/NOT EXISTS

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

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

SELECT COUNT 1 in EXISTS/NOT EXISTS

EXISTS(SELECT CCOUNT 1 FROM TABLE_NAME WHERE CONDITIONS) - условие EXISTS вернет true, если соблюдено CONDITIONS. Остальное ложно.

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

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