CodeGym /Kurslar /SQL SELF /WHERE istifadə edərək UPDATE v...

WHERE istifadə edərək UPDATE və DELETE zamanı təhlükəsiz işləmək

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

Təsəvvür elə, sən database administratorusan və hansısa qeydləri dəyişmək və ya silmək lazımdır. Amma birdən səhvən hər şeyi yenilədin və ya sildin? WHERE operatorundan istifadə — sənin "sığorta polisin"dir, belə fəlakətli səhvlərdən qoruyur. Bu, dəqiq olaraq hansı sətirlərin təsirlənəcəyini göstərməyə imkan verir.

Məsələn:

UPDATE students
SET status = 'Graduated';
Bu sorğu bütün sətirləri students cədvəlində yeniləyəcək. Təsəvvür elə, təbrik əvəzinə hamıya status = 'Expelled' qoydun. Təhlükəlidir, düzdür? Bunun qarşısını almaq üçün həmişə WHERE istifadə edirik və şərtlər yazırıq ki, hansı sətirlər yenilənəcək və ya silinəcək, dəqiq bilək.

WHERE şərtinin sintaksisi

WHERE operatoru tətbiq olunan sətirləri filtrləmək üçündür. Onu həm UPDATE, həm də DELETE komandasında istifadə edə bilərsən. Sintaksis belədir:

UPDATE üçün:

UPDATE cədvəl
SET column1 = value1, column2 = value2
WHERE şərt;

DELETE üçün:

DELETE FROM cədvəl
WHERE şərt;

WHERE olmadan dəyişikliklər cədvəldəki bütün sətirlərə təsir edəcək. Ona görə də, planlaşdırmadığın məlumatların dəyişməməsi üçün həmişə şərt yazmağa çalış.

Müqayisə operatorlarından istifadə

WHERE şərtləri qurmaq üçün müqayisə operatorlarından istifadə olunur. Gəlin əsas operatorlara baxaq:

Operator Təsviri Nümunə
= Bərabərdir age = 18
<> Bərabər deyil age <> 18
> Böyükdür age > 18
< Kiçikdir age < 18
>= Böyük və ya bərabərdir age >= 18
<= Kiçik və ya bərabərdir age <= 18

Nümunə: tələbənin statusunu yeniləyirik

Əgər 21 yaşdan yuxarı bütün tələbələri "mezun" kimi qeyd etmək lazımdırsa, belə yazılır:

UPDATE students
SET status = 'Graduated'
WHERE age > 21;

Nümunə: 18 yaşdan kiçik bütün tələbələri silirik

Kiminsə səhvən yetkinlik yaşına çatmayan tələbələri əlavə etdiyini fərz et, onları belə silə bilərik:

DELETE FROM students
WHERE age < 18;

Məntiqi operatorlarla mürəkkəb şərtlər

Çox vaxt bir neçə kriteriyaya görə sətirləri filtrləmək lazımdır. Məsələn, yalnız 18 yaşdan yuxarı və proqramlaşdırma kursunda oxuyan tələbələri yeniləmək üçün. Bunun üçün məntiqi operatorlardan istifadə olunur: AND, OR və NOT.

Məntiqi operatorlar:

Operator Təsviri Nümunə
AND Bütün şərtlər doğru olduqda işləyir age > 18 AND course = 'Programming'
OR Heç olmasa bir şərt doğru olduqda işləyir age > 18 OR course = 'Programming'
NOT Əksinə (şərtin nəticəsini tərsinə çevirir) NOT (age < 18)

Nümunə: yalnız proqramçı tələbələri və 18 yaşdan yuxarı olanları yeniləyirik

UPDATE students
SET status = 'Advanced'
WHERE age > 18 AND course = 'Programming';

Nümunə: 18 yaşdan kiçik və ya "Singing" kursunda oxuyan tələbələri silirik

DELETE FROM students
WHERE age < 18 OR course = 'Singing';

Fəlakətli səhvlərdən necə qaçmaq olar

Həmişə şərti yoxla!

WHERE olmadan yazsan, PostgreSQL sevinclə bütün cədvəl üçün əmri icra edəcək. Bax belə olur:

DELETE FROM students;
-- Oops! students cədvəlindəki bütün qeydlər silindi!

Belə hallardan qaçmaq üçün WHERE əlavə et:

DELETE FROM students
WHERE student_id = 123;

Məsləhət: şərtin necə işləyəcəyinə əmin deyilsənsə, əvvəlcə SELECT ilə yoxla. Məsələn:

SELECT * FROM students
WHERE student_id = 123;

Əmin olduqdan sonra UPDATE və ya DELETE icra et.

Praktik nümunələr

Nümunə 1: Tələbələrin statusunu yeniləmək

Fərz et, belə bir students cədvəlimiz var:

student_id name age course status
1 Otto Lin 20 Programming Beginner
2 Maria Chi 22 Mathematics Graduated
3 Eva Gram 19 Programming Beginner

Biz istəyirik ki, proqramçı və 18 yaşdan yuxarı olan tələbələrin statusu "Intermediate" olsun:

UPDATE students
SET status = 'Intermediate'
WHERE age > 18 AND course = 'Programming';

Nəticə:

student_id name age course status
1 Otto Lin 20 Programming Intermediate
2 Maria Chi 22 Mathematics Graduated
3 Eva Gram 19 Programming Beginner

Nümunə 2: Xaric olunan tələbələri silmək

İndi fərz et, silmək lazım olan kurslarda oxuyan tələbələr var. Məsələn, "History of Arts" kursunda oxuyanlar. Cədvəl:

student_id name age course status
1 Otto Lin 20 Programming Intermediate
4 Alex Ming 21 History of Arts Expelled

"History of Arts" kursunda oxuyan tələbələri silirik:

DELETE FROM students
WHERE course = 'History of Arts';
student_id name age course status
1 Otto Lin 20 Programming Intermediate

Nümunə 3: Şərtsiz yeniləmə (və niyə bu pisdir)

Əgər belə yazsan:

UPDATE students
SET status = 'Mezun';

BÜTÜN tələbələr mezun olacaq. Ona görə də həmişə WHERE istifadə etməyi tövsiyə edirik!

Fərz et, əvvəlcə belə bir cədvəlimiz var idi:

student_id name age course status
1 Otto Lin 20 Programming Intermediate
2 Maria Chi 22 Mathematics Graduated
3 Eva Gram 19 Programming Beginner

UPDATE əmri WHERE olmadan icra olunduqdan sonra:

student_id name age course status
1 Otto Lin 20 Programming Mezun
2 Maria Chi 22 Mathematics Mezun
3 Eva Gram 19 Programming Mezun

😬 Gördün? Bütün statuslar dəyişdi. Xüsusilə backup yoxdursa, bu səhv bəzən düzəlməz olur. Ona görə də WHERE — sənin dostundur!

Xüsusiyyətlər və tələlər

WHERE operatoru çox faydalı olsa da, yeni başlayanlar tez-tez səhv edirlər:

  • Şərtin olmaması: WHERE yazmağı unutsan, bütün sətirlər təsirlənəcək.
  • Yanlış şərt: məsələn, age = 19 əvəzinə age < 19 yazsan, lazım olmayan məlumatları dəyişə bilərsən.
  • Mürəkkəb şərtlər: AND və OR prioritetlərini səhv qoysan, gözlənilməz nəticələr ala bilərsən. Dəqiqlik üçün mötərizələrdən istifadə et:
    DELETE FROM students
    WHERE (age > 18 AND course = 'Programming') OR course = 'Mathematics';
    

Sorğuları elə yaz ki, həm sənə, həm də komanda yoldaşlarına aydın olsun.

Artıq bilirsən ki, WHERE ilə məlumatları necə təhlükəsiz və etibarlı şəkildə yeniləmək və silmək olar. Bu alət — database işində ən yaxşı dostundur. Unutma: şərti iki dəfə yoxlamaq, sonra məlumatları bərpa etməkdən yaxşıdır!

2
Tapşırıq
SQL SELF, səviyyə, dərs
Bağlanıb
Bir neçə şərtlə yeniləmə
Bir neçə şərtlə yeniləmə
1
Sorğu/viktorina
, səviyyə, dərs
Əlçatan deyil
Daxil etmə və yeniləmə əməliyyatları
Daxil etmə və yeniləmə əməliyyatları
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION