Giúp tôi hiểu điều này: Trong hướng dẫn sqlzoo cho câu hỏi 3a ("Tìm quốc gia lớn nhất trong từng khu vực"), tại sao gắn 'AND population> 0' vào câu lệnh lồng nhau SELECT thực hiện điều này đúng?SQL: Mệnh đề WHERE dự phòng xác định cột là> 0?
Trả lời
Lý do là vì:
AND population > 0
... được lọc ra hàng null cho khu vực "Châu Âu", tên "Vatican", mà làm phức tạp:
WHERE population >= ALL (SELECT population
FROM ...)
. ..bởi vì NULL không phải là giá trị, vì vậy, Nga sẽ không được xếp hạng đúng. Toán tử ALL yêu cầu giá trị bạn so sánh lớn hơn hoặc bằng TẤT CẢ các giá trị được trả về từ truy vấn con, điều này không bao giờ có thể xảy ra khi có NULL trong đó.
truy vấn của tôi sẽ đã hoặc:
SELECT region, name, population
FROM bbc x
WHERE population = (SELECT MAX(population)
FROM bbc y
WHERE y.region = x.region)
... hoặc, sử dụng lệnh JOIN:
SELECT x.region, x.name, x.population
FROM bbc x
JOIN (SELECT y.region,
MAX(y.population) AS max_pop
FROM bbc y
GROUP BY y.region) z ON z.region = x.region
AND z.max_pop = x.population
Không, không. Quốc gia lớn nhất có dân số không phải là người ưu tiên.
Giống như kiểm tra xem một cuốn sách lớn nhất có bất kỳ trang nào trong đó hay không.
Tôi nghĩ rằng đó là điểm của câu hỏi @ Hamster của - một phần của mệnh đề là trong ví dụ được đưa ra trên trang web SQLzoo – sasfrog
Ngoài ra truy vấn trả về các kết quả khác nhau nếu bạn bỏ qua mệnh đề "> 0". –
Có vẻ như Nga bị mất tích mà không có nó. Tôi không thể hiểu tại sao điều đó có thể xảy ra. – Hamster
OH vì vậy Châu Âu là khu vực duy nhất có giá trị dân số NULL. Tôi hiểu rồi. – Hamster
@Hamster: Vâng, nếu không bạn cũng sẽ thấy các khu vực khác bỏ học. Toán tử ALL yêu cầu giá trị bạn so sánh lớn hơn hoặc bằng TẤT CẢ các giá trị được trả về từ truy vấn con, điều này không bao giờ có thể xảy ra khi có NULL trong đó. –
Có tùy chọn NOT NULL nào không? Điều đó sẽ có ý nghĩa hơn nhiều, có thể. – Hamster