sql >> Databasteknik >  >> RDS >> Mysql

Konstigt överallt

Uppdatera :Vid ytterligare analys och utveckling av MySQL:s > ALL udda implementering. Detta svar bör betraktas som MySQL-specifikt. Så för ytterligare ansvarsfriskrivning, förklaring på svar här angående > ALL är inte tillämplig på andra RDBMS:er (såvida det inte finns andra RDBMS:er som kopierade MySQL-implementering). Intern översättning från > ALL till ett MAX konstruktion, gäller endast MySQL.

Detta:

select id from t1 where id > all (select id from t2); 

är semantiskt ekvivalent med:

select id from t1 where id > (select max(id) from t2); 

Eftersom select max(id) from t2 returnerar 1, den andra frågan materialiseras till detta:

select id from t1 where id > 1

Det är därför det returnerar både 10 och 2 från tabell t1

Ett av fallen där NULL-regler tillämpas är när du använder NOT IN , ett exempel:

DDL:

create table t1(id int);

insert into t1 values (10),(2);


create table t2(id int); 

insert into t2 values (0),(null),(1);

Fråga:

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;

De två sista frågorna returnerar 10 och 2 , medan de två första frågorna returnerar tom uppsättning

Livetest:http://www.sqlfiddle.com/#!2/82865/ 1

Hoppas dessa exempel raderar din förvirring med NULL-regler.

Angående

Optimerad sql är detta:

select `test`.`t1`.`id` AS `id` from `test`.`t1` where <not>((`
test`.`t1`.`id` <= (select max(`test`.`t2`.`id`) from `test`.`t2`)))

Det motsvarar verkligen din ursprungliga fråga:select id from t1 where id > all (select id from t2);

Konstruktionen t1.field > all (select t2.field from t2) är bara ett syntaktisk socker för:

t1.field > (select max(t2.field) from t2)

Om du kommer att tillämpa DeMorgan-satsen på optimerad SQL av MySql:

not (t1.id <= (select max(t2.id) from t2))

Det motsvarar:

t1.id > (select max(t2.id) from t2)

Vilket i sin tur motsvarar det syntaktiska sockret ALL :

t1.id > ALL(select t2.id from t2)


  1. XAMPP-inställning - MySQL fungerar inte

  2. mysql LIKE med dubbel procent

  3. Pinkoddatabas för Indien med platsfinnarskript i php och jquery

  4. MYSQL - Ta bort fråga med Join