2009-05-05 5 views

Trả lời

41

Không, nếu bạn không sử dụng "order by" bạn không được bảo đảm bất kỳ thứ tự nào. Trong thực tế, bạn không được đảm bảo rằng thứ tự từ một truy vấn đến truy vấn tiếp theo sẽ giống nhau. Hãy nhớ rằng SQL đang xử lý dữ liệu theo kiểu thời trang. Bây giờ, một cơ sở dữ liệu thực hiện hay cách khác có thể xảy ra để cung cấp các lệnh theo một cách nhất định nhưng bạn không bao giờ nên dựa vào điều đó.

+1

Bất kỳ cơ hội nào các hồ sơ sẽ được trả lại theo thứ tự của chỉ số nhóm? –

+1

Một cơ hội rất tốt, nhưng không được bảo đảm. Truy vấn phức tạp liên quan đến kết nối, lượt xem, truy vấn phụ và các truy vấn tương tự có thể khiến tập kết quả được sắp xếp rất khác nhau. –

+0

ANd nó có thể trở lại đôi khi inthe nhóm thứ tự chỉ mục và đôi khi không. Luôn sử dụng đơn hàng nếu bạn muốn một đơn đặt hàng cụ thể. – HLGEM

6

Khi tôi thực hiện lựa chọn, liệu tôi luôn đảm bảo rằng kết quả của tôi sẽ được đặt theo khóa chính hay tôi nên chỉ định nó bằng 'thứ tự'?

Không, nó không được đảm bảo.

SELECT * 
FROM table 

hầu hết có thể sẽ sử dụng TABLE SCAN không sử dụng khóa chính.

Bạn có thể sử dụng một gợi ý:

SELECT /*+ INDEX(pk_index_name) */ 
     * 
FROM table 

, nhưng ngay cả trong trường hợp này, trật tự không được bảo đảm: nếu bạn sử dụng Enterprise Edition, truy vấn có thể được song song.

Đây là một vấn đề, vì ORDER BY không thể được sử dụng trong một điều khoản subquery SELECT và bạn không thể viết một cái gì đó như thế này:

SELECT (
     SELECT column 
     FROM table 
     WHERE rownum = 1 
     ORDER BY 
       other_column 
     ) 
FROM other_table 
+0

Không phải là vấn đề: CHỌN DISTINCT FIRST_VALUE (cột) OVER (ORDER BY other_column) TỪ bảng; –

+0

@ Jeffrey: có thể, nhưng truy vấn phụ sẽ chọn tất cả FIRST_VALUE và HASH UNIQUE chúng. Điều này sẽ giết tất cả hiệu suất, truy vấn phụ sẽ trả về rất nhiều hàng. – Quassnoi

0

Nó phụ thuộc vào DB của bạn và cũng nó phụ thuộc vào lĩnh vực lập chỉ mục.

Ví dụ, trong bảng của tôi Người dùng mỗi người dùng có trường varchar (20) duy nhất - đăng nhập và khóa chính - id.

Và "Chọn * từ người dùng" trả về các hàng được sắp xếp theo đăng nhập.

0

Nếu bạn muốn đặt hàng cụ thể thì hãy khai báo cụ thể bằng cách sử dụng ORDER BY.

Điều gì sẽ xảy ra nếu bảng không có khóa chính?

+0

Nếu bảng không có khóa chính, bạn có các vấn đề khác với thứ tự dữ liệu được trả về. –

+0

hoàn toàn, nhưng nó không ngăn mọi người thiết kế bảng nặng! – pmcilreavy

0

Nếu bạn muốn kết quả của bạn theo một thứ tự cụ thể, luôn luôn chỉ định một trật tự bởi

2

Không, trật tự được bảo đảm về trừ khi bạn sử dụng một ORDER BY.

Thứ tự các hàng được tìm nạp phụ thuộc vào phương pháp truy cập (ví dụ: quét bảng đầy đủ, quét chỉ mục), các thuộc tính vật lý của bảng, vị trí hợp lý của mỗi hàng trong bảng và các yếu tố khác. Tất cả những điều này có thể thay đổi ngay cả khi bạn không thay đổi truy vấn của mình, để đảm bảo thứ tự nhất quán trong tập kết quả của bạn, ORDER BY là cần thiết.