Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Aneh di mana-mana

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)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara menghapus baris dari tiga tabel - kesalahan kueri

  2. CakePHP:Cara menerapkan perubahan skema DB ke produksi tanpa kesalahan

  3. Dapatkan Gambar dari Database MySQL - C#

  4. Kapan menambahkan indeks pada bidang tabel SQL (MySQL)?

  5. Kiri bergabung dengan syarat