Навіщо використовувати “де 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 оцінюється як FALSE для всіх рядків
Денніс Яхеруддін

28
Це невеликий хак, щоб уникнути необхідності вводити всю структуру стовпців знову. Він створить таблицю з однаковими назвами стовпців та типами даних, але без копіювання будь-яких рядків даних або ключів.
Adwaenyth,

це заощаджує 2 (два) символи при наборі "1 = 2": 3 символу, "False": 5 символів
Archemar

1
Зверніть увагу, що це далеко не стандартний SQL. Це працює в MySQL, не впевнений в інших діалектах.
Альваро Гонсалес,

Відповіді:


110

Цей тип команд зазвичай використовується для копіювання структури однієї таблиці в іншу. У цьому випадку EMPL_DEMOбуде мати однакову структуру стовпців employees, за винятком ключів або обмежень .

1=2Завжди має значення , Falseяке запобігає Вас від копіювання кожному з рядків.


2
@ jpmc26 Я думаю, "ідентичний" був поганим вибором. Я просто мав на увазі структуру стовпців.
DrZoo

Це також створить будь-які індекси або обмеження. По суті, ви зробите копію стовпців із відповідними типами даних
Barranka,

7
Якби ви також хотіли скопіювати всі обмеження, індекси тощо, ви б використалиCREATE TABLE new_table LIKE old_table
Barmar

1
@Barmar, якщо це не щось нове, LIKE old_tableце не конструкція SQL Server ...
WernerCD

1
Я думаю, що ваше значення структури стовпців - просто, nameа typeстовпця. Враховуйте, що існують деякі інші властивості, також як структура стовпців - наприклад, значення за замовчуванням, псевдонім та ін.;).
shA.

27

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

EMPL_DEMO (Викликається EMPL_DEMO)

AS (З даними та структурою)

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

..По суті, копіюйте структуру, а не дані.


14

Цей синтаксис робить те саме, але це більш очевидно, він створює таблицю з однаковою структурою, без даних.

CREATE TABLE EMPL_DEMO AS SELECT * FROM employees limit 0;

2
LIMIT має певну популярність, але вона ні на що не наближається до стандартної (на жаль)
bgusach

1
@bgusach, боже, це так божевільно. Я не міг уявити, що будь-яка реалістична БД може не мати LIMIT. Але, здається, цього не вистачає MSSQL (що здається мені вагомою причиною просто не використовувати MSSQL). Очевидно, вони це роблять TOP, але в результатах Google так багато людей цим не користуються, тому, мабуть, навколо нього є якийсь хіджінк.
Кет

@Kat У деяких є , у багатьох інших немає (включаючи стандартний SQL). У чому особливість цього специфічного синтаксису?
Альваро Гонсалес,

Справа не в синтаксисі, @ ÁlvaroGonzález, але сама функціональність досить критична для IMO. Можливо, не так вже й багато для цього випадку (хоча я бачу це більш читабельним, ніж інші варіанти), але це, очевидно, корисно для пагінації результатів. Коли я подивився на "Обмеження MSSQL", деякі обхідні шляхи, які я бачив, пропонували божевільні щодо функції, яка є невід'ємною частиною SQL (я також була здивована, що це не було стандартно - хто може відслідковувати, що є і що хіба SQL не настільки фрагментований?).
Kat

7

Це може бути корисно для копіювання структури таблиці, виключаючи її обмеження, ключі, індекси, властивість ідентичності та рядки даних.

Цей запит створить EMPL_DEMOтаблицю без жодних рядків, скопійованих із таблиці співробітників, оскільки WHERE 1=2умова завжди буде оцінюватися як FALSE.

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

з цікавості, як би ви також скопіювали обмеження тощо?
Туфір,

@Thufir Корисне повідомлення dba.stackexchange.com/questions/65734/…
Vishwanath Dalvi

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

Oracle:

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

1

У SQL Server

виберіть * у таблицю1 з таблиці2, де 1 = 2 (лише структура)

виберіть * у таблицю1 з таблиці2, де 1 = 1 (Структура з даними)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.