İndi isə gəlin bütün bu bilikləri bir yerə yığaq və SELECT, WHERE və ORDER BY kombinasiyası ilə sadə, amma faydalı sorğular qurmağı öyrənək. Bu bacarıq sənə çoxlu tapşırıqlarda lazım olacaq, məsələn, istifadəçilərin siyahısını almaqdan tutmuş kiçik hesabatlar hazırlamağa qədər.
Başlamazdan əvvəl, sadə SQL-sorğusunun strukturu necə olur, yadına salaq:
SELECT kolonka1, kolonka2, kolonka3
FROM cədvəl
WHERE şərt
ORDER BY kolonka ASC
LIMIT sətr_sayı
OFFSET sətr_sayı;
Əgər SQL ədəbi əsər olsaydı, SELECT — fəsil başlığı, FROM — onun məzmunu, WHERE isə süjetin izahı olardı. ORDER BY isə oxumağı daha maraqlı etmək üçün qayda-qanun əlavə edir!
Operatorların ardıcıllığı dəqiq olmalıdır. Bəzilərini buraxmaq olar, amma ardıcıllığı dəyişmək olmaz.
Nümunə 1: Əla qiymət alan tələbələrin adlarını seçmək
Təsəvvür elə ki, bizdə belə bir students cədvəli və aşağıdakı məlumatlar var:
| id | name | age | grade |
|---|---|---|---|
| 1 | Otto | 21 | A |
| 2 | Maria | 22 | B |
| 3 | Alex | 20 | A |
| 4 | Nat | 23 | C |
| 5 | Dan | 25 | B |
Sənə lazım olan — bütün əla qiymət alan tələbələrin siyahısını almaqdır (yəni grade = 'A'), adlarına görə sıralanmış şəkildə. Bunu belə edirik:
SELECT name
FROM students
WHERE grade = 'A'
ORDER BY name ASC;
Nəticə:
| name |
|---|
| Alex |
| Otto |
İzah:
SELECT name— yalnız adı seçirik. Lazımsız məlumatları çıxarmağa ehtiyac yoxdur.WHERE grade = 'A'— yalnız əla qiymət alanları filtr edirik.ORDER BY name ASC— tələbələrin adlarını əlifba sırası ilə düzürük.
Nümunə 2: Qiymətə görə məhsul axtarışı
İndi isə təsəvvür elə ki, bizdə products adlı məhsullar cədvəli var:
| id | product_name | category | price |
|---|---|---|---|
| 1 | Smartfon | Electronics | 30000 |
| 2 | Televizor | Electronics | 45000 |
| 3 | Xolodilnik | Appliances | 50000 |
| 4 | Pilesos | Appliances | 15000 |
| 5 | Lampochka | Lighting | 500 |
Tapşırığımız — "Electronics" kateqoriyasından olan məhsulları qiymətə görə azalan sırada almaqdır. Sorğu belə olacaq:
SELECT product_name, price
FROM products
WHERE category = 'Electronics'
ORDER BY price DESC;
Nəticə:
| product_name | price |
|---|---|
| Televizor | 45000 |
| Smartfon | 30000 |
İzah:
SELECT product_name, price— məhsulun adını və qiymətini seçirik.WHERE category = 'Electronics'— yalnız "Electronics" kateqoriyasındakı məhsulları filtr edirik.ORDER BY price DESC— nəticəni qiymətə görə azalan sırada düzürük (ən bahalı birinci olacaq).
Nümunə 3: Mürəkkəb filtrlər və məntiq
Eyni students cədvəlindən istifadə edirik. Tutaq ki, bizə 21 yaşdan böyük olan və qiyməti B və ya C olan tələbələri tapmaq lazımdır, nəticəni yaşa görə sıralamaq şərtilə. Burada bir neçə şərti birləşdiririk:
SELECT name, age, grade
FROM students
WHERE age > 21 AND (grade = 'B' OR grade = 'C')
ORDER BY age ASC;
Nəticə:
| name | age | grade |
|---|---|---|
| Maria | 22 | B |
| Nat | 23 | C |
| Dan | 25 | B |
İzah:
WHERE age > 21— yalnız 21 yaşdan böyük tələbələri seçirik.AND (grade = 'B' OR grade = 'C')— qiymətiBvə yaColanları filtr edirik. Dairəvi mötərizələr şərtləri qruplaşdırmaq üçündür.ORDER BY age ASC— nəticəni yaşa görə artan sırada düzürük, ən gəncdən başlayaraq.
Nümunə 4: Sıralama və filtrin birləşdirilməsi
Yenidən products cədvəlinə qayıdırıq. Məqsədimiz — qiyməti 50 000-dən ucuz olan məhsulları tapmaq, əvvəlcə kateqoriyaya görə, sonra isə hər kateqoriyada qiymətə görə artan sırada düzülməkdir.
SELECT product_name, category, price
FROM products
WHERE price < 50000
ORDER BY category ASC, price ASC;
Nəticə:
| product_name | category | price |
|---|---|---|
| Pilesos | Appliances | 15000 |
| Smartfon | Electronics | 30000 |
| Televizor | Electronics | 45000 |
| Lampochka | Lighting | 500 |
İzah:
WHERE price < 50000— əvvəlcə yalnız 50 000-dən ucuz məhsulları filtr edirik.ORDER BY category ASC, price ASC— əvvəlcə kateqoriyaya görə (əlifba sırası ilə), sonra isə hər kateqoriyada qiymətə görə artan sırada düzürük.
Nümunə 5: Tez-tez rast gəlinən səhv — şərtləri unutmaq
İndi isə baxaq, nə səhv ola bilər. Tutaq ki, məntiqi operatorlarla işləyərkən şərtləri qruplaşdırmağı unuduruq?
Səhv sorğu:
SELECT name, age, grade
FROM students
WHERE age > 21 AND grade = 'B' OR grade = 'C'
ORDER BY age ASC;
Burada OR grade = 'C' AND age > 21 nəzərə alınmadan işləyəcək və sorğu düzgün nəticə qaytarmayacaq. Yəni, qiyməti C olan bütün tələbələr çıxacaq, hətta 21 yaşdan kiçik olsalar belə.
Ona görə də həmişə mötərizələrdən istifadə et, aydın olsun:
WHERE age > 21 AND (grade = 'B' OR grade = 'C')
GO TO FULL VERSION