Where 1 1 sql зачем
Перейти к содержимому

Where 1 1 sql зачем

  • автор:

Что значит where 1=1

Что такое (1=1)? Что это значит и для чего это? В гугле поискал ответ так так такими умными словами написано, что вообще не понятно, а еще там пишут, что можно и (1=2) написать.

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

6 cores are activated что это значит и что с этим делать?
Доброго времени суток уважаемые форумчане. Возникла вот такая незадача с компом. Пишет 6 cores are.

Что значит Handle hf? Что в эту функцию нужно передавать
мне нужно создать функцию Node * ReadNode(HANDLE hf); (Node это структура) Так вот вопрос в том.

Sleep(8000) — что значит? На что можно заменить в борланд с++?
Не распознаёт Sleep(8000) . Если за комментировать пишет что f заданно но не используется. Как.

4214 / 3054 / 582
Регистрация: 21.01.2011
Сообщений: 13,205

ЦитатаСообщение от Talamaur Посмотреть сообщение

Что такое (1=1)

Используется в нескольких целях:
1. запрос формируется динамически, т.е. например, в зависимости от условий, заданных на какой-то форме, к WHERE добавляются AND . В этом случае, если не нужно добавлять ни одного условия, то останется «голое» WHERE, что вызовет ошибку. А если начинать с WHERE 1 = 1, то запрос в любом случае будет корректным

2. Для целей отладки

1 2 3
WHERE fld1 = val1 AND fld2 = val2 AND . 

Иногда нужно закомментировать какую-то строку. Все строки, кроме первой, комментировать удобно, а если комментровать первую, то надо убирать и первый AND. Если же первой строкой идет 1 = 1, то такой проблемы не возникает.

1 = 2 обычно используется в конструкции CTAS

1 2 3 4 5
CREATE TABLE tab2 AS SELECT * FROM tab1 [ WHERE 1 = 2 ]

Если не указать WHERE, то будет создана новая таблица и все строки старой будут скопированы в новую. Если указать
1 = 2 (я лично привык писать 1 = 0), то не будет выбрано ни одной строки и будет создана таблица без строк.

Заблокирован

обычная замена булевого значения
1=1 — как true
1=2 — как false

еще при динамических запросах можно 1=1 подменять на что-то другое, тогда 1=1 обозначает место куда будет вставлено динамическое условие.

119 / 84 / 42
Регистрация: 14.12.2015
Сообщений: 945

ЦитатаСообщение от Grossmeister Посмотреть сообщение

1. запрос формируется динамически, т.е. например, в зависимости от условий, заданных на какой-то форме, к WHERE добавляются AND . В этом случае, если не нужно добавлять ни одного условия, то останется «голое» WHERE, что вызовет ошибку. А если начинать с WHERE 1 = 1, то запрос в любом случае будет корректным

а можно небольшой примерчик для пояснения, а то я несколько раз перечитал и не совсем понял

Добавлено через 3 минуты

ЦитатаСообщение от Grossmeister Посмотреть сообщение

CREATE TABLE tab2
AS
SELECT *
FROM tab1
[ WHERE 1 = 2 ]

А есть разница как писать 1=2 или 2=1, 1=0 или 0=1? А если написать 0=0 это что будет значить? А какие цифры вообще используются? Цифру 3 можно тут использовать?

Заблокирован

ЦитатаСообщение от Talamaur Посмотреть сообщение

а можно небольшой примерчик для пояснения, а то я несколько раз перечитал и не совсем понял
пример дан в

ЦитатаСообщение от Grossmeister Посмотреть сообщение

2. Для целей отладки
Добавлено через 1 минуту

ЦитатаСообщение от Talamaur Посмотреть сообщение

А есть разница как писать 1=2 или 2=1, 1=0 или 0=1? А если написать 0=0 это что будет значить? А какие цифры вообще используются? Цифру 3 можно тут использовать?

1=2 — ложь
2=1 — ложь
294854784=56353 — ложь
разницы нет

с нулём не шутите

119 / 84 / 42
Регистрация: 14.12.2015
Сообщений: 945

ЦитатаСообщение от belalugoci Посмотреть сообщение

с нулём не шутите
Встречный вопрос: почему?
И все равно не могу понять фразу.

ЦитатаСообщение от Grossmeister Посмотреть сообщение

1. запрос формируется динамически, т.е. например, в зависимости от условий, заданных на какой-то форме, к WHERE добавляются AND . В этом случае, если не нужно добавлять ни одного условия, то останется «голое» WHERE, что вызовет ошибку.

Уже с разной интонацией перечитал.
Пока что единственный второй пункт понял что удобно комментировать строку)

4214 / 3054 / 582
Регистрация: 21.01.2011
Сообщений: 13,205

ЦитатаСообщение от Talamaur Посмотреть сообщение

можно небольшой примерчик для пояснения

1 2 3 4 5 6
v_SQL:= 'WHERE 1 = 1'; IF некое условие> THEN v_SQL:= v_SQL || ' AND fld1 = val1 ' elsif . 

Добавлено через 51 секунду

ЦитатаСообщение от Talamaur Посмотреть сообщение

А есть разница как писать 1=2 или 2=1, 1=0 или 0=1
Разницы никакой, главное, чтобы условие гарантированно возвращало false
Заблокирован

ЦитатаСообщение от Talamaur Посмотреть сообщение

Встречный вопрос: почему?

разные системы, разные языки, компиляторы, трансляторы и т.п. Не принято использовать ноль, но это не значит что нельзя.

разбираем по частям

ЦитатаСообщение от Talamaur Посмотреть сообщение

запрос формируется динамически

то есть сам текст запроса формируется исполняемым кодом

ЦитатаСообщение от Talamaur Посмотреть сообщение

т.е. например, в зависимости от условий, заданных на какой-то форме, к WHERE добавляются AND . В этом случае, если не нужно добавлять ни одного условия, то останется «голое» WHERE, что вызовет ошибку.

например у нас при одном условии нужно сделать

WHERE a.employer=5 AND b.city="NY"

а при другом

WHERE a.employer=7 AND b.city="LA"

а при отсутствии условий

WHERE 1=1

то есть выберется вся таблица
119 / 84 / 42
Регистрация: 14.12.2015
Сообщений: 945

ЦитатаСообщение от Grossmeister Посмотреть сообщение

v_SQL:= ‘WHERE 1 = 1’;
IF THEN
* v_SQL:= v_SQL || ‘ AND fld1 = val1 ‘
elsif
* .

Так а где тут условие WHERE и что за «голый» WHERE.
Тут переменной v_SQL сначала присваивается строка ‘WHERE 1 = 1’. Если ввернет TRUE, то выполнится следующий оператор: v_SQL:= v_SQL || ‘ AND fld1 = val1 ‘. А если вернет FALSE, то .

Добавлено через 3 минуты

ЦитатаСообщение от belalugoci Посмотреть сообщение

а при отсутствии условий
SQL
1
WHERE 1=1

Но WHERE это необязательный оператор. Зачем его писать да еще и с выражение 1=1?

Добавлено через 10 минут

ЦитатаСообщение от Grossmeister Посмотреть сообщение

Если не указать WHERE, то будет создана новая таблица и все строки старой будут скопированы в новую. Если указать
1 = 2 (я лично привык писать 1 = 0), то не будет выбрано ни одной строки и будет создана таблица без строк.

А ограничения, триггеры, индексы тоже будут скопированы в новую таблицу?
Заблокирован

ЦитатаСообщение от Talamaur Посмотреть сообщение

Так а где тут условие WHERE и что за «голый» WHERE.

Это всё равно что с образованием в 3 класса зайти на форум, где физики обсуждают теорию относительности. Если у вас нет базовых представлений об SQL то зачем такие вопросы? Я SQL пользуюсь с 1999 года и ни разу не использовал эту конструкцию, но пользовался в Си например, когда пишется

while (1)

например или

int a = 1; if (!a) {}

ЦитатаСообщение от Talamaur Посмотреть сообщение

А если вернет FALSE, то

выполнится с условие где всегда истина

ЦитатаСообщение от Talamaur Посмотреть сообщение

Но WHERE это необязательный оператор. Зачем его писать да еще и с выражение 1=1?
Вы скучный
Вы любите парсить строки? Писать горы кода? Нет? Вот и другие выбирают простые решения.
4214 / 3054 / 582
Регистрация: 21.01.2011
Сообщений: 13,205

ЦитатаСообщение от Talamaur Посмотреть сообщение

А ограничения, триггеры, индексы тоже будут скопированы в новую таблицу?
Заблокирован
вот смотрите, у вас есть выбор из таблицы

SELECT a

а может быть и выбор с условием

SELECT a WHERE m=5
SELECT a WHERE m=5 AND s=6

как можно сократить число команд со строками?
можно всё свести к константе

SELECT a WHERE 1=1

а при условиях всегда добавлять только

AND условие>

никаких проверок, никаких дополнительных телодвижений
4214 / 3054 / 582
Регистрация: 21.01.2011
Сообщений: 13,205

ЦитатаСообщение от Talamaur Посмотреть сообщение

Так а где тут условие WHERE и что за «голый» WHERE

Допустим, мы начинаем не с WHERE 1 = 1, а просто с WHERE. Если ни одно условие не выполнится, то и получится «голый WHERE». Плюс надо различать, что если условие первое, то надо писать без ведущего ‘AND’, для остальных ведущее AND нужно.
Еще раз — запрограммировать можно все и вполне можно обойтись без 1 = 1. Просто его применение упрощает программный код.

141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429

Ну и чтобы окончательно добить. конструкция может быть использована для реализации ораклом hard parsing чтобы проверить реальное время работы запроса, без кешированных планов и данных

119 / 84 / 42
Регистрация: 14.12.2015
Сообщений: 945

ЦитатаСообщение от belalugoci Посмотреть сообщение

Вы скучный

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

ЦитатаСообщение от Grossmeister Посмотреть сообщение

Если ни одно условие не выполнится, то и получится «голый WHERE».

Хм, тогда ведь ничего и не выберется в SELECT если ни одно условие не выполнится) А если Вы к вышеприведенному примеру с IF THEN, то мне немножко еще сложновато понять его. Я пока только еще с выборками воюю)

Заблокирован

ЦитатаСообщение от Talamaur Посмотреть сообщение

Я не скучный, я самоучка

Я тоже самоучка, просто до того как я стал разбирать ОТО — я начал с ньютоновской физики — это как бы логично.

Например фраза «голый WHERE» относится вообще ко всему в жизни, а если вы и про неё спрашиваете, то у вас нет базовых знаний. Вопросы у вас как у ребёнка, который всё не понимает, но читать не умеет и сам не разберётся в сложных вопросах. И тут родители находятся в сложной ситуации, можно ребёнка послать (как поступают многие), а можно попытаться сложное рассказать на примере пчёлок и цветочков. Только у нас с вами разговор про пчёлок ни к чему не приведёт. Поэтому априори нет смысла в такой беседе. Значит это скучно.
Судя по тому как вы соображаете я бы сказал что вам лет 14-15, а если больше, то всё печально.
Я не пытаюсь сказать что я лучше вас, я такой же балбес, но дело в том, что у нас разное образование и разный подход к изучению непознанного.

ЦитатаСообщение от Talamaur Посмотреть сообщение

Хм, тогда ведь ничего и не выберется в SELECT если ни одно условие не выполнится

Нет, будет ошибка синтаксиса запроса, так как задана команда WHERE, а условие не назначено.

ЦитатаСообщение от Talamaur Посмотреть сообщение

А если Вы к вышеприведенному примеру с IF THEN, то мне немножко еще сложновато понять его. Я пока только еще с выборками воюю

Мой совет — научитесь базовому программированию, тогда не будет особо важно какой язык вы используете. Ну а к SQL вернётесь года через два-три.

Форум пользователей MySQL

У меня предположим 2 таблицы.
Первая таблица хранит название каталогов.
Во второй таблице находятся названия файлов, и id каталога, к которому относится файл.

CREATE TABLE `PSPK`.`category_of_documents` (
`id` INT AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR ( 100 ) ,
)
ENGINE = InnoDB ;

CREATE TABLE `PSPK`.`Document` (
`id` INT AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR ( 45 ) ,
`category` INT ,
)
ENGINE = InnoDB

В данном случае получается отношение один к одному.
Один файл может находится только в одном каталоге.

Теперь вопрос: зачем создавать реляции, если можно создать 2 таблицы MyIsam.
И в конечном итоге они будут делать тоже самое, только не нужно будет создавать PRIMARY i FOREIGN ключи.

Я всё пытаюсь разобраться в этой «философии» и никак не получается.
Очень надеюсь,что кто-нибудь мне объяснит.

#2 11.12.2011 02:47:28

deadka Администратор Зарегистрирован: 14.11.2007 Сообщений: 2416

Re: Зачем нужны реляции 1:1

Вообще тут скорее отношение один ко многим — много файлов может находиться в одном каталоге.

> Теперь вопрос: зачем создавать реляции, если можно создать 2 таблицы MyIsam.
Поясните плиз, что Вы имели в виду под реляцией?

Использование вторичного ключа на поле category таблицы Document даст гарантию того, что вы сможете привязать документ только к реально существующей категории документов. Плюс даст дополнительные плюшки, такие как каскадное удаление (или наоборот невозможность удалить категорию документов, если вдруг в ней еще есть документы). Но это — в случае использования innodb, а не myisam.

Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли.

#3 11.12.2011 17:57:12

ew4oo Участник Зарегистрирован: 30.07.2011 Сообщений: 11

Re: Зачем нужны реляции 1:1

Если я захочу на странице вывести список категорий.
Список из себя будет представлять ссылки на следующую страницу, на которой будет находится список уже с документами, относящимися к категории, которую выбрали).

Например документация к автомобилям. Выбираю категорию AUDI
Меня перенаправляет на страницу, где будет список моделей
— Q7
-A8
-A6
и т.д.

То есть я могу вывести всех производителей. А затем модели, относящиеся к определённому производителю.
И всё это я могу сделать без реляций между таблицами.

SELECT * FROM `Document`
WHERE `category` = 1

Если мне не нужно использовать каскадное удаление, и всё что Вы описали. То тогда есть ли разница между использованием реляций между таблицами и их не использованием.

Why use WHERE 1 or WHERE 1=1?

Basically it is just for programmer convenience since you can just add additional conditions with AND. after that and it has no impact on execution time.

Check out these links to Stackoverflow:

  • Why would someone use WHERE 1=1 AND in a SQL clause?
  • “where 1=1” statement

Note that WHERE 1 is identical to WHERE 1=1 ; both mean WHERE TRUE but the former is rejected by many database management systems as not really being boolean.

answered Dec 13, 2013 at 13:26
2,361 1 1 gold badge 17 17 silver badges 25 25 bronze badges

My main use is that it makes it easier to comment out stuff during development of queries. I lead with , ‘s and and ‘s:

SELECT A -- ,B ,C ,D -- ,E FROM TABLE WHERE 1=1 -- and B='This' and C='That' -- and D is not null 

Also makes it easier to programmatically tack stuff unto the end.

this = "SELECT * " this += "FROM TABLE " this += "WHERE 1=1 " if user chooses option a then this += "and A is not null " if user chooses option b then this += "and B is not null " if user chooses option b then this += "and C is not null " if user chooses option b then this += "and D is not null " 

Otherwise you’d have to qualify the first option. and have each following option check the previous options. What if the user only chose Option D in the previous example? You’d have to make sure that if A, B and C aren’t chosen then use WHERE else use and . With = at the start, you can just slap the qualifiers to the end of the statement.

Урок 2. Составные условия

В прошлом уроке мы научились выбирать совершеннолетних пользователей с помощью простого SQL запроса.

SELECT last_name, first_name, birthday FROM users WHERE age >= 18

Теперь попробуем немного уточнить запрос. Например, выберем всех совершенолетних мужчин. В таблицу я добавил дополнительное строковое поле sex, которое хранит m для мужчин и w для женщин:

Новая таблица users

id first_name last_name birthday age sex
1 Дмитрий Иванов 1996-12-11 20 m
2 Олег Лебедев 2000-02-07 17 m
3 Тимур Шевченко 1998-04-27 19 m
4 Светлана Иванова 1993-08-06 23 w
5 Олег Ковалев 2002-02-08 15 m
6 Алексей Иванов 1993-08-05 23 m
7 Алена Процук 1997-02-28 18 w

Давайте добавим вывод столбца sex и оставим только мужчин. Для этого в блоке условий, который начинается со слова WHERE нужно добавить AND sex = ‘m’:

SELECT last_name, first_name, birthday, sex FROM users WHERE age >= 18 AND sex = 'm'

После выполнения SQL запроса получиться такая таблица:

Результат выполнения SQL-запроса

id last_name first_name birthday sex
1 Иванов Дмитрий 1996-12-11 m
3 Шевченко Тимур 1998-04-27 m
6 Иванов Алексей 1993-08-05 m

Посмотрим на SQL запрос. Сейчас блок WHERE содержит составное условие: возраст больше или равен 18 годам и пол равен m. Это простое логическое выражение, которому соответствуют все записи для которых оба условия верны. То есть у которых одновременно и возраст от 18 лет и sex = «m».

Кстати, о sex = «m». Так как мы используем равенство, в результируеющей таблице в колонке sex для всех записей у нас выводится m. Это не логично, ведь мы и так знаем, что выбираем мужчин, поэтому смысла в том, что мы эту информацию выводим в таблице нет. А значит можно удалить sex из запроса. Удалим и посмотрим на результат выполнения SQL-запроса:

SELECT last_name, first_name, birthday FROM users WHERE age >= 18 AND sex = 'm'
Результат выполнения SQL-запроса

id last_name first_name birthday
1 Иванов Дмитрий 1996-12-11
3 Шевченко Тимур 1998-04-27
6 Иванов Алексей 1993-08-05

Строки выводятся те же, однако столбца sex больше нет.

Обратите внимание, что извлекаем мы столбцы last_name, first_name, birthday, а фильтрутем по age и sex. То есть не обязательно чтобы столбцы, которые мы получаем, совпадали со столбцами в условии. Главное, чтобы все они были в таблице.

Но вернемся к составным условиям.

Кроме операции AND (И), в условии можно применять OR (ИЛИ). Давайте заменим AND на OR, а также вернем колонки sex и age:

SELECT last_name, first_name, birthday, sex FROM users WHERE age >= 18 OR sex = 'm'

И посмотрим на результат:

Новая таблица users

>

id last_name first_name birthday sex age
1 Иванов Дмитрий 1996-12-11 m 20
2 Лебедев Олег 2000-02-07 m 17
3 Шевченко Тимур 1998-04-27 m 19
4 Иванова Светлана 1993-08-06 w 23
5 Ковалев Олег 2002-02-08 m 15
6 Иванов Алексей 1993-08-05 m 23
7 Процук Алена 1997-02-28 w 18

Получили всех мужчин, а также женщин, которым исполнилось 18 лет. В частности в SQL-таблице две женщины старше 18 лет и все мужчины, даже те, которым меньше 18. Всё это соответствует условию ИЛИ. ИЛИ возраст от 18 лет, ИЛИ мужской пол.

Теперь переключимся на таблицу products. В ней появилось поле country, которое содержит данные о стране производителе:

Таблица products

id name count price country
1 Телевизор 3 43200.00 RU
2 Микроволновая печь 4 3200.00 RU
3 Холодильник 3 12000.00 UA
4 Роутер 1 1340.00 US
5 Компьютер 0 26150.00 US
6 Утюг 6 3200.00 BL
7 Пылесос 11 4500.00 UA

Давайте выберем товары, произведененные в России, Белоруссии и на Украине. Напишем SQL-запрос:

SELECT * FROM products WHERE country = "RU" OR country = "UA" OR country = "BL"

После выполнения запроса мы получим следующую таблицу:

Результат выполнения запроса

id name count price country
1 Телевизор 3 43200.00 RU
2 Микроволновая печь 4 3200.00 RU
3 Холодильник 3 12000.00 UA
6 Утюг 6 3200.00 BL
7 Пылесос 11 4500.00 UA

Разберем запрос: в блоке WHERE мы используем три условия, разделенные OR (или). Во всех трех условиях мы с помощью символа равенства сравниваем значение в столбце country с одной из стран: ИЛИ Россия, ИЛИ Украина, ИЛИ Белоруссия.

Если мы хотим получить товары еще каких-то стран, то нужно добавить еще условия OR. Это не очень удобно, так как запрос становится громоздиким.

Но его можно упростить. Кроме стандартных условий сравнения AND и OR в языке SQL есть условие принадлежности IN, которое в данном случае подходит лучше. Напишем после WHERE:

SELECT * FROM products WHERE country IN ("RU", "UA", "BL")

Конструкция получилась короче и понятней. И с помощью неё мы выбираем данные, в которых страна равна любом из значений перечисленных в скобках. После запуска запроса мы получим результат, аналогичный предыдущему.

Но давайте добавим к запросу еще одно условие. Например нам нужны не просто товары, а товары стоимостью до 10 000 рублей. Напишем:

SELECT * FROM products WHERE country IN ("RU", "UK", "BL") AND price < 10000

И посмотрим результат:

Результат выполнения SQL-запроса

id name count price country
2 Микроволновая печь 4 3200.00 RU
6 Утюг 6 3200.00 BL
7 Пылесос 11 4500.00 UA

Получили новую таблицу с тремя записями, которые удовлетовряют новому условию. И в этом условии мы совместили AND и IN. То есть в SQL-запросах можно совмещать логические операции AND и OR с оператором IN. Что делает их очень гибкими.

Теперь давай попробуем выбрать товары, стоимостью от 10000 до 20000.

Условие с country уберем и напишем:

SELECT * FROM products WHERE price >= 10000 AND price 

В результате получается такая таблица:

Таблица products

id name count price country
3 Холодильник 3 12000.00 UA

Выполним — получили 1 товар в этом ценовом интервале. Рассмотрим на запрос. Как видите в этой конструкции мы снова написали двойное условие по одному полю — price. И с одной строны всё логично и понятно, а с другой стороны эту конструкцию также можно упростить.

SELECT * FROM products WHERE price BETWEEN 10000 AND 20000

Теперь запрос звучит так: ВЫБРАТЬ все столбцы из таблицы products, в которых цена между 10000 и 20000. Звучит более чем понятно.

После запуска мы получим всё тот же один товар.

Вообще AND, OR, IN и BETWEEN — это основные конструкции для построения условий в SQL запросах и используются они в блоке WHERE. Вы можете применять их как по одиночке, так комбинируя в самых разлчных вариантах.

Следующий урок

Урок 3. Порядок AND и OR

Вы узнаете о приоритете AND и OR, а также с ошибками, которые возникают у новичков в SQL-запросах с несколькими условиями.

Полный курс с практикой

  • 57 уроков
  • 261 задание
  • Сертификат
  • Поддержка преподавателя
  • Доступ к курсу навсегда
  • Можно в рассрочку

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *