CodeGym /Kurslar /SQL SELF /DISTINCT ilə unikal dəyərlərin çıxarılması

DISTINCT ilə unikal dəyərlərin çıxarılması

SQL SELF
Səviyyə , Dərs
Mövcuddur

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.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION