ВЫБРАТЬ * ИЗ имя таблицы ГДЕ 1


129

Мне было любопытно. В чем разница между этими запросами:

  1. SELECT * FROM `tablename`

  2. SELECT * FROM `tablename` WHERE 1

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


9
есть ли флаг "слишком узкий" для тегов? потому что это применимо ко многим, если не ко всем, диалектам SQL. Я часто вижу это в MSSQL и Oracle. кстати какие апострофы? разве обратная кавычка `не используется для цитирования имен объектов mysql?
Cee McSharpface 07

3
@dlatikay, вы можете редактировать теги ...
Брайам,

2
гектометр почему не просто ... WHERE TRUE? Я знаю, что (в большинстве SQL, включая MySQL) TRUE - это просто причудливый макрос для 1- но все же, разве это не более очевидно для читателя?

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

Ответы:


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 лет и никогда не думал о том, чтобы заняться чем-нибудь еще, лол
WernerCD

4
@WernerCD Я думаю, что гораздо разумнее создать список предложений фильтра в каком-либо списке, а затем соединить их строкой " AND "в качестве разделителя.
Зев Шпиц

76

Как известно, все три дают одинаковые результаты. (В логическом контексте MySQL обрабатывает целое число «1» как истинное - фактически, любое число, отличное от «0», рассматривается как истинное).

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

  • Постоянное снятие состояния. , .:

    (B> = ​​5 AND B = 5) OR (B = 6 AND 5 = 5) OR (B = 7 AND 5 = 6) -> B = 5 OR B = 6

Следовательно, все три будут скомпилированы в один и тот же код.

Все они функционально эквивалентны и должны иметь одинаковые рабочие характеристики.

Тем не менее, первый и третий - это стандартный SQL. Второй вызовет некоторую ошибку логического выражения во многих базах данных. Итак, я бы посоветовал вам избегать этого (я не уверен, работает ли это в строгом режиме SQL MySQL).

Часто третий используется при построении динамических WHEREпредложений. Это позволяет легко добавлять дополнительные условия, AND <condition>не беспокоясь о затяжных ANDs.


6
Это превосходный ответ для того, чтобы сказать все, что делает другой ответ, но с решающим указанием на разницу в том, что № 2 не соответствует требованиям ANSI.
underscore_d

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 не требуется оценивать какие-либо условия WHERE.

В 2 и 3 условие where является статическим и не основывается на значениях строк. Он будет оцениваться с помощью логической логики и всегда будет истинным.

Функционально разницы нет. Вы должны выбрать 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 форматирования Библии.
Mathieu Guindon

4

Все они дают один и тот же ответ. Однако способ написания 2 и 3 в основном заключается в том, чтобы иметь контроль над оператором «Где», чтобы было легче добавить или удалить его позже.

Я думаю, что первый и третий способ - правильный способ написания. Если вам нужен оператор where, который вам нравится в номере 3, иначе номер 1 будет достаточно хорош.


3

В MS SQL 1 и 3 одинаковы, однако вариант 2 не будет работать, вариант 2 является недопустимым оператором, как и в MS SQL, где для сравнения некоторых значений используется WHERE. Например:

  1. Выберите * из myTable, где ID = 3 (действительный)
  2. Select * from 'myTable, где 1 = 1 совпадает с Select * from' myTable, где 2 = 2 совпадает с Select * from 'myTable, где 3 = 3, вы получаете идею (действительный) такой же, как Select * From' myTable '

2
  1. SELECT * FROM table_name : он предоставит вам все записи таблицы с выполнением любого оператора where.
  2. SELECT * FROM table_name WHERE 1 : здесь условие всегда истинно, чаще всего используется хакером для проникновения в любую систему. Если вы слышали о SQL-инъекциях, то 2 и 3 - это сценарии, которые хакер вынужден создавать для получения всех записей таблицы.
  3. SELECT * FROM table_name, где 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.