2016-08-07 6 views
124

Мне было любопытно. Каковы различия между этими соответствующими запросами:SELECT * FROM tablename WHERE 1

  1. SELECT * FROM `tablename`

  2. SELECT * FROM `tablename` WHERE 1

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

+9

Есть ли «слишком узкий» флаг для тегов? потому что это относится ко многим, если не ко всем, диалектам SQL. Я часто вижу это в MSSQL и Oracle. Кстати, что такое апострофы? это не обратная сторона ', используемая для указания имен объектов mysql? – dlatikay

+3

@dlatikay вы можете редактировать теги ... – Braiam

+2

hm. почему бы не просто «... ГДЕ ИСТИНА»? Я знаю, что (в большинстве SQL, включая MySQL) TRUE - всего лишь причудливый макрос для '1' - но все же, разве это не является более очевидным для читателя? – vaxquis

ответ

172

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

+2

Возможно, стоит отметить, что это очень отличается от «ORDER BY 1», который обескуражен и довольно редок: здесь число является индексом столбца для сортировки. – dlatikay

15

Если вы спрашиваете о различиях в спектаклях и результатов, нет никакого, 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 выражение, поэтому - ни один фильтр - каждая запись будет выбрана.

6

В 1 MySQL не нуждается в оценке каких-либо условий WHERE.

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

Функционально нет разницы. Вы должны выбрать 1 для ясности кода.

69

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

оптимизатор MySQL явно documented удалить постоянные условия в пункте WHERE:

  • Постоянное удаление состояние. , ,:

    (B> = ​​5 и В = 5) или (В = 6 и 5 = 5) или (В = 7 и 5 = 6) -> B = 5 OR B = 6

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

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

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

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

+10

«первый и третий стандарт SQL» - очень хорошая точка. – icc97

+6

Это превосходный ответ за то, что он сказал все, что делает другой ответ, но вкратце указывает на то, что №2 не соответствует ANSI. –

+0

Красиво объяснены и выделены хорошие моменты. –

12

все те же, но 2 и 3 используются для Исли обрабатывать И/ИЛИ условия

как

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

Все одинаковы, но 2 и 3 используются для создания динамических запросов для И/ИЛИ условия

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

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

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

после нескольких строк, если у нас есть новые фильтры, которые мы добавляем «И coulmnb = Ь» и так далее

Вы не должны проверить запрос 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

'У вас слишком много форматирования кода' – skrrgwasme

+0

4 ведущих пространства обозначают блок кода. Пожалуйста, отредактируйте свой ответ, чтобы отформатировать его правильно, и см. [Edit help] (http://stackoverflow.com/editing-help) для всей Библии форматирования Markdown. –

3

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

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

2

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

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

1 - SELECT * FROM table_name это даст вам все записи таблицы с запуском в любом месте заявление.

2 - SELECT * FROM table_name WHERE 1 это условие всегда истинно, его в основном используется хакером для доступа в любую систему. Если вы слышали о sql-инъекциях, чем 2 & 3 - это сценарии, которые вынуждены хакером создавать все записи таблицы.

3 - SELECT * FROM table_name где 1 = 1 Это даст вам все записи таблицы, но будет сравнивать оператор where и затем двигаться вперед, в основном это добавлено для добавления или удаления дополнительных инструкций после этого.

1

Результат - Дает все записи в таблице, указанные вместо имя_таблицы для всех трех запросов

SELECT * FROM tablename WHERE 1 - Проверить это answer

SELECT * FROM tablename WHERE 1=1 - Проверьте answer

Для получения дополнительной информации о том, где оптимизация предложений: MYSQL, SQLite, SQL