Що робить “вибрати 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
Ви пробували ???
Jimmy D

Відповіді:


72
select 1 from table

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

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

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

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

2) користувач запиту може покладатися на порядок стовпців. Якщо ваша таблиця оновлюється, клієнт отримуватиме стовпці в іншому порядку, ніж очікувалося.


33

Конструкція зазвичай використовується в перевірках "існування"

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

або

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

Обидві конструкції еквівалентні. Раніше люди вважали, що вибір * був кращим, оскільки керуючий запитом тоді використовував би найкращий індексований стовпець. Це було доведено неправдою.


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умова завжди поверне помилкове незалежно від того 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умова поверне хибне, якщо CONDITIONSвиконано. Інакше правда.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.