“Chọn 1 từ” làm gì?


80

Tôi đọc một số bài báo nhưng thực sự không hiểu những gì select 1 fromlàm gì? Ai đó nói rằng "bạn nên sử dụng select 1thay vì select *". Đây là một bảng ví dụ:

cust_id     cust_name       cust_address

1000000001  Village Toys    Mapl
1000000002  Kids Place      South
1000000003  Fun4All         Sunny
1000000004  Fun4All         Riverside
1000000005  The Toy Store   53rd

Kết quả sẽ ra sao khi tôi viết select 1 from customer_tablecâu lệnh này làm gì?


Khoảng một thập kỷ trước, lời khuyên hợp lý là nên đề xuất select 1thay vì select *trong một EXISTSmệnh đề. Trình tối ưu hóa đã được cải thiện cách đây rất lâu. Nó không bao giờ thay thế cho "lấy tất cả các cột từ tập kết quả này".
Damien_The_Un Believer

12
Bạn đã thử à???
Jimmy D

Câu trả lời:


72
select 1 from table

sẽ trả về một cột gồm 1 cho mọi hàng trong bảng. Bạn có thể sử dụng nó với câu lệnh where để kiểm tra xem bạn có mục nhập cho một khóa nhất định hay không, như trong:

if exists(select 1 from table where some_column = 'some_value')

Điều mà bạn của bạn có lẽ đang nói là thay vì thực hiện các lựa chọn hàng loạt với select * from table, bạn nên chỉ định chính xác các cột mà bạn cần, vì hai lý do:

1) hiệu suất & bạn có thể truy xuất nhiều dữ liệu hơn bạn thực sự cần.

2) người dùng của truy vấn có thể dựa vào thứ tự của các cột. Nếu bảng của bạn được cập nhật, khách hàng sẽ nhận được các cột theo thứ tự khác với mong đợi.


33

Cấu trúc thường được sử dụng trong kiểm tra "sự tồn tại"

if exists(select 1 from customer_table where customer = 'xxx')

hoặc là

if exists(select * from customer_table where customer = 'xxx')

Cả hai công trình đều tương đương nhau. Trước đây, người ta nói rằng select * tốt hơn vì khi đó người quản lý truy vấn sẽ sử dụng cột được lập chỉ mục tốt nhất. Điều này đã được chứng minh là không đúng.


24

Nó thực hiện những gì bạn yêu cầu, SELECT 1 FROM tablesẽ SELECT(trả về) a 1cho mọi hàng trong bảng đó, nếu có 3 hàng trong bảng bạn sẽ nhận được

1
1
1

Hãy xem Đếm (*) và Đếm (1) , đây có thể là vấn đề bạn được mô tả.


3
Tại sao tôi muốn điều đó?
CodyBugstein

7
@Imray Điều này hữu ích khi bạn chỉ quan tâm xem điều kiện trong WHEREmệnh đề của bạn là đúng hay sai. Nó thường được sử dụng trong các truy vấn phụ.
Andreas

9

Câu lệnh SELECT 1 FROM SomeTablechỉ trả về một cột chứa giá trị 1cho mỗi hàng trong bảng của bạn. Nếu bạn thêm một cột khác vào, ví dụ: SELECT 1, cust_name FROM SomeTablethì nó làm cho nó rõ ràng hơn một chút:

            cust_name
----------- ---------------
1           Village Toys
1           Kids Place
1           Fun4All
1           Fun4All
1           The Toy Store

4
SELECT COUNT(*) in EXISTS/NOT EXISTS

EXISTS(SELECT CCOUNT(*) FROM TABLE_NAME WHERE CONDITIONS) - các EXISTS điều kiện sẽ luôn trả về true bất kể ĐIỀU KIỆN được đáp ứng hay không.

NOT EXISTS(SELECT CCOUNT(*) FROM TABLE_NAME WHERE CONDITIONS)- NOT EXISTSđiều kiện sẽ luôn trả về false bất kể CONDITIONSđược đáp ứng hay không.

SELECT COUNT 1 in EXISTS/NOT EXISTS

EXISTS(SELECT CCOUNT 1 FROM TABLE_NAME WHERE CONDITIONS)- EXISTSđiều kiện sẽ trả về true nếu CONDITIONSđược đáp ứng. Khác sai.

NOT EXISTS(SELECT CCOUNT 1 FROM TABLE_NAME WHERE CONDITIONS)- NOT EXISTSđiều kiện sẽ trả về false nếu CONDITIONSđược đáp ứng. Đúng là khác.

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.