Məlumat analizini həyata keçirmək üçün kompleks bir SQL sorğusu yazarkən istifadə edə biləcəyimiz faydalı alətlər içərisində alt sorğular və ümumi cədvəl ifadələri mühüm yer tutur. Hər iki anlayış bənzər işlər görsə də, bir-birlərinə nəzərən üstün və fərqli olduqları cəhətlər mövcuddur. Bu məqalə nümunələr əsasında alt sorğular və onun növləri özündə əhatə edəcəkdir.

Alt sorğu nədir və hansı növləri mövcuddur?

    Alt sorğu ifadə edə biləcəyimiz ən sadə dildə sorğu içərisində yaradılmış sorğulardır. Əgər bizdən tələb olunan cədvəl sətirlərini və ya dəyərlərini sadəcə 1 SELECT komandası ilə əldə edə bilmiriksə, bu zaman ana sorğuda (main query) əlavə məlumatları (məsələn, digər cədvəllərin datasını) özündə əhatə edən müəyyən məhdudiyyətlər və ya şərt qoymaq gərəklidir. Ən son arzuolunan dəyər və ya sətirləri əldə etmək üçün alt sorğuların qaytarmış olduğu məlumat və sətirlər əsas sorğuda (main query) şərt daxilində istifadə olunur (İrəlidə göstərəcəyim nümunələr bu cümləyə aydınlıq gətirəcəkdir J ). Alt sorğu qaytardığı sətir və sütun sayına görə müxtəlif növlərə bölünür:

  • Tək sətir qaytaran alt sorğular (Single Row Subquery)

   Bu alt sorğunun nəticəsi ana sorğuya qaytarılmış 1 sətir olacaqdır. Məsələn, bizdən tələb olunur ki, SalesOrders cədvəlində ən son daxil olunmuş sifarişin detallarını ekrana çıxaraq. Məsələyə müxtəlif cür yanaşmaq olar, lakin biz bilirik ki, sonuncu daxil olmuş sifarişin nömrəsi (ID) bütün nömrələrin maximumu olmalıdır. Sorğunu aşağıdakı kimi yazırıq:

İlk öncə alt sorğu işə düşür və nəticə olaraq bizə qaytardığı 1 sətir olur:

Daha sonra bu id dəyəri WHERE şərtinə yerləşdirilir (təbii ki, bu proses serverin daxilində baş verir):

Və ən son arzuolunan nəticə isə:

Beləliklə, 2 fərqli sorğunu iç-içə yazaraq cəmi 1 sorğu ilə (ana sorğu daxilində yazılmış şərt içərisində alt sorğu ilə) doğru nəticə əldə etmiş oluruq. Bəs bu məsələdə alt sorğudan istifadə etmə zəruriyyəti necə yarandı?

  1. 2 fərqli cədvəldən (SalesOrders və SalesOrderİtems) məlumat əldə etməli idik.
  2. Tutaq ki, məlumatlar eyni cədvəldən olsaydı, bu zaman MAX() funksiyasını WHERE şərti daxilində işlətməli idik. Lakin, aggregate funksiyaların sadəcə HAVİNG klauzu ilə işlədildiyini və WHERE daxilində işlədilmədiklərini bilirik. Bu zaman aşağıdakı error qaçınılmaz olacaq idi:

An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference.

Bir sətir və bir sütun dəyər qaytaran sorğular Skalyar alt sorğular adlanır.

QEYD: Alt sorğuları SELECT, İNSERT, UPDATE, DELETE (DML komandaları) CREATE DDL komandası daxilində işlətmək mümkündür.

  • Çox sətir qaytaran alt sorğular (Multiple Row Subquery)

    Bu alt sorğunun nəticəsi ana sorğuya qaytarılmış bir və ya bir neçə sətirlər olacaqdır. Məsələn, “Uşaq velosipedləri” və  “Elektrikli motosikletlər” kateqoriyasına aid olan məhsullar barəsində məlumatı çıxarmaq istəyirik.

Alt sorğu birdən çox dəyər qaytarırsa, bu zaman IN açar kəliməsindən istifadə olunur. Həmçinin, NOT IN, EXİSTS, ANY, ALL kimi operatorlar da bu tip alt sorğularda istifadə olunur.

Alt sorğunun (SELECT category_id FROM [production].[categories] WHERE                           category_name IN ('Children Bicycles', 'Electric Bikes'))) qaytardığı sətirlər (1-dən çox sətir qaytarır):

Bu əməliyyatı JOİN istifadə edərək yazmaq mümkündür.

 

  • Çox sütun qaytaran alt sorğular (Multiple Column subquery)

Alt sorğunun göndərdiyi sütunların sayı 1-dən çox olur. Məsələn, məhsul kateqoriyası və məhsul qiyməti  18 nömrəli məhsul (product_id = 18 ) ilə eyni olan bütün məhsulları əldə etmək istəyirik:

Əldə olunan nəticə:

Bu cür yazılış Oracle tərəfindən dəstəklənsə də, SQL SERVER işlədərkən error ilə qarşılaşacaqsınız. Bu zaman MS Serverdə yaza biləcəyiniz sorğunu bu şəkildə əvəzləyə bilərik:

Bir neçə sətir və ya bir neçə sütun qaytaran alt sorğular “Çox dəyərli alt sorğular” (Multi-valued subqueries) adlanır.

Alt sorğular onları əhatə edən ana sorğu ilə əlaqələrinin (korrelasiyanın) olub-olmaması baxımından 2 kateqoriyaya bölünür.

  • Bağımsız alt sorğular (“Non-correlated” və ya “Self-contained” və ya “Nested” subquery)

Adından da göründüyü kimi, bu tip sorğular tamamilə əsas sorğudan bağımsız şəkildə işləyir və onları hər hansı sorğu daxilində olmadan işlətdikdə nəticə əldə etmək mümkün olur. Məsələn, Marketinq departamentində çalışan işçilərin siyahısını əldə etmək istəyirik.

Alt sorğunu ayrıca işə salsaq bizə nəticə qaytaracaqdır:

Bütövlükdə sorğunun nəticəsi:

  • Əlaqəli alt sorğular (Correlated subquery)

Alt sorğu ana sorğu ilə əlaqəli şəkildə icra olunarsa və ya alt sorğu ana sorğuya istinad edərək nəticə qaytararsa, bu tip sorğular əlaqəli sorğular adlanır. Bu zaman əsas sorğu birinci icra olunur, çünki ana sorğuda çağrılmış cədvəl alt sorğuda istifadə olunur. Məsələn, “Huawei” brendinə aid məhsulun sifariş detallarını əldə etmək istəyirik. Bu zaman 3 cədvələ müraciət edəcəyik: SalesOrders, SalesOrderDetails və Products cədvəlləri. Məshullar barəsində məlumat Products cədvəlində, sifarişlər və onlara daxil olan məhsullar barəsində detallar SalesOrderdetails cədvəlində, sifarişin kim tərəfindən, nə zaman, haraya edilmısi barəsində məlumatlar isə Orders cədvəlində yerləşir:

Ana sorğu daxilində 2 əlaqəli alt sorğudan istifadə olunur. Alt sorğunu ayrılıqda icra etdikdə qarşılaşacağımız xəta:

Bu tip sorğularda daha çox EXİSTS NOT EXİSTS açar sözlərindən istifadə olunur. Bağımsız sorğularla müqayisədə əlaqəli sorğular icra sürətləri daha aşağı olur. Səbəb isə əlaqəli sorğu ana sorğu tərəfindən qaytarılmış hər bir sətir üçün yenidən icra olunur.

Ümid edirəm, alt sorğular barəsindəki məqaləm sizlər üçün kifayət qədər açıqlayıcı oldu.

Vaxt ayırıb oxuduğunuz üçün minnətdaram!