Subsorğu cədvəl qaytarır
Nəhayət, üçüncü variant – suborğun tam bir cədvəl qaytardığı variant. Bu, ən geniş yayılmış variantdır.
Çox vaxt biz müəyyən bir cədvəli bir az düzəltmək istəyirik. Və yalnız bundan sonra (JOIN ON operatoru vasitəsilə) düzəldilən cədvəli başqa biri ilə birləşdiririk.
Gəlin əvvəlcə iki cədvəli JOIN vasitəsilə birləşdirdiyimiz ən sadə vəziyyəti götürək:
SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id
Və yəqin ki, xatırlayırsan, task cədvəlində heç kimə təyin olunmayan tapşırıqlar var: employee_id NULL bərabərdir.
Gəlin bütün qalmış tapşırıqları direktora (onun ID = 4) təyin edəcəyimiz düzəldilmiş cədvəl yaradaq.
Bunun üçün IFNULL() funksiyasından istifadə edək:
SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline FROM task
Və bu sorğunun nəticəsi:
id | employee_id | name | deadline |
---|---|---|---|
1 | 1 | Frontend-də xətanı düzəlt | 2022-06-01 |
2 | 2 | Backend-də xətanı düzəlt | 2022-06-15 |
3 | 5 | Kofe al | 2022-07-01 |
4 | 5 | Kofe al | 2022-08-01 |
5 | 5 | Kofe al | 2022-09-01 |
6 | 4 | Ofisi təmizlə | (NULL) |
7 | 4 | Həyatdan zövq al | (NULL) |
8 | 6 | Həyatdan zövq al | (NULL) |
Qırmızı rənglə düzəldilmiş hücrə qeyd olunub.
İndi gəlin bizim düzəldilmiş cədvəlimizi sorğuya qoyaq:
SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id
task cədvəli əvəzinə.
Belə bir sorğu təxminən belə görünəcək:
SELECT * FROM employee e JOIN ( SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline FROM task ) t ON e.id = t.emploee_id
Biz task sözünün əvəzinə dairəvi mötərizələr yazdıq və sorğunun məzmununu onların içinə yerləşdirdik.
Yeri gəlmişkən, psevdonimi t (alias) iç-içə olan sorğu üçün çox kömək oldu. Cədvəldən fərqli olaraq daxili sorğunun adı yoxdur, buna görə də psevdonim çox uyğun gəlir.
Və bu sorğunun nəticəsi belədir:
id | name | occupation | salary | age | join_date | id | employee_id | name |
---|---|---|---|---|---|---|---|---|
1 | İvanov Ivan | Proqramçı | 100000 | 25 | 2012-06-30 | 1 | 1 | Frontend-də xətanı düzəlt |
2 | Petrov Petr | Proqramçı | 80000 | 23 | 2013-08-12 | 2 | 2 | Backend-də xətanı düzəlt |
4 | Rabinoviç Moyşa | Direktor | 200000 | 35 | 2015-05-12 | 6 | 4 | Ofisi təmizlə |
4 | Rabinoviç Moyşa | Direktor | 200000 | 35 | 2015-05-12 | 7 | 4 | Həyatdan zövq al |
5 | Kiriyevnko Anastasiya | Ofis-menecer | 40000 | 25 | 2015-10-10 | 4 | 5 | Kofe al |
5 | Kiriyevnko Anastasiya | Ofis-menecer | 40000 | 25 | 2015-10-10 | 5 | 5 | Kofe al |
5 | Kiriyevnko Anastasiya | Ofis-menecer | 40000 | 25 | 2015-10-10 | 3 | 5 | Kofe al |
6 | Vasya | pisi | 1000 | 3 | 2018-11-11 | 8 | 6 | Həyatdan zövq al |
Bizim direktorun üzərində “ofisi təmizlə” tapşırığı var, fikrimcə, o, tez bir zamanda kiminə təhvil verməyi tapacaq :)WITH operatorunun istifadəsi
Yeri gəlmişkən, MySQL-in 8-ci versiyasından etibarən sən artıq bütün suborğularını birbaşa yekun sorğunun daxilinə yerləşdirmək məcburiyyətində deyilsən. Onları ayrıca da icra edə bilərsən. Bunun üçün WITH operatorundan istifadə edilir.
O, virtual cədvəl (adlanmış sorğu) yaratmaq imkanı verir və onun görünüşü şablon ilə təyin edilir:
WITH ad AS (sorğu)
Çox vaxt suborğunuzda adı olmayan sütunlar, məsələn COUNT(*) kimi olanlar var, onlara unikal ad təyin etməmisiniz. WITH operatoru üçün bu halda suborğu üçün yeni sütun adlarını təyin etmək imkanı var.
Onun ikinci növü şablon ilə təyin edilir:
WITH ad(sütun1, sütun2, …) AS (sorğu)
Sən istədiyin qədər virtual cədvəllər (adlanmış sorğular) istifadə edə bilərsən və onlarda bir-birinə istinad edə bilərsən. Ümumi sorğunun formatı təxminən belə olacaq:
WITH ad1 AS (sorğu1), ad2 AS (sorğu2), ad3 AS (sorğu3) SELECT * FROM ad1 JOIN ad2 ON …
İndi gəlin bizim qorxunc sorğumuzu götürək:
SELECT * FROM employee e JOIN ( SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline FROM task ) t ON e.id = t.emploee_id
Və bunu WITH operatorunu istifadə edərək təkrar yazaq:
WITH task2(id, employee_id, name, deadline) AS (SELECT id, IFNULL(employee_id, 4), name, deadline FROM task) SELECT * FROM employee e JOIN task2 t ON e.id = t.emploee_id
Və ya sütun adları olmadan edə bilərik, amma onda IFNULL() funksiyasına mütləq aliase təyin etməliyik:
WITH task2 AS ( SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline FROM task ) SELECT * FROM employee e JOIN task2 t ON e.id = t.emploee_id
GO TO FULL VERSION