अपडेट करें :आगे के विश्लेषण और MySQL के > ALL
. का खुलासा करने पर अजीब कार्यान्वयन। इस उत्तर को MySQL- विशिष्ट माना जाना चाहिए। तो आगे के अस्वीकरण के लिए, > ALL
. के बारे में यहां उत्तर पर स्पष्टीकरण अन्य RDBMSes पर लागू नहीं है (जब तक कि अन्य RDBMSes नहीं हैं जो MySQL कार्यान्वयन की नकल करते हैं)। > ALL
. से आंतरिक अनुवाद एक MAX
. पर निर्माण, केवल MySQL पर लागू होता है।
यह:
select id from t1 where id > all (select id from t2);
शब्दार्थ के बराबर है:
select id from t1 where id > (select max(id) from t2);
चूंकि select max(id) from t2
1 लौटाता है, दूसरी क्वेरी इस पर अमल करती है:
select id from t1 where id > 1
इसलिए यह 10
both दोनों लौटाता है और 2
तालिका t1 से
जब आप NOT IN
. का उपयोग करते हैं तो NULL नियम लागू होने का एक उदाहरण है , एक उदाहरण:
डीडीएल:
create table t1(id int);
insert into t1 values (10),(2);
create table t2(id int);
insert into t2 values (0),(null),(1);
प्रश्न:
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;
अंतिम दो क्वेरी 10
लौटाती हैं और 2
, जबकि पहले दो प्रश्न खाली सेट लौटाते हैं
लाइव परीक्षण:http://www.sqlfiddle.com/#!2/82865/ 1
आशा है कि ये उदाहरण NULL नियमों के साथ आपके भ्रम को मिटा देंगे।
के बारे में
अनुकूलित एसक्यूएल यह है:
select `test`.`t1`.`id` AS `id` from `test`.`t1` where <not>((`
test`.`t1`.`id` <= (select max(`test`.`t2`.`id`) from `test`.`t2`)))
यह वास्तव में आपकी मूल क्वेरी के बराबर है:select id from t1 where id > all (select id from t2);
निर्माण t1.field > all (select t2.field from t2)
इसके लिए सिर्फ एक वाक्यात्मक चीनी है:
t1.field > (select max(t2.field) from t2)
यदि आप MySql द्वारा अनुकूलित SQL पर DeMorgan प्रमेय लागू करेंगे:
not (t1.id <= (select max(t2.id) from t2))
यह इसके बराबर है:
t1.id > (select max(t2.id) from t2)
जो बदले में वाक्यात्मक शर्करा के बराबर है ALL
:
t1.id > ALL(select t2.id from t2)