Мне было любопытно. Каковы различия между этими запросами:
-
SELECT * FROM `tablename`
-
SELECT * FROM `tablename` WHERE 1
-
SELECT * FROM `tablename` WHERE 1=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'
Как вы знаете, все три дают одинаковые результаты. (В булевом контексте MySQL рассматривает целое число "1" как истинное - фактически любое число, которое не является "0", рассматривается как истинный).
Оптимизатор MySQL явно документирован для удаления константных условий в WHERE
:
Удаление состояния.,.
(B >= 5 AND B = 5) OR (B = 6 AND 5 = 5) ИЛИ (B = 7 AND 5 = 6) → B = 5 ИЛИ B = 6
Следовательно, все три будут скомпилированы в точно такой же код.
Все они функционально эквивалентны и должны иметь одинаковые рабочие характеристики.
Тем не менее, первый и третий являются стандартными SQL. Второй приведет к некоторой ошибке булева выражения во многих базах данных. Поэтому я бы посоветовал вам избегать этого (я не уверен, работает ли он в строгом режиме SQL MySQL).
Часто третий используется при построении динамических предложений WHERE
. Это упрощает добавление дополнительных условий как AND <condition>
, не беспокоясь о задержке AND
s.
Если вы спрашиваете о различиях в характеристиках и результатах, их нет, 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
, поэтому - нет фильтра - каждая запись будет выбрана.
все одинаковы, но 2 и 3 используются для простой обработки условий AND/OR
как
SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')
В 1 MySQL не нуждается в оценке каких-либо условий WHERE.
В 2 и 3 условие where статично и не зависит от значений строк. Он будет оцениваться с логической логикой и всегда будет истинным.
Функционально нет разницы. Вы должны выбрать 1 для ясности кода.
Все одинаковы, но 2 и 3 используются для создания динамических запросов для условий AND/OR.
sqlquery =" SELECT * FROM `tablename` where 1 =1 "
мы используем формат 2 и 3 для создания динамического запроса, поэтому мы уже знаем "where" добавлено ключевое слово, и мы продолжаем добавлять дополнительные фильтры. Как
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
нет предложения where 'where', тогда
sqlquery = sqlquery + "where columna =a"
еще
sqlquery = sqlquery + "and columna =a"
Все они выдают один и тот же ответ. Однако способы записи 2 и 3 в основном состоят в том, чтобы контролировать оператор "Where", чтобы было проще добавить его или удалить позже.
Я думаю, что первый и третий путь - правильный способ его написания. Если вам нужен оператор where, который вам нравится в номере 3, в противном случае номер 1 будет достаточно хорошим.
В MS SQL 1 и 3 одинаковы, однако вариант 2 не будет работать, параметр 2 является недопустимым, как в MS SQL, WHERE используется для сравнения некоторых значений. Например:
1 - SELECT * FROM table_name он предоставит вам все записи таблицы с запуском любого оператора where.
2 - SELECT * FROM table_name ГДЕ 1 это когда условие всегда верно, его в основном используется хакером, чтобы попасть в любую систему. Если вы слышали о SQL-инъекциях, чем 2 и 3, это сценарии, которые вынуждены хакером создавать все записи таблицы.
3 - SELECT * FROM table_name где 1 = 1 Это даст вам все записи таблицы, но будет сравнивать оператор where, а затем двигаться вперед, в основном он добавляется для добавления или удаления дополнительных инструкций после этого.
Результат. Дает все записи в указанной таблице вместо имени табуляции для всех трех запросов
SELECT * FROM tablename WHERE 1
- Проверьте этот ответ
SELECT * FROM tablename WHERE 1=1
- Проверьте этот ответ
Для получения дополнительной информации о оптимизации предложения WHERE выполните следующие действия: MYSQL, SQLite, SQL