Зачем использовать «где 1 = 2» в синтаксисе SQL CREATE TABLE?

82
CREATE TABLE EMPL_DEMO AS SELECT * FROM employees WHERE 1=2;

Я читал это заявление где-то в Интернете, но не мог понять WHERE 1=2.

Кто-нибудь, пожалуйста, объясните это?

Омид Шагивал
источник
4
tl; dr 1 = 2 оценивается как ЛОЖЬ для всех строк
Деннис Джахеруддин
28
Это небольшой прием, позволяющий избежать повторного ввода всей структуры столбцов. Будет создана таблица с теми же именами столбцов и типами данных, но без копирования каких-либо строк данных или ключей.
Adwaenyth
это сохраняет 2 (два) символа при вводе «1 = 2»: 3 символа, «False»: 5 ​​символов
Archemar
1
Обратите внимание, что это ни в коем случае не стандартный SQL. Он работает в MySQL, не уверен в других диалектах.
Альваро Гонсалес,

Ответы:

110

Этот тип команды обычно используется для копирования структуры одной таблицы в другую. В этом случае EMPL_DEMOбудет такая же структура столбцов employees, за исключением ключей или ограничений .

1=2Всегда имеет значение , Falseкоторое предотвращает Вас от копирования любой из строк.

DrZoo
источник
2
@ jpmc26 Думаю, «идентичный» - плохой выбор. Я просто имел в виду структуру столбцов.
DrZoo
Он также будет включать любые индексы или ограничения. По сути, вы сделаете копию столбцов с соответствующими типами данных
Барранка
7
Если вы хотите скопировать все ограничения, индексы и т. Д., Вы должны использоватьCREATE TABLE new_table LIKE old_table
Barmar
1
@Barmar, если это не что-то новое, LIKE old_tableэто не конструкция SQL Server ...
WernerCD
1
Я думаю , что вы имеете в виду структуру столбца как раз nameи typeстолбец. Учтите, что есть некоторые другие свойства, также как структура столбца - например, значение по умолчанию, псевдоним и т.д.;).
shA.t
27

CREATE TABLE (Создать новую таблицу)

EMPL_DEMO (Называется EMPL_DEMO)

AS (С данными и структурой)

SELECT * FROM employees WHERE 1=2; (Все в сотрудников, где 1 = 2. Поскольку 1 никогда не бывает 2 - скопируйте структуру и все 0 совпадающих строк)

..По сути копируйте структуру, а не данные.

Fazer87
источник
14

Этот синтаксис делает то же самое, но более очевидно, он создает таблицу с той же структурой, без данных.

CREATE TABLE EMPL_DEMO AS SELECT * FROM employees limit 0;
фрафф
источник
2
LIMIT имеет некоторую популярность, но он
далек
1
@bgusach, боже, это так безумие. Я не мог себе представить, что никакой реалистичной БД не могло быть LIMIT. Но, похоже, в MSSQL его нет (что кажется мне хорошей причиной просто не использовать MSSQL). По-видимому, они есть TOP, но в результатах Google так много людей не используют это, поэтому, вероятно, вокруг этого есть какие-то шутки.
Кэт
@Kat У некоторых он есть , у многих - нет (включая стандартный SQL). Что такого особенного в этом синтаксисе?
Альваро Гонсалес
Дело не в синтаксисе, @ ÁlvaroGonzález, а в самой функциональности, IMO. Может быть, не так много для этого случая (хотя я считаю его более читаемым, чем другие варианты), но он, очевидно, полезен для разбивки результатов на страницы. Когда я поискал «MSSQL LIMIT», я заметил, что некоторые обходные пути, которые я видел, были безумны для функции, которая кажется неотъемлемой частью SQL (я также был удивлен, что она не была стандартной - кто может отслеживать, что и разве с SQL не так фрагментировано?).
Кэт
7

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

Этот запрос создаст EMPL_DEMOтаблицу без строк, скопированных из таблицы сотрудников, поскольку WHERE 1=2условие всегда будет оцениваться как FALSE.

  CREATE TABLE EMPL_DEMO 
  AS 
  SELECT * 
  FROM employees 
  WHERE 1=2;
Вишванатх Далви
источник
из любопытства, как бы вы также установили ограничения на копирование и т. д.?
Туфир,
@Thufir Полезный пост dba.stackexchange.com/questions/65734/…
Вишванат
6

Доверься Google, друг мой. Из нижней части первого результата, когда вы гуглите это утверждение :

Например:

CREATE TABLE suppliers
  AS (SELECT *
    FROM companies WHERE 1=2);

В результате будет создана новая таблица с названием «поставщики», в которую будут включены все столбцы из таблицы компаний, но не будет данных из таблицы компаний.

Сайлас Б.
источник
42
Обратите внимание, что результаты поиска Google настраиваются для каждого пользователя на основе того, что Google знает о пользователе. Таким образом, порядок результатов может быть разным для всех, и, следовательно, «первый результат» рискует быть разным для всех. В моем случае лучшим результатом для этого запроса является этот вопрос , а страница, на которую вы ссылаетесь, даже не отображается среди трех обращений.
пользователь
2
При ссылке на n-й результат используйте поисковую систему, такую ​​как DuckDuckGo, которая дает статические результаты по каждому запросу.
wizzwizz4
@ MichaelKjörling Раньше была возможность показывать статические («не персонализированные») результаты. Я не знаю, насколько хорошо это работало, когда оно было, но теперь его больше нет, поскольку кажется, что пользовательские данные настолько переплелись с алгоритмом PageRank.
oldmud0
1
@ oldmud0: Не думаю, что его больше нет? Между частными результатами и удалением всех пользовательских результатов Я думаю, это должно быть настраиваемым?
user541686
1
@Mehrdad Вторая ссылка в разделе «Удалить все пользовательские результаты» говорит, что одним из обязательных шагов является вход в вашу учетную запись Google, поэтому это явно недоступно для тех, у кого нет учетной записи Google. Кроме того, название параметра указывает, что он влияет только на рекламу , а не на результаты поиска, но текст намекает на то, что он также влияет на результаты, поэтому в лучшем случае это неясно.
пользователь
1

Оракул:

CREATE TABLE EMPL_DEMO AS SELECT * FROM employees WHERE 1=2; //just structure not data

CREATE TABLE EMPL_DEMO AS SELECT * FROM employees WHERE 1=1; //ststructure and data

Лучшее понимание в базе данных Teradata:

CREATE TABLE EMPL_DEMO AS Memployees with no data; //structure

CREATE TABLE EMPL_DEMO AS Memployees with data; //structure and data
13957813157
источник
1

В SQL Server

выберите * в table1 из table2, где 1 = 2 (только структура)

выберите * в table1 из table2, где 1 = 1 (структура с данными)

Сай Кумар Редди
источник