DBMS-də alt sorğular

Tutaq ki, 'Alex' dən böyük olan şagirdlərin qeydlərini almaq istəyirik. Bu əməliyyatı necə edəcəyik? Əvvəlcə Alexin yaşını araşdırmalıyıq, sonra sorğuda Alexdən böyük olan tələbələri gətirmək üçün onun yaşından istifadə edilməlidir. Beləliklə, yuxarıda axtarış üçün yerinə yetiriləcək iki sorğu olacaqdır. Ancaq bir sorğunun nəticəsini saxlayacaq və başqa bir sorğuda istifadə olunan, PL / SQL bloku yazılmadığı təqdirdə heç bir dəyişənimiz yoxdur. Ancaq bu qədər sadə bir sorğu üçün elan, başlamaq, istisna və s. İlə uzun bir PL / SQL bloku yazmaq istəmirik. Bunu asanlıqla yerinə yetirməliyik. Beləliklə, DBMS bir sorğunun WHERE bəndində yazıldığı alt sorğu adlı bir xüsusiyyət təmin edir.

Yuxarıdakı nümunədə, HARADA bəndində Alexin yaşını almaq üçün bir sorğu yazsaq və digər tələbə yaşı ilə müqayisə etsək, tapşırıq daha asandır.

SELECT *
      FROM STUDENT
    WHERE AGE>=
    (SELECT AGE
        FROM STUDENT
     WHERE STD_NAME = ‘Alex’);

Yuxarıda göstərilən sorğunu müşahidə etsək, Alexin yaşını gətirmək üçün daxili sorğunun əvvəlcə yaşını almaq üçün icra edildiyini və daha sonra daha yaşlı yaşda olan tələbələri geri götürmək üçün istifadə edildiyini görə bilərik.

Alt sorğu daxili sorğunun əvvəlcə yerinə yetirildiyi və nəticəsinin xarici sorğuda istifadə edildiyi daxili sorğu və ya iç içə sorğudur. Alt sorğular yalnız bir dəfə icra ediləcəkdir. Aşağıdakı xüsusiyyətlərdən bəzilərinə malikdir:

  •  Alt sorğular SELECT, INSERT, UPDATE və DELETE ifadələri ilə istifadə edilə bilər.

Aşağıdakı kimi INSERT ifadəsində alt sorğulardan istifadə edə bilərik:

INSERT INTO STD_BKP
SELECT STD_ID, STD_NAME, ADDRESS, CLASS_ID 
        FROM STUDENT
   WHERE CLASS_ID IN
	(SELECT CLASS_ID 
		FROM STUDENT
	      WHERE CREATED_DATE<= SYSDATE-30);

Yuxarıdakı sorğu bir ay əvvəl TƏLƏBƏ daxil olan CLASS_IDs TƏLƏBƏLƏRİNİ seçərək STD_BKP tələbə cədvəlinin ehtiyatına bir ay əvvəlki qeydləri əlavə edin.

UPDATE ifadəsində alt sorğuları aşağıdakı kimi istifadə edə bilərik:

UPDATE EMPLOYEE
SET SALARY = SALARY + (SALARY * 0.1)
WHERE DEPT_ID = (SELECT DEPT_ID FROM DEPT WHERE DEPT_NAME = ‘DESIGN’);

Yuxarıdakı sorğu DESIGN işçilərinin maaşlarını 10% yeniləmək üçün yazılmışdır.

DELETE ifadəsində alt sorğuları aşağıdakı kimi istifadə edə bilərik:

DELETE EMPLOYEE 
WHERE DEPT_ID = (SELECT DEPT_ID FROM DEPT WHERE DEPT_NAME = ‘DESIGN’);

Yuxarıdakı sorğu DESIGN işçilərini EMPLOYEE cədvəlindən silmək üçün yazılmışdır.

  •     NECələri WHERE bəndində =, <,>,> =, <=, IN, BETWEEN və s operatorları istifadə edərək müqayisə etmək üçün alt sorğulardan istifadə edə bilərik.
  •     Daxili sorğular mötərizəyə daxil edilir.
  •     Yalnız bir sıra məlumat qaytarmalıdır. Birdən çox sətir varsa, alt sorğu ilə qaytarılır IN operator istifadə edilməlidir.
  •     Əksər hallarda daxili SELECT ifadəsində yalnız bir sütun istifadə olunur. Ancaq xarici sorğuda müqayisə etmək üçün birdən çox sütuna sahib olmaq şərti ilə birdən çox sütuna sahib ola bilərik. Birdən çox sütun istifadə edildikdə xarici və daxili sorğudakı sütunların sırası eyni olmalıdır.

Məsələn, Alexin yaşında olan və onun yerindən olan tələbələri tapmaq lazımdırsa, daxili / alt sorğu aşağıdakı kimi yazıla bilər:

SELECT * 
      FROM STUDENT
    WHERE (AGE, ADDRESS) = 
	(SELECT AGE, ADDRESS
	    FROM STUDENT 
	 WHERE STD_NAME = ‘Alex’);

  •     SİFARİŞ BY maddəsi alt sorğunun içərisində istifadə edilə bilməz. İdeal olaraq çox istifadə edildiyi təqdirdə heç bir şey ifadə etmir, çünki yalnız bir sıra qaytarmalıdır. Sütunları sıralamalı olsaq da GROUP BY müddəasından istifadə edə bilərik.
  •     Alt sorğu, BLOB, ARRAY, CLOB və ya NCLOB tipli məlumatları xarici sorğuya qaytara bilməz.
  •     SQL-də WHERE bəndində 255 alt sorğu ola bilər.
  •     Bəzi müddəaları istifadə edərək dəyərləri müqayisə etmək üçün alt sorğulardan istifadə edilə bilər. VƏ ya bəndini istifadə edərək dəyərlər siyahısını müqayisə etməli olduğumuz zaman BƏZİ istifadə olunur. Siyahı dəyərindən hər hansı biri uyğun gəlirsə, nəticə göstərilir.

SELECT * 
      FROM STUDENT
    WHERE (AGE) > SOME – here if there is any student whose age are above ANY students from 100 t0 105, then result will be displayed.
	(SELECT AGE
	    FROM STUDENT 
	 WHERE STD_ID BETWEEN 100 AND 105);

Burada BƏZİ bəndini HƏR bir bənd əvəz edə bilər. Bu bəndlərin hər ikisi eyni vəzifəni yerinə yetirir.

  •     Alt sorğular BÜTÜN bəndlərdən istifadə edərək dəyərləri müqayisə etmək üçün istifadə edilə bilər. ALL, AND bəndindən istifadə edərək dəyərlər siyahısını müqayisə etməli olduğumuz zaman istifadə olunur. Siyahı dəyərlərinin hamısı uyğun gəlirsə, nəticə göstəriləcəkdir.

SELECT * 
      FROM STUDENT
    WHERE (AGE) > ALL – here if there is any student whose age is above students from 100 t0 105, then result will be displayed.
	(SELECT AGE
	    FROM STUDENT 
	 WHERE STD_ID BETWEEN 100 AND 105);

  •     Alt sorğular UNİKAL bəndlə birlikdə alt sorğunun təkrarlanan dəyərlər verdiyini yoxlamaq üçün istifadə olunur.

SELECT * 
      FROM STUDENT
    WHERE UNIQUE – verifies if any students from 100 to 105 have same age 
	(SELECT AGE
	    FROM STUDENT 
	 WHERE STD_ID BETWEEN 100 AND 105);

  •     Alt sorğular əldə edilmiş münasibətlərdə istifadə edilə bilər. Yəni alt sorğuları cədvəl kimi istifadə edə bilərik. Orta qiyməti 80-dən çox olan tələbələri almaq üçün bir sorğunu nəzərdən keçirin. Bunun üçün sadə bir sorğu belə olacaq:

SELECT S.STD_ID, AVG (SM.MARKS) AS avg_mark
FROM STUDENT S, STD_MARKS SM
WHERE S.STD_ID = SM.STD_ID
GROUP BY S.STD_ID
HAVING AVG (SM.MARKS) >80;

Burada bu sorğu yalnız ortalama 80-dən çox olan tələbə şəxsiyyət vəsiqələrini tapacaqdır. Lakin tələbələrin digər təfərrüatları tələb olunarsa, başqa bir sorğu yazmalıyıq, yuxarıdakı sorğunu cədvəl şəklində soruşmalı, yəni; yuxarıdakı sorğu tələbə məlumatlarını almaq üçün sorğu üçün bir cədvəl rolunu oynayır.
SELECT S.STD_ID, S.STD_NAME, S.COURSE_ID
FROM STUDENT, 
(SELECT S.STD_ID, AVG (SM.MARKS) AS avg_mark
FROM STUDENT S, STD_MARKS SM
WHERE S.STD_ID = SM.STD_ID
GROUP BY S.STD_ID) AS SA
WHERE S.STD_ID = SA.STD_ID
AND SA.AVG_MARK >80;

Burada orta dəyərin HAVING bəndindən istifadə etmədən alt sorğunun xaricində müqayisə olunduğunu qeyd etmək olar, çünki bu alt sorğu cədvəl rolunu oynayır. Buna görə müqayisə HARADA bəndində aparılır.

  •     Maddə ilə: - Bəzi sorğular mürəkkəb olacaq və eyni sorğuda birdən çox alt sorğudan istifadə etmək sorğunun mürəkkəbliyini artıracaqdır. Bu cür uzun sorğularda bəzən alt sorğunun bir hissəsini sorğudan çıxarıb eyni sorğunun görünüşü kimi istifadə edə bilərik. Yəni bu fikirlər müvəqqəti baxışlardır və sorğu icra edilərkən mövcud olmalıdır. Bu cür baxışlar WITH bəndindən istifadə edərək yaradılır və sorğu həqiqətən yerinə yetirildikdə tərtib edilir və icra olunur. Sorğu icra edildikdə bu görünüş mövcud olmayacaqdır.

Yuxarıda orta qiyməti 80-dən çox olan tələbə təfərrüatlarını çəkmək nümunəsini nəzərdən keçirin. Yuxarıdakı alt sorğu baxış sayıla bilər və sorğu aşağıdakı kimi yerinə yetirilə bilər:

WITH STD_AVG AS
	 (SELECT S.STD_ID, AVG (SM.MARKS) AS avg_mark
		FROM STUDENT S, STD_MARKS SM
		WHERE S.STD_ID = SM.STD_ID
		GROUP BY S.STD_ID)
SELECT S.STD_ID, S.STD_NAME, S.COURSE_ID
FROM STUDENT, STD_AVG SA
WHERE S.STD_ID = SA.STD_ID
AND SA.AVG_MARK >80;

İndi alt sorğu WITH bəndinə köçürüldü və bu sorğu üçün müvəqqəti görünüş rolunu oynayır. Sorğuda hər hansı bir normal görünüş istifadə edildiyi üçün ad verilə və sorğuda istifadə edilə bilər.

Translate »