Neden bir SQL CREATE TABLE sözdiziminde "1 = 2 nerede" kullanılsın?


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

Bu ifadeyi internette bir yerde okudum ama anlayamadım WHERE 1=2.

Lütfen kimse bunu açıklar mı?


4
tl; dr 1 = 2 tüm satırlar için YANLIŞ olarak değerlendirilir
Dennis Jaheruddin

28
Sütun yapısının tamamını yeniden yazmak zorunda kalmamak için biraz zor. Aynı sütun adlarına ve veri türlerine sahip, ancak herhangi bir veri satırı veya anahtarı kopyalamadan bir tablo oluşturacaktır.
Adwaenyth

bu "1 = 2" yazıldığında 2 (iki) karakter kazandırır: 3 karakter, "Yanlış": 5 karakter
Archemar

1
Lütfen bunun hiçbir şekilde standart SQL olmadığını unutmayın. MySQL'de çalışıyor, diğer lehçelerden emin değil.
Álvaro González

Yanıtlar:


110

Bu tür bir komut genellikle bir tablonun yapısını diğerine kopyalamak için kullanılır. Bu durumda, EMPL_DEMOaynı kolon yapıya sahip olacaktır employees, anahtarlar veya kısıtlamaları için hariç .

Her 1=2zaman False, satırlardan herhangi birini kopyalamanızı engelleyecek şekilde değerlendirilir .


2
@ jpmc26 Sanırım "aynı" kötü bir seçimdi. Ben sadece sütun yapısından bahsediyordum.
DrZoo

Ayrıca herhangi bir indeks veya kısıtlamayı da içerecektir. Esasen, uygun veri türleriyle sütunların bir kopyasını oluşturacaksınız
Barranka

7
Tüm kısıtlamaları, dizinleri vb. De kopyalamak isterseniz, şunu kullanırsınızCREATE TABLE new_table LIKE old_table
Barmar

1
@Barmar yeni bir şey olmadıkça, LIKE old_tablebir SQL Server yapısı değildir ...
WernerCD

1
Ben sütun yapının sizin anlamı sadece olduğunu düşünüyorum nameve typesütunun diğer bazı özellikler olarak da olduğunu düşünün sütun yapısına - örneğin varsayılan değer, takma ad vb).
shA.

27

CREATE TABLE (Yeni Bir Tablo Oluştur)

EMPL_DEMO (EMPL_DEMO olarak adlandırıldı)

AS (Veriler ve yapısı ile)

SELECT * FROM employees WHERE 1=2; (1 = 2 olan çalışanlarda her şey. 1 hiçbir zaman 2 olmadığından - yapıyı ve eşleşen 0 satırın tümünü kopyalayın)

.. Esasen yapıyı kopyalayın, verileri değil.


14

Bu sözdizimi aynı şeyi yapar, ancak daha açıktır, aynı yapıya sahip, verisiz bir tablo oluşturur.

CREATE TABLE EMPL_DEMO AS SELECT * FROM employees limit 0;


1
@bgusach, jeeze, bu çok çılgınca. Herhangi bir gerçekçi DB'nin sahip olamayacağını hayal bile edemezdim LIMIT. Ama görünen o ki MSSQL bundan yoksun (ki bu da bana MSSQL kullanmamak için iyi bir neden olarak çarpıcı geliyor). Görünüşe göre var TOP, ancak google sonuçlarında o kadar çok insan bunu kullanmıyor, bu yüzden muhtemelen onu çevreleyen bir hırsızlık var.
Kat

@Kat Bazılarında var , bazılarında yok (standart SQL dahil). Bu özel sözdizimi hakkında bu kadar özel olan nedir?
Álvaro González

@ ÁlvaroGonzález sözdizimi ile ilgili değildir, ancak işlevselliğin kendisi oldukça kritik IMO'dur. Belki bu vaka için çok fazla değil (diğer seçeneklerden daha okunabilir görmeme rağmen), ama sonuçların sayfalandırılması için açıkça yararlıdır. "MSSQL LIMIT" i aradığımda, önerdiğim bazı geçici çözümler, SQL'in ayrılmaz bir parçası gibi hissettiren bir özellik için çılgıncaydı (standart olmadığına da şaşırdım - kimin ne olduğunu ve SQL ile çok parçalanmış değil mi?).
Kat

7

Bu , sınırlamaları, anahtarları, dizinleri, kimlik özelliği ve veri satırları hariç bir tablonun yapısını kopyalamak için yararlı olabilir .

Koşul her zaman olarak değerlendirileceğinden, bu sorgu EMPL_DEMOçalışanlar tablosundan kopyalanan satır içermeyen bir tablo oluşturacaktır .WHERE 1=2FALSE

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

meraktan, kısıtlamaları vb. nasıl kopyalarsınız?
Thufir


6

Google'a güven dostum. Bu ifadeyi google'da arattığınızda ilk sonucun altından :

Örneğin:

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

Bu, şirketler tablosundaki tüm sütunları içeren, ancak şirketler tablosundaki verileri içermeyen tedarikçiler adı verilen yeni bir tablo oluşturacaktır.


42
Google arama sonuçlarının, Google'ın kullanıcı hakkında bildiklerine bağlı olarak her kullanıcı için özelleştirildiğini unutmayın. Dolayısıyla, sonuçların sıralaması muhtemelen herkes için farklı olacaktır ve sonuç olarak "ilk sonuç" herkes için farklı olma riski taşır. Benim durumumda, bu sorgu için en iyi sonuç bu sorudur ve bağlantı kurduğunuz sayfa, üç isabet arasında bile görünmüyor.
kullanıcı

2
N'inci sonuca atıfta bulunurken , her sorgu için zaman içinde statik sonuçlar veren DuckDuckGo gibi bir arama motoru kullanın.
wizzwizz4

@ MichaelKjörling Statik ("kişiselleştirilmemiş") sonuçları göstermek için bir seçenek vardı. Etrafta olduğu zaman ne kadar iyi çalıştığını bilmiyorum ama artık yok, çünkü kullanıcı verileri PageRank algoritmasıyla iç içe geçmiş durumda.
oldmud0

1
@ oldmud0: Gittiğini sanmıyorum? Özel Sonuçlar arasında ve Tüm özel sonuçları Kaldır arasında, yapılandırılabilir olması gerektiğini düşünüyorum?
user541686

1
@Mehrdad İkinci bağlantı, "Tüm özel sonuçları kaldır" ın altında, gerekli adımlardan birinin Google hesabınızda oturum açmak olduğunu, dolayısıyla bunun Google hesabı olmayanlar için açık bir şekilde kullanılamayacağını söylüyor. Ayrıca, ayarın adı, arama sonuçlarını değil, yalnızca reklamları etkilediğini gösterir , ancak metin, sonuçları da etkilediğini ima eder, bu nedenle en iyi ihtimalle belirsizdir.
kullanıcı

1

Oracle:

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 Veritabanında daha iyi anlama:

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

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

1

SQL Server'da

1 = 2 (Sadece Yapı) olan table2'den table1'e * seçin

1 = 1 (Verili yapı) olan table2'den table1'e * seçin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.