Що це означає, вибравши 1 з таблиці?


146

Я бачив багато запитів із чимось наступним.

Select 1  
From table

Що це 1означає, як воно буде виконано і що поверне?

Також, у якому типі сценаріїв це можна використовувати?


Покажіть нам повний запит, будь ласка
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);оскільки я вважаю, що як ЗДАРОЮ більш чітко для читача, якщо не існували поважні причини цього не робити).

EDIT

Насправді є один випадок, про який я забув поки що. У випадку, коли ви намагаєтеся визначити існування значення в базі даних із сторонньої мови, іноді SELECT 1 FROM TABLE_NAMEбуде використано. Це не дає значної вигоди від вибору окремого стовпця, але, залежно від реалізації, воно може принести значні вигоди від виконання операції SELECT *, просто тому, що часто трапляється так, що чим більше стовпців, які БД повертає до мови, тим більше даних структури, що в свою чергу означає, що буде потрібно більше часу.


І чому "нормально" з ІСНУЮЧИМИ? Чи є у вас докази того, чому ?
gbn

6
І -1 для пропаганди міфу...EXISTS (SELECT 1...
gbn

2
@Gbn Не маю ідеї, чому я бачив його там набагато частіше, ніж будь-що інше. Я щойно там бачив його набагато частіше.
cwallenpoole

2
В’язка курка? Не хотів би це їсти! Можливо, це має бути "порочна проблема з куркою та яйцями"?
No'am Newman

2
@Ben: IN та EXIST, як правило, оптимізуються до одного плану
gbn

106

select 1 from tableповерне константу 1 для кожного рядка таблиці. Це корисно, коли ви хочете дешево визначити, чи відповідає запис вашому whereпункту та / або join.


1
Ця відповідь мала для мене найбільш сенс
Йосип Астрахан

2
Насправді дуже важливий момент: " ВСЯКОГО рядок у таблиці". Таким чином, перевірка "доступності таблиці" як частини, наприклад, перевірки здоров'я таблиці зі сто мільйонів рядків, закінчиться набором результатів у сто мільйонів "1". (зауважте: не те, щоб це коли-небудь трапилося ... у виробництві;);))
conny

Буквально це повинна бути прийнята відповідь тут!
Фахад Джавед

40

Якщо ти маєш на увазі щось подібне

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

то це міф, що тим 1краще, ніж

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

Значення 1або *в EXISTS ігнорується, і ви можете записати це відповідно до сторінки 191 стандарту ANSI SQL 1992 :

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

1
щойно перевірив, що postgres поважає це, exists (select 1/0працює як шарм
алекс

22

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


22
uhm - питання було "що це означає", а не "чи це хороша практика". Я погоджуюся, що це не має значення з точки зору продуктивності - але це умова, яку розробники використовують, імовірно, тому, що 1 зазвичай трактується як "правда".
Невілл Куйт

20

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


2
Це був мій випадок, він досить поширений серед програм JBOSS та TOMCAT.
Вальтер Сільва

13

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


Не дуже, я спробував створити порожню таблицю та виконати запит, результат - шість 1.
r0ng

9

Хоча це широко не відомо, запит може мати HAVINGпункт без GROUP BYпункту.

За таких обставин HAVINGстаття застосовується до всього набору. Зрозуміло, що SELECTпункт не може посилатися на жоден стовпець, інакше ви отримаєте (виправите) помилку: "Стовпець недійсний у виборі, оскільки він не міститься у групі BY" тощо.

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

Приклад: щоб дізнатись, чи має стовпець більше одного чіткого значення:

SELECT 1
  FROM tableA
HAVING MIN(colA) < MAX(colA);

"Очевидно, що пункт SELECT не може стосуватися жодного стовпця" - Чи не було б більш розумним вибрати вираз bool 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, щоб дізнатися, чи є в таблиці дані, а кількість рядків вказує, скільки рядків існує в цій таблиці.


3

Це означає, що ви хочете значення " 1 " як вихід або більшу частину часу використовується як Внутрішні запити, оскільки ви чомусь хочете обчислити зовнішні запити на основі результату внутрішніх запитів. Не весь час ви використовуєте 1, але ви мають певні значення ...

Це статично дає результат як значення 1.


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;

Ці цифри можна використовувати, щоб відгадати, де існує база даних, та вгадати ім'я стовпця бази даних, яку ви вказали. І значення таблиць.


0

це просто означає, що ви отримуєте перший стовпець числа з таблиці ,,,, означає вибирати Emply_num, Empl_no від співробітників; тут ви використовуєте Select 1 від Співробітники; це означає, що ви отримуєте стовпець Emply_num. Дякую


Я пам'ятаю такий синтаксис, але він характерний для бази даних, яку я не можу пригадати. Postgresql?
діневала

0

Причина - ще одна, принаймні для MySQL. Це з посібника MySQL

InnoDB обчислює значення індексу кардинальності для таблиці вперше, коли доступ до таблиці після запуску замість того, щоб зберігати такі значення в таблиці. Цей крок може зайняти значний час для систем, які розділяють дані на багато таблиць. Оскільки ця накладка застосовується лише до початкової операції відкриття таблиці, щоб “розігріти” таблицю для подальшого використання, відкрийте її негайно після запуску, видавши оператор типу SELECT 1 FROM tbl_name LIMIT 1


0

Це просто використовується для зручності з IF EXISTS (). Інакше можна піти

select * from [table_name]

Image У випадку "ЯКЩО Є", нам просто потрібно знати, що будь-який рядок із заданою умовою існує чи не має значення, який є вміст рядка.

select 1 from Users

вище приклад код, повертає ні. рядків дорівнює ні. користувачів з 1 в одній колонці

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