Saturs
Pastāvīgs izaicinājums SQL izmantošanā ir noteikt EXISTS un IN operatoru pareizu izmantošanu. Abi operatori var radīt tādus pašus rezultātus, bet ne vienmēr. Turklāt notiek ievērojamas debates par to, kā katrs operators ir optimizēts ātrumam. Lietotājiem vajadzētu saprast katra operatora dažādos atribūtus un eksperimentēt ar diviem, lai noteiktu atbilstošu lietojumu.
Apsveriet savus SQL mērķus, izvēloties EXISTS vai IN (Jupiterimages / Photos.com / Getty Images)
IN operators
IN operators atgriež rindu, ja tabulas lauka vērtība atbilst WHERE nosacījumam IN vērtību sarakstā. To parasti izmanto kā galveno vaicājumu vai kopā ar subquery.
1. piemērs: WHERE table.field IN ('a', 'b', 'c') 2. piemērs: WHERE table.field IN (Subquery, kas atgriež komplektu)
EXISTS operators
Operators EXISTS atgriež visas galvenās rindas, ja subquery satur kādas rindas. To izmanto tikai kopā ar subquery. Atgrieztās rindas nosaka galvenā vaicājuma filtrs.
Piemērs: KUR EXISTS (Subquery, kas atgriež komplektu)
Atšķirība
IN operators nevar novērtēt NULL vērtības, tāpēc šādas līnijas vienmēr būs nepatiesas, un tās neatdos, atšķirībā no EXISTS operatora, kas novērtē un atgriež līnijas ar NULL vērtībām.
Līdzības
Gan EXISTS, gan IN atbalsta korelētas un nekorelētas subqueries, un abi var dot līdzīgus rezultātus. Ja tie ir savstarpēji saistīti, tie atbilst galvenajam vaicājuma laukam subquery laukam (piem., Princip.id = subquery.id). Subquery novērtē rindu pēc kārtas katram atrastajam notikumam. Šajā gadījumā IN un EXISTS atgriezīs tās pašas līnijas, pamatojoties uz līdzīgiem "id" nosacījumiem. Ja tie nav korelēti, abi operatori apstrādā savas subqueries un pēc tam apvieno galvenās vaicājuma rezultātus.
Veiktspēja
Veiktspēju nosaka datubāzes optimizētājs un izpildes plāns, ko izmanto izpildītajam kodam. EXISTS un IN, optimizētājs var izvēlēties dažādus ceļus. Oracle programmā NOT EXISTS parasti nav ātrāk nekā NAV. Galu galā ir nepieciešami daži mēģinājumi un kļūdas, lai sakārtotu īsāko ceļu, atkarībā no izmantotās datu bāzes un versijas. Noteikti izmantojiet operatoru, kurš vispirms garantē pareizos rezultātus, un tad mēģiniet nomainīt operatorus, lai redzētu, kurš ir ātrākais.