Мне было любопытно. Каковы различия между этими соответствующими запросами:SELECT * FROM tablename WHERE 1
SELECT * FROM `tablename`
SELECT * FROM `tablename` WHERE 1
SELECT * FROM `tablename` WHERE 1=1
Мне было любопытно. Каковы различия между этими соответствующими запросами:SELECT * FROM tablename WHERE 1
SELECT * FROM `tablename`
SELECT * FROM `tablename` WHERE 1
SELECT * FROM `tablename` WHERE 1=1
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'
А также, когда вы программно строите запрос в строку, чтобы выполнить его позже, если вы добавите 'WHERE 1 = 1', вам не нужно будет заботиться, если условие вы попытка добавить к строке первая (так что ей понадобится 'WHERE') или нет. –
Был программирование на 6 лет и никогда не думал об этом - спасибо! – SimonGates
Возможно, стоит отметить, что это очень отличается от «ORDER BY 1», который обескуражен и довольно редок: здесь число является индексом столбца для сортировки. – dlatikay
Если вы спрашиваете о различиях в спектаклях и результатов, нет никакого, 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
выражение, поэтому - ни один фильтр - каждая запись будет выбрана.
В 1 MySQL не нуждается в оценке каких-либо условий WHERE.
В 2 и 3, где условие является статическим и не основано на значениях строк. Он будет оцениваться с логической логикой и всегда будет истинным.
Функционально нет разницы. Вы должны выбрать 1 для ясности кода.
Как вы знаете, все три дают одинаковые результаты. (В булевом контексте 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.
«первый и третий стандарт SQL» - очень хорошая точка. – icc97
Это превосходный ответ за то, что он сказал все, что делает другой ответ, но вкратце указывает на то, что №2 не соответствует ANSI. –
Красиво объяснены и выделены хорошие моменты. –
все те же, но 2 и 3 используются для Исли обрабатывать И/ИЛИ условия
как
SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')
Все одинаковы, но 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"
'У вас слишком много форматирования кода' – skrrgwasme
4 ведущих пространства обозначают блок кода. Пожалуйста, отредактируйте свой ответ, чтобы отформатировать его правильно, и см. [Edit help] (http://stackoverflow.com/editing-help) для всей Библии форматирования Markdown. –
Они все выходные и тот же ответ. Однако способы записи 2 и 3 в основном состоят в том, чтобы контролировать оператор «Where», чтобы было проще добавить его или удалить позже.
Я думаю, что первый и третий способ - это правильный способ его написания. Если вам нужен оператор where, который вам нравится в номере 3, в противном случае номер 1 будет достаточно хорошим.
В MS SQL 1 и 3 одинаковы, однако вариант 2 не работает, параметр 2 является недопустимым, как в MS SQL, WHERE используется для сравнения некоторых значений.Например:
1 - SELECT * FROM table_name это даст вам все записи таблицы с запуском в любом месте заявление.
2 - SELECT * FROM table_name WHERE 1 это условие всегда истинно, его в основном используется хакером для доступа в любую систему. Если вы слышали о sql-инъекциях, чем 2 & 3 - это сценарии, которые вынуждены хакером создавать все записи таблицы.
3 - SELECT * FROM table_name где 1 = 1 Это даст вам все записи таблицы, но будет сравнивать оператор where и затем двигаться вперед, в основном это добавлено для добавления или удаления дополнительных инструкций после этого.
Есть ли «слишком узкий» флаг для тегов? потому что это относится ко многим, если не ко всем, диалектам SQL. Я часто вижу это в MSSQL и Oracle. Кстати, что такое апострофы? это не обратная сторона ', используемая для указания имен объектов mysql? – dlatikay
@dlatikay вы можете редактировать теги ... – Braiam
hm. почему бы не просто «... ГДЕ ИСТИНА»? Я знаю, что (в большинстве SQL, включая MySQL) TRUE - всего лишь причудливый макрос для '1' - но все же, разве это не является более очевидным для читателя? – vaxquis