Bəzən verilənlər bazası yaddaşı zəif olan bir insanı xatırladır — hər şeyi yazır, amma artıq yazdığını unudur. Nəticədə, müştərilərin şəhərləri olan cədvəli açırsan, orada on dənə "Berlin", beş dənə "Seattle" və bir sürü başqa təkrarlar var. Belə olur, çünki eyni şəhər müxtəlif müştərilərdə təkrar ola bilər. Amma sən reklam kampaniyasını on dənə "Berlin" üçün qurmaq istəmirsən axı, halbuki bu sadəcə bir şəhərdir, düzdür?
Yalnız unikal dəyərləri — yəni dublikatlar olmadan — çıxarmaq üçün rahat bir komanda var: DISTINCT. O, sanki sehrli bir mop kimidir: bir hərəkətlə təkrarlanan sətirləri silir və həqiqətən fərqli olanları saxlayır.
DISTINCT sorğunun nəticəsindən yalnız unikal sətirləri çıxarmağa imkan verir. Bu, təkrarlanan datalardan qurtulmaq lazım olan hallarda çox faydalıdır, məsələn:
- Sifarişlərdə unikal məhsullar.
- Müştərilərin unikal adları.
- Unikal data kombinasiyaları, məsələn "şəhər + ölkə".
DISTINCT necə işləyir?
DISTINCT-in sintaksisi çox sadə və başa düşüləndir, SQL-də tez-tez olduğu kimi:
SELECT DISTINCT kolonka1, kolonka2, ...
FROM cədvəl;
Sən sorğuna DISTINCT əlavə edəndə, verilənlər bazası nəticədə hər sətirin unikal olmasına zəmanət verir.
DISTINCT istifadəsinə nümunələr
Gəlin klassik nümunələrlə başlayaq ki, DISTINCT necə işləyir, başa düşək.
Nümunə 1: Bir sütunun unikal dəyərləri
Güman edək ki, bizdə students adlı cədvəl var və orada tələbələr haqqında məlumatlar saxlanılır:
-- students cədvəli
| id | first_name | last_name | city |
|---|---|---|---|
| 1 | Maria | Chi | Seattle |
| 2 | Alex | Lin | Toronto |
| 3 | Anna | Song | Seattle |
| 4 | Nat | Cole | Chicago |
| 5 | Maria | Chi | Seattle |
Tələbələrin hansı şəhərlərdən gəldiyini bilmək istəyirik. Sorğunu belə yazırıq
SELECT city
FROM students;
və nəticə belə olur:
| city |
|---|
| Seattle |
| Toronto |
| Seattle |
| Chicago |
| Seattle |
Bir az istədiyimiz kimi olmadı :(
Dublikatları aradan qaldırmaq üçün DISTINCT istifadə etmək lazımdır:
SELECT DISTINCT city
FROM students;
Nəticə:
| city |
|---|
| Seattle |
| Toronto |
| Chicago |
DISTINCT olmadan nəticədə "Seattle" üç dəfə çıxır, amma bizə hər şəhərdən bir dəfə lazım idi.
Nümunə 2: Bir neçə sütunun unikal dəyərləri
İndi təsəvvür et ki, biz "ad + soyad" unikal kombinasiyalarını almaq istəyirik, çünki tələbələr arasında eyni soyadlı və ya eyni adlılar ola bilər.
Yenə də bizdə eyni students cədvəli var:
-- students cədvəli
| id | first_name | last_name | city |
|---|---|---|---|
| 1 | Maria | Chi | Seattle |
| 2 | Alex | Lin | Toronto |
| 3 | Anna | Song | Seattle |
| 4 | Nat | Cole | Chicago |
| 5 | Maria | Chi | Seattle |
Sorğu:
SELECT DISTINCT first_name, last_name
FROM students;
Nəticə:
| first_name | last_name |
|---|---|
| Maria | Chi |
| Alex | Lin |
| Anna | Song |
| Nat | Cole |
Beləliklə, DISTINCT filtr kimi işləyir: o, göstərilən bütün sütunları nəzərə alır və yalnız həmin sütunların bütün dəyərləri üst-üstə düşəndə təkrarı çıxarır.
Nümunə 3: Unikal kombinasiyalar və sıralama
İndi DISTINCT-i ORDER BY ilə birləşdiririk ki, unikal dəyərləri soyada görə əlifba sırası ilə alaq.
Bizdə students cədvəli var:
-- students cədvəli
| id | first_name | last_name | city |
|---|---|---|---|
| 1 | Maria | Chi | Seattle |
| 2 | Alex | Lin | Toronto |
| 3 | Anna | Song | Seattle |
| 4 | Nat | Cole | Chicago |
| 5 | Maria | Chi | Seattle |
Sorğu:
SELECT DISTINCT first_name, last_name
FROM students
ORDER BY last_name ASC;
Nəticə:
| first_name | last_name |
|---|---|
| Maria | Chi |
| Nat | Cole |
| Alex | Lin |
| Anna | Song |
Təkrarlanan sətirlər silindi və soyadlar əlifba sırası ilə düzülüb.
Nümunə 4: Aqrqasiya funksiyalarında istifadə
Bəs, DISTINCT-i hansısa funksiya, məsələn, COUNT ilə istifadə etsək nə olar?
SELECT COUNT(DISTINCT city) AS unique_city_count
FROM students;
Nəticə:
| unique_city_count |
|---|
| 3 |
Bu sorğu unikal şəhərlərin sayını qaytaracaq. Rahatdır, düzdür?
DISTINCT-in işləmə xüsusiyyətləri
DISTINCT istifadə edəndə başa düşmək lazımdır ki, o, göstərilən bütün sütunlara görə işləyir. Əgər sorğuya daha çox sütun əlavə etsən, nəticə dəyişə bilər.
Nümunə 5: Konteksti başa düşmək niyə vacibdir?
Əgər sorğuna əlavə sahələr əlavə etsən, bu, sətirlərin unikallığına təsir edə bilər.
SELECT DISTINCT first_name, city
FROM students;
students cədvəli:
| id | first_name | last_name | city |
|---|---|---|---|
| 1 | Maria | Chi | Seattle |
| 2 | Alex | Lin | Austin |
| 3 | Anna | Song | Seattle |
| 4 | Otto | Art | Denver |
| 5 | Maria | Chi | Portland |
Nəticə:
| first_name | city |
|---|---|
| Maria | Seattle |
| Alex | Austin |
| Anna | Seattle |
| Otto | Denver |
| Maria | Portland |
Hər "ad + şəhər" kombinasiyası indi unikal oldu. Ona görə unutma: unikallıq bütün göstərilən sütunlara görə müəyyən olunur, tək-tək sütunlara görə yox.
DISTINCT ilə işləyərkən tipik səhvlər
DISTINCT istifadə edəndə ən çox rast gəlinən səhvlərdən biri sorğunun nə etdiyini düzgün başa düşməməkdir. Məsələn, sorğuda çoxlu sütun göstərsən, nəticə gözlədiyindən tam fərqli ola bilər, çünki unikallıq bütün sütunlara görə müəyyən olunacaq.
Məsələn:
SELECT DISTINCT *
FROM students;
Bu halda hər bir sətir unikal sayılacaq, çünki bütün sütunlar nəzərə alınır.
Başqa bir səhv — DISTINCT-i lazım olmayan yerdə istifadə etməkdir. Əgər əminsənsə ki, data artıq unikaldır (məsələn, birincil açar olan sütun), onda DISTINCT sadəcə SGBD-yə əlavə yük verəcək.
GO TO FULL VERSION