Я бачив багато запитів із чимось наступним.
Select 1
From table
Що це 1
означає, як воно буде виконано і що поверне?
Також, у якому типі сценаріїв це можна використовувати?
Я бачив багато запитів із чимось наступним.
Select 1
From table
Що це 1
означає, як воно буде виконано і що поверне?
Також, у якому типі сценаріїв це можна використовувати?
Відповіді:
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);
оскільки я вважаю, що як ЗДАРОЮ більш чітко для читача, якщо не існували поважні причини цього не робити).
Насправді є один випадок, про який я забув поки що. У випадку, коли ви намагаєтеся визначити існування значення в базі даних із сторонньої мови, іноді SELECT 1 FROM TABLE_NAME
буде використано. Це не дає значної вигоди від вибору окремого стовпця, але, залежно від реалізації, воно може принести значні вигоди від виконання операції SELECT *
, просто тому, що часто трапляється так, що чим більше стовпців, які БД повертає до мови, тим більше даних структури, що в свою чергу означає, що буде потрібно більше часу.
...EXISTS (SELECT 1...
select 1 from table
поверне константу 1 для кожного рядка таблиці. Це корисно, коли ви хочете дешево визначити, чи відповідає запис вашому where
пункту та / або join
.
Якщо ти маєш на увазі щось подібне
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...)
exists (select 1/0
працює як шарм
він робить те, що говорить - завжди поверне ціле число 1. Він використовується, щоб перевірити, чи є запис, який відповідає вашому, де існує застереження.
select 1 from table
використовується деякими базами даних як запит для перевірки з'єднання, щоб перевірити, чи є він живим, часто використовується під час отримання або повернення з'єднання в пул з'єднання / з нього.
Хоча це широко не відомо, запит може мати HAVING
пункт без GROUP BY
пункту.
За таких обставин HAVING
стаття застосовується до всього набору. Зрозуміло, що SELECT
пункт не може посилатися на жоден стовпець, інакше ви отримаєте (виправите) помилку: "Стовпець недійсний у виборі, оскільки він не міститься у групі BY" тощо.
Тому необхідно використовувати буквальне значення (оскільки SQL не дозволяє набір результатів з нульовими стовпцями - чому ?!), а INTEGER
зазвичай використовується буквальне значення 1 ( ): якщо HAVING
стаття оцінює, TRUE
то набір результатів буде одним рядком з одним стовпчик із значенням 1, інакше ви отримаєте порожній набір.
Приклад: щоб дізнатись, чи має стовпець більше одного чіткого значення:
SELECT 1
FROM tableA
HAVING MIN(colA) < MAX(colA);
SELECT MIN(colA) < MAX(colA) FROM tableA
:?
Щоб бути трохи більш конкретним, ви використовуєте це для цього
SELECT 1 FROM MyUserTable WHERE user_id = 33487
а не робити
SELECT * FROM MyUserTable WHERE user_id = 33487
тому що вам не байдуже дивитись на результати. Просити номер 1 дуже просто для бази даних (оскільки не потрібно робити жодних пошукових запитів).
Якщо ви не знаєте, чи є у вашій таблиці будь-які дані, ви можете скористатися наступним запитом:
SELECT cons_value FROM table_name;
Для прикладу:
SELECT 1 FROM employee;
Отже, ми використовуємо цей запит SQL, щоб дізнатися, чи є в таблиці дані, а кількість рядків вказує, скільки рядків існує в цій таблиці.
Це означає, що ви хочете значення " 1 " як вихід або більшу частину часу використовується як Внутрішні запити, оскільки ви чомусь хочете обчислити зовнішні запити на основі результату внутрішніх запитів. Не весь час ви використовуєте 1, але ви мають певні значення ...
Це статично дає результат як значення 1.
Якщо ви просто хочете перевірити справжню чи неправдиву на основі пункту WHERE, виберіть 1 із таблиці, де умова є найдешевшим.
Я бачу, що він завжди використовується в ін'єкції SQL, наприклад:
www.urlxxxxx.com/xxxx.asp?id=99 union select 1,2,3,4,5,6,7,8,9 from database;
Ці цифри можна використовувати, щоб відгадати, де існує база даних, та вгадати ім'я стовпця бази даних, яку ви вказали. І значення таблиць.
це просто означає, що ви отримуєте перший стовпець числа з таблиці ,,,, означає вибирати Emply_num, Empl_no від співробітників; тут ви використовуєте Select 1 від Співробітники; це означає, що ви отримуєте стовпець Emply_num. Дякую
Причина - ще одна, принаймні для MySQL. Це з посібника MySQL
InnoDB обчислює значення індексу кардинальності для таблиці вперше, коли доступ до таблиці після запуску замість того, щоб зберігати такі значення в таблиці. Цей крок може зайняти значний час для систем, які розділяють дані на багато таблиць. Оскільки ця накладка застосовується лише до початкової операції відкриття таблиці, щоб “розігріти” таблицю для подальшого використання, відкрийте її негайно після запуску, видавши оператор типу SELECT 1 FROM tbl_name LIMIT 1
Це просто використовується для зручності з IF EXISTS (). Інакше можна піти
select * from [table_name]
Image У випадку "ЯКЩО Є", нам просто потрібно знати, що будь-який рядок із заданою умовою існує чи не має значення, який є вміст рядка.
select 1 from Users
вище приклад код, повертає ні. рядків дорівнює ні. користувачів з 1 в одній колонці