Подзаявката връща table

И накрая, третата опция е, когато подзаявката връща цялата table. Това е най-често срещаният вариант.

Много често има ситуации, когато искаме да променим малко определена table. И едва след това съединете (с помощта на оператора JOIN ON) коригираната table с друга.

Нека започнем с най-простия случай, където обединихме две таблици с JOIN:

SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id

И Howто вероятно си спомняте, в tableта със задачи има задачи , които не са присвоени на никого: employee_id е NULL .

Нека генерираме коригирана table , където присвояваме всички висящи задачи на директора (неговият ID = 4).

За да направим това, използваме функцията IFNULL() :

SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline FROM task 

И резултатът от тази заявка:

document за самоличност ИД на служител име краен срок
1 1 Коригиране на грешка във фронтенда 2022-06-01
2 2 Коригиране на грешка в бекенда 2022-06-15
3 5 Купи кафе 2022-07-01
4 5 Купи кафе 2022-08-01
5 5 Купи кафе 2022-09-01
6 4 Почистете офиса (НУЛА)
7 4 Наслаждавай се на живота (НУЛА)
8 6 Наслаждавай се на живота (НУЛА)

Коригираната клетка е маркирана в червено.

Сега нека заместим нашата коригирана table в заявката:

SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id

Вместо tableта със задачите .

Такава заявка би изглеждала така:

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

Вместо думата задача написахме скоби и поставихме тялото на заявката в тях.

Между другото, псевдонимът t (alias) за вложената заявка беше много полезен. Вложената заявка, за разлика от tableта, няма собствено име, така че псевдонимът е много неуместен.

И ето резултата от такова запитване:

document за самоличност име професия заплата възраст дата на присъединяване document за самоличност ИД на служител име
1 Ivanов Ivan Програмист 100 000 25 2012-06-30 1 1 Коригиране на грешка във фронтенда
2 Peterов Петър Програмист 80 000 23 2013-08-12 2 2 Коригиране на грешка в бекенда
4 Рабинович Мойша Директор 200 000 35 2015-05-12 6 4 Почистете офиса
4 Рабинович Мойша Директор 200 000 35 2015-05-12 7 4 Наслаждавай се на живота
5 Кириенко Анастасия Офис мениджър 40 000 25 2015-10-10 4 5 Купи кафе
5 Кириенко Анастасия Офис мениджър 40 000 25 2015-10-10 5 5 Купи кафе
5 Кириенко Анастасия Офис мениджър 40 000 25 2015-10-10 3 5 Купи кафе
6 Васка котка 1000 3 2018-11-11 8 6 Наслаждавай се на живота

Нашият директор има задачата да "почисти офиса", мисля, че бързо ще намери на кого да го делегира :) Използване на оператора WITH

Между другото, започвайки с version 8 на MySQL, вече не трябва да поставяте всичките си подзаявки направо в крайната заявка. Те могат да се изпълняват поотделно. За това се използва операторът WITH .

Тя ви позволява да създадете виртуална table (наименувана заявка) и външният й вид се дава от шаблон:

WITH Name AS (request) 

Често има моменти, когато вашата подзаявка има неименувани колони, като COUNT(*), на които не сте присвоor уникално име. В този случай операторът WITH има опцията да посочи нови имена на колони за подзаявката.

Втората му форма е дадена от шаблона:

WITH Name(column1, column2, …) AS (request) 

Можете да използвате колкото искате виртуални таблици (именувани заявки) и да се препращате една към друга в тях. Общата форма на вашата заявка ще има нещо подобно:

WITH name1 AS (request1),  
       	name2 AS (request2), 
       	name3 AS (request3) 
SELECT * FROM name1 JOIN name2 ON

Сега нека вземем нашето страшно запитване:

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  

И го пренапишете, като използвате оператора WITH:

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

Или можете да правите без имена на колони, но тогава ще трябва да посочите псевдоним за функцията IFNULL():

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