SQL CREATETABLE構文で「where1 = 2」を使用するのはなぜですか?


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

私はインターネットのどこかでこの声明を読みましたが、私は理解できませんでしたWHERE 1=2

誰かがこれを説明してくれませんか?


4
tl; dr 1 = 2は、すべての行でFALSEと評価されます
Dennis Jaheruddin 2017

28
列構造全体を再入力する必要がないようにするのは少しハックです。同じ列名とデータ型でテーブルを作成しますが、データの行やキーはコピーしません。
Adwaenyth 2017

「1 = 2」と入力すると2文字節約できます:3文字、「False」:5文字
Archemar 2017

1
これは決して標準SQLではないことに注意してください。MySQLで動作しますが、他の方言についてはよくわかりません。
アルバロゴンサレス

回答:


110

このタイプのコマンドは通常、あるテーブルの構造を別のテーブルにコピーするために使用されます。この場合、EMPL_DEMO同じ列構造を持つことになりますemployeesキーや制約を除きます

1=2いつもと評価False行のいずれかをコピーするからあなたを防止します。


2
@ jpmc26「同一」は悪い選択だったと思います。カラム構造について言及していました。
DrZoo 2017

また、インデックスや制約を初期化します。基本的に、適切なデータ型で列のコピーを作成します
Barranka 2017

7
すべての制約、インデックスなどもコピーする場合は、次を使用しますCREATE TABLE new_table LIKE old_table
Barmar 2017

1
@Barmarは新しいそれの何かをしない限り、LIKE old_table... SQL Serverの構文ではありません
WernerCD

1
私は、列構造のあなたの意味だけでいると思うnametype列の、ともいくつかの他のプロパティがあることを考慮して、カラム構造-例えば、デフォルト値、エイリアスおよびなど;)。
shA.t 2017

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にはある程度の人気がありますが、標準には
ほど遠いです

1
@ bgusach、jeeze、それはとてもクレイジーです。現実的なDBにはあり得ないことは想像もできませんでしたLIMIT。しかし、MSSQLにはそれが欠けているようです(これは、MSSQLを使用しない正当な理由として私を驚かせます)。どうやら彼らは持っているようTOPですが、グーグルの結果はそれを使用していない人が非常に多いので、おそらくそれを取り巻くいくつかのhijinkがあります。
Kat

@Katある人はそれを持っていますが、他の多くは持っていません(標準SQLを含む)。この特定の構文の何がそんなに特別なのですか?
アルバロゴンサレス

@ÁlvaroGonzálezという構文ではありませんが、機能自体は非常に重要なIMOです。この場合はそれほど多くないかもしれませんが(他のオプションよりも読みやすいと思いますが)、結果のページ付けには明らかに役立ちます。「MSSQLLIMIT」を調べたとき、私が提案した回避策のいくつかは、SQLの不可欠な部分のように感じる機能に夢中だった(それが標準ではなかったことにも驚いた-誰が何であるかを追跡できるSQLはそれほど断片化されていませんか?)
Kat 2017

7

これは、制約、キー、インデックス、IDプロパティ、およびデータ行を除いて、テーブルの構造をコピーするのに役立ちます。

このクエリはEMPL_DEMOWHERE 1=2条件が常にとして評価されるため、employeesテーブルからコピーされた行のないテーブルを作成しますFALSE

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

好奇心から、制約などをどのようにコピーしますか?
Thufir 2017


6

私の友人、グーグルを信頼してください。あなたがそのステートメントをグーグルで検索したときの最初の結果の下から

例えば:

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

これにより、companysテーブルのすべての列が含まれているが、companysテーブルのデータは含まれていないsuppliersという新しいテーブルが作成されます。


42
Googleの検索結果は、Googleがユーザーについて知っていることに基づいて、ユーザーごとにカスタマイズされていることに注意してください。したがって、結果の順序はすべての人で異なる可能性があり、その結果、「最初の結果」はすべての人で異なるリスクがあります。私の場合、そのクエリの上位の結果はこの質問であり、リンク先のページは3つのヒットの中に表示されません。
ユーザー

2
n番目の結果を参照するときは、DuckDuckGoのような検索エンジンを使用します。この検索エンジンでは、クエリごとに時間の経過とともに静的な結果が得られます。
wizzwizz4 2017

@MichaelKjörling以前は静的な(「パーソナライズされていない」)結果を表示するオプションがありました。それが周りにあったときにどれほどうまく機能したかはわかりませんが、ユーザーデータがPageRankアルゴリズムと非常に絡み合っているように見えるため、現在はなくなっています。
oldmud0 2017

1
@ oldmud0:なくなったとは思わない?プライベート結果すべてのカスタム結果の削除の間設定可能である必要があると思いますか?
user541686 2017

1
@Mehrdad 2番目のリンクは、「すべてのカスタム結果を削除する」の下に、必要な手順の1つは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

1

SQLServerの場合

select * into table1 from table2 where 1 = 2(Only Structure)

select * into table1 from table2 where 1 = 1(Structure with data)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.