Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Seltsam alles drin

Aktualisieren :Nach weiterer Analyse und Entfaltung von MySQLs > ALL seltsame Umsetzung. Diese Antwort sollte als MySQL-spezifisch betrachtet werden. Für weiteren Haftungsausschluss, Erklärung zur Antwort hier in Bezug auf > ALL gilt nicht für andere RDBMS (es sei denn, es gibt andere RDBMS, die die MySQL-Implementierung kopiert haben). Interne Übersetzung von > ALL auf MAX Konstrukt, gilt nur für MySQL.

Dies:

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

ist semantisch äquivalent zu:

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

Da select max(id) from t2 gibt 1 zurück, die zweite Abfrage ergibt sich daraus:

select id from t1 where id > 1

Deshalb gibt es sowohl 10 zurück und 2 aus Tabelle t1

Einer der Fälle, in denen NULL-Regeln angewendet werden, ist die Verwendung von NOT IN , ein Beispiel:

DDL:

create table t1(id int);

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


create table t2(id int); 

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

Abfrage:

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;

Die letzten beiden Abfragen geben 10 zurück und 2 , während die ersten beiden Abfragen eine leere Menge

zurückgeben

Live-Test:http://www.sqlfiddle.com/#!2/82865/ 1

Ich hoffe, diese Beispiele beseitigen Ihre Verwirrung mit NULL-Regeln.

Bezüglich

Optimiertes SQL ist das:

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

Das entspricht wirklich Ihrer ursprünglichen Abfrage:select id from t1 where id > all (select id from t2);

Das Konstrukt t1.field > all (select t2.field from t2) ist nur ein syntaktischer Zucker für:

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

Wenn Sie das DeMorgan-Theorem auf das optimierte SQL von MySql anwenden:

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

Das entspricht:

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

Was wiederum dem syntaktischen Zucker ALL entspricht :

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