JavaRush /Kurslar /All lectures for AZ purposes /Cədvəllərlə Subsorğular

Cədvəllərlə Subsorğular

All lectures for AZ purposes
Səviyyə , Dərs
Mövcuddur

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 

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