CodeGym/Java курс/All lectures for BG purposes/Избор на данни от множество таблици

Избор на данни от множество таблици

На разположение

зависима 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о.

Коментари
  • Популярен
  • Нов
  • Стар
Трябва да сте влезли, за да оставите коментар
Тази страница все още няма коментари