CodeGym /Kurslar /SQL SELF /Məlumatların yenilənməsi UPDATE istifadə ed...

Məlumatların yenilənməsi UPDATE istifadə edərək

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

Bu gün yeni bilik bazanın daha bir vacib hissəsinə çatırıq — məlumatların yenilənməsi. Gəlin baxaq, PostgreSQL-də mövcud informasiyanı UPDATE komandası ilə necə dəyişmək olar. Niyə bu vacibdir? Çünki real həyatda məlumatlar statik olmur. Təsəvvür elə, dostun telefon nömrəsini dəyişdi, ya da tələbə başqa qrupa keçdi — əlbəttə, bu məlumatları bazada yeniləmək istəyəcəksən.

Məktəb sevgilin Svetka Sokolova birdən Svetka Xaçatryan oldu (həyat belədir də), bu artıq bazada dəyişiklik tələb edir. Məlumatları yeniləmək lazım olan ssenarilər tez-tez olur:

  • Qeyddəki səhvlərin düzəldilməsi.
  • Məlumatların yenilənməsi (köçmək, statusun dəyişməsi və s.).
  • Kütləvi dəyişikliklər, məsələn, işçilərin maaşının artırılması.

Məlumatların yenilənməsi — bu, bir və ya bir neçə sətirdə bir və ya bir neçə sütunun dəyərini dəyişmək üsuludur, yeni qeyd əlavə etmədən.

UPDATE komandasının sintaksisi

PostgreSQL-də UPDATE komandası olduqca aydın sintaksisə malikdir. Gəlin strukturuna baxaq:

UPDATE cedvel
SET column1 = value1,
    column2 = value2
WHERE sert;

İzahlar:

  • cedvel: dəyişiklik edəcəyimiz cədvəlin adı.
  • SET column = value: hansı sütunun hansı dəyərə dəyişəcəyini göstərir.
  • WHERE sert: hansı sətirlərin yenilənəcəyini göstərir (çox vacibdir ki, hər şeyi birdən dəyişməyəsən).

Əsas detal: əgər WHERE əlavə etməyi unutsan (ya da səhv yazsan), dəyişikliklərin cədvəldəki bütün sətirlərə təsir edəcək. Bu isə böyük problemlərə səbəb ola bilər.

Nümunə: tələbənin adının dəyişdirilməsi

Tutaq ki, bizdə students adlı cədvəl var, sütunları isə id, name, email. İstəyirik ki, id = 1 olan tələbənin adını "Maria Chi" edək.

UPDATE students
SET name = 'Maria Chi'
WHERE id = 1;

Bu komanda id = 1 olan sətri tapacaq və name sütununu yeni dəyərlə yeniləyəcək. Asandır, düzdür?

Bir neçə sütunun yenilənməsi

Çox vaxt bir qeyddə bir neçə dəyəri dəyişmək lazım olur. Məsələn, tələbə təkcə adını yox, həm də email ünvanını dəyişib. Bunu belə edirik:

UPDATE students
SET name = 'Otto Lin',
    email = 'otto.lin@example.com'
WHERE id = 2;

Burada həm name, həm də email sütunlarını id = 2 olan tələbə üçün yeniləyirik. PostgreSQL imkan verir ki, SET hissəsində bir neçə sütun=dəyər cütünü vergüllə ayırasan.

Bir neçə sətrin yenilənməsi

Bəs birdən bir neçə sətrin məlumatını dəyişmək lazımdırsa? Məsələn, tələbələri yeni qruplara keçirmək istəyirsən. Bunun üçün müəyyən kriteriyaya uyğun sətirləri yeniləmək olar. Tutaq ki, group_number adlı sahəmiz var və istəyirik ki, 101-ci qrupdakı bütün tələbələri 202-ci qrupa keçirək:

UPDATE students
SET group_number = 202
WHERE group_number = 101;

Bu komanda group_number 101 olan bütün sətirləri tapıb, onu 202 ilə əvəz edəcək.

5. WHERE şərti: diqqətli ol!

Daha əvvəl dediyimiz kimi, WHERE — sənin can qurtaran dairəndir. Onsuz sorğu cədvəldəki bütün sətirləri dəyişəcək. Məsələn, bu komanda BÜTÜN tələbələrin qrupu dəyişəcək, təkcə 101-lər yox. Bunu istəmirsən, düzdür?

UPDATE students
SET group_number = 202;

Xahiş edirəm, həmişə WHERE əlavə et, əgər təsadüfən məlumatları məhv etmək istəmirsənsə. Yaxşısı budur, ehtiyatlı ol.

UPDATE komandasını belə düşün: o, cədvəlin sütunlarını dəyişir, sətirləri yox. Məqsədi — müəyyən sütunun bütün hüceyrələrinə müəyyən dəyər verməkdir. Yalnız WHERE olduqda, bütün sətirlər yox, yalnız uyğun gələnlər dəyişir.

Başqa cədvəldəki məlumatlara əsaslanaraq yeniləmə

Bəzən bizə sadəcə dəyəri əl ilə yazmaq yox, A cədvəlindəki dəyərləri B cədvəlindəki məlumatlara əsaslanaraq yeniləmək lazımdır. Bu tez-tez olur — xüsusən də məlumatlar ayrı-ayrı saxlanılırsa: məsələn, hesablamalar bir cədvəldə, istifadəçi profilləri başqa cədvəldə.

Tutaq ki, students cədvəlimiz var və debt sütununu payments cədvəlindəki aktual borc (due_amount) ilə yeniləmək lazımdır. students-dəki hər bir qeyd payments-dəki student_id ilə uyğun gəlir.

Sintaksis belə olacaq:

UPDATE students
SET debt = payments.due_amount
FROM payments
WHERE students.id = payments.student_id;

Nə baş verir:

  • PostgreSQL FROM payments-i məlumat mənbəyi kimi istifadə edir.
  • WHERE şərti ilə cədvəllər arasında uyğunluq qurur.
  • Yalnız payments-də uyğunluğu olan students sətirlərini yeniləyir.

Vacibdir: bu UPDATE ... FROM içində əslində gizli JOIN baş verir, sadəcə JOIN açar sözü olmadan.

Əslində, orada arxa planda gizli JOIN var. Realda belə görünür:

UPDATE students
SET debt = p.due_amount
FROM payments p
    JOIN students s ON s.id = p.student_id
WHERE students.id = p.student_id;

Nə dəyişəcəyini necə görmək olar

UPDATE işlətməzdən əvvəl çox ağıllı olar ki, nə dəyişəcək onu əvvəlcədən görəsən. Bunu eyni prinsiplə yazılmış SELECT ilə etmək olar:

SELECT
    students.id, 
    students.name, 
    students.debt AS old_debt, 
    payments.due_amount AS new_debt
FROM students
    JOIN payments ON students.id = payments.student_id;

Nəticədə görəcəksən:

  • köhnə borc dəyəri (old_debt);
  • payments cədvəlindən gələn yeni dəyər (new_debt).

Bu yanaşma məntiqin düzgünlüyünü yoxlamağa kömək edir, məlumatları həmişəlik dəyişməzdən əvvəl.

Potensial tələlər

  • Əgər payments-də bir tələbəyə bir neçə qeyd varsa, UPDATE səhv verəcək: more than one row returned. Ya MAX, SUM, LIMIT 1 kimi agregasiya istifadə et, ya da payments-də student_id unikal olduğuna əmin ol.
  • Unutma ki, UPDATE ... FROM PostgreSQL-ə xasdır və bəzi başqa DBMS-lərdə (məsələn, MySQL) bu cür işləmir.

Praktik nümunələr

Nümunə 1: Tələbələrin statusunun dəyişdirilməsi

Təsəvvür elə ki, kursu bitirən tələbələrə "mezun" statusu verilir. Bizdə status sütunu var. completed_course = true olan tələbələrin statusunu yeniləmək üçün:

UPDATE students
SET status = 'mezun'
WHERE completed_course = true;

Nümunə 2: İşçilərin maaşının artırılması

Əgər employees cədvəlin var və satış şöbəsində işləyənlərin maaşını 10% artırmaq istəyirsən:

UPDATE employees
SET salary = salary * 1.10
WHERE department = 'Sales';

Burada birbaşa SET hissəsində riyazi əməliyyatdan istifadə edirik. Kütləvi dəyişiklik üçün rahatdır.

Nümunə 3: Şərti yeniləmə

Bəzən məlumatı şərtdən asılı olaraq yeniləmək lazımdır. Məsələn, əgər işçinin maaşı 50,000-dən azdırsa, 20% artır, çoxdursa — 10%:

UPDATE employees
SET salary = CASE
                WHEN salary < 50000 THEN salary * 1.20
                ELSE salary * 1.10
             END;

Bu komanda CASE konstruksiyasından istifadə edir ki, salary dəyərinə görə müxtəlif yeniləmə qaydaları təyin etsin.

UPDATE istifadə edərkən tipik səhvlər

Yəqin artıq başa düşmüsən, ən məşhur səhv hansıdır? Bəli, WHERE-i unutmaq. Təsəvvür elə: 10,000 işçidən ibarət bazan var, səhvən hamının maaşını artırdın. İşçilər üçün xoş olsa da, sənin karyeran üçün... heç də yaxşı deyil.

Başqa bir tipik səhv — səhv sütunu yeniləmək. Həmişə yoxla ki, nəyi və hara yazırsan. UPDATE-dan əvvəl sadə SELECT sənə çox vaxt qazandıra bilər.

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