2012-08-23 22 views
6

Nếu tôi tạo bí danh trong mệnh đề select thì tôi không thể sử dụng nó trong mệnh đề where vì theo thứ tự thực hiện truy vấn sql where trước select.Sự khác biệt giữa vị trí và đối với bí danh

Nhưng tôi có thể tạo bí danh trong mệnh đề select và sử dụng nó trong mệnh đề having mặc dù having xuất hiện trước select.

Tại sao lại như vậy?

Ex:

select type, (case when number>25 then 1 else 0 end) inc 
from animals 
where inc='1'; 

wont work này. Nhưng,

select type, (case when number>25 then 1 else 0 end) inc 
from animals 
having inc='1'; 

Tác phẩm này hoạt động. Tại sao như vậy?

+6

Đây là phần mở rộng của MySQL cho tiêu chuẩn. Bạn không thể tham khảo bí danh cột trong 'có' trong SQL Server chẳng hạn. –

Trả lời

5

Về cơ bản vì chúng được xác định cho các mục đích khác nhau. Mệnh đề WHERE là để lọc hồ sơ và mệnh đề HAVING được thiết kế để lọc với chức năng tổng hợp (GROUP BY). Trong truy vấn thứ hai của bạn, bộ lọc GROUP BY tiềm ẩn đang được sử dụng, ví dụ: nếu bạn thêm một cột khác vào mệnh đề SELECT, bạn sẽ kết thúc với các kết quả khác nhau.

EDIT dựa trên chỉnh bởi Martin Smith

HAVING được tạo ra để cho phép lọc các hàng kết quả của một GROUP BY. Khi không có GROUP BY được chỉ định, toàn bộ kết quả được coi là một nhóm.

Nếu không phải là một <where clause> hay một <group by clause> được chỉ định, sau đó để T là kết quả của trước đó <from clause>

hoặc

... nhóm là toàn bộ bảng nếu không có <group by clause> được chỉ định

EDIT 2 Bây giờ về ALIAS:

Các đặc điểm kỹ thuật cho mệnh đề WHERE về tài liệu tham khảo cột trong điều kiện tìm kiếm nói điều này:

Mỗi <column reference> chứa trực tiếp trong <search condition> sẽ rõ ràng tham khảo một cột của T hoặc là tham chiếu ngoài.

Tham khảo: 7.6 <where clause>, Quy tắc cú pháp 1.

Các đặc điểm kỹ thuật cho các mệnh đề HAVING về tài liệu tham khảo cột trong điều kiện tìm kiếm nói điều này:

Mỗi <column reference> chứa trực tiếp trong <search condition> trách nhiệm rõ ràng tham khảo một cột nhóm của T hoặc là một bên ngoài tài liệu tham khảo.

Tham khảo: Quy tắc 7.8 <having clause>, Cú pháp 1.

Và một nhóm cột được định nghĩa là:

Một cột được tham chiếu trong một <group by clause> là một cột nhóm.

Vì vậy, trong kết luận, WHERE phải tham chiếu cột của bảng và mệnh đề HAVING phải tham chiếu cột nhóm của nhóm hàng.

(Second Informal Review Draft) ISO/IEC 9075:1992, Database Language SQL- July 30, 1992

+0

Nhưng làm thế nào mà 'có' chọn bí danh ngay cả trước khi 'chọn' được thực hiện? – pooja

+0

Bất kỳ trích dẫn nào cho "Trong SQL chuẩn, bạn không thể sử dụng mệnh đề HAVING mà không có GROUP BY"? –

+0

Không có trích dẫn, nhưng nó cũng được biết rằng HAVING đã được tạo ra để lọc các hàng kết quả của một mệnh đề GROUP BY. http://en.wikipedia.org/wiki/SQL – davidmontoyago