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 자 (2 자) : 3 자, "False": 5 자
Archemar

1
이것은 결코 표준 SQL이 아닙니다. MySQL에서 작동하지만 다른 방언에 대해서는 확실하지 않습니다.
Álvaro González

답변:


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 서버 구조되지 않습니다
WernerCD

1
나는 열 구조의 당신의 의미는 단지 생각 nametype열의, 다른 속성으로도 있다는 것을 고려 열 구조 - 예를 들어, 기본값, 별칭 등).
shA.t aug.

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, jeeze, 정말 미쳤습니다. 나는 어떤 현실적인 DB도 가질 수 없을 것이라고 상상할 수 없었다 LIMIT. 그러나 MSSQL에는 그것이 부족한 것 같습니다 (MSSQL을 사용하지 않는 좋은 이유라고 생각합니다). 분명히 그들은 가지고 TOP있지만 Google 결과에는 사용하지 않는 사람들이 너무 많아서 주변에 약간의 hijink가있을 것입니다.
Kat.

@Kat 일부는 가지고 있고 다른 많은 사람들은 가지고 있지 않습니다 (표준 SQL 포함). 이 특정 구문의 특별한 점은 무엇입니까?
Álvaro González

@ ÁlvaroGonzález라는 구문에 관한 것이 아니지만 기능 자체는 매우 중요한 IMO입니다. 이 경우에는 그다지 많지 않을 수도 있지만 (다른 옵션보다 더 읽기 쉽다고 생각하지만) 결과의 페이지 매김에는 분명히 유용합니다. "MSSQL LIMIT"를 검색했을 때 제가 제안한 해결 방법 중 일부는 SQL의 필수 부분처럼 느껴지는 기능에 미쳤습니다 (표준이 아니라는 사실에 놀랐습니다. SQL이 그렇게 조각화되어 있지 않습니까?).

7

다음을 제외한 테이블의 구조를 복사하는 데 유용 할 수 있습니다. 제약 조건, 키, 인덱스, ID 속성 및 데이터 행을 .

이 쿼리는 조건이 항상로 평가되므로 EMPL_DEMO직원 테이블에서 복사 된 행이없는 테이블을 만듭니다 .WHERE 1=2FALSE

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

호기심에서 제약 조건 등을 어떻게 복사 하시겠습니까?
Thufir


6

내 친구, Google을 신뢰하십시오. 해당 진술을 Google에 검색했을 때 첫 번째 결과의 하단에서 :

예를 들면 :

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

이렇게하면 companies 테이블의 모든 열을 포함하지만 companies 테이블의 데이터는 포함하지 않는 supplier라는 새 테이블이 생성됩니다.


41
Google 검색 결과는 Google이 사용자에 대해 알고있는 모든 정보를 기반으로 사용자별로 맞춤 설정됩니다. 따라서 결과 순서는 모든 사람에게 다를 수 있으며 결과적으로 "첫 번째 결과"는 모든 사람에게 다를 위험이 있습니다. 필자의 경우 해당 쿼리의 최상위 결과는 this question 이며 링크 한 페이지는 세 번의 조회 중에도 표시되지 않습니다.
사용자

2
n 번째 결과를 참조 할 때 각 쿼리에 대해 시간이 지남에 따라 정적 결과가있는 DuckDuckGo 와 같은 검색 엔진을 사용하십시오 .
wizzwizz4

@ MichaelKjörling 예전에는 정적 ( "개인화되지 않은") 결과를 표시하는 옵션이있었습니다. 그것이 주변에 있었을 때 얼마나 잘 작동했는지는 모르겠지만 사용자 데이터가 PageRank 알고리즘과 너무 얽혀있는 것처럼 보이기 때문에 지금은 사라졌습니다.
oldmud0

1
@ oldmud0 : 사라진 것 같아? 비공개 결과모든 사용자 지정 결과 제거 사이에 구성 가능해야한다고 생각합니까?
user541686 aug

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

1

SQL Server에서

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

* 선택 *을 table2에서 table1로, 여기서 1 = 1 (데이터가있는 구조)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.