зависима table

Сега нека усложним нашите запитвания малко. Нека добавим нова table със задачи към нашата база данни със задачи за нашите служители. И нека да видим Howви записи съдържа:

SELECT * FROM task

Резултатът от такова искане:

document за самоличност Emploee_id име краен срок
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 (НУЛА) Почистете офиса (НУЛА)
7 4 Наслаждавай се на живота (НУЛА)
8 6 Наслаждавай се на живота (НУЛА)

Тази table има само 4 колони:

  • id — уникален номер на задача (и редове в tableта);
  • employee_id — ID на служителя от tableта на служителите, на когото е възложена задачата;
  • име — име и описание на задачата;
  • краен срок - времето, до което задачата трябва да бъде изпълнена.

Обърнете внимание на няколко нюанса. Задача N6 няма employee_id, нямаме чистач. Задачата е налице, но изпълнителят го няма. Случва се.

Освен това задачи 6-9 нямат определен срок. Това се случва, когато една задача трябва да се изпълнява редовно и непрекъснато. Например, офисът трябва да се почиства всеки ден, но също така трябва да се наслаждавате на живота всеки ден :)

Ако една table използва идентификатори от друга table, тогава такава table се нарича зависима .

Заявка срещу множество таблици

Тук виждаме в tableта със задачи, че има две задачи „Да се ​​наслаждаваме на живота“. Как да разберем кои са тези късметлии?

За да направите това, в SQL можете да изпълните заявка върху две таблици наведнъж. По принцип в SQL можете да правите заявки за произволен брой таблици едновременно. Общият формат за такова искане е:

SELECT columns
FROM Table 1, table 2, tableN

важно! Ако напишете заявка към няколко таблици едновременно, тогава в резултат ще получите така наречения декартов продукт на редовете на tableта. Всеки ред от първата table ще бъде залепен към всеки ред от втората table и т.н.

Тоест, ако имате 5 реда в първата table и 10 реда във втората, тогава ще имате общо 50 реда. В Java тази заявка ще изглежда така:

for (String row1 : table1)
{
	for (String row2 : table2)
   {
  	System.out.println(row1 + row2);
   }
}

Нека напишем нашата заявка към две таблици наведнъж и да видим Howво ще се случи:

SELECT * FROM employee, task

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

document за самоличност име професия заплата възраст document за самоличност служител _document за самоличност име краен срок
1 Ivanов Ivan Програмист 100 000 25 1 1 Коригиране на грешка във фронтенда 2022-06-01
2 Peterов Петър Програмист 80 000 23 1 1 Коригиране на грешка във фронтенда 2022-06-01
3 Ivanов Сергей Тестер 40 000 тридесет 1 1 Коригиране на грешка във фронтенда 2022-06-01
4 Рабинович Мойша Директор 200 000 35 1 1 Коригиране на грешка във фронтенда 2022-06-01
5 Кириенко Анастасия Офис мениджър 40 000 25 1 1 Коригиране на грешка във фронтенда 2022-06-01
6 Васка котка 1000 3 1 1 Коригиране на грешка във фронтенда 2022-06-01
1 Ivanов Ivan Програмист 100 000 25 2 2 Коригиране на грешка в бекенда 2022-06-15
2 Peterов Петър Програмист 80 000 23 2 2 Коригиране на грешка в бекенда 2022-06-15
3 Ivanов Сергей Тестер 40 000 тридесет 2 2 Коригиране на грешка в бекенда 2022-06-15
4 Рабинович Мойша Директор 200 000 35 2 2 Коригиране на грешка в бекенда 2022-06-15
5 Кириенко Анастасия Офис мениджър 40 000 25 2 2 Коригиране на грешка в бекенда 2022-06-15

Имаме общо 48 реда с резултати, но тук съм дал само 11. В противен случай просто няма да има достатъчно място.

Обърнете внимание на три неща:

  • Колони със същото име: id . Това е идентификаторът от tableта на служителите и идентификаторът от tableта със задачите .
  • Редовете на всяка table се повтарят. В лявата колона ID 6 е последван от ID = 1 отново.
  • Имаме безсмислени редове, където например id (от tableта на служителите) е 6, а в същия ред employee_id е 1.

Премахване на безсмислени линии

Има твърде много редове в нашата получена table, която е декартово произведение на всички редове на двете таблици служител и задача .

Логично, ако редът employee_id е 3, тогава той трябва да се придържа само към реда от tableта на служителите, където id е 3. Нека се опитаме да поправим това недоразумение с WHERE.

Нека напишем заявка като тази:

SELECT * FROM employee, task 
WHERE emploee.id = task.emploee_id 

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

document за самоличност име професия заплата възраст document за самоличност Emploee_id име краен срок
1 Ivanов Ivan Програмист 100 000 25 1 1 Коригиране на грешка във фронтенда 2022-06-01
2 Peterов Петър Програмист 80 000 23 2 2 Коригиране на грешка в бекенда 2022-06-15
4 Рабинович Мойша Директор 200 000 35 7 4 Наслаждавай се на живота (НУЛА)
5 Кириенко Анастасия Офис мениджър 40 000 25 3 5 Купи кафе 2022-07-01
5 Кириенко Анастасия Офис мениджър 40 000 25 4 5 Купи кафе 2022-08-01
5 Кириенко Анастасия Офис мениджър 40 000 25 5 5 Ще купи кафе 2022-09-01
6 Васка котка 1000 3 8 6 Наслаждавай се на живота (НУЛА)

Добрата новина е, че безсмислените редове са изчезнали: id от първата колона винаги е equals на employee_id.

Лошата новина е, че задачите, които не са възложени на никого, като почистване на офиса, ги няма. Техният employee_id беше NULL, така че те бяха отхвърлени, след като WHERE беше напequalsо.