sql >> Databáze >  >> RDS >> Mysql

Divné všude

Aktualizovat :Po další analýze a rozvinutí > ALL MySQL lichá implementace. Tato odpověď by měla být považována za specifickou pro MySQL. Takže pro další vyloučení odpovědnosti, vysvětlení odpovědi zde týkající se > ALL se nevztahuje na jiné RDBMS (pokud neexistují jiné RDBMS, které zkopírovaly implementaci MySQL). Interní překlad z > ALL na MAX konstrukt, platí pouze pro MySQL.

Toto:

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

je sémanticky ekvivalentní:

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

Protože select max(id) from t2 vrátí 1, druhý dotaz se zhmotní takto:

select id from t1 where id > 1

Proto vrací obě 10 a 2 z tabulky t1

Jedním z případů, kdy jsou aplikována pravidla NULL, je použití NOT IN , příklad:

DDL:

create table t1(id int);

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


create table t2(id int); 

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

Dotaz:

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;

Poslední dva dotazy vrátí 10 a 2 , zatímco první dva dotazy vrátí prázdnou sadu

Živý test:http://www.sqlfiddle.com/#!2/82865/ 1

Doufám, že tyto příklady vymažou váš zmatek s pravidly NULL.

Pokud jde o

Optimalizované sql je toto:

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

To je skutečně ekvivalentní vašemu původnímu dotazu:select id from t1 where id > all (select id from t2);

Konstrukce t1.field > all (select t2.field from t2) je pouze syntaktický cukr pro:

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

Pokud použijete DeMorganovu větu na optimalizované SQL podle MySql:

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

To je ekvivalentní:

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

Což je zase ekvivalentní syntaktickému cukru ALL :

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


  1. JSON v SQL Server

  2. python odo sql AssertionError:datový tvar musí být typ záznamu, dostal 0 * {...}

  3. Jak změnit velikost ovládacích prvků formuláře v Accessu 2016

  4. Stránkování PHP a MySQL