Có nghĩa là gì khi chọn 1 từ bảng?


146

Tôi đã thấy nhiều truy vấn với một cái gì đó như sau.

Select 1  
From table

Điều này 1có nghĩa là gì, nó sẽ được thực thi như thế nào và nó sẽ trả về cái gì?

Ngoài ra, trong các loại kịch bản, điều này có thể được sử dụng?


Vui lòng cho chúng tôi xem toàn bộ truy vấn
gbn

Câu trả lời:


107

SELECT 1 FROM TABLE_NAMEcó nghĩa là, "Trả về 1 từ bảng". Bản thân nó khá là không đáng kể, vì vậy thông thường nó sẽ được sử dụng WHEREvà thường xuyên EXISTS(như ghi chú @gbn, đây không hẳn là cách thực hành tốt nhất, tuy nhiên, nó đủ phổ biến để được lưu ý, ngay cả khi nó không thực sự có ý nghĩa ( Điều đó nói rằng, tôi sẽ sử dụng nó bởi vì những người khác sử dụng nó và nó "rõ ràng hơn" ngay lập tức. Tất nhiên, đó có thể là một con gà nhớt so với vấn đề trứng, nhưng tôi thường không sống)).

 SELECT * FROM TABLE1 T1 WHERE EXISTS (
     SELECT 1 FROM TABLE2 T2 WHERE T1.ID= T2.ID
 );

Về cơ bản, ở trên sẽ trả về mọi thứ từ bảng 1 có ID tương ứng từ bảng 2. (Đây rõ ràng là một ví dụ giả định, nhưng tôi tin rằng nó truyền đạt ý tưởng. Cá nhân tôi có thể làm như trên SELECT * FROM TABLE1 T1 WHERE ID IN (SELECT ID FROM TABLE2);vì tôi thấy như vậy FAR rõ ràng hơn cho người đọc trừ khi có một lý do thuyết phục hoàn cảnh không).

BIÊN TẬP

Thực sự có một trường hợp mà tôi đã quên cho đến tận bây giờ. Trong trường hợp bạn đang cố gắng xác định sự tồn tại của một giá trị trong cơ sở dữ liệu từ một ngôn ngữ bên ngoài, đôi khi SELECT 1 FROM TABLE_NAMEsẽ được sử dụng. Điều này không mang lại lợi ích đáng kể so với việc chọn một cột riêng lẻ, nhưng, tùy thuộc vào việc triển khai, nó có thể mang lại lợi ích đáng kể khi thực hiện SELECT *, đơn giản là vì thường càng nhiều cột mà DB trả về ngôn ngữ, dữ liệu càng lớn cấu trúc, điều đó có nghĩa là sẽ mất nhiều thời gian hơn.


Và tại sao "bình thường" với EXISTS? Bạn có bằng chứng về lý do tại sao ?
gbn

6
Và -1 để truyền bá huyền thoại về...EXISTS (SELECT 1...
gbn

2
@Gbn Không biết tại sao tôi lại thấy nó ở đó thường xuyên hơn bất cứ thứ gì khác. Tôi chỉ thấy nó ở đó thường xuyên hơn.
cwallenpoole

2
Một con gà nhớt? Không muốn ăn cái đó! Có lẽ nó nên là một 'vấn đề gà và trứng luẩn quẩn'?
No'am Newman

2
@Ben: IN và EXIST thường sẽ tối ưu hóa cho cùng một kế hoạch
gbn

106

select 1 from tablesẽ trả về hằng số 1 cho mỗi hàng của bảng. Nó hữu ích khi bạn muốn xác định giá rẻ nếu bản ghi khớp với wheremệnh đề của bạn và / hoặc join.


1
Câu trả lời này có ý nghĩa nhất đối với tôi
Joseph Astrahan

2
Điểm rất quan trọng trong thực tế: "cho MỌI hàng trong bảng". Do đó, kiểm tra "tính khả dụng của bảng" như một phần của, ví dụ: kiểm tra sức khỏe của bảng có hàng trăm triệu hàng, sẽ kết thúc bằng tập kết quả là hàng trăm triệu "1". (lưu ý: không rằng điều này sẽ bao giờ xảy ra ... trong sản xuất;);))
Conny

Theo nghĩa đen, đây nên là câu trả lời được chấp nhận ở đây!
Fahad Javed

40

Nếu bạn có ý gì đó như

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT 1 FROM table WHERE...) 

sau đó nó là một huyền thoại rằng 1tốt hơn

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT * FROM table WHERE...) 

Các 1hoặc *trong EXISTS bị bỏ qua và bạn có thể viết phần này theo tiêu chuẩn ANSI SQL 1992 :

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT 1/0 FROM table WHERE...) 

1
chỉ cần xác minh rằng postgres tôn trọng điều này, exists (select 1/0hoạt động như một cơ duyên
alex

22

nó thực hiện những gì nó nói - nó sẽ luôn trả về số nguyên 1. Nó được sử dụng để kiểm tra xem một bản ghi có khớp với mệnh đề where của bạn không.


22
uhm - câu hỏi là "nó có nghĩa là gì", không phải "đây là cách thực hành tốt". Tôi đồng ý rằng nó không tạo ra sự khác biệt từ quan điểm hiệu suất - nhưng đó là một quy ước mà các nhà phát triển sử dụng, có lẽ vì 1 thường được hiểu là "đúng".
Neville Kuyt

20

select 1 from table được một số cơ sở dữ liệu sử dụng làm truy vấn để kiểm tra kết nối để xem nó còn sống hay không, thường được sử dụng khi truy xuất hoặc trả lại kết nối đến / từ nhóm kết nối.


2
Đó là trường hợp của tôi, nó khá phổ biến trong số các ứng dụng JBOSS và TOMCAT.
Valter Silva

13

Kết quả là 1cho mỗi bản ghi trong bảng. __


Không thực sự, tôi đã cố gắng tạo một bảng trống và thực hiện truy vấn, kết quả là sáu 1 giây.
r0ng

9

Mặc dù nó không được biết đến rộng rãi, một truy vấn có thể có một HAVINGmệnh đề mà không có GROUP BYmệnh đề.

Trong trường hợp như vậy, HAVINGmệnh đề được áp dụng cho toàn bộ tập hợp. Rõ ràng, SELECTmệnh đề không thể đề cập đến bất kỳ cột nào, nếu không, bạn sẽ (chính xác) nhận được lỗi, "Cột không hợp lệ trong lựa chọn vì nó không được chứa trong NHÓM THEO", v.v.

Do đó, phải sử dụng giá trị bằng chữ (vì SQL không cho phép tập kết quả có cột bằng 0 - tại sao?!) Và giá trị bằng chữ 1 ( INTEGER) thường được sử dụng: nếu HAVINGmệnh đề đánh giá TRUEthì tập kết quả sẽ là một hàng với một cột hiển thị giá trị 1, nếu không, bạn nhận được tập hợp trống.

Ví dụ: để tìm xem một cột có nhiều hơn một giá trị riêng biệt hay không:

SELECT 1
  FROM tableA
HAVING MIN(colA) < MAX(colA);

"Rõ ràng, mệnh đề SELECT không thể tham chiếu đến bất kỳ cột nào" - Sẽ không hợp lý hơn khi chọn biểu thức bool : SELECT MIN(colA) < MAX(colA) FROM tableA?
Paul Spiegel

7

Để cụ thể hơn một chút, bạn sẽ sử dụng điều này để làm

SELECT 1 FROM MyUserTable WHERE user_id = 33487

thay vì làm

SELECT * FROM MyUserTable WHERE user_id = 33487

bởi vì bạn không quan tâm đến việc nhìn vào kết quả. Yêu cầu số 1 là rất dễ dàng cho cơ sở dữ liệu (vì nó không phải thực hiện bất kỳ tra cứu nào).


Theo các nhận xét ở trên, có vẻ như Chọn 1 không có hiệu suất tốt hơn chọn *, có phải vậy không?
eRaisedToX

5

Nếu bạn không biết có tồn tại bất kỳ dữ liệu nào trong bảng của mình hay không, bạn có thể sử dụng truy vấn sau:

SELECT cons_value FROM table_name;

Ví dụ:

SELECT 1 FROM employee;
  1. Nó sẽ trả về một cột chứa tổng số hàng & tất cả các hàng có cùng giá trị không đổi 1 (lần này nó trả về 1 cho tất cả các hàng);
  2. Nếu không có hàng trong bảng của bạn, nó sẽ không trả về gì.

Vì vậy, chúng tôi sử dụng truy vấn SQL này để biết liệu có bất kỳ dữ liệu nào trong bảng không và số lượng hàng cho biết có bao nhiêu hàng tồn tại trong bảng này.


3

Điều này có nghĩa là Bạn muốn giá trị " 1 " là đầu ra hoặc Hầu hết thời gian được sử dụng làm Truy vấn Nội bộ vì một số lý do bạn muốn tính toán các truy vấn bên ngoài dựa trên kết quả của các truy vấn bên trong .. không phải tất cả thời gian bạn sử dụng 1 mà là bạn có một số giá trị cụ thể ...

Điều này sẽ cung cấp cho bạn đầu ra dưới dạng giá trị 1.


3

Nếu bạn chỉ muốn kiểm tra đúng hay sai dựa trên mệnh đề WHERE, hãy chọn 1 từ bảng trong đó điều kiện là cách rẻ nhất.


2

Tôi thấy nó luôn được sử dụng trong SQL tiêm, chẳng hạn như:

www.urlxxxxx.com/xxxx.asp?id=99 union select 1,2,3,4,5,6,7,8,9 from database;

Các số này có thể được sử dụng để đoán nơi cơ sở dữ liệu tồn tại và đoán tên cột của cơ sở dữ liệu bạn đã chỉ định. Và các giá trị của các bảng.


0

nó đơn giản có nghĩa là bạn đang truy xuất cột số đầu tiên từ bảng ,,,, có nghĩa là chọn Emply_num, Empl_no từ nhân viên; Ở đây bạn đang sử dụng chọn 1 từ Nhân viên; điều đó có nghĩa là bạn đang truy xuất cột Emply_num. Cảm ơn


Tôi nhớ cú pháp như vậy, nhưng nó là cụ thể cho một cơ sở dữ liệu tôi không thể nhớ lại. Postgresql?
diynevala 17/03/2016

0

Lý do là một lý do khác, ít nhất là cho MySQL. Đây là từ hướng dẫn sử dụng MySQL

InnoDB tính toán các giá trị cardinality chỉ mục cho một bảng trong lần đầu tiên bảng đó được truy cập sau khi khởi động, thay vì lưu trữ các giá trị đó trong bảng. Bước này có thể mất thời gian đáng kể trên các hệ thống phân vùng dữ liệu thành nhiều bảng. Vì chi phí này chỉ áp dụng cho hoạt động mở bảng ban đầu, để khởi động lại một bảng để sử dụng sau, hãy truy cập ngay sau khi khởi động bằng cách đưa ra câu lệnh như CHỌN 1 TỪ Tbl_name GIỚI HẠN 1


0

Điều này chỉ được sử dụng để thuận tiện với IF EXISTS (). Nếu không bạn có thể đi với

select * from [table_name]

Hình ảnh Trong trường hợp 'NẾU EXISTS', chúng ta chỉ cần biết rằng bất kỳ hàng nào có điều kiện được chỉ định tồn tại hay không không quan trọng nội dung của hàng là gì.

select 1 from Users

mã ví dụ trên, trả về không. của hàng bằng không. của người dùng có 1 trong một cột

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.