Cập nhật :Sau khi phân tích sâu hơn và mở ra > ALL
của MySQL thực hiện lẻ. Câu trả lời này nên được coi là dành riêng cho MySQL. Vì vậy, để có thêm tuyên bố từ chối trách nhiệm, hãy giải thích về câu trả lời ở đây liên quan đến > ALL
không áp dụng cho các RDBMS khác (trừ khi có các RDBMS khác đã sao chép việc triển khai MySQL). Bản dịch nội bộ từ > ALL
thành MAX
cấu trúc, chỉ áp dụng cho MySQL.
Cái này:
select id from t1 where id > all (select id from t2);
tương đương về mặt ngữ nghĩa với:
select id from t1 where id > (select max(id) from t2);
Vì select max(id) from t2
trả về 1, truy vấn thứ hai trở thành hiện thực:
select id from t1 where id > 1
Đó là lý do tại sao nó trả về cả 10
và 2
từ bảng t1
Một trong những trường hợp áp dụng quy tắc NULL là khi bạn sử dụng NOT IN
, một ví dụ:
DDL:
create table t1(id int);
insert into t1 values (10),(2);
create table t2(id int);
insert into t2 values (0),(null),(1);
Truy vấn:
select * from t1 where id not in (select id from t2);
-- above is evaluated same as the following query, so the rules about null applies,
-- hence the above and following query will not return any record.
select * from t1 where id <> 0 and id <> null and id <> 1;
-- to eliminate null side-effect, do this:
select * from t1 where id not in (select id from t2 where id is not null);
-- which is equivalent to this:
select * from t1 where id <> 0 and id <> 1;
Hai truy vấn cuối cùng trả về 10
và 2
, trong khi hai truy vấn đầu tiên trả về tập hợp rỗng
Kiểm tra trực tiếp: http://www.sqlfiddle.com/#!2/82865/ 1
Hy vọng những ví dụ này sẽ xóa bỏ sự nhầm lẫn của bạn với các quy tắc NULL.
Về
Sql được tối ưu hóa là điều này:
select `test`.`t1`.`id` AS `id` from `test`.`t1` where <not>((`
test`.`t1`.`id` <= (select max(`test`.`t2`.`id`) from `test`.`t2`)))
Điều đó thực sự tương đương với truy vấn ban đầu của bạn:select id from t1 where id > all (select id from t2);
Cấu trúc t1.field > all (select t2.field from t2)
chỉ là một đường cú pháp cho:
t1.field > (select max(t2.field) from t2)
Nếu bạn áp dụng định lý DeMorgan trên SQL được tối ưu hóa bởi MySql:
not (t1.id <= (select max(t2.id) from t2))
Điều đó tương đương với:
t1.id > (select max(t2.id) from t2)
Đến lượt nó, tương đương với đường cú pháp ALL
:
t1.id > ALL(select t2.id from t2)