ВИБІР * ІМЕННЯ таблиці, де 1


129

Мені було цікаво. Які відмінності між цими відповідними запитами:

  1. SELECT * FROM `tablename`

  2. SELECT * FROM `tablename` WHERE 1

  3. SELECT * FROM `tablename` WHERE 1=1


9
чи є "занадто вузький" прапор для тегів? тому що це стосується багатьох, якщо не всіх, діалектів SQL. Я часто бачу це і в MSSQL та Oracle. btw, що таке апострофи? не є "backtick", який використовується для цитування імен об'єктів mysql?
Cee McSharpface

3
@dlatikay ви можете редагувати теги ...
Braiam

2
хм. чому не просто ... WHERE TRUE? Я усвідомлюю, що (у більшості SQL, включаючи MySQL) TRUE - це просто химерний макрос, 1але все-таки хіба це не так очевидно для читача?

2
2 недійсний у більшості діалектів SQL
edc65

Відповіді:


177

2 і 3 в MySQL однакові, функціонально 1 теж однаковий.

where 1 не є стандартним, тому, як зазначали інші, не буде працювати в інших діалектах.

Люди, які додають where 1або, where 1 = 1таким чином, whereумови можуть бути легко додані або видалені до / із запиту, додавши / коментуючи деякі " and..." компоненти.

тобто

SELECT * FROM `tablename` WHERE 1=1
--AND Column1 = 'Value1'
AND Column2 = 'Value2'

11
А також, коли ви програмно будуєте запит у рядок, щоб виконати його пізніше, якщо ви додасте, WHERE 1=1вам не потрібно буде дбати, якщо умова, яку ви намагаєтеся додати до рядка, є першою (тому знадобиться WHEREперед ) чи ні.
Вінсент Оліверт Рієра

45
Програмував 6 років і ніколи не думав цього робити - дякую!
SimonGates

6
ORDER BY 1Синтаксис @dlatikay потрібен (замість імен стовпців), якщо ви робите об'єднання двох або більше операторів SELECT.
Марк Стюарт

5
@SimonGates Я програмував 6 років і ніколи не думав робити щось інше,
хай

4
@WernerCD Я думаю, що набагато розумніше скласти список фільтр-пропозицій у списку якогось типу, а потім об'єднати їх у " AND "якості роздільника.
Zev Spitz

76

Як відомо, усі троє дають однакові результати. (У булевому контексті MySQL трактує ціле число "1" як істинне - насправді будь-яке число, яке не є "0", трактується як істинне).

Оптимізатор MySQL явно задокументований для видалення постійних умов у WHEREпункті:

  • Постійне усунення стану. . .:

    (В> = 5 І В = 5) АБО (В = 6 І 5 = 5) АБО (В = 7 І 5 = 6) -> В = 5 АБО В = 6

Отже, всі три будуть складені в абсолютно один і той же код.

Всі вони функціонально рівноцінні і повинні мати однакові експлуатаційні характеристики.

Однак, перший і третій є стандартними SQL. Друга викличе якусь булеву помилку вираження у багатьох базах даних. Отже, я б порадив цього уникати (я не впевнений, працює він чи ні в суворому режимі SQL MySQL).

Часто третій використовується при побудові динамічних WHEREпропозицій. Це дозволяє легко додавати додаткові умови, оскільки AND <condition>не турбуйтеся про затримку AND.


6
Це чудова відповідь на те, щоб сказати все, що робить інша відповідь, але вирішально вказавши на різницю, що №2 не відповідає стандарту ANSI.
підкреслити_

16

Якщо ви запитуєте про відмінності у виконанні та результатах, їх немає, 2 і 3 є однаковими WHERE TRUE, і вони матимуть такий самий результат, як і перший.

1 - SELECT * FROM table_name

Результати у всіх даних table_name(без фільтра)

2 - SELECT * FROM table_name WHERE 1

1 буде оцінено як TRUE, отже, без фільтра - кожен запис буде повернутий.

3 - SELECT * FROM table_name where 1=1

Так само, як і останній, 1 = 1 - це TRUEвираз, тому - без фільтра - буде вибрано кожен запис.


14

Усі однакові, але 2 і 3 використовуються для легкого впорядкування AND/ORтаких умов, як:

SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')

8

У 1 MySQL не потребує оцінки будь-яких умов, де БУДЬ.

У 2 і 3, де умова статична і не заснована на значеннях рядків. Він буде оцінюватися логічною логікою і завжди буде правдою.

Функціонально різниці немає. Для чіткості коду слід вибрати 1.


7

Усі однакові, але 2 і 3 використовуються для створення динамічних запитів для умов І / АБО

sqlquery ="  SELECT * FROM `tablename` where 1 =1 "

ми використовуємо формат 2 і 3 для створення динамічного запиту, щоб ми вже знали ключове слово "куди", і ми продовжуємо додавати більше фільтрів. Подібно до

sqlquery  = sqlquery + "and columna =a"
"AND columna =a " then

через кілька рядків, якщо у нас є нові фільтри, ми додаємо "AND coulmnb = b" тощо

Вам не доведеться перевіряти sql-запит на те, де ключове слово як його розміщено в першому чи початковому запиті

SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')

Інакше ми можемо писати sqlquery = "SELECT * FROM tablename"

тоді

якщо немає «де» застереження в sqlquery то

sqlquery  = sqlquery + "where columna =a"

ще

sqlquery  = sqlquery + "and columna =a"

4 провідні пробіли позначають блок коду. Будь ласка , змініть свій відповідь відформатувати його належним чином, і побачити редагування довідки для всієї Markdown форматування Біблії.
Матьє Гіндон

4

Усі вони дають однакову відповідь. Однак спосіб запису 2 і 3 здебільшого полягає в тому, щоб мати контроль над оператором "Where", щоб було легше його додати або видалити пізніше.

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


3

У MS SQL 1 і 3 однакові, однак варіант 2 не працюватиме, варіант 2 є недійсним твердженням, як у MS SQL, WHERE використовується для порівняння деяких значень. Наприклад:

  1. Виберіть * з 'myTable, де ID = 3 (дійсно)
  2. Виберіть * з 'myTable, де 1 = 1 є таким самим, як Вибрати * з' myTable, де 2 = 2 є таким самим, як Вибрати * з 'myTable, де 3 = 3, ви отримаєте ідею (дійсна) така ж, як Вибрати * Від' myTable '

2
  1. SELECT * FROM table_name : він дасть вам усі записи таблиці із запуском будь-якого оператора where.
  2. ВИБІРТЕ * ВІД таблиці_ДІЛИ ДЕ 1 : це умова завжди істинна, її хакер в основному використовує для потрапляння в будь-яку систему. Якщо ви чули про sql ін'єкції, то 2 та 3 - це сценарії, які змушені будувати хакером, щоб отримати всі записи таблиці.
  3. SELECT * FROM table_name where 1 = 1 : Це дасть вам усі записи таблиці, але вона порівняє оператор where і потім рухається вперед, в основному додається, щоб після цього додати або видалити більше операторів.

1

Результат - дає всі записи в зазначеній таблиці замість імені таблиці для всіх трьох запитів

SELECT * FROM tablename WHERE 1- Перевірте цю відповідь

SELECT * FROM tablename WHERE 1=1- Перевірте цю відповідь

Для отримання додаткової інформації про оптимізацію пропозицій WHERE перевірте такі: MYSQL , SQLite , SQL

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