为什么在SQL CREATE TABLE语法上使用“ where 1 = 2”?


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

我在互联网上的某处阅读了此声明,但我听不懂WHERE 1=2

有人可以解释一下吗?


4
tl; dr 1 = 2对所有行的评估均为FALSE
Dennis Jaheruddin

27
避免再次键入整个列结构有点麻烦。它将创建一个具有相同列名和数据类型的表,但不复制任何数据行或键。
Adwaenyth

键入“ 1 = 2”可节省2(两)个字符:3个字符,“假”:5个字符
Archemar

1
请注意,这绝不是标准SQL。它可以在MySQL中运行,不确定其他方言。
阿瓦罗·冈萨雷斯

Answers:


109

这种类型的命令通常用于将一个表的结构复制到另一个表。在这种情况下,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
我认为您对列结构的含义是公正nametype对列的含义,请考虑列结构还具有其他一些属性-例如默认值,别名等;)。
shA.t

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,太疯狂了。我无法想象任何现实的数据库都不可能拥有LIMIT。但是似乎MSSQL缺少它(这使我不使用MSSQL是一个很好的理由)。显然他们有TOP,但是google结果中有很多人没有使用它,因此可能周围有一些怪癖。

@Kat有些人拥有它,许多其他人没有(包括标准SQL)。这种特定语法有何特别之处?
阿瓦罗·冈萨雷斯

这与语法@ÁlvaroGonzález无关,但是功能本身是非常关键的IMO。在这种情况下,可能不是很多(尽管我认为它比其他选项更具可读性),但对于分页结果显然很有用。当我查找“ MSSQL LIMIT”时,我看到一些建议的解决方法对于感觉像SQL不可或缺的功能的功能而言是疯狂的(我也感到惊讶,因为它不是标准的,谁可以跟踪什么是和使用SQL不是那么零散吗?)。

7

这对于复制表的结构(排除其约束,键,索引,标识属性和数据行)可能很有用。

该查询将创建一个EMPL_DEMO表,该表不从employees表复制任何行,因为WHERE 1=2条件总是被评估为FALSE

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

出于好奇,您将如何复制约束等?
Thufir


6

相信Google,我的朋友。从第一个结果的底部开始,当您搜索该语句时

例如:

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

这将创建一个称为供应商的新表,其中包括公司表中的所有列,但公司表中没有数据。


41
请注意,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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.