Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

अजीब सब जगह

अपडेट करें :आगे के विश्लेषण और 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)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL के साथ नवीनतम डुप्लीकेट आईडी खोजें

  2. पी के साथ पंक्ति क्रमांकन:डेटाटेबल

  3. MySQL त्रुटि 1449:एक निश्चित के रूप में निर्दिष्ट उपयोगकर्ता मौजूद नहीं है

  4. Android कनेक्शन त्रुटि java.lang.UnsupportedOperationException

  5. बड़े डेटासेट को यादृच्छिक बनाना