Po co używać „gdzie 1 = 2” w składni SQL CREATE TABLE?

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

Przeczytałem to oświadczenie gdzieś w Internecie, ale nie mogłem zrozumieć WHERE 1=2.

Czy ktoś może to wyjaśnić?

Omid Shagiwal
źródło
4
tl; dr 1 = 2 jest oceniane jako FAŁSZ dla wszystkich wierszy
Dennis Jaheruddin
28
To mały hack, aby uniknąć konieczności ponownego wpisywania całej struktury kolumny. Utworzy tabelę z tymi samymi nazwami kolumn i typami danych, ale bez kopiowania żadnych wierszy danych ani kluczy.
Adwaenyth
ten zapis 2 (dwa) znaki po wpisaniu „1 = 2”: 3 znaki, „Fałsz”: 5
znaków
1
Należy pamiętać, że nie jest to bynajmniej standardowy SQL. Działa w MySQL, nie jestem pewien co do innych dialektów.
Álvaro González

Odpowiedzi:

110

Ten typ polecenia jest zwykle używany do kopiowania struktury jednej tabeli do drugiej. W tym przypadku, EMPL_DEMObędzie miał taką samą konstrukcję kolumny employees, z wyjątkiem klawiszy lub ograniczenia .

1=2Zawsze ma wartość False, która uniemożliwia kopiowanie którymś z wierszy.

DrZoo
źródło
2
@ jpmc26 Myślę, że „identyczny” był złym wyborem. Miałem właśnie na myśli strukturę kolumn.
DrZoo
Zbuduje również wszelkie indeksy lub ograniczenia. Zasadniczo wykonasz kopię kolumn z odpowiednimi typami danych
Barranka
7
Jeśli chcesz skopiować wszystkie ograniczenia, indeksy itp., CREATE TABLE new_table LIKE old_table
Użyłbyś
1
@Barmar, chyba że to coś nowego, LIKE old_tablenie jest konstrukcją SQL Server ...
WernerCD
1
Myślę, że twoje znaczenie struktury kolumny jest słuszne namei typekolumny. Weź pod uwagę, że istnieją inne właściwości również jako struktura kolumny - np. Wartość domyślna, alias itp .;).
shA.t
27

CREATE TABLE (Utwórz nową tabelę)

EMPL_DEMO (Zadzwoniono do EMPL_DEMO)

AS (Z danymi i strukturą)

SELECT * FROM employees WHERE 1=2; (Wszystko w pracownikach, gdzie 1 = 2. Ponieważ 1 nigdy nie jest 2 - skopiuj strukturę i wszystkie 0 pasujących wierszy)

.. Zasadniczo kopiuj strukturę, a nie dane.

Fazer87
źródło
14

Ta składnia robi to samo, ale jest bardziej oczywiste, tworzy tabelę o tej samej strukturze, bez danych.

CREATE TABLE EMPL_DEMO AS SELECT * FROM employees limit 0;
krucha
źródło
2
LIMIT ma pewną popularność, ale nie jest nigdzie zbliżony do standardu (niestety)
bgusach
1
@bgusach, jeeze, to jest takie szalone. Nie mogłem sobie wyobrazić, że jakikolwiek realistyczny DB nie mógłby mieć LIMIT. Ale wygląda na to, że MSSQL go nie ma (co wydaje mi się dobrym powodem, aby po prostu nie używać MSSQL). Najwyraźniej tak TOP, ale w wynikach Google jest tak wiele osób, które tego nie używają, więc prawdopodobnie wiąże się to z pewnym przeczuciem.
Kat.
@Kat Niektórzy to mają , wielu nie (w tym standardowy SQL). Co jest takiego specjalnego w tej specyficznej składni?
Álvaro González
Nie chodzi o składnię @ ÁlvaroGonzález, ale sama funkcjonalność jest dość krytyczna dla IMO. Może nie tak bardzo w tym przypadku (chociaż widzę to bardziej czytelne niż inne opcje), ale jest oczywiście przydatne do paginacji wyników. Kiedy wyszukałem „LIMIT MSSQL”, niektóre z obejść, które zauważyłem, sugerowane były szalone w przypadku funkcji, która wydaje się być integralną częścią SQL (byłem również zaskoczony, że nie jest to standardowe - kto może śledzić czy SQL nie jest tak pofragmentowany?).
Kat
7

Może to być przydatne do kopiowania struktury tabeli z wyłączeniem jej ograniczeń, kluczy, indeksów, właściwości tożsamości i wierszy danych.

To zapytanie utworzy EMPL_DEMOtabelę bez wierszy skopiowanych z tabeli pracowników, ponieważ WHERE 1=2warunek zawsze będzie oceniany jako FALSE.

  CREATE TABLE EMPL_DEMO 
  AS 
  SELECT * 
  FROM employees 
  WHERE 1=2;
Vishwanath Dalvi
źródło
z ciekawości, jak skopiowałbyś ograniczenia itp.?
Thufir
@Thufir Pomocny post dba.stackexchange.com/questions/65734/…
Vishwanath Dalvi
6

Zaufaj Google, przyjacielu. Od dołu pierwszego wyniku po wygooglowaniu tego stwierdzenia :

Na przykład:

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

Spowoduje to utworzenie nowej tabeli o nazwie dostawcy, która zawierałaby wszystkie kolumny z tabeli firm, ale nie zawierała danych z tabeli firm.

Silas B.
źródło
42
Pamiętaj, że wyniki wyszukiwania Google są dostosowywane dla każdego użytkownika na podstawie tego, co Google o nim wie. Zatem kolejność wyników może być inna dla każdego, a w konsekwencji „pierwszy wynik” może być inny dla każdego. W moim przypadku najlepszym wynikiem dla tego zapytania jest to pytanie , a strona, do której prowadzi link, nie pojawia się nawet wśród trzech trafień.
użytkownik
2
Odwołując się do n-tego wyniku, użyj wyszukiwarki, takiej jak DuckDuckGo, która ma statyczne wyniki w czasie dla każdego zapytania.
wizzwizz4
@ MichaelKjörling Dawniej istniała opcja wyświetlania statycznych („niespersonalizowanych”) wyników. Nie wiem, jak dobrze to działało, gdy było w pobliżu, ale teraz zniknęło, ponieważ wydaje się, że dane użytkownika zostały tak powiązane z algorytmem PageRank.
oldmud0
1
@ oldmud0: Nie sądzę, że zniknął? Pomiędzy wynikami prywatnymi a Usuń wszystkie wyniki niestandardowe Myślę, że powinno to być konfigurowalne?
user541686
1
@Mehrdad Drugi link mówi w sekcji „Usuń wszystkie wyniki niestandardowe”, że jednym z wymaganych kroków jest zalogowanie się na konto Google, więc jest to oczywiście niedostępne dla tych, którzy nie mają konta Google. Ponadto nazwa ustawienia wskazuje, że ma ono wpływ tylko na reklamy , a nie wyniki wyszukiwania, ale tekst sugeruje, że wpływa również na wyniki, więc jest to w najlepszym przypadku niejasne.
użytkownik
1

Wyrocznia:

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

Lepsze zrozumienie w bazie danych Teradata:

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

CREATE TABLE EMPL_DEMO AS Memployees with data; //structure and data
13957813157
źródło
1

W SQL Server

wybierz * do tabeli1 z tabeli2, gdzie 1 = 2 (tylko struktura)

wybierz * do tabeli1 z tabeli2, gdzie 1 = 1 (Struktura z danymi)

Sai Kumar Reddy
źródło