Tại sao lại sử dụng “where 1 = 2” trên cú pháp SQL CREATE TABLE?


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

Tôi đã đọc câu nói này ở đâu đó trên internet nhưng tôi không thể hiểu được WHERE 1=2.

Có ai vui lòng giải thích điều này không?


4
tl; dr 1 = 2 được đánh giá là FALSE cho tất cả các hàng
Dennis Jaheruddin

27
Đó là một mẹo nhỏ để tránh phải gõ lại toàn bộ cấu trúc cột. Nó sẽ tạo một bảng có cùng tên cột và kiểu dữ liệu, nhưng không sao chép bất kỳ hàng hoặc khóa dữ liệu nào.
Adwaenyth

điều này tiết kiệm được 2 (hai) ký tự khi nhập "1 = 2": 3 ký tự, "Sai": 5 ký tự
Archemar

1
Xin lưu ý rằng đây không phải là SQL tiêu chuẩn. Nó hoạt động trong MySQL, không chắc chắn về các phương ngữ khác.
Álvaro González

Câu trả lời:


109

Loại lệnh này thường được sử dụng để sao chép cấu trúc của bảng này sang bảng khác. Trong trường hợp này, EMPL_DEMOsẽ có cùng cấu trúc cột employees, ngoại trừ các khóa hoặc ràng buộc .

Các 1=2luôn đánh giá Falseđó ngăn cản bạn từ việc sao chép bất kỳ hàng.


2
@ jpmc26 Tôi đoán "giống hệt" là một lựa chọn tồi. Tôi chỉ đề cập đến cấu trúc cột.
DrZoo

Nó cũng sẽ nhập vào bất kỳ chỉ mục hoặc ràng buộc nào. Về cơ bản, bạn sẽ tạo một bản sao của các cột với các kiểu dữ liệu thích hợp
Barranka

7
Nếu bạn muốn sao chép tất cả những hạn chế, chỉ số vv là tốt, bạn sẽ sử dụngCREATE TABLE new_table LIKE old_table
Barmar

1
@Barmar trừ khi đó là một cái gì đó mới, LIKE old_tablekhông phải là một cấu trúc SQL Server ...
WernerCD

1
Tôi nghĩ rằng ý nghĩa của bạn về cấu trúc cột là chỉ nametypecủa cột, Hãy xem xét rằng có một số thuộc tính khác cũng như cấu trúc cột - ví dụ: giá trị mặc định, bí danh và v.v.;).
shA.t

27

CREATE TABLE (Tạo một bảng mới)

EMPL_DEMO (Được gọi là EMPL_DEMO)

AS (Với Dữ liệu và cấu trúc của)

SELECT * FROM employees WHERE 1=2; (Mọi thứ trong các nhân viên trong đó 1 = 2. Vì 1 không bao giờ là 2 - hãy sao chép cấu trúc và tất cả 0 hàng phù hợp)

..Sự sao chép cấu trúc chứ không phải dữ liệu.


14

Cú pháp này cũng thực hiện tương tự, nhưng rõ ràng hơn, nó tạo ra một bảng có cùng cấu trúc, không có dữ liệu.

CREATE TABLE EMPL_DEMO AS SELECT * FROM employees limit 0;

2
LIMIT có một số phổ biến, nhưng nó là hư không gần một tiêu chuẩn (không may)
bgusach

1
@bgusach, jeeze, thật là điên rồ. Tôi không thể tưởng tượng rằng bất kỳ DB thực tế nào có thể không có LIMIT. Nhưng có vẻ như MSSQL thiếu nó (điều này khiến tôi không thích sử dụng MSSQL). Rõ ràng là họ có TOP, nhưng kết quả google có rất nhiều người không sử dụng nó, vì vậy có thể có một số hijink xung quanh nó.
Kat

@Kat Một số có nó , nhiều người khác thì không (bao gồm cả SQL chuẩn). Nó có gì đặc biệt về cú pháp cụ thể này?
Álvaro González

Đó không phải là về cú pháp, @ ÁlvaroGonzález, nhưng bản thân chức năng là IMO khá quan trọng. Có thể không quá nhiều đối với trường hợp này (mặc dù tôi thấy nó dễ đọc hơn các tùy chọn khác), nhưng rõ ràng là nó hữu ích cho việc phân trang kết quả. Khi tôi tìm kiếm "MSSQL LIMIT", một số cách giải quyết mà tôi thấy được đề xuất là điên rồ đối với một tính năng giống như một phần không thể thiếu của SQL (tôi cũng ngạc nhiên rằng nó không phải là tiêu chuẩn - ai có thể theo dõi những gì và không phải với SQL rất phân mảnh?).
Kat

7

Điều này có thể hữu ích để sao chép cấu trúc của một bảng ngoại trừ các ràng buộc, khóa, chỉ mục, thuộc tính nhận dạng và các hàng dữ liệu của nó.

Truy vấn này sẽ tạo EMPL_DEMObảng không có hàng nào được sao chép từ bảng nhân viên vì WHERE 1=2điều kiện luôn được đánh giá là FALSE.

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

tò mò, làm thế nào bạn sẽ sao chép các ràng buộc, v.v.?
Thufir 19/08/17


6

Hãy tin tưởng vào Google, bạn của tôi. Từ cuối kết quả đầu tiên khi bạn google câu lệnh đó :

Ví dụ:

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

Điều này sẽ tạo ra một bảng mới có tên là nhà cung cấp bao gồm tất cả các cột từ bảng công ty, nhưng không có dữ liệu từ bảng công ty.


41
Lưu ý rằng kết quả tìm kiếm của Google được tùy chỉnh cho từng người dùng, dựa trên bất cứ điều gì Google xảy ra để biết về người dùng. Vì vậy, thứ tự kết quả có thể khác nhau đối với mọi người, và do đó, "kết quả đầu tiên" có nguy cơ khác đối với mọi người. Trong trường hợp của tôi, kết quả hàng đầu cho truy vấn đó là câu hỏi này và trang bạn liên kết đến thậm chí không hiển thị trong số ba lần truy cập.
người dùng

2
Khi tham chiếu kết quả thứ n, hãy sử dụng công cụ tìm kiếm như DuckDuckGo có kết quả tĩnh theo thời gian cho mỗi truy vấn.
wizzwizz 4

@ MichaelKjörling Đã từng có một tùy chọn để hiển thị kết quả tĩnh ("không được cá nhân hóa"). Tôi không biết nó hoạt động tốt như thế nào khi nó xuất hiện, nhưng bây giờ nó đã biến mất, vì có vẻ như dữ liệu người dùng đã trở nên rất gắn bó với thuật toán PageRank.
oldmud0

1
@ oldmud0: Tôi không nghĩ là nó đã biến mất? Giữa Kết quả Riêng tưXóa tất cả các kết quả tùy chỉnh Tôi nghĩ rằng nó phải có thể định cấu hình?
user541686

1
@Mehrdad Liên kết thứ hai cho biết trong "Xóa tất cả kết quả tùy chỉnh" rằng một trong các bước bắt buộc là đăng nhập vào tài khoản Google của bạn, vì vậy rõ ràng là không có sẵn cho những người không có tài khoản Google. Ngoài ra, tên của cài đặt cho biết rằng nó chỉ ảnh hưởng đến quảng cáo chứ không ảnh hưởng đến kết quả tìm kiếm, nhưng văn bản gợi ý rằng nó cũng ảnh hưởng đến kết quả, vì vậy tốt nhất là nó không rõ ràng.
người dùng

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

Hiểu rõ hơn trong Cơ sở dữ liệu Teradata:

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

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

1

Trong SQL Server

chọn * vào table1 từ table2 trong đó 1 = 2 (Chỉ cấu trúc)

chọn * vào table1 từ table2 trong đó 1 = 1 (Cấu trúc với dữ liệu)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.