Подзаявката връща 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
GO TO FULL VERSION