Əsas SQL Müsahibə Sualları

Mündəricat

 Əsas SQL Müsahibə Sualları

1. SELECT Statement-də DISTINCT-in istifadəsi nədir?

DISTINCT ifadəsi nəticədən təkrarlanan sətirlərin aradan qaldırılması üçün istifadə olunur. SELECT ifadəsini atəşə verdiyimiz zaman, cədvəldən bütün uyğun satırları seçəcəkdir. Bu uyğun sətirlərdə təkrarlanan giriş ola bilər. DISTINCT istifadə etdiyimiz zaman bütün təkrarlanan sətirlər silinəcək və bu cür girişlər üçün tək giriş saxlanacaqdır.

ŞƏKİLLƏR cədvəlini nəzərdən keçirin. Hər şöbənin yerini göstərən LOCATION_ID var.

Bölmələrin mövcud olduğu yerləri tapmaq üçün sadə bir sorğu yazsaq, sıra və təkrarlanan dəyərlərdən asılı olmayaraq bütün yer identifikatorlarını sadalayacaqdır.

SELECT LOCATION_ID FROM DEPARTMENTS;

Yuxarıdakı nəticə dəstində yer kimliklərinin təkrar qeydlərini görə bilərik. Lakin bölmələrin müxtəlif yerlərini bilmək üçün nəticədə müəyyən edilmiş təkrarlanan dəyərlərə ehtiyacımız yoxdur. Burada təkrarlanan dəyərləri ortadan qaldırmalıyıq. Buna görə fərqli yerlər əldə etmək üçün yuxarıdakı sorğuda DISTINCT istifadə edirik.

SELECT DISTINCT LOCATION_ID FROM DEPARTMENTS;

İndi nəticədə təkrarlanan dəyərimiz yoxdur. Sütunların birləşməsinə DISTINCT tətbiq edə bilərik. Yuxarıdakı kimi bir sütunda olmamalıdır.

Aşağıdakı kimi EMPLOYEES cədvəlindən müxtəlif MANAGER_ID və DEPARTMENT_ID siyahısını vermək üçün aşağıdakı sorğunu nəzərdən keçirin.

SELECT MANAGER_ID, DEPARTMENT_ID FROM EMPLOYEES;

Yuxarıdakı sorğuda təkrarlanan nəticə dəyərlərini görə bilərik. Təkrarlanan girişləri aradan qaldırmaq istəyiriksə, DISTINCT bəndindən istifadə edə bilərik. Sütunların birləşməsindəki təkrarlanan dəyərləri siləcəkdir. MANAGER_ID üçün təkrarlanan dəyərləri görə bilərik, lakin MANAGER_ID və DEPARTMENT_ID birləşmələrində təkrarlanan dəyərlər yoxdur.

SELECT DISTINCT MANAGER_ID, DEPARTMENT_ID FROM EMPLOYEES;

2. Heç bir MAX () və MIN () funksiyasından istifadə etmədən cədvəldən Maksimum və Minimum dəyərləri tapmaq üçün bir sorğu yazın.

MAX və ya MIN məcmu funksiyalarından istifadə edə bilmədiyimiz üçün maksimum və minimum dəyərləri əldə etmək üçün məntiq düşünməliyik. Bu dəyərləri əldə etmək üçün məntiq hər hansı bir şey ola bilər, ancaq doğru dəyəri verməlidir. Əvvəlcə məlumatları çeşidləyərək minimum və maksimum dəyərləri əldə etməyin ən sadə yolunu müzakirə edək.

Minimum dəyər və maksimum dəyərlə LOCATION_ID tapmalı olduğumuz ŞÖBƏLƏR cədvəlini nəzərdən keçirin.

SELECT LOCATION_ID FROM DEPARTMENTS;


Fərqli LOCATION_ID ilə 27 qeydə malikdir və cədvəldə göründükləri sırada göstərilir. MIN () funksiyasından istifadə etmədən burada LOCATION_ID-in minimum dəyərini necə əldə edə bilərik? LOCATION_ID sütununu artan qaydada sıralasaq, birinci sətirdə ən kiçik, son sətirdə ən böyük rəqəmi əldə edəcəyik. Beləliklə, yuxarıdakı sorğunu artan qaydada sıralasaq, nəticəni ən kiçik saydan başlayaraq əldə edəcəyik.
SELECT LOCATION_ID FROM DEPARTMENTS ORDER BY LOCATION_ID;

Ancaq bütün LOCATION_ID-ləri istəmirik. Yalnız ən kiçik şəxsiyyət sənədinə ehtiyacımız var. Bu səbəbdən yuxarıdakı SEÇİM Bəyanatındakı sıra sayını ROWNUM istifadə edərək bir sıra ilə məhdudlaşdırmalıyıq. Ancaq ROWNUM şərti HARADA bəndində veriləcək. WHERE bəndindəki sətirlərin sayını məhdudlaşdırsaq, əvvəlcə ilk sətir seçilir və sonra sıralanır. Bu, bizə lazım olan ən kiçik rəqəmi verməyəcəkdir.

SELECT LOCATION_ID FROM DEPARTMENTS WHERE ROWNUM

Ən kiçik nömrə kimi 1400 almalıyıq. Buna görə əvvəlcə qeydləri sıralamalıyıq və sonra aşağıdakı kimi satırları məhdudlaşdıraraq ən kiçik ədədi seçməliyik. Bu bizə düzgün nəticə verəcəkdir.

SELECT LOCATION_ID
FROM (SELECT LOCATION_ID 
        FROM DEPARTMENTS 
          ORDER BY LOCATION_ID)
WHERE ROWNUM <2;

Ən kiçik rəqəmi belə əldə etdik. Ən çox say əldə etmək üçün nə etməliyik? Sütunu azalan sırada sıralamalıyıq. Sonra ən böyük rəqəm yuxarıda olacaq və sıra sayını birinə məhdudlaşdıraraq onu seçə bilərik.

SELECT LOCATION_ID
FROM (SELECT LOCATION_ID 
        FROM DEPARTMENTS 
          ORDER BY LOCATION_ID DESC)
WHERE ROWNUM <2;

Fərz edək ki, hər hansı bir min, maksimum funksiya və ya sıra istifadə etmədən minimum və maksimum dəyərləri tapmaq lazımdır. Sonra minimum və maksimum dəyərləri əldə etmək üçün kompleks məntiq düşünməliyik. Bu vəziyyətdə məntiq və sorğu haqqında bir az daha düşünməliyik. Maksimum və min dəyərləri əldə etmək üçün eyni cədvəli iki dəfə nəzərdən keçirməli və hər bir dəyəri qalanları ilə müqayisə etməliyik. Dəyərləri əldə etmək üçün addım-addım başlayaq.

İlk addım olaraq, eyni cədvəldəki dəyərləri necə müqayisə etmək olar? Sorğumuzda öz-özünə qoşulma ilə bölmələr cədvəlinə iki dəfə sahib olmalıyıq. Ancaq öz-özünə qoşulma burada bərabərlik deyil (dəyərlər, '=' ilə bərabər ilə müqayisə olunmur). Kiçik və daha böyük dəyərlər əldə etmək üçün operatordan böyük və ya daha kiçik istifadə etməliyik. yəni;

SELECT smaller.LOCATION_ID smaller_loc_id, larger.LOCATION_ID large_loc_id
FROM DEPARTMENTS  smaller, DEPARTMENTS larger
WHERE smaller.LOCATION_ID < larger.LOCATION_ID;

Burada hər LOCATION_ID, '<' müqayisə edərək LOCATION_ID-lərin qalan hissəsi ilə müqayisə olunur. Beləliklə, nəticə dəstində bütün kiçik LOCATION_ID və aşağıda göstərilən uyğun daha böyük yer identifikatoru birləşmələrini əldə edəcəyik.

Bu son deyil. Bu siyahıdan daha kiçik və daha böyük dəyərləri çıxarmaq lazımdır. Bəs necə? Bu siyahıdan dəyərləri almaq üçün hansı məntiq ola bilər? Yuxarıdakı nəticə dəstində birinci sətirdə ilk sütunda ən kiçik rəqəm olacaqdır. Satır sayını birinə məhdudlaşdıraraq onu çıxarmaq lazımdır. Bundan əlavə, daha kiçik və daha böyük dəyərlərin birləşməsini istəmirik. Yalnız daha kiçik rəqəmə ehtiyacımız var. Beləliklə, yuxarıdakı siyahıdakı ikinci sütunu ləğv edə bilərik.

SELECT smaller.LOCATION_ID smaller_loc_id 
FROM DEPARTMENTS  smaller, DEPARTMENTS larger
WHERE smaller.LOCATION_ID < larger.LOCATION_ID
AND ROWNUM <2;


İndi ən böyük nömrəni necə əldə edəcəyik? Bir üsul, son sətir ikinci sütunu çıxarmaqdır. Ancaq sıralamaq və dəyəri almaq üçün SİFARİŞ BY istifadə edə bilmərik. Başqa bir üsul da yuxarıdakı ilə eyni məntiqi bir az fərqli şəkildə istifadə etməkdir. Yuxarıdakı ilk sütunda daha böyük dəyərlə müqayisədə bütün kiçik dəyərlər olacaqdır. Ən böyük dəyərin müqayisə ediləcək heç bir dəyəri olmayacaq və birinci sütunda göstərilməyəcəkdir. Beləliklə, yuxarıdakı sorğuda hansı nömrənin verilmədiyini tapmaq üçün ŞÖBƏLƏRDƏ bir sorğu yazaraq həmin nömrəni çıxardırıqsa, ən böyük rəqəmi əldə edəcəyik.
SELECT LOCATION_ID FROM DEPARTMENTS 
WHERE LOCATION_ID NOT IN (SELECT smaller.LOCATION_ID smaller_loc_id 
FROM DEPARTMENTS  smaller, DEPARTMENTS larger
WHERE smaller.LOCATION_ID < larger.LOCATION_ID);


Cədvəldən daha kiçik və daha böyük rəqəmlər əldə etməyin iki yolu bunlardır. Məntiq haqqında düşüncələrinizə görə başqa üsullar da olacaqdır.

3. SQL-də üçlü (üç dəyərli kimi də bilinir) məntiq nədir?

SQL-də cədvəldəki hər hansı bir sütun bir qədər etibarlı bir dəyər və ya BİLMƏMƏYƏN dəyər ala bilər. Sütunun dəyəri bilinməz olduqda, onu NULL və ya əslində boş olmayan bir boş sütun istifadə edərək təmsil edirik.


OR

Sütun dəyərlərini müqayisə etmək məcburiyyətində qaldıqda, ümumiyyətlə ya bir dəyəri olduğunu və ya heç bir dəyəri olmadığını düşünürük. Lakin NULL heç bir dəyəri olmadığını göstərir. Sütundakı dəyərin hələ bilinmədiyini göstərir. Beləliklə, yuxarıdakı cədvəldə aşağıdakı kimi sorğu yazdığımızda heç bir nəticə vermir.


Yəni yuxarıdakı kimi NULL-i '=' operatoru ilə müqayisə edə bilmərik. NULL (bilinməyən bir dəyər) başqa bir NULL (bilinməyən dəyər) ilə bərabər olmadığından, 'bərabər' və ya 'bərabər deyil' və ya 'böyük' və ya 'az' və s. İstifadə edərək NULL ilə müqayisə etmək mənasızdır. Buna görə heç bir dəyər vermir.

NULL olmayan bütün STATE_PROVINCE siyahısını sadalamaq istədiyimizi düşünək.


STATE_PROVICE dəyəri olan heç bir satır qaytarmır. Yəni bu bilinməyən dəyəri müqayisə edə bilməz. Buna görə SQL, 'IS NULL' və ya NOT NULL 'istifadə edərək NULL və NULL olmayan dəyəri müqayisə etmək üçün xüsusi sintaksis təmin edir. Beləliklə, hər hansı bir etibarlı dəyər (NULL olmayan) '=' və ya '<>' dəyərləri ilə müqayisə edilə bilər. NULL və ya NOT NULL dəyərlərini (sütunun üçüncü dəyəri) müqayisə etməli olduğumuzda, üçüncü operator 'IS NULL' və ya 'IS NULL deyil' operatorunu istifadə etməliyik.

SELECT * FROM LOCATIONS
WHERE STATE_PROVINCE IS NULL;


SELECT * FROM LOCATIONS
WHERE STATE_PROVINCE IS NOT NULL;

Bərabər olub olmaması kimi hər hansı bir etibarlı dəyəri müqayisə etməli olduğumuz zaman (DOĞRU və ya YALAN - sütunun iki ümumi dəyəri) hər hansı bir müqayisə operatorundan istifadə edə bilərik.


Aşağıda qeyd edin ki, '<>' operatoru NULL STATE_PROVICE ilə heç bir qeyd qaytarmadı. Bunun səbəbi, '<>' operatorunu istifadə edərək üçüncü dəyəri 'NULL' ilə müqayisə edə bilməməsidir.

Beləliklə, cədvəldəki hər hansı bir sütunun müqayisə ediləcək üç dəyəri var - TRUE, FALSE və ya NULL. Buna görə üç dəyərli məntiq və ya üçlü məntiq olaraq bilinir.

4. SQL-də, Sifarişə görə bəndin standart qayda qaydası nədir?

Sorğu nəticəsi artan və ya azalan qaydada sıralana bilər. Sorğuda ASC və ya DESC göstərərək cədvəlin və ya sorğunun artan və ya azalan bir şəkildə sıralanması lazım olub olmadığını müəyyən etməliyik. ASC və ya DESC sorğuda göstərilmədikdə Verilənlər bazası standart sıralama qaydasını nəzərə alır. SQL -də, standart sıralama qaydası artmaqdadır. Buna görə çeşidləmə qaydasını təyin etməsək, avtomatik olaraq artan sıraya görə sıralamağı düşünər.

Aşağıdakı iş cədvəlini nəzərdən keçirin. SİFARİŞ BY müddəası istifadə edilmədikdə, məlumatların daxil edildiyi sırada nəticə verir.


Fərz edək ki, onları JOB_ID artan sırada sıralamalıyıq. Aşağıda qeyd edək ki, heç bir çeşidləmə əmri istifadə etməmişik. Nəticədə JOB_ID artan sırada sıralanmış olduğunu görə bilərik. Sorğunun altında ASC göstərməyin heç bir ziyanı yoxdur. Sonra da artan sırada sıralanacaq.

SELECT * FROM JOBS ORDER BY JOB_ID;


Bunu azalan qaydada çeşidləməli olduğumuz halda, sorğuda DESC-ni açıq şəkildə qeyd etməliyik.
SELECT * FROM JOBS ORDER BY JOB_ID DESC;

5. SQL-də fərqlilik və sifariş necə birlikdə işləyir?

DISTINCT açar sözünün bir sorğudan fərqli dəyərləri çıxarmaq üçün istifadə olunduğunu bilirik (yəni; hər hansı bir təkrarlanan dəyər olmadan). SİPARİŞ BY maddəsi nəticəni artan və ya azalan qaydada sıralamaq üçün istifadə olunur.

İndi bütün fərqli şöbələri şəxsiyyət vəsiqələrinin azalan sıralarında tapdığımız bir sorğunu nəzərdən keçirin. Bu o deməkdir ki, nəticə dəstində hər hansı bir təkrarlanan dəyər görmək istəmirik. Ayrıca, azalan sırada onlara ehtiyacımız var. Bu düz irəli. DEPARTMENT_ID DESC SİFARİŞİ İLƏ DEPARTMENT_ID-ləri ayırmaq lazımdır.

SELECT DISTINCT DEPARTMENT_ID 
FROM EMPLOYEES
ORDER BY DEPARTMENT_ID DESC;


Nəticələr göz qabağındadır və heç bir kompleks məntiq yoxdur. İndi tələbi bir az əyri edək. Sorğunu çevirməzdən əvvəl ƏMƏKDAŞLAR cədvəlində məlumatların necə göründüyünü yoxlayın. Yəni hər şöbə və işçinin maaşları cədvələ daxil edildikləri sırada göstərilir. Onlar sıralanmış qaydada deyil. Bu iki sütunda DISTINCT dedikdə, sorğu nəticəni yerləşdirildiyi qaydada çəkir. Eyni nümunə məlumatlarını aşağıda görə bilərik.
SELECT DISTINCT DEPARTMENT_ID, SALARY FROM EMPLOYEES;

İndi bütün fərqli şöbələri tapaq və nəticəni işçinin əmək haqqının azalan qaydasında sıralayaq. Yəni bütün fərqli şöbələri sadalamalıyıq. Ancaq şöbələri sıralamaq elə olmalıdır ki, ən yüksək əmək haqqı alan işçinin şöbəsi əvvəlində, daha sonra şöbə işçinin ikinci ən yüksək əmək haqqı və s. Sorğunu yazmazdan əvvəl bütün ƏMƏKDAŞLARIN məlumatlarını maaşları azalan sırada görək.

ƏMƏKDAŞLARI cədvəlinin yuxarıdakı nümunə məlumatlarından nəticə dəstimizdə gözlədiyimiz budur ki, DEPARTMENT_ID bu sırada olmalıdır: 90, 80, 20, 100, 110, 30, 70, 60 və s. Sualı indi yazaq.

SELECT DISTINCT DEPARTMENT_ID 
FROM EMPLOYEES
ORDER BY SALARY DESC;

Ancaq nəticə:

Xəta! Niyə? Sorğumuzda nə var? Soruşulanların sorğusunu yazdıq. Bəs bu sorğunu niyə icra edə bilmirik? DEPARTMENT_ID-ə əsasən çeşidlənəndə fərqli şöbələri tapa bildik, amma niyə SALARY istifadə edərək sıralaya bilmirik?

Buna cavab vermək üçün yuxarıda müzakirə olunan bütün məqamları xatırlamalı və yazdığımız sorğuya diqqətlə riayət etməliyik. Bu sorğu necə qiymətləndiriləcək? Birincisi, fərqli DEPARTMENT_ID-lər əldə etmək üçün SELECT ifadəsi icra olunur. Yəni fərqli DEPARTMENT_ID-lərini göründükləri və ya cədvələ daxil etdikləri sırada seçəcəkdir. Bu seçim əmək haqqından asılı deyil. Müxtəlif şöbə siyahısı əldə edildikdən sonra sorğu siyahını ümumiyyətlə seçilməyən MƏHSUL əsasında sıralamağa çalışır. Sorğunun ƏMƏKDAŞLARI cədvəlində MƏHSÜMÜ olmasına baxmayaraq, maaşları almaq üçün yenidən sorğu atəş etməyəcəkdir. Sıralama başlayanda bütün seçimlər bitdi. Bu səbəbdən SALALI sıralamaq olmur. Bu səbəbdən bir səhv atır: “SEÇİN İFADƏDƏ MƏHSƏLİ DEYİL”.

Bu səbəbdən, MƏHSULUN azalan sırasına əsasən DEPARTMENT_ID seçməyimiz lazımdırsa, MƏHSƏZİ də seçməliyik.

SELECT DISTINCT DEPARTMENT_ID, SALARY
FROM EMPLOYEES
ORDER BY SALARY DESC;

Ancaq bu, bizə yalnız ayrı DEPARTMENT_ID-lər verməyəcəkdir. Fərqli DEPARTMENT_ID və MƏƏHSUL birləşməsini verəcəkdir. Bu səbəbdən bu sorğunu daha da dəyişdirməliyik.

GROUP BY müddəasını istifadə edərək fərqli dəyərlər əldə etmək üçün başqa bir metod var. Bu metodda əvvəlcə fərqli qruplar yaratmaq üçün cədvəldəki bütün fərqli dəyərləri seçir. Beləliklə, qeydləri ƏMƏKDAŞLAR cədvəlində DEPARTMENT_ID əsasında qruplaşdırsaq, cədvəldəki bütün fərqli dəyərləri əldə edəcəyik. Növbəti vəzifə, DEPARTMENT_ID-lərin MAZARIN azalma sırasına əsasən sıralanmasıdır. Maaşı azalan qaydada almaq üçün şöbələri elə seçməliyik ki, əvvəlcə ən yüksək əmək haqqı alan işçilər bölməsi siyahıya alınsın. Şöbədəki işçinin ən yüksək əmək haqqı, DEPARTMENT_ID tarixində eyni qrupdakı MAX funksiyasından istifadə edərək tapılır. Yəni seçilən hər bir fərqli şöbənin ən yüksək məvacibi olacaqdır. yəni;

SELECT DEPARTMENT_ID, MAX (SALARY) AS max_salary
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID;

İndi bu nəticəni əmək haqqının azalma sırası ilə sıralasaq, bütün şöbələri - əmək haqqını əmək haqqının azalan qaydasında alacağıq.

SELECT DEPARTMENT_ID, MAX (SALARY) AS max_salary
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID
ORDER BY max_salary DESC;

Bu nəticədən tələb olunan nəticəni əldə etmək üçün yalnız DEPARTMENT_ID seçməliyik.

SELECT DEPARTMENT_ID 
FROM (SELECT DEPARTMENT_ID, MAX (SALARY) AS max_salary
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID
ORDER BY max_salary DESC);

Beləliklə, cədvəlin digər sütunlarına sıralayaraq CƏDVƏDƏN DISTINCT dəyərlərini seçirik.

Səhifələr: 1 2 3 4 5 6 7

Şərh yaz

Translate »