¿Por qué utilizar "donde 1 = 2" en una sintaxis SQL CREATE TABLE?

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

Leí esta declaración en algún lugar de Internet pero no pude entender el WHERE 1=2.

¿Alguien podría explicar esto?

Omid Shagiwal
fuente
4
tl; dr 1 = 2 se evalúa como FALSO para todas las filas
Dennis Jaheruddin
27
Es un pequeño truco para evitar tener que volver a escribir toda la estructura de la columna. Creará una tabla con los mismos nombres de columna y tipos de datos, pero sin copiar ninguna fila o clave de datos.
Adwaenyth
esto guarda 2 (dos) caracteres cuando se escribe "1 = 2": 3 caracteres, "Falso": 5 caracteres
Archemar
1
Tenga en cuenta que esto no es de ninguna manera SQL estándar. Funciona en MySQL, no estoy seguro de otros dialectos.
Álvaro González

Respuestas:

109

Este tipo de comando se suele utilizar para copiar la estructura de una tabla a otra. En este caso, EMPL_DEMOtendrá la misma estructura de columnas que employees, excepto las claves o restricciones .

El 1=2da siempre como resultado Falseque le impide la copia de cualquiera de las filas.

DrZoo
fuente
2
@ jpmc26 Supongo que "idéntico" fue una mala elección. Solo me refería a la estructura de la columna.
DrZoo
También incluirá índices o restricciones. Básicamente, hará una copia de las columnas con los tipos de datos apropiados
Barranka
7
Si también quisiera copiar todas las restricciones, índices, etc., usaríaCREATE TABLE new_table LIKE old_table
Barmar
1
@Barmar a menos que sea algo nuevo, LIKE old_tableno es una construcción de SQL Server ...
WernerCD
1
Creo que su significado de estructura de columna es justo namey typede columna. Tenga en cuenta que hay otras propiedades también como estructura de columna , por ejemplo, valor predeterminado, alias, etc.;).
shA.t
27

CREATE TABLE (Crear una tabla nueva)

EMPL_DEMO (Llamado EMPL_DEMO)

AS (Con los datos y estructura de)

SELECT * FROM employees WHERE 1=2; (Todo en los empleados donde 1 = 2. Dado que 1 nunca es 2, copie la estructura y las 0 filas coincidentes)

..Esencialmente copia la estructura y no los datos.

Fazer87
fuente
14

Esta sintaxis hace lo mismo, pero es más obvio, crea una tabla con la misma estructura, sin datos.

CREATE TABLE EMPL_DEMO AS SELECT * FROM employees limit 0;
fraff
fuente
2
LÍMITE tiene cierta popularidad, pero no está ni cerca de una norma (por desgracia)
bgusach
1
@bgusach, jeeze, eso es una locura. No podía imaginar que cualquier DB realista no pudiera tenerlo LIMIT. Pero parece que MSSQL carece de él (lo que me parece una buena razón para no usar MSSQL). Aparentemente lo han hecho TOP, pero los resultados de Google tienen a tanta gente que no usa eso, por lo que probablemente haya algunas tonterías en torno a esto.
Kat
@Kat Algunos lo tienen , muchos otros no (incluido SQL estándar). ¿Qué tiene de especial esta sintaxis específica?
Álvaro González
No se trata de la sintaxis, @ ÁlvaroGonzález, pero la funcionalidad en sí es bastante crítica en mi opinión. Quizás no tanto para este caso (aunque lo veo más legible que las otras opciones), pero obviamente es útil para la paginación de resultados. Cuando busqué "MSSQL LIMIT", algunas de las soluciones que vi sugeridas estaban locas por una característica que se siente como una parte integral de SQL (también me sorprendió que no fuera estándar, quién puede realizar un seguimiento de lo que es y ¿No está tan fragmentado con SQL?).
Kat
7

Esto puede ser útil para copiar la estructura de una tabla excluyendo sus restricciones, claves, índices, propiedad de identidad y filas de datos.

Esta consulta creará una EMPL_DEMOtabla sin filas copiadas de la tabla de empleados, ya que la WHERE 1=2condición siempre se evaluará como FALSE.

  CREATE TABLE EMPL_DEMO 
  AS 
  SELECT * 
  FROM employees 
  WHERE 1=2;
Vishwanath Dalvi
fuente
por curiosidad, ¿cómo copiaría las restricciones, etc.?
Thufir
@Thufir Publicación útil dba.stackexchange.com/questions/65734/…
Vishwanath Dalvi
6

Confía en Google, amigo. Desde la parte inferior del primer resultado cuando buscas en Google esa declaración :

Por ejemplo:

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

Esto crearía una nueva tabla llamada proveedores que incluiría todas las columnas de la tabla de empresas, pero sin datos de la tabla de empresas.

Silas B
fuente
41
Tenga en cuenta que los resultados de búsqueda de Google están personalizados para cada usuario, en función de lo que Google sepa sobre el usuario. Por lo tanto, es probable que el orden de los resultados sea diferente para todos y, en consecuencia, "el primer resultado" corre el riesgo de ser diferente para todos. En mi caso, el resultado principal para esa consulta es esta pregunta , y la página a la que enlaza ni siquiera aparece entre los tres resultados.
usuario
2
Al hacer referencia al enésimo resultado, use un motor de búsqueda como DuckDuckGo que tiene resultados estáticos a lo largo del tiempo para cada consulta.
wizzwizz4
@ MichaelKjörling Solía ​​haber una opción para mostrar resultados estáticos ("no personalizados"). No sé qué tan bien funcionó cuando estaba disponible, pero ya no está, ya que parece que los datos del usuario se han entrelazado tanto con el algoritmo de PageRank.
oldmud0
1
@ oldmud0: ¿No creo que se haya ido? Entre Resultados privados y Eliminar todos los resultados personalizados , creo que debería ser configurable.
user541686
1
@Mehrdad El segundo enlace dice en "Eliminar todos los resultados personalizados" que uno de los pasos necesarios es iniciar sesión en su cuenta de Google, por lo que obviamente no está disponible para aquellos que no tienen una cuenta de Google. Además, el nombre de la configuración indica que solo afecta a los anuncios , no a los resultados de la búsqueda, pero el texto indica que también afecta a los resultados, por lo que, en el mejor de los casos, no está claro.
usuario
1

Oráculo:

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

Mejor comprensión en la base de datos de Teradata:

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

CREATE TABLE EMPL_DEMO AS Memployees with data; //structure and data
13957813157
fuente
1

En SQL Server

seleccione * en la tabla1 de la tabla2 donde 1 = 2 (solo estructura)

seleccione * en la tabla1 de la tabla2 donde 1 = 1 (Estructura con datos)

Sai Kumar Reddy
fuente