Perbarui :Setelah analisis lebih lanjut dan pembukaan > ALL
MySQL pelaksanaan yang aneh. Jawaban ini harus dianggap sebagai khusus MySQL. Jadi untuk penafian lebih lanjut, penjelasan tentang jawaban di sini mengenai > ALL
tidak berlaku untuk RDBMS lain (kecuali ada RDBMS lain yang menyalin implementasi MySQL). Terjemahan internal dari > ALL
ke MAX
konstruksi, hanya berlaku untuk MySQL.
Ini:
select id from t1 where id > all (select id from t2);
secara semantik setara dengan:
select id from t1 where id > (select max(id) from t2);
Karena select max(id) from t2
mengembalikan 1, kueri kedua terwujud sebagai berikut:
select id from t1 where id > 1
Itu sebabnya ia mengembalikan keduanya 10
dan 2
dari tabel t1
Salah satu contoh di mana aturan NULL diterapkan adalah ketika Anda menggunakan NOT IN
, contoh:
DDL:
create table t1(id int);
insert into t1 values (10),(2);
create table t2(id int);
insert into t2 values (0),(null),(1);
Pertanyaan:
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;
Dua kueri terakhir mengembalikan 10
dan 2
, sedangkan dua kueri pertama mengembalikan set kosong
Tes langsung:http://www.sqlfiddle.com/#!2/82865/ 1
Semoga contoh-contoh ini menghapus kebingungan Anda dengan aturan NULL.
Tentang
sql yang dioptimalkan menjadi ini:
select `test`.`t1`.`id` AS `id` from `test`.`t1` where <not>((`
test`.`t1`.`id` <= (select max(`test`.`t2`.`id`) from `test`.`t2`)))
Itu benar-benar setara dengan kueri asli Anda:select id from t1 where id > all (select id from t2);
Konstruksi t1.field > all (select t2.field from t2)
hanyalah gula sintaksis untuk:
t1.field > (select max(t2.field) from t2)
Jika Anda akan menerapkan teorema DeMorgan pada SQL yang dioptimalkan oleh MySql:
not (t1.id <= (select max(t2.id) from t2))
Itu setara dengan:
t1.id > (select max(t2.id) from t2)
Yang pada gilirannya setara dengan gula sintaksis ALL
:
t1.id > ALL(select t2.id from t2)